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"? 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