On Wednesday 02 November 2005 1:02 am, Richard Purdie wrote:
> To allow multiple platforms to use the PXA27x OHCI driver, the platform
> code needs to be moved into the board specific files in
> arch/arm/mach-pxa. This patch does this for mainstone and adds
> preliminary hooks to allow other boards to use the driver.
>
> This has been compile tested for mainstone and successfully run on Spitz
> (Sharp Zaurus SL-C3000) with the addition of an appropriate board
> support file.
>
> Signed-off-by: Richard Purdie <[EMAIL PROTECTED]>
> Signed-off-by: Nicolas Pitre <[EMAIL PROTECTED]>
> Acked-by: David Brownell <[EMAIL PROTECTED]>
Acked again. :)
>
> Index: git/drivers/usb/host/ohci-pxa27x.c
> ===================================================================
> --- git.orig/drivers/usb/host/ohci-pxa27x.c 2005-10-30 10:57:02.000000000
> +0000
> +++ git/drivers/usb/host/ohci-pxa27x.c 2005-10-30 11:08:11.000000000
> +0000
> @@ -23,18 +23,12 @@
> #include <asm/mach-types.h>
> #include <asm/hardware.h>
> #include <asm/arch/pxa-regs.h>
> -
> -
> -#define PMM_NPS_MODE 1
> -#define PMM_GLOBAL_MODE 2
> -#define PMM_PERPORT_MODE 3
> +#include <asm/arch/ohci.h>
>
> #define PXA_UHC_MAX_PORTNUM 3
>
> #define UHCRHPS(x) __REG2( 0x4C000050, (x)<<2 )
>
> -static int pxa27x_ohci_pmm_state;
> -
> /*
> PMM_NPS_MODE -- PMM Non-power switching mode
> Ports are powered continuously.
> @@ -47,8 +41,6 @@
> */
> static int pxa27x_ohci_select_pmm( int mode )
> {
> - pxa27x_ohci_pmm_state = mode;
> -
> switch ( mode ) {
> case PMM_NPS_MODE:
> UHCRHDA |= RH_A_NPS;
> @@ -68,7 +60,6 @@
> "Invalid mode %d, set to non-power switch mode.\n",
> mode );
>
> - pxa27x_ohci_pmm_state = PMM_NPS_MODE;
> UHCRHDA |= RH_A_NPS;
> }
>
> @@ -79,8 +70,13 @@
>
> /*-------------------------------------------------------------------------*/
>
> -static void pxa27x_start_hc(struct platform_device *dev)
> +static int pxa27x_start_hc(struct device *dev)
> {
> + int retval = 0;
> + struct pxaohci_platform_data *inf;
> +
> + inf = dev->platform_data;
> +
> pxa_set_cken(CKEN10_USBHOST, 1);
>
> UHCHR |= UHCHR_FHR;
> @@ -91,21 +87,11 @@
> while (UHCHR & UHCHR_FSBIR)
> cpu_relax();
>
> - /* This could be properly abstracted away through the
> - device data the day more machines are supported and
> - their differences can be figured out correctly. */
> - if (machine_is_mainstone()) {
> - /* setup Port1 GPIO pin. */
> - pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN); /* USBHPWR1 */
> - pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */
> -
> - /* Set the Power Control Polarity Low and Power Sense
> - Polarity Low to active low. Supply power to USB ports. */
> - UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
> - ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
> + if (inf->init)
> + retval = inf->init(dev);
>
> - pxa27x_ohci_pmm_state = PMM_PERPORT_MODE;
> - }
> + if (retval < 0)
> + return retval;
>
> UHCHR &= ~UHCHR_SSE;
>
> @@ -114,10 +100,19 @@
> /* Clear any OTG Pin Hold */
> if (PSSR & PSSR_OTGPH)
> PSSR |= PSSR_OTGPH;
> +
> + return 0;
> }
>
> -static void pxa27x_stop_hc(struct platform_device *dev)
> +static void pxa27x_stop_hc(struct device *dev)
> {
> + struct pxaohci_platform_data *inf;
> +
> + inf = dev->platform_data;
> +
> + if (inf->exit)
> + inf->exit(dev);
> +
> UHCHR |= UHCHR_FHR;
> udelay(11);
> UHCHR &= ~UHCHR_FHR;
> @@ -144,22 +139,28 @@
> * through the hotplug entry's driver_data.
> *
> */
> -int usb_hcd_pxa27x_probe (const struct hc_driver *driver,
> - struct platform_device *dev)
> +int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct device *dev)
> {
> int retval;
> struct usb_hcd *hcd;
> + struct pxaohci_platform_data *inf;
> + struct platform_device *pdev = to_platform_device(dev);
> +
> + inf = dev->platform_data;
> +
> + if (!inf)
> + return -ENODEV;
>
> - if (dev->resource[1].flags != IORESOURCE_IRQ) {
> + if (pdev->resource[1].flags != IORESOURCE_IRQ) {
> pr_debug ("resource[1] is not IORESOURCE_IRQ");
> return -ENOMEM;
> }
>
> - hcd = usb_create_hcd (driver, &dev->dev, "pxa27x");
> + hcd = usb_create_hcd (driver, dev, "pxa27x");
> if (!hcd)
> return -ENOMEM;
> - hcd->rsrc_start = dev->resource[0].start;
> - hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
> + hcd->rsrc_start = pdev->resource[0].start;
> + hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
>
> if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
> pr_debug("request_mem_region failed");
> @@ -174,18 +175,22 @@
> goto err2;
> }
>
> - pxa27x_start_hc(dev);
> + if ((retval = pxa27x_start_hc(dev)) < 0) {
> + pr_debug("pxa27x_start_hc failed");
> + goto err3;
> + }
>
> /* Select Power Management Mode */
> - pxa27x_ohci_select_pmm(pxa27x_ohci_pmm_state);
> + pxa27x_ohci_select_pmm(inf->port_mode);
>
> ohci_hcd_init(hcd_to_ohci(hcd));
>
> - retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT);
> + retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT);
> if (retval == 0)
> return retval;
>
> pxa27x_stop_hc(dev);
> + err3:
> iounmap(hcd->regs);
> err2:
> release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
> @@ -208,7 +213,7 @@
> * context, normally "rmmod", "apmd", or something similar.
> *
> */
> -void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct platform_device *dev)
> +void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct device *dev)
> {
> usb_remove_hcd(hcd);
> pxa27x_stop_hc(dev);
> @@ -289,24 +294,19 @@
>
> static int ohci_hcd_pxa27x_drv_probe(struct device *dev)
> {
> - struct platform_device *pdev = to_platform_device(dev);
> - int ret;
> -
> pr_debug ("In ohci_hcd_pxa27x_drv_probe");
>
> if (usb_disabled())
> return -ENODEV;
>
> - ret = usb_hcd_pxa27x_probe(&ohci_pxa27x_hc_driver, pdev);
> - return ret;
> + return usb_hcd_pxa27x_probe(&ohci_pxa27x_hc_driver, dev);
> }
>
> static int ohci_hcd_pxa27x_drv_remove(struct device *dev)
> {
> - struct platform_device *pdev = to_platform_device(dev);
> struct usb_hcd *hcd = dev_get_drvdata(dev);
>
> - usb_hcd_pxa27x_remove(hcd, pdev);
> + usb_hcd_pxa27x_remove(hcd, dev);
> return 0;
> }
>
> Index: git/arch/arm/mach-pxa/pxa27x.c
> ===================================================================
> --- git.orig/arch/arm/mach-pxa/pxa27x.c 2005-10-30 10:56:32.000000000
> +0000
> +++ git/arch/arm/mach-pxa/pxa27x.c 2005-10-30 11:08:11.000000000 +0000
> @@ -21,6 +21,7 @@
> #include <asm/hardware.h>
> #include <asm/irq.h>
> #include <asm/arch/pxa-regs.h>
> +#include <asm/arch/ohci.h>
>
> #include "generic.h"
>
> @@ -194,6 +195,11 @@
> .resource = pxa27x_ohci_resources,
> };
>
> +void __init pxa_set_ohci_info(struct pxaohci_platform_data *info)
> +{
> + ohci_device.dev.platform_data = info;
> +}
> +
> static struct platform_device *devices[] __initdata = {
> &ohci_device,
> };
> Index: git/include/asm-arm/arch-pxa/ohci.h
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ git/include/asm-arm/arch-pxa/ohci.h 2005-10-30 11:08:11.000000000
> +0000
> @@ -0,0 +1,18 @@
> +#ifndef ASMARM_ARCH_OHCI_H
> +#define ASMARM_ARCH_OHCI_H
> +
> +struct device;
> +
> +struct pxaohci_platform_data {
> + int (*init)(struct device *);
> + void (*exit)(struct device *);
> +
> + int port_mode;
> +#define PMM_NPS_MODE 1
> +#define PMM_GLOBAL_MODE 2
> +#define PMM_PERPORT_MODE 3
> +};
> +
> +extern void pxa_set_ohci_info(struct pxaohci_platform_data *info);
> +
> +#endif
> Index: git/arch/arm/mach-pxa/mainstone.c
> ===================================================================
> --- git.orig/arch/arm/mach-pxa/mainstone.c 2005-10-30 10:56:32.000000000
> +0000
> +++ git/arch/arm/mach-pxa/mainstone.c 2005-10-30 11:10:11.000000000 +0000
> @@ -38,6 +38,7 @@
> #include <asm/arch/pxafb.h>
> #include <asm/arch/mmc.h>
> #include <asm/arch/irda.h>
> +#include <asm/arch/ohci.h>
>
> #include "generic.h"
>
> @@ -318,6 +319,25 @@
> .transceiver_mode = mainstone_irda_transceiver_mode,
> };
>
> +static int mainstone_ohci_init(struct device *dev)
> +{
> + /* setup Port1 GPIO pin. */
> + pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN); /* USBHPWR1 */
> + pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT); /* USBHPEN1 */
> +
> + /* Set the Power Control Polarity Low and Power Sense
> + Polarity Low to active low. */
> + UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
> + ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
> +
> + return 0;
> +}
> +
> +static struct pxaohci_platform_data mainstone_ohci_platform_data = {
> + .port_mode = PMM_PERPORT_MODE,
> + .init = mainstone_ohci_init,
> +};
> +
> static void __init mainstone_init(void)
> {
> /*
> @@ -338,6 +358,7 @@
>
> pxa_set_mci_info(&mainstone_mci_platform_data);
> pxa_set_ficp_info(&mainstone_ficp_platform_data);
> + pxa_set_ohci_info(&mainstone_ohci_platform_data);
> }
>
>
>
>
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel