diff --git a/arch/x86/platform/olpc/olpc-xo1.c b/arch/x86/platform/olpc/olpc-xo1.c index 1277756..4723139 100644 --- a/arch/x86/platform/olpc/olpc-xo1.c +++ b/arch/x86/platform/olpc/olpc-xo1.c @@ -19,7 +19,7 @@ #include #include -#define DRV_NAME "olpc-xo1" +#define DRV_NAME "olpc-xo1-pm" /* PMC registers (PMS block) */ #define PM_SCLK 0x10 @@ -72,17 +72,23 @@ static int __devinit olpc_xo1_probe(struct platform_device *pdev) return -EIO; } - if (strcmp(pdev->name, "cs5535-pms") == 0) - pms_base = res->start; - else if (strcmp(pdev->name, "cs5535-acpi") == 0) - acpi_base = res->start; + pms_base = res->start; - /* If we have both addresses, we can override the poweroff hook */ - if (pms_base && acpi_base) { - pm_power_off = xo1_power_off; - printk(KERN_INFO "OLPC XO-1 support registered\n"); + res = platform_get_resource(pdev, IORESOURCE_IO, 1); + if (!res) { + dev_err(&pdev->dev, "can't fetch device resource info\n"); + return -EIO; } + if (!request_region(res->start, resource_size(res), DRV_NAME)) { + dev_err(&pdev->dev, "can't request region\n"); + return -EIO; + } + + acpi_base = res->start; + + pm_power_off = xo1_power_off; + printk(KERN_INFO "OLPC XO-1 support registered\n"); return 0; } @@ -93,27 +99,19 @@ static int __devexit olpc_xo1_remove(struct platform_device *pdev) r = platform_get_resource(pdev, IORESOURCE_IO, 0); release_region(r->start, resource_size(r)); - if (strcmp(pdev->name, "cs5535-pms") == 0) - pms_base = 0; - else if (strcmp(pdev->name, "cs5535-acpi") == 0) - acpi_base = 0; + r = platform_get_resource(pdev, IORESOURCE_IO, 1); + release_region(r->start, resource_size(r)); + + pms_base = 0; + acpi_base = 0; pm_power_off = NULL; return 0; } -static struct platform_driver cs5535_pms_drv = { +static struct platform_driver xo1_pm_drv = { .driver = { - .name = "cs5535-pms", - .owner = THIS_MODULE, - }, - .probe = olpc_xo1_probe, - .remove = __devexit_p(olpc_xo1_remove), -}; - -static struct platform_driver cs5535_acpi_drv = { - .driver = { - .name = "cs5535-acpi", + .name = DRV_NAME, .owner = THIS_MODULE, }, .probe = olpc_xo1_probe, @@ -122,28 +120,17 @@ static struct platform_driver cs5535_acpi_drv = { static int __init olpc_xo1_init(void) { - int r; - - r = platform_driver_register(&cs5535_pms_drv); - if (r) - return r; - - r = platform_driver_register(&cs5535_acpi_drv); - if (r) - platform_driver_unregister(&cs5535_pms_drv); - - return r; + return platform_driver_register(&xo1_pm_drv); } static void __exit olpc_xo1_exit(void) { - platform_driver_unregister(&cs5535_acpi_drv); - platform_driver_unregister(&cs5535_pms_drv); + platform_driver_unregister(&xo1_pm_drv); } MODULE_AUTHOR("Daniel Drake "); MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:olpc-xo1"); +MODULE_ALIAS("platform:" DRV_NAME); module_init(olpc_xo1_init); module_exit(olpc_xo1_exit); diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 3a7b891..203245d 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -540,7 +540,7 @@ config AB3550_CORE config MFD_CS5535 tristate "Support for CS5535 and CS5536 southbridge core functions" select MFD_CORE - depends on PCI + depends on PCI && X86 ---help--- This is the core driver for CS5535/CS5536 MFD functions. This is necessary for using the board's GPIO and MFGPT functionality. diff --git a/drivers/mfd/cs5535-mfd.c b/drivers/mfd/cs5535-mfd.c index 59ca6f1..9ef5dd9 100644 --- a/drivers/mfd/cs5535-mfd.c +++ b/drivers/mfd/cs5535-mfd.c @@ -28,6 +28,8 @@ #include #include +#include + #define DRV_NAME "cs5535-mfd" enum cs5535_mfd_bars { @@ -74,6 +76,15 @@ static __devinitdata struct mfd_cell cs5535_mfd_cells[] = { }, }; +static __devinitdata struct resource cs5535_mfd_resources_xo1[2]; + +static __devinitdata struct mfd_cell cs5535_mfd_cell_xo1 = { + .id = -1, + .name = "olpc-xo1-pm", + .num_resources = 2, + .resources = cs5535_mfd_resources_xo1, +}; + static int __devinit cs5535_mfd_probe(struct pci_dev *pdev, const struct pci_device_id *id) { @@ -106,8 +117,22 @@ static int __devinit cs5535_mfd_probe(struct pci_dev *pdev, dev_info(&pdev->dev, "%zu devices registered.\n", ARRAY_SIZE(cs5535_mfd_cells)); + if (machine_is_olpc()) { + cs5535_mfd_resources_xo1[0] = cs5535_mfd_resources[PMS_BAR]; + cs5535_mfd_resources_xo1[1] = cs5535_mfd_resources[ACPI_BAR]; + err = mfd_add_devices(&pdev->dev, -1, &cs5535_mfd_cell_xo1, 1, + NULL, 0); + if (err) { + dev_err(&pdev->dev, + "MFD add OLPC device fail: %d\n", err); + goto err_olpc; + } + } + return 0; +err_olpc: + mfd_remove_devices(&pdev->dev); err_disable: pci_disable_device(pdev); return err;