From 12ea61ebc663a3dabf1fc72afecf4011d9caf747 Mon Sep 17 00:00:00 2001 Message-Id: <12ea61ebc663a3dabf1fc72afecf4011d9caf747.1286793231.git.amit.kucheria@linaro.org> From: Amit Kucheria Date: Mon, 11 Oct 2010 13:06:19 +0300 Subject: [PATCH] mxc: Stop passing usb phy configuration to the ehci driver Currently the phy settings are coded into generic flags, passed to the usb driver which then calls mxc_initialize_usb_hw() which dispatches the different SoCs and translates the generic flags back into SoC specific ones. Instead, make the board init code call mx*_init_usb_phy() with a pointer to a struct containing phy configuration for it's USB ports. --- arch/arm/mach-mx5/board-cpuimx51.c | 11 ++++- arch/arm/mach-mx5/board-mx51_babbage.c | 11 ++++- arch/arm/mach-mx5/board-mx51_efikamx.c | 9 +++- arch/arm/plat-mxc/ehci.c | 67 +++++++++++++++-------------- arch/arm/plat-mxc/include/mach/mxc_ehci.h | 14 ++++++- drivers/usb/host/ehci-mxc.c | 5 -- 6 files changed, 74 insertions(+), 43 deletions(-) diff --git a/arch/arm/mach-mx5/board-cpuimx51.c b/arch/arm/mach-mx5/board-cpuimx51.c index ff5d223..f8ca125 100644 --- a/arch/arm/mach-mx5/board-cpuimx51.c +++ b/arch/arm/mach-mx5/board-cpuimx51.c @@ -175,10 +175,16 @@ static int initialize_usbh1_port(struct platform_device *pdev) return 0; } +static struct mxc_usb_phy_config cpuimx51_phy_config[] = { + { 0, MXC_EHCI_INTERNAL_PHY }, + { 1, (MXC_EHCI_POWER_PINS_ENABLED | MXC_EHCI_ITC_NO_THRESHOLD) }, +}; + +static struct mxc_usb_phy_data cpuimx51_usb_data = {2, cpuimx51_phy_config}; + static struct mxc_usbh_platform_data dr_utmi_config = { .init = mx51_initialize_otg_port, .portsc = MXC_EHCI_UTMI_16BIT, - .flags = MXC_EHCI_INTERNAL_PHY, }; static struct fsl_usb2_platform_data usb_pdata = { @@ -189,7 +195,6 @@ static struct fsl_usb2_platform_data usb_pdata = { static struct mxc_usbh_platform_data usbh1_config = { .init = initialize_usbh1_port, .portsc = MXC_EHCI_MODE_ULPI, - .flags = (MXC_EHCI_POWER_PINS_ENABLED | MXC_EHCI_ITC_NO_THRESHOLD), }; static int otg_mode_host; @@ -242,6 +247,8 @@ static void __init eukrea_cpuimx51_init(void) mxc_register_device(&mxc_usbdr_udc_device, &usb_pdata); } mxc_register_device(&mxc_usbh1_device, &usbh1_config); + if (mx51_init_usb_phy(&cpuimx51_usb_data)) + pr_err("Error initialising USB phy"); #ifdef CONFIG_MACH_EUKREA_MBIMX51_BASEBOARD eukrea_mbimx51_baseboard_init(); diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-mx5/board-mx51_babbage.c index a84de02..71ca1c8 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-mx5/board-mx51_babbage.c @@ -223,10 +223,16 @@ static int initialize_usbh1_port(struct platform_device *pdev) return 0; } +static struct mxc_usb_phy_config mx51_babbage_phy_config[] = { + { 0, MXC_EHCI_INTERNAL_PHY }, + { 1, (MXC_EHCI_POWER_PINS_ENABLED | MXC_EHCI_ITC_NO_THRESHOLD) }, +}; + +static struct mxc_usb_phy_data mx51_babbage_usb_data = {2, mx51_babbage_phy_config}; + static struct mxc_usbh_platform_data dr_utmi_config = { .init = mx51_initialize_otg_port, .portsc = MXC_EHCI_UTMI_16BIT, - .flags = MXC_EHCI_INTERNAL_PHY, }; static struct fsl_usb2_platform_data usb_pdata = { @@ -237,7 +243,6 @@ static struct fsl_usb2_platform_data usb_pdata = { static struct mxc_usbh_platform_data usbh1_config = { .init = initialize_usbh1_port, .portsc = MXC_EHCI_MODE_ULPI, - .flags = (MXC_EHCI_POWER_PINS_ENABLED | MXC_EHCI_ITC_NO_THRESHOLD), }; static int otg_mode_host; @@ -281,6 +286,8 @@ static void __init mxc_board_init(void) gpio_usbh1_active(); mxc_register_device(&mxc_usbh1_device, &usbh1_config); + if (mx51_init_usb_phy(&mx51_babbage_usb_data)) + pr_err("Error initialising USB phy"); /* setback USBH1_STP to be function */ mxc_iomux_v3_setup_pad(&usbh1stp); babbage_usbhub_reset(); diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-mx5/board-mx51_efikamx.c index 5d61175..0b6b032 100644 --- a/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/arch/arm/mach-mx5/board-mx51_efikamx.c @@ -61,10 +61,15 @@ static inline void mxc_init_imx_uart(void) } #endif /* SERIAL_IMX */ +static struct mxc_usb_phy_config mx51_efikamx_phy_config[] = { + { 0, MXC_EHCI_INTERNAL_PHY }, +}; + +static struct mxc_usb_phy_data mx51_efikamx_usb_data = {1, mx51_efikamx_phy_config}; + static struct mxc_usbh_platform_data dr_utmi_config = { .init = mx51_initialize_otg_port, .portsc = MXC_EHCI_UTMI_16BIT, - .flags = MXC_EHCI_INTERNAL_PHY, }; static void __init mx51_efikamx_board_init(void) @@ -72,6 +77,8 @@ static void __init mx51_efikamx_board_init(void) mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads, ARRAY_SIZE(mx51efikamx_pads)); mxc_register_device(&mxc_usbdr_host_device, &dr_utmi_config); + if (mx51_init_usb_phy(&mx51_efikamx_usb_data)) + pr_err("Error initialising USB phy"); mxc_init_imx_uart(); } diff --git a/arch/arm/plat-mxc/ehci.c b/arch/arm/plat-mxc/ehci.c index 9915607..83edaf0 100644 --- a/arch/arm/plat-mxc/ehci.c +++ b/arch/arm/plat-mxc/ehci.c @@ -246,31 +246,34 @@ int mxc_initialize_usb_hw(int port, unsigned int flags) return 0; } #endif /* CONFIG_MACH_MX27 */ + printk(KERN_WARNING + "%s() unable to setup USBCONTROL for this CPU\n", __func__); + return -EINVAL; +} +EXPORT_SYMBOL(mxc_initialize_usb_hw); + #ifdef CONFIG_ARCH_MX51 - if (cpu_is_mx51()) { - void __iomem *usb_base; - void __iomem *usbotg_base; - void __iomem *usbother_base; - int ret = 0; +int mx51_init_usb_phy(struct mxc_usb_phy_data *phy_data) +{ + struct mxc_usb_phy_config *portconfig = phy_data->config; + void __iomem *usb_base; + void __iomem *usbotg_base; + void __iomem *usbother_base; + unsigned int flags, v; + int ret = 0; - usb_base = ioremap(MX51_OTG_BASE_ADDR, SZ_4K); - switch (port) { - case 0: /* OTG port */ - usbotg_base = usb_base + MXC_OTG_OFFSET; - break; - case 1: /* Host 1 port */ - usbotg_base = usb_base + MXC_H1_OFFSET; - break; - default: - printk(KERN_ERR"%s no such port %d\n", __func__, port); - ret = -ENOENT; - goto error; - } - usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET; + if ((!phy_data) || (phy_data->num <= 0) || !(portconfig)) + return -EINVAL; - switch (port) { - case 0: /*OTG port */ + usb_base = ioremap(MX51_OTG_BASE_ADDR, SZ_4K); + usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET; + + while (portconfig) { + flags = portconfig->flags; + switch (portconfig->port) { + case 0: /* Port 0 is OTG */ + usbotg_base = usb_base + MXC_OTG_OFFSET; if (flags & MXC_EHCI_INTERNAL_PHY) { v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET); @@ -288,8 +291,8 @@ int mxc_initialize_usb_hw(int port, unsigned int flags) __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET); } break; - case 1: /* Host 1 */ - /*Host ULPI */ + case 1: /* Host 1 port - ULPI */ + usbotg_base = usb_base + MXC_H1_OFFSET; v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET); if (flags & MXC_EHCI_WAKEUP_ENABLED) v &= ~(MXC_H1_UCTRL_H1WIE_BIT | MXC_H1_UCTRL_H1UIE_BIT);/* HOST1 wakeup/ULPI intr disable */ @@ -315,16 +318,16 @@ int mxc_initialize_usb_hw(int port, unsigned int flags) v &= MXC_UCMD_ITC_NO_THRESHOLD_MASK; __raw_writel(v, usbotg_base + MXC_USBCMD_OFFSET); break; + default: + printk(KERN_ERR"%s no such port %d\n", __func__, portconfig->port); + ret = -ENOENT; + goto error; } + portconfig++; + } error: - iounmap(usb_base); - return ret; - } -#endif - printk(KERN_WARNING - "%s() unable to setup USBCONTROL for this CPU\n", __func__); - return -EINVAL; + iounmap(usb_base); + return ret; } -EXPORT_SYMBOL(mxc_initialize_usb_hw); - +#endif diff --git a/arch/arm/plat-mxc/include/mach/mxc_ehci.h b/arch/arm/plat-mxc/include/mach/mxc_ehci.h index 7fc5f99..9d9f458 100644 --- a/arch/arm/plat-mxc/include/mach/mxc_ehci.h +++ b/arch/arm/plat-mxc/include/mach/mxc_ehci.h @@ -43,11 +43,23 @@ struct mxc_usbh_platform_data { int (*exit)(struct platform_device *pdev); unsigned int portsc; - unsigned int flags; struct otg_transceiver *otg; }; +/* Phy data for board */ +struct mxc_usb_phy_data { + int num; + struct mxc_usb_phy_config *config; +}; + +/* Configuration information for one USB port */ +struct mxc_usb_phy_config { + int port; + unsigned int flags; +}; + int mxc_initialize_usb_hw(int port, unsigned int flags); +int mx51_init_usb_phy(struct mxc_usb_phy_data *phy_data); #endif /* __INCLUDE_ASM_ARCH_MXC_EHCI_H */ diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index a8ad8ac..0923154 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c @@ -199,11 +199,6 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) writel(pdata->portsc, hcd->regs + PORTSC_OFFSET); mdelay(10); - /* setup specific usb hw */ - ret = mxc_initialize_usb_hw(pdev->id, pdata->flags); - if (ret < 0) - goto err_init; - /* Initialize the transceiver */ if (pdata->otg) { pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; -- 1.7.0.4