Message ID | 20110917213532.20710.92002.stgit@ponder |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On Sat, Sep 17, 2011 at 03:36:19PM -0600, Grant Likely wrote: > There is no need for two drivers anymore > > Signed-off-by: Grant Likely <grant.likely@secretlab.ca> > Cc: Dave Martin <dave.martin@linaro.org> > COMPILE TESTED ONLY > --- > [resend - I flubbed Dave's email address] > > Dave, as I mentioned in the other thread, this is the patch that I > hacked together to get rid of pata_of_platform.c. Can you take over > on this patch please? This seems to work for me on vexpress. Can you clarify what you mean by "take over"? Cheers ---Dave > > drivers/ata/pata_of_platform.c | 116 ---------------------------------------- > drivers/ata/pata_platform.c | 60 ++++++++++++++++++--- > include/linux/ata_platform.h | 9 --- > 3 files changed, 52 insertions(+), 133 deletions(-) > delete mode 100644 drivers/ata/pata_of_platform.c > > diff --git a/drivers/ata/pata_of_platform.c b/drivers/ata/pata_of_platform.c > deleted file mode 100644 > index f305400..0000000 > --- a/drivers/ata/pata_of_platform.c > +++ /dev/null > @@ -1,116 +0,0 @@ > -/* > - * OF-platform PATA driver > - * > - * Copyright (c) 2007 MontaVista Software, Inc. > - * Anton Vorontsov <avorontsov@ru.mvista.com> > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License (Version 2) as > - * published by the Free Software Foundation. > - */ > - > -#include <linux/kernel.h> > -#include <linux/module.h> > -#include <linux/of_platform.h> > -#include <linux/ata_platform.h> > - > -static int __devinit pata_of_platform_probe(struct platform_device *ofdev) > -{ > - int ret; > - struct device_node *dn = ofdev->dev.of_node; > - struct resource io_res; > - struct resource ctl_res; > - struct resource irq_res; > - unsigned int reg_shift = 0; > - int pio_mode = 0; > - int pio_mask; > - const u32 *prop; > - > - ret = of_address_to_resource(dn, 0, &io_res); > - if (ret) { > - dev_err(&ofdev->dev, "can't get IO address from " > - "device tree\n"); > - return -EINVAL; > - } > - > - if (of_device_is_compatible(dn, "electra-ide")) { > - /* Altstatus is really at offset 0x3f6 from the primary window > - * on electra-ide. Adjust ctl_res and io_res accordingly. > - */ > - ctl_res = io_res; > - ctl_res.start = ctl_res.start+0x3f6; > - io_res.end = ctl_res.start-1; > - } else { > - ret = of_address_to_resource(dn, 1, &ctl_res); > - if (ret) { > - dev_err(&ofdev->dev, "can't get CTL address from " > - "device tree\n"); > - return -EINVAL; > - } > - } > - > - ret = of_irq_to_resource(dn, 0, &irq_res); > - if (ret == NO_IRQ) > - irq_res.start = irq_res.end = 0; > - else > - irq_res.flags = 0; > - > - prop = of_get_property(dn, "reg-shift", NULL); > - if (prop) > - reg_shift = *prop; > - > - prop = of_get_property(dn, "pio-mode", NULL); > - if (prop) { > - pio_mode = *prop; > - if (pio_mode > 6) { > - dev_err(&ofdev->dev, "invalid pio-mode\n"); > - return -EINVAL; > - } > - } else { > - dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n"); > - } > - > - pio_mask = 1 << pio_mode; > - pio_mask |= (1 << pio_mode) - 1; > - > - return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, &irq_res, > - reg_shift, pio_mask); > -} > - > -static int __devexit pata_of_platform_remove(struct platform_device *ofdev) > -{ > - return __pata_platform_remove(&ofdev->dev); > -} > - > -static struct of_device_id pata_of_platform_match[] = { > - { .compatible = "ata-generic", }, > - { .compatible = "electra-ide", }, > - {}, > -}; > -MODULE_DEVICE_TABLE(of, pata_of_platform_match); > - > -static struct platform_driver pata_of_platform_driver = { > - .driver = { > - .name = "pata_of_platform", > - .owner = THIS_MODULE, > - .of_match_table = pata_of_platform_match, > - }, > - .probe = pata_of_platform_probe, > - .remove = __devexit_p(pata_of_platform_remove), > -}; > - > -static int __init pata_of_platform_init(void) > -{ > - return platform_driver_register(&pata_of_platform_driver); > -} > -module_init(pata_of_platform_init); > - > -static void __exit pata_of_platform_exit(void) > -{ > - platform_driver_unregister(&pata_of_platform_driver); > -} > -module_exit(pata_of_platform_exit); > - > -MODULE_DESCRIPTION("OF-platform PATA driver"); > -MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>"); > -MODULE_LICENSE("GPL"); > diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c > index 2067308..adc435a 100644 > --- a/drivers/ata/pata_platform.c > +++ b/drivers/ata/pata_platform.c > @@ -17,6 +17,7 @@ > #include <linux/blkdev.h> > #include <scsi/scsi_host.h> > #include <linux/ata.h> > +#include <linux/of.h> > #include <linux/libata.h> > #include <linux/platform_device.h> > #include <linux/ata_platform.h> > @@ -176,7 +177,6 @@ int __devinit __pata_platform_probe(struct device *dev, > return ata_host_activate(host, irq, irq ? ata_sff_interrupt : NULL, > irq_flags, &pata_platform_sht); > } > -EXPORT_SYMBOL_GPL(__pata_platform_probe); > > /** > * __pata_platform_remove - unplug a platform interface > @@ -185,7 +185,7 @@ EXPORT_SYMBOL_GPL(__pata_platform_probe); > * A platform bus ATA device has been unplugged. Perform the needed > * cleanup. Also called on module unload for any active devices. > */ > -int __pata_platform_remove(struct device *dev) > +int __devexit __pata_platform_remove(struct device *dev) > { > struct ata_host *host = dev_get_drvdata(dev); > > @@ -193,14 +193,28 @@ int __pata_platform_remove(struct device *dev) > > return 0; > } > -EXPORT_SYMBOL_GPL(__pata_platform_remove); > + > +#ifdef CONFIG_OF > +static struct of_device_id pata_platform_match[] = { > + { .compatible = "arm,versatile-ata", }, > + { .compatible = "ata-generic", }, > + { .compatible = "electra-ide", }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, pata_platform_match); > +#else > +#define pata_platform_match NULL > +#endif > > static int __devinit pata_platform_probe(struct platform_device *pdev) > { > + struct device_node *np = pdev->dev.of_node; > struct resource *io_res; > struct resource *ctl_res; > struct resource *irq_res; > struct pata_platform_info *pp_info = pdev->dev.platform_data; > + int local_pio_mask = pio_mask; > + u32 reg_shift = 0; > > /* > * Simple resource validation .. > @@ -224,11 +238,24 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) > * Then the CTL base > */ > ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1); > - if (ctl_res == NULL) { > + if (ctl_res == NULL) > ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > - if (unlikely(ctl_res == NULL)) > - return -EINVAL; > +#ifdef CONFIG_OF > + if ((ctl_res == NULL) && of_device_is_compatible(np, "electra-ide")) { > + /* electra-ide quirk: Altstatus is really at offset 0x3f6 from > + * the primary window. Adjust ctl_res and io_res accordingly. */ > + ctl_res = devm_kzalloc(&pdev->dev, sizeof(*ctl_res) * 2, GFP_KERNEL); > + if (ctl_res) { > + ctl_res[0] = *io_res; > + ctl_res[1] = *io_res; > + io_res = &ctl_res[1]; > + ctl_res->start += 0x3f6; > + io_res->end = ctl_res->start - 1; > + } > } > +#endif > + if (unlikely(ctl_res == NULL)) > + return -EINVAL; > > /* > * And the IRQ > @@ -237,9 +264,25 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) > if (irq_res) > irq_res->flags = pp_info ? pp_info->irq_flags : 0; > > + /* Parse device tree data if available */ > + if (np) { > + u32 pio_mode = 0; > + of_property_read_u32(np, "reg-shift", ®_shift); > + if (of_property_read_u32(np, "pio-mode", &pio_mode) == 0) > + dev_info(&pdev->dev, "pio-mode unspecified, assuming PIO0\n"); > + if (pio_mode > 6) { > + dev_err(&pdev->dev, "invalid pio-mode\n"); > + return -EINVAL; > + } > + local_pio_mask = (1 << (pio_mode + 1)) - 1; > + } > + > + /* Platform data takes precedence if available */ > + if (pp_info) > + reg_shift = pp_info->ioport_shift; > + > return __pata_platform_probe(&pdev->dev, io_res, ctl_res, irq_res, > - pp_info ? pp_info->ioport_shift : 0, > - pio_mask); > + reg_shift, local_pio_mask); > } > > static int __devexit pata_platform_remove(struct platform_device *pdev) > @@ -253,6 +296,7 @@ static struct platform_driver pata_platform_driver = { > .driver = { > .name = DRV_NAME, > .owner = THIS_MODULE, > + .of_match_table = pata_platform_match, > }, > }; > > diff --git a/include/linux/ata_platform.h b/include/linux/ata_platform.h > index 9a26c83..1e83a7f 100644 > --- a/include/linux/ata_platform.h > +++ b/include/linux/ata_platform.h > @@ -15,15 +15,6 @@ struct pata_platform_info { > unsigned int irq_flags; > }; > > -extern int __devinit __pata_platform_probe(struct device *dev, > - struct resource *io_res, > - struct resource *ctl_res, > - struct resource *irq_res, > - unsigned int ioport_shift, > - int __pio_mask); > - > -extern int __devexit __pata_platform_remove(struct device *dev); > - > /* > * Marvell SATA private data > */ > -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Sep 19, 2011 at 05:39:02PM +0100, Dave Martin wrote: > On Sat, Sep 17, 2011 at 03:36:19PM -0600, Grant Likely wrote: > > There is no need for two drivers anymore > > > > Signed-off-by: Grant Likely <grant.likely@secretlab.ca> > > Cc: Dave Martin <dave.martin@linaro.org> > > COMPILE TESTED ONLY > > --- > > [resend - I flubbed Dave's email address] > > > > Dave, as I mentioned in the other thread, this is the patch that I > > hacked together to get rid of pata_of_platform.c. Can you take over > > on this patch please? > > This seems to work for me on vexpress. > > Can you clarify what you mean by "take over"? Adopt it. Give it a home. Shepherd it to help it find it's way into mainline. :-) The patch isn't complete. I've not cleaned up the Kconfig or Makefile and it needs some more due diligence to review and make sure that the pata_of_platform functionality has moved into pata_platform.c. g. > > Cheers > ---Dave > > > > > drivers/ata/pata_of_platform.c | 116 ---------------------------------------- > > drivers/ata/pata_platform.c | 60 ++++++++++++++++++--- > > include/linux/ata_platform.h | 9 --- > > 3 files changed, 52 insertions(+), 133 deletions(-) > > delete mode 100644 drivers/ata/pata_of_platform.c > > > > diff --git a/drivers/ata/pata_of_platform.c b/drivers/ata/pata_of_platform.c > > deleted file mode 100644 > > index f305400..0000000 > > --- a/drivers/ata/pata_of_platform.c > > +++ /dev/null > > @@ -1,116 +0,0 @@ > > -/* > > - * OF-platform PATA driver > > - * > > - * Copyright (c) 2007 MontaVista Software, Inc. > > - * Anton Vorontsov <avorontsov@ru.mvista.com> > > - * > > - * This program is free software; you can redistribute it and/or modify > > - * it under the terms of the GNU General Public License (Version 2) as > > - * published by the Free Software Foundation. > > - */ > > - > > -#include <linux/kernel.h> > > -#include <linux/module.h> > > -#include <linux/of_platform.h> > > -#include <linux/ata_platform.h> > > - > > -static int __devinit pata_of_platform_probe(struct platform_device *ofdev) > > -{ > > - int ret; > > - struct device_node *dn = ofdev->dev.of_node; > > - struct resource io_res; > > - struct resource ctl_res; > > - struct resource irq_res; > > - unsigned int reg_shift = 0; > > - int pio_mode = 0; > > - int pio_mask; > > - const u32 *prop; > > - > > - ret = of_address_to_resource(dn, 0, &io_res); > > - if (ret) { > > - dev_err(&ofdev->dev, "can't get IO address from " > > - "device tree\n"); > > - return -EINVAL; > > - } > > - > > - if (of_device_is_compatible(dn, "electra-ide")) { > > - /* Altstatus is really at offset 0x3f6 from the primary window > > - * on electra-ide. Adjust ctl_res and io_res accordingly. > > - */ > > - ctl_res = io_res; > > - ctl_res.start = ctl_res.start+0x3f6; > > - io_res.end = ctl_res.start-1; > > - } else { > > - ret = of_address_to_resource(dn, 1, &ctl_res); > > - if (ret) { > > - dev_err(&ofdev->dev, "can't get CTL address from " > > - "device tree\n"); > > - return -EINVAL; > > - } > > - } > > - > > - ret = of_irq_to_resource(dn, 0, &irq_res); > > - if (ret == NO_IRQ) > > - irq_res.start = irq_res.end = 0; > > - else > > - irq_res.flags = 0; > > - > > - prop = of_get_property(dn, "reg-shift", NULL); > > - if (prop) > > - reg_shift = *prop; > > - > > - prop = of_get_property(dn, "pio-mode", NULL); > > - if (prop) { > > - pio_mode = *prop; > > - if (pio_mode > 6) { > > - dev_err(&ofdev->dev, "invalid pio-mode\n"); > > - return -EINVAL; > > - } > > - } else { > > - dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n"); > > - } > > - > > - pio_mask = 1 << pio_mode; > > - pio_mask |= (1 << pio_mode) - 1; > > - > > - return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, &irq_res, > > - reg_shift, pio_mask); > > -} > > - > > -static int __devexit pata_of_platform_remove(struct platform_device *ofdev) > > -{ > > - return __pata_platform_remove(&ofdev->dev); > > -} > > - > > -static struct of_device_id pata_of_platform_match[] = { > > - { .compatible = "ata-generic", }, > > - { .compatible = "electra-ide", }, > > - {}, > > -}; > > -MODULE_DEVICE_TABLE(of, pata_of_platform_match); > > - > > -static struct platform_driver pata_of_platform_driver = { > > - .driver = { > > - .name = "pata_of_platform", > > - .owner = THIS_MODULE, > > - .of_match_table = pata_of_platform_match, > > - }, > > - .probe = pata_of_platform_probe, > > - .remove = __devexit_p(pata_of_platform_remove), > > -}; > > - > > -static int __init pata_of_platform_init(void) > > -{ > > - return platform_driver_register(&pata_of_platform_driver); > > -} > > -module_init(pata_of_platform_init); > > - > > -static void __exit pata_of_platform_exit(void) > > -{ > > - platform_driver_unregister(&pata_of_platform_driver); > > -} > > -module_exit(pata_of_platform_exit); > > - > > -MODULE_DESCRIPTION("OF-platform PATA driver"); > > -MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>"); > > -MODULE_LICENSE("GPL"); > > diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c > > index 2067308..adc435a 100644 > > --- a/drivers/ata/pata_platform.c > > +++ b/drivers/ata/pata_platform.c > > @@ -17,6 +17,7 @@ > > #include <linux/blkdev.h> > > #include <scsi/scsi_host.h> > > #include <linux/ata.h> > > +#include <linux/of.h> > > #include <linux/libata.h> > > #include <linux/platform_device.h> > > #include <linux/ata_platform.h> > > @@ -176,7 +177,6 @@ int __devinit __pata_platform_probe(struct device *dev, > > return ata_host_activate(host, irq, irq ? ata_sff_interrupt : NULL, > > irq_flags, &pata_platform_sht); > > } > > -EXPORT_SYMBOL_GPL(__pata_platform_probe); > > > > /** > > * __pata_platform_remove - unplug a platform interface > > @@ -185,7 +185,7 @@ EXPORT_SYMBOL_GPL(__pata_platform_probe); > > * A platform bus ATA device has been unplugged. Perform the needed > > * cleanup. Also called on module unload for any active devices. > > */ > > -int __pata_platform_remove(struct device *dev) > > +int __devexit __pata_platform_remove(struct device *dev) > > { > > struct ata_host *host = dev_get_drvdata(dev); > > > > @@ -193,14 +193,28 @@ int __pata_platform_remove(struct device *dev) > > > > return 0; > > } > > -EXPORT_SYMBOL_GPL(__pata_platform_remove); > > + > > +#ifdef CONFIG_OF > > +static struct of_device_id pata_platform_match[] = { > > + { .compatible = "arm,versatile-ata", }, > > + { .compatible = "ata-generic", }, > > + { .compatible = "electra-ide", }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(of, pata_platform_match); > > +#else > > +#define pata_platform_match NULL > > +#endif > > > > static int __devinit pata_platform_probe(struct platform_device *pdev) > > { > > + struct device_node *np = pdev->dev.of_node; > > struct resource *io_res; > > struct resource *ctl_res; > > struct resource *irq_res; > > struct pata_platform_info *pp_info = pdev->dev.platform_data; > > + int local_pio_mask = pio_mask; > > + u32 reg_shift = 0; > > > > /* > > * Simple resource validation .. > > @@ -224,11 +238,24 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) > > * Then the CTL base > > */ > > ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1); > > - if (ctl_res == NULL) { > > + if (ctl_res == NULL) > > ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > > - if (unlikely(ctl_res == NULL)) > > - return -EINVAL; > > +#ifdef CONFIG_OF > > + if ((ctl_res == NULL) && of_device_is_compatible(np, "electra-ide")) { > > + /* electra-ide quirk: Altstatus is really at offset 0x3f6 from > > + * the primary window. Adjust ctl_res and io_res accordingly. */ > > + ctl_res = devm_kzalloc(&pdev->dev, sizeof(*ctl_res) * 2, GFP_KERNEL); > > + if (ctl_res) { > > + ctl_res[0] = *io_res; > > + ctl_res[1] = *io_res; > > + io_res = &ctl_res[1]; > > + ctl_res->start += 0x3f6; > > + io_res->end = ctl_res->start - 1; > > + } > > } > > +#endif > > + if (unlikely(ctl_res == NULL)) > > + return -EINVAL; > > > > /* > > * And the IRQ > > @@ -237,9 +264,25 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) > > if (irq_res) > > irq_res->flags = pp_info ? pp_info->irq_flags : 0; > > > > + /* Parse device tree data if available */ > > + if (np) { > > + u32 pio_mode = 0; > > + of_property_read_u32(np, "reg-shift", ®_shift); > > + if (of_property_read_u32(np, "pio-mode", &pio_mode) == 0) > > + dev_info(&pdev->dev, "pio-mode unspecified, assuming PIO0\n"); > > + if (pio_mode > 6) { > > + dev_err(&pdev->dev, "invalid pio-mode\n"); > > + return -EINVAL; > > + } > > + local_pio_mask = (1 << (pio_mode + 1)) - 1; > > + } > > + > > + /* Platform data takes precedence if available */ > > + if (pp_info) > > + reg_shift = pp_info->ioport_shift; > > + > > return __pata_platform_probe(&pdev->dev, io_res, ctl_res, irq_res, > > - pp_info ? pp_info->ioport_shift : 0, > > - pio_mask); > > + reg_shift, local_pio_mask); > > } > > > > static int __devexit pata_platform_remove(struct platform_device *pdev) > > @@ -253,6 +296,7 @@ static struct platform_driver pata_platform_driver = { > > .driver = { > > .name = DRV_NAME, > > .owner = THIS_MODULE, > > + .of_match_table = pata_platform_match, > > }, > > }; > > > > diff --git a/include/linux/ata_platform.h b/include/linux/ata_platform.h > > index 9a26c83..1e83a7f 100644 > > --- a/include/linux/ata_platform.h > > +++ b/include/linux/ata_platform.h > > @@ -15,15 +15,6 @@ struct pata_platform_info { > > unsigned int irq_flags; > > }; > > > > -extern int __devinit __pata_platform_probe(struct device *dev, > > - struct resource *io_res, > > - struct resource *ctl_res, > > - struct resource *irq_res, > > - unsigned int ioport_shift, > > - int __pio_mask); > > - > > -extern int __devexit __pata_platform_remove(struct device *dev); > > - > > /* > > * Marvell SATA private data > > */ > > -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Sep 19, 2011 at 6:10 PM, Grant Likely <grant.likely@secretlab.ca> wrote: > On Mon, Sep 19, 2011 at 05:39:02PM +0100, Dave Martin wrote: >> On Sat, Sep 17, 2011 at 03:36:19PM -0600, Grant Likely wrote: >> > There is no need for two drivers anymore >> > >> > Signed-off-by: Grant Likely <grant.likely@secretlab.ca> >> > Cc: Dave Martin <dave.martin@linaro.org> >> > COMPILE TESTED ONLY >> > --- >> > [resend - I flubbed Dave's email address] >> > >> > Dave, as I mentioned in the other thread, this is the patch that I >> > hacked together to get rid of pata_of_platform.c. Can you take over >> > on this patch please? >> >> This seems to work for me on vexpress. >> >> Can you clarify what you mean by "take over"? > > Adopt it. Give it a home. Shepherd it to help it find it's way into > mainline. :-) > > The patch isn't complete. I've not cleaned up the Kconfig or Makefile > and it needs some more due diligence to review and make sure that the > pata_of_platform functionality has moved into pata_platform.c. OK, assume for now that I will own this fow now -- If I get stuck, I'll come back to you. Cheers ---Dave -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/ata/pata_of_platform.c b/drivers/ata/pata_of_platform.c deleted file mode 100644 index f305400..0000000 --- a/drivers/ata/pata_of_platform.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * OF-platform PATA driver - * - * Copyright (c) 2007 MontaVista Software, Inc. - * Anton Vorontsov <avorontsov@ru.mvista.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License (Version 2) as - * published by the Free Software Foundation. - */ - -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/of_platform.h> -#include <linux/ata_platform.h> - -static int __devinit pata_of_platform_probe(struct platform_device *ofdev) -{ - int ret; - struct device_node *dn = ofdev->dev.of_node; - struct resource io_res; - struct resource ctl_res; - struct resource irq_res; - unsigned int reg_shift = 0; - int pio_mode = 0; - int pio_mask; - const u32 *prop; - - ret = of_address_to_resource(dn, 0, &io_res); - if (ret) { - dev_err(&ofdev->dev, "can't get IO address from " - "device tree\n"); - return -EINVAL; - } - - if (of_device_is_compatible(dn, "electra-ide")) { - /* Altstatus is really at offset 0x3f6 from the primary window - * on electra-ide. Adjust ctl_res and io_res accordingly. - */ - ctl_res = io_res; - ctl_res.start = ctl_res.start+0x3f6; - io_res.end = ctl_res.start-1; - } else { - ret = of_address_to_resource(dn, 1, &ctl_res); - if (ret) { - dev_err(&ofdev->dev, "can't get CTL address from " - "device tree\n"); - return -EINVAL; - } - } - - ret = of_irq_to_resource(dn, 0, &irq_res); - if (ret == NO_IRQ) - irq_res.start = irq_res.end = 0; - else - irq_res.flags = 0; - - prop = of_get_property(dn, "reg-shift", NULL); - if (prop) - reg_shift = *prop; - - prop = of_get_property(dn, "pio-mode", NULL); - if (prop) { - pio_mode = *prop; - if (pio_mode > 6) { - dev_err(&ofdev->dev, "invalid pio-mode\n"); - return -EINVAL; - } - } else { - dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n"); - } - - pio_mask = 1 << pio_mode; - pio_mask |= (1 << pio_mode) - 1; - - return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, &irq_res, - reg_shift, pio_mask); -} - -static int __devexit pata_of_platform_remove(struct platform_device *ofdev) -{ - return __pata_platform_remove(&ofdev->dev); -} - -static struct of_device_id pata_of_platform_match[] = { - { .compatible = "ata-generic", }, - { .compatible = "electra-ide", }, - {}, -}; -MODULE_DEVICE_TABLE(of, pata_of_platform_match); - -static struct platform_driver pata_of_platform_driver = { - .driver = { - .name = "pata_of_platform", - .owner = THIS_MODULE, - .of_match_table = pata_of_platform_match, - }, - .probe = pata_of_platform_probe, - .remove = __devexit_p(pata_of_platform_remove), -}; - -static int __init pata_of_platform_init(void) -{ - return platform_driver_register(&pata_of_platform_driver); -} -module_init(pata_of_platform_init); - -static void __exit pata_of_platform_exit(void) -{ - platform_driver_unregister(&pata_of_platform_driver); -} -module_exit(pata_of_platform_exit); - -MODULE_DESCRIPTION("OF-platform PATA driver"); -MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>"); -MODULE_LICENSE("GPL"); diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c index 2067308..adc435a 100644 --- a/drivers/ata/pata_platform.c +++ b/drivers/ata/pata_platform.c @@ -17,6 +17,7 @@ #include <linux/blkdev.h> #include <scsi/scsi_host.h> #include <linux/ata.h> +#include <linux/of.h> #include <linux/libata.h> #include <linux/platform_device.h> #include <linux/ata_platform.h> @@ -176,7 +177,6 @@ int __devinit __pata_platform_probe(struct device *dev, return ata_host_activate(host, irq, irq ? ata_sff_interrupt : NULL, irq_flags, &pata_platform_sht); } -EXPORT_SYMBOL_GPL(__pata_platform_probe); /** * __pata_platform_remove - unplug a platform interface @@ -185,7 +185,7 @@ EXPORT_SYMBOL_GPL(__pata_platform_probe); * A platform bus ATA device has been unplugged. Perform the needed * cleanup. Also called on module unload for any active devices. */ -int __pata_platform_remove(struct device *dev) +int __devexit __pata_platform_remove(struct device *dev) { struct ata_host *host = dev_get_drvdata(dev); @@ -193,14 +193,28 @@ int __pata_platform_remove(struct device *dev) return 0; } -EXPORT_SYMBOL_GPL(__pata_platform_remove); + +#ifdef CONFIG_OF +static struct of_device_id pata_platform_match[] = { + { .compatible = "arm,versatile-ata", }, + { .compatible = "ata-generic", }, + { .compatible = "electra-ide", }, + {}, +}; +MODULE_DEVICE_TABLE(of, pata_platform_match); +#else +#define pata_platform_match NULL +#endif static int __devinit pata_platform_probe(struct platform_device *pdev) { + struct device_node *np = pdev->dev.of_node; struct resource *io_res; struct resource *ctl_res; struct resource *irq_res; struct pata_platform_info *pp_info = pdev->dev.platform_data; + int local_pio_mask = pio_mask; + u32 reg_shift = 0; /* * Simple resource validation .. @@ -224,11 +238,24 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) * Then the CTL base */ ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1); - if (ctl_res == NULL) { + if (ctl_res == NULL) ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (unlikely(ctl_res == NULL)) - return -EINVAL; +#ifdef CONFIG_OF + if ((ctl_res == NULL) && of_device_is_compatible(np, "electra-ide")) { + /* electra-ide quirk: Altstatus is really at offset 0x3f6 from + * the primary window. Adjust ctl_res and io_res accordingly. */ + ctl_res = devm_kzalloc(&pdev->dev, sizeof(*ctl_res) * 2, GFP_KERNEL); + if (ctl_res) { + ctl_res[0] = *io_res; + ctl_res[1] = *io_res; + io_res = &ctl_res[1]; + ctl_res->start += 0x3f6; + io_res->end = ctl_res->start - 1; + } } +#endif + if (unlikely(ctl_res == NULL)) + return -EINVAL; /* * And the IRQ @@ -237,9 +264,25 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) if (irq_res) irq_res->flags = pp_info ? pp_info->irq_flags : 0; + /* Parse device tree data if available */ + if (np) { + u32 pio_mode = 0; + of_property_read_u32(np, "reg-shift", ®_shift); + if (of_property_read_u32(np, "pio-mode", &pio_mode) == 0) + dev_info(&pdev->dev, "pio-mode unspecified, assuming PIO0\n"); + if (pio_mode > 6) { + dev_err(&pdev->dev, "invalid pio-mode\n"); + return -EINVAL; + } + local_pio_mask = (1 << (pio_mode + 1)) - 1; + } + + /* Platform data takes precedence if available */ + if (pp_info) + reg_shift = pp_info->ioport_shift; + return __pata_platform_probe(&pdev->dev, io_res, ctl_res, irq_res, - pp_info ? pp_info->ioport_shift : 0, - pio_mask); + reg_shift, local_pio_mask); } static int __devexit pata_platform_remove(struct platform_device *pdev) @@ -253,6 +296,7 @@ static struct platform_driver pata_platform_driver = { .driver = { .name = DRV_NAME, .owner = THIS_MODULE, + .of_match_table = pata_platform_match, }, }; diff --git a/include/linux/ata_platform.h b/include/linux/ata_platform.h index 9a26c83..1e83a7f 100644 --- a/include/linux/ata_platform.h +++ b/include/linux/ata_platform.h @@ -15,15 +15,6 @@ struct pata_platform_info { unsigned int irq_flags; }; -extern int __devinit __pata_platform_probe(struct device *dev, - struct resource *io_res, - struct resource *ctl_res, - struct resource *irq_res, - unsigned int ioport_shift, - int __pio_mask); - -extern int __devexit __pata_platform_remove(struct device *dev); - /* * Marvell SATA private data */
There is no need for two drivers anymore Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Cc: Dave Martin <dave.martin@linaro.org> COMPILE TESTED ONLY --- [resend - I flubbed Dave's email address] Dave, as I mentioned in the other thread, this is the patch that I hacked together to get rid of pata_of_platform.c. Can you take over on this patch please? drivers/ata/pata_of_platform.c | 116 ---------------------------------------- drivers/ata/pata_platform.c | 60 ++++++++++++++++++--- include/linux/ata_platform.h | 9 --- 3 files changed, 52 insertions(+), 133 deletions(-) delete mode 100644 drivers/ata/pata_of_platform.c -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html