OF-platform PATA driver
v3 cover OF-platform PATA driver
Hi all,
Here is the third version of the OF-platform PATA driver and related patches.
Changes since v2:
- "PPC" added to PATA_PLATFORM "depends on" Kconfig entry; I didn't remove EMBEDDED "depends on" -- this wasn't discussed much and these patches should not depend on the decision.
- cosmetic fixes;
- "s/ioport_shift/reg_shift/g" patch dropped.
Changes since v1:
- __pata_platform_probe now accepts pio_mask argument;
- pata-platform compatible property renamed to ata-generic;
- pata_of_platform understands pio-mode property. It's used to pass pio_mask to the __pata_platform_probe. That is, in ata-generic context pio-mode means "pio mode the bus already configured for";
- New optional patch that renames pata_platform_info's ioport_shift to reg_shift.
Changes since RFC:
- nuked drivers/ata/pata_platform.h;
- powerpc bits: proper localbus node added.
Signature · 4 lines
Anton Vorontsov email: [email protected] backup email: [email protected] irc://irc.freenode.net/bd2
PATCH v3 1/3 pata_platform: make probe and remove functions device type neutral
Split pata_platform_{probe,remove} into two pieces:
1. pata_platform_{probe,remove} -- platform_device-dependant bits;
2. __ptata_platform_{probe,remove} -- device type neutral bits.
This is done to not duplicate code for the OF-platform driver.
--- drivers/ata/pata_platform.c | 144 ++++++++++++++++++++++++---------------- include/linux/pata_platform.h | 9 +++ 2 files changed, 95 insertions(+), 58 deletions(-)
drivers/ata/pata_platform.c +86 -58
@@ -93,14 +93,9 @@ static struct ata_port_operations pata_platform_port_ops = { };static void pata_platform_setup_port (struct ata_ioports *ioaddr, -struct pata_platform_info *info) +unsigned int shift) { -unsigned int shift =0 ; -/* Fixup the port shift for platforms that need it */ -if (info && info->ioport_shift) - shift = info->ioport_shift; - ioaddr->data_addr = ioaddr->cmd_addr + (ATA_REG_DATA << shift); ioaddr->error_addr = ioaddr->cmd_addr + (ATA_REG_ERR << shift); ioaddr->feature_addr = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
@@ -114,8 +109,13 @@ static void pata_platform_setup_port(struct ata_ioports *ioaddr, }/** -* pata_platform_probe - attach a platform interface -* @pdev: platform device +* __pata_platform_probe - attach a platform interface +* @dev: device +* @io_res: Resource representing I/O base +* @ctl_res: Resource representing CTL base +* @irq_res: Resource representing IRQ and its flags +* @ioport_shift: I/O port shift +* @__pio_mask: PIO mask * * Register a platform bus IDE interface. Such interfaces are PIO and we * assume do not support IRQ sharing.
@@ -135,42 +135,18 @@ static void pata_platform_setup_port(struct ata_ioports *ioaddr,* * If no IRQ resource is present, PIO polling mode is used instead. */ -static int __devinit pata_platform_probe (struct platform_device *pdev) +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) { -struct resource *io_res, *ctl_res;struct ata_host *host;struct ata_port *ap; -struct pata_platform_info *pp_info;unsigned int mmio; -int irq; - -/* -* Simple resource validation .. -*/ -if ((pdev->num_resources !=3 ) && (pdev->num_resources !=2 )) { -dev_err (&pdev->dev,"invalid number of resources\n" ); -return -EINVAL ; - } - -/* -* Get the I/O base first -*/ - io_res =platform_get_resource (pdev,IORESOURCE_IO ,0 ); -if (io_res ==NULL ) { - io_res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -if (unlikely (io_res ==NULL )) -return -EINVAL ; - } - -/* -* Then the CTL base -*/ - ctl_res =platform_get_resource (pdev,IORESOURCE_IO ,1 ); -if (ctl_res ==NULL ) { - ctl_res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); -if (unlikely (ctl_res ==NULL )) -return -EINVAL ; - } +int irq =0 ; +int irq_flags =0 ;/* * Check for MMIO
@@ -181,20 +157,21 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)/* * And the IRQ */ - irq =platform_get_irq (pdev,0 ); -if (irq <0 ) - irq =0 ;/* no irq */ +if (irq_res && irq_res->start >0 ) { + irq = irq_res->start; + irq_flags = irq_res->flags; + }/* * Now that that's out of the way, wire up the port.. */ - host =ata_host_alloc (&pdev->dev,1 ); + host =ata_host_alloc (dev,1 );if (!host)return -ENOMEM ; ap = host->ports[0 ]; ap->ops = &pata_platform_port_ops; - ap->pio_mask = pio_mask; + ap->pio_mask = __pio_mask; ap->flags |=ATA_FLAG_SLAVE_POSS ;/*
@@ -209,25 +186,24 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)* Handle the MMIO case */ if (mmio) { - ap->ioaddr.cmd_addr =devm_ioremap (&pdev->dev, io_res->start, + ap->ioaddr.cmd_addr =devm_ioremap (dev, io_res->start, io_res->end - io_res->start +1 ); - ap->ioaddr.ctl_addr =devm_ioremap (&pdev->dev, ctl_res->start, + ap->ioaddr.ctl_addr =devm_ioremap (dev, ctl_res->start, ctl_res->end - ctl_res->start +1 ); }else { - ap->ioaddr.cmd_addr =devm_ioport_map (&pdev->dev, io_res->start, + ap->ioaddr.cmd_addr =devm_ioport_map (dev, io_res->start, io_res->end - io_res->start +1 ); - ap->ioaddr.ctl_addr =devm_ioport_map (&pdev->dev, ctl_res->start, + ap->ioaddr.ctl_addr =devm_ioport_map (dev, ctl_res->start, ctl_res->end - ctl_res->start +1 ); }if (!ap->ioaddr.cmd_addr || !ap->ioaddr.ctl_addr) { -dev_err (&pdev->dev,"failed to map IO/CTL base\n" ); +dev_err (dev,"failed to map IO/CTL base\n" );return -ENOMEM ; } ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; - pp_info = pdev->dev.platform_data; -pata_platform_setup_port (&ap->ioaddr, pp_info); +pata_platform_setup_port (&ap->ioaddr, ioport_shift); ata_port_desc(ap, "%s cmd 0x%llx ctl 0x%llx", mmio ? "mmio" : "ioport", (unsigned long long)io_res->start,
@@ -235,26 +211,78 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)/* activate */ return ata_host_activate (host, irq, irq ? ata_interrupt :NULL , - pp_info ? pp_info->irq_flags :0 , - &pata_platform_sht); + irq_flags, &pata_platform_sht); } +EXPORT_SYMBOL_GPL (__pata_platform_probe);/** -* pata_platform_remove - unplug a platform interface -* @pdev: platform device +* __pata_platform_remove - unplug a platform interface +* @dev: device * * A platform bus ATA device has been unplugged. Perform the needed * cleanup. Also called on module unload for any active devices. */ -static int __devexit pata_platform_remove(struct platform_device *pdev) +int __devexit __pata_platform_remove(struct device *dev) { -struct device *dev = &pdev->dev;struct ata_host *host =dev_get_drvdata (dev);ata_host_detach (host);return 0 ; } +EXPORT_SYMBOL_GPL (__pata_platform_remove); + +static int __devinit pata_platform_probe (struct platform_device *pdev) +{ +struct resource *io_res; +struct resource *ctl_res; +struct resource *irq_res; +struct pata_platform_info *pp_info = pdev->dev.platform_data; + +/* +* Simple resource validation .. +*/ +if ((pdev->num_resources !=3 ) && (pdev->num_resources !=2 )) { +dev_err (&pdev->dev,"invalid number of resources\n" ); +return -EINVAL ; + } + +/* +* Get the I/O base first +*/ + io_res =platform_get_resource (pdev,IORESOURCE_IO ,0 ); +if (io_res ==NULL ) { + io_res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); +if (unlikely (io_res ==NULL )) +return -EINVAL ; + } + +/* +* Then the CTL base +*/ + ctl_res =platform_get_resource (pdev,IORESOURCE_IO ,1 ); +if (ctl_res ==NULL ) { + ctl_res =platform_get_resource (pdev,IORESOURCE_MEM ,1 ); +if (unlikely (ctl_res ==NULL )) +return -EINVAL ; + } + +/* +* And the IRQ +*/ + irq_res =platform_get_resource (pdev,IORESOURCE_IRQ ,0 ); +if (irq_res) + irq_res->flags = pp_info ? pp_info->irq_flags :0 ; + +return __pata_platform_probe (&pdev->dev, io_res, ctl_res, irq_res, + pp_info ? pp_info->ioport_shift :0 , + pio_mask); +} + +static int __devexit pata_platform_remove(struct platform_device *pdev) +{ +return __pata_platform_remove (&pdev->dev); +}static struct platform_driver pata_platform_driver = { .probe = pata_platform_probe,
include/linux/pata_platform.h +9 -0
@@ -15,4 +15,13 @@ 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); +#endif /* __LINUX_PATA_PLATFORM_H */
Signature · 1 line
1.5.2.2
Re: [PATCH 1/3] [libata] pata_platform: make probe and remove functions device type neutral
Quoted 8 lines · Anton Vorontsov
Split pata_platform_{probe,remove} into two pieces:
1. pata_platform_{probe,remove} -- platform_device-dependant bits;
2. __ptata_platform_{probe,remove} -- device type neutral bits.This is done to not duplicate code for the OF-platform driver.
Signed-off-by Anton Vorontsov <[email protected]>Acked-by Olof Johansson <[email protected]>
Looks fine to me now, thanks for cleaning it up Anton.
PATCH v3 2/3 pata_of_platform: OF-Platform PATA device driver
In reply to Anton VorontsovThis driver nicely wraps around pata_platform library functions, and provides OF platform bus bindings to the PATA devices.
Also add || PPC to the PATA_PLATFORM's "depends on" Kconfig entry, needed for PA Semi Electra.
--- drivers/ata/Kconfig | 12 ++++- drivers/ata/Makefile | 1 + drivers/ata/pata_of_platform.c | 104 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletions(-) create mode 100644 drivers/ata/pata_of_platform.c
drivers/ata/Kconfig +11 -1
@@ -607,13 +607,23 @@ config PATA_WINBOND_VLB config PATA_PLATFORM tristate "Generic platform device PATA support" - depends on EMBEDDED || ARCH_RPC + depends on EMBEDDED || ARCH_RPC || PPC help This option enables support for generic directly connected ATA devices commonly found on embedded systems. If unsure, say N. +config PATA_OF_PLATFORM + tristate "OpenFirmware platform device PATA support" + depends on PATA_PLATFORM && PPC_OF + help + This option enables support for generic directly connected ATA + devices commonly found on embedded systems with OpenFirmware + bindings. + + If unsure, say N. + config PATA_ICSIDE tristate "Acorn ICS PATA support" depends on ARM && ARCH_ACORN
drivers/ata/Makefile +1 -0
@@ -67,6 +67,7 @@ obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp4xx_cf.o obj-$(CONFIG_PATA_SCC) += pata_scc.o obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o +obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o # Should be last but two libata driver obj-$(CONFIG_PATA_ACPI) += pata_acpi.o
drivers/ata/pata_of_platform.c new file +104 -0
104 lines not on this page · raw message
Signature · 1 line
1.5.2.2
Re: [PATCH 2/3] [libata] pata_of_platform: OF-Platform PATA device driver
drivers/ata/pata_of_platform.c line 50
Quoted 2 lines · On Fri, 14 Dec 2007 21:24:38 +0300 Anton Vorontsov <[email protected]>…
drivers/ata/pata_of_platform.c new file +1
-0+ prop = (u32 *)of_get_property (dn,"reg-shift" ,NULL );
This cast is unnecessary.
drivers/ata/pata_of_platform.c line 54
Quoted 4 lines
drivers/ata/pata_of_platform.c new file +4
-0+if (prop) + reg_shift = *prop; + + prop = (u32 *)of_get_property (dn,"pio-mode" ,NULL );
So is this one.
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
Anton Vorontsov
Reviewed-by Olof JohanssonRe: [PATCH 2/3] [libata] pata_of_platform: OF-Platform PATA device driver
Quoted 6 lines · Stephen Rothwell
Review
Quoted 2 lines · On Fri, 14 Dec 2007 21:24:38 +0300 Anton Vorontsov <[email protected]>…
(quoted diff) +1
-0+ prop = (u32 *)of_get_property(dn, "reg-shift", NULL);This cast is unnecessary.
Quoted 6 lines
Review
Quoted 4 lines
(quoted diff) +4
-0+ if (prop) + reg_shift = *prop; + + prop = (u32 *)of_get_property(dn, "pio-mode", NULL);So is this one.
Thanks. I changed "prop" to const but obviously forgot to remove casts.
- - - -
From: Anton Vorontsov <[email protected]>
[libata] pata_of_platform: OF-Platform PATA device driver
This driver nicely wraps around pata_platform library functions, and provides OF platform bus bindings to the PATA devices.
Also add || PPC to the PATA_PLATFORM's "depends on" Kconfig entry, needed for PA Semi Electra.
--- drivers/ata/Kconfig | 12 ++++- drivers/ata/Makefile | 1 + drivers/ata/pata_of_platform.c | 104 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletions(-) create mode 100644 drivers/ata/pata_of_platform.c
drivers/ata/Kconfig +11 -1
@@ -607,13 +607,23 @@ config PATA_WINBOND_VLB config PATA_PLATFORM tristate "Generic platform device PATA support" - depends on EMBEDDED || ARCH_RPC + depends on EMBEDDED || ARCH_RPC || PPC help This option enables support for generic directly connected ATA devices commonly found on embedded systems. If unsure, say N. +config PATA_OF_PLATFORM + tristate "OpenFirmware platform device PATA support" + depends on PATA_PLATFORM && PPC_OF + help + This option enables support for generic directly connected ATA + devices commonly found on embedded systems with OpenFirmware + bindings. + + If unsure, say N. + config PATA_ICSIDE tristate "Acorn ICS PATA support" depends on ARM && ARCH_ACORN
drivers/ata/Makefile +1 -0
@@ -67,6 +67,7 @@ obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp4xx_cf.o obj-$(CONFIG_PATA_SCC) += pata_scc.o obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o +obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o # Should be last but two libata driver obj-$(CONFIG_PATA_ACPI) += pata_acpi.o
drivers/ata/pata_of_platform.c new file +104 -0
104 lines not on this page · raw message
Signature · 1 line
1.5.2.2
PATCH v3 3/3 MPC8349E-mITX: introduce localbus and pata nodes
In reply to Anton VorontsovThis patch adds localbus and pata nodes to use CF IDE interface on MPC8349E-mITX boards.
Patch also adds code to probe localbus.
--- arch/powerpc/boot/dts/mpc8349emitx.dts | 17 ++++++++++++++++- arch/powerpc/platforms/83xx/mpc834x_itx.c | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletions(-)
arch/powerpc/boot/dts/mpc8349emitx.dts +16 -1
@@ -249,6 +249,21 @@ device_type = "pci"; }; + localbus@e0005000 { + #address-cells = <2>; + #size-cells = <1>; + compatible = "fsl,mpc8349e-localbus", + "fsl,pq2pro-localbus"; + reg = <e0005000 d8>; + ranges = <3 0 f0000000 210>; - + pata@3,0 { + compatible = "fsl,mpc8349emitx-pata", "ata-generic"; + reg = <3 0 10 3 20c 4>; + reg-shift = <1>; + pio-mode = <6>; + interrupts = <17 8>; + interrupt-parent = <&ipic>; + }; + }; };
arch/powerpc/platforms/83xx/mpc834x_itx.c +17 -0
@@ -23,6 +23,7 @@#include <linux/delay.h> #include <linux/seq_file.h> #include <linux/root_dev.h> +#include <linux/of_platform.h> #include <asm/system.h> #include <asm/atomic.h>
@@ -37,6 +38,22 @@#include "mpc83xx.h" +static struct of_device_id mpc834x_itx_ids[] = { + { .compatible ="fsl,pq2pro-localbus" , }, + {}, +}; + +static int __init mpc834x_itx_declare_of_platform_devices (void ) +{ +if (!machine_is (mpc834x_itx)) +return 0 ; + +of_platform_bus_probe (NULL , mpc834x_itx_ids,NULL ); + +return 0 ; +} +device_initcall (mpc834x_itx_declare_of_platform_devices); +/* ************************************************************************ * * Setup the architecture
Signature · 1 line
1.5.2.2