Merge pata_of_platform.c into pata_platform.c
PATCH 1/1 Merge pata_of_platform.c into pata_platform.c
There is no need for two drivers anymore
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
drivers/ata/pata_of_platform.c deleted +0 -116
@@ -1,116 +0,0 @@ -/* -* OF-platform PATA driver -* -* Copyright (c) 2007 MontaVista Software, Inc. -* Anton Vorontsov <[email protected]> -* -* 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 <[email protected]>" ); -MODULE_LICENSE ("GPL" );
drivers/ata/pata_platform.c +52 -8
112 lines not on this page · raw message
include/linux/ata_platform.h +0 -9
@@ -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 */
Quoted 11 lines · Grant Likely
There is no need for two drivers anymore
Signed-off-by Grant Likely <[email protected]>Cc Dave Martin <[email protected]>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
Quoted 273 lines
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.cdrivers/ata/pata_of_platform.c deleted +0
-116@@ -1,116 +0,0 @@ -/* -* OF-platform PATA driver -* -* Copyright (c) 2007 MontaVista Software, Inc. -* Anton Vorontsov <[email protected]> -* -* 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 <[email protected]>" ); -MODULE_LICENSE ("GPL" );drivers/ata/pata_platform.c +52
-8@@ -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, }, };include/linux/ata_platform.h +0
-9@@ -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 */
Quoted 9 lines · Dave Martin
Quoted 8 lines · Grant Likely
There is no need for two drivers anymore
Signed-off-by Grant Likely <[email protected]>Cc Dave Martin <[email protected]>COMPILE TESTED ONLY
---
[resend - I flubbed Dave's email address]
Quoted 7 lines
Quoted 3 lines
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.
Quoted 277 lines
Cheers
---DaveQuoted 273 lines
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.cdrivers/ata/pata_of_platform.c deleted +0
-116@@ -1,116 +0,0 @@ -/* -* OF-platform PATA driver -* -* Copyright (c) 2007 MontaVista Software, Inc. -* Anton Vorontsov <[email protected]> -* -* 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 <[email protected]>" ); -MODULE_LICENSE ("GPL" );drivers/ata/pata_platform.c +52
-8@@ -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, }, };include/linux/ata_platform.h +0
-9@@ -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 */
Quoted 16 lines · Grant Likely
Quoted 15 lines · Dave Martin
Quoted 11 lines · Grant Likely
There is no need for two drivers anymore
Signed-off-by Grant Likely <[email protected]>Cc Dave Martin <[email protected]>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.
Quoted 8 lines
Quoted 1 line
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
KconfigorMakefileand it needs some more due diligence to review and make sure that thepata_of_platformfunctionality has moved intopata_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