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@xxxxxxxxxxxx> > > Cc: Dave Martin <dave.martin@xxxxxxxxxx> > > 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@xxxxxxxxxxxxx> > > - * > > - * 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@xxxxxxxxxxxxx>"); > > -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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html