From 1b56ef293c6acbbbef1f79786d325f901510c963 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Thu, 24 Apr 2008 21:51:52 +0300 Subject: [PATCH] USB: Generalize usb initialization for omap hw Create a generic board-file for initializing usb on omap2430 and omap3 boards. Signed-off-by: Felipe Balbi Signed-off-by: Tony Lindgren --- arch/arm/mach-omap2/Makefile | 6 +- arch/arm/mach-omap2/board-2430sdp.c | 5 +- arch/arm/mach-omap2/board-3430sdp.c | 5 +- .../{board-3430sdp-usb.c => usb-ehci.c} | 93 ++----------------- .../{board-2430sdp-usb.c => usb-musb.c} | 64 ++++++++----- include/asm-arm/arch-omap/usb-ehci.h | 35 +++++++ include/asm-arm/arch-omap/usb-musb.h | 35 +++++++ 7 files changed, 131 insertions(+), 112 deletions(-) rename arch/arm/mach-omap2/{board-3430sdp-usb.c => usb-ehci.c} (71%) rename arch/arm/mach-omap2/{board-2430sdp-usb.c => usb-musb.c} (60%) create mode 100644 include/asm-arm/arch-omap/usb-ehci.h create mode 100644 include/asm-arm/arch-omap/usb-musb.h diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index c37df1ae58a..9b6f60e5ed1 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -29,11 +29,13 @@ obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o board-h4-mmc.o obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \ board-2430sdp-flash.o \ board-sdp-hsmmc.o \ - board-2430sdp-usb.o + usb-musb.o \ + usb-ehci.o obj-$(CONFIG_MACH_OMAP_2430OSK) += board-2430osk.o obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \ board-sdp-hsmmc.o \ - board-3430sdp-usb.o \ + usb-musb.o \ + usb-ehci.o \ board-3430sdp-flash.o obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \ diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 76bbe06a26f..2018b5d3c21 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include #include #include @@ -390,7 +392,8 @@ static void __init omap_2430sdp_init(void) omap_serial_init(); sdp2430_flash_init(); - sdp2430_usb_init(); + usb_musb_init(); + usb_ehci_init(); spi_register_board_info(sdp2430_spi_board_info, ARRAY_SIZE(sdp2430_spi_board_info)); diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 1eb84a6e129..060c976d42c 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include #include @@ -297,7 +299,8 @@ static void __init omap_3430sdp_init(void) ads7846_dev_init(); sdp3430_flash_init(); omap_serial_init(); - sdp3430_usb_init(); + usb_musb_init(); + usb_ehci_init(); sdp_mmc_init(); } diff --git a/arch/arm/mach-omap2/board-3430sdp-usb.c b/arch/arm/mach-omap2/usb-ehci.c similarity index 71% rename from arch/arm/mach-omap2/board-3430sdp-usb.c rename to arch/arm/mach-omap2/usb-ehci.c index 048f01702bb..ffd1108fed0 100644 --- a/arch/arm/mach-omap2/board-3430sdp-usb.c +++ b/arch/arm/mach-omap2/usb-ehci.c @@ -1,11 +1,11 @@ /* - * linux/arch/arm/mach-omap2/board-3430sdp-usb.c + * linux/arch/arm/mach-omap2/usb-ehci.c * * This file will contain the board specific details for the - * MENTOR USB OTG and Synopsys EHCI host controllers on OMAP3430 + * Synopsys EHCI host controller on OMAP3430 * - * Copyright (C) 2007 Texas Instruments - * Author: Vikram Pandita + * Copyright (C) 2008 Nokia Corporation + * Author: Felipe Balbi * * 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 @@ -25,77 +25,6 @@ #include #include -#ifdef CONFIG_USB_MUSB_SOC -static struct resource musb_resources[] = { - [0] = { - .start = OMAP34XX_HSUSB_OTG_BASE, - .end = OMAP34XX_HSUSB_OTG_BASE + SZ_8K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { /* general IRQ */ - .start = INT_243X_HS_USB_MC, - .flags = IORESOURCE_IRQ, - }, - [2] = { /* DMA IRQ */ - .start = INT_243X_HS_USB_DMA, - .flags = IORESOURCE_IRQ, - }, -}; - -static int hsotgusb_ick_on; - -static int musb_set_clock(struct clk *clk, int state) -{ - if (state) { - if (hsotgusb_ick_on > 0) - return -ENODEV; - - omap2_block_sleep(); - clk_enable(clk); - hsotgusb_ick_on = 1; - } else { - if (hsotgusb_ick_on == 0) - return -ENODEV; - - clk_disable(clk); - hsotgusb_ick_on = 0; - omap2_allow_sleep(); - } - - return 0; -} - -static struct musb_hdrc_platform_data musb_plat = { -#ifdef CONFIG_USB_MUSB_OTG - .mode = MUSB_OTG, -#elif defined(CONFIG_USB_MUSB_HDRC_HCD) - .mode = MUSB_HOST, -#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) - .mode = MUSB_PERIPHERAL, -#endif - .multipoint = 1, - .clock = "hsotgusb_ick", - .set_clock = musb_set_clock, -}; - -static u64 musb_dmamask = ~(u32)0; - -static struct platform_device musb_device = { - .name = "musb_hdrc", - .id = 0, - .dev = { - .dma_mask = &musb_dmamask, - .coherent_dma_mask = 0xffffffff, - .platform_data = &musb_plat, - }, - .num_resources = ARRAY_SIZE(musb_resources), - .resource = musb_resources, -}; -#endif - - -/* EHCI platform specific data */ - #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) static struct resource ehci_resources[] = { [0] = { @@ -217,25 +146,17 @@ static void setup_ehci_io_mux(void) #endif /* EHCI specific data */ -void __init sdp3430_usb_init(void) +void __init usb_ehci_init(void) { -#ifdef CONFIG_USB_MUSB_SOC - if (platform_device_register(&musb_device) < 0) { - printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); - return; - } -#endif - #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) - /* Setup Pin IO MUX for EHCI */ - setup_ehci_io_mux(); + if (cpu_is_omap34xx()) + setup_ehci_io_mux(); if (platform_device_register(&ehci_device) < 0) { printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n"); return; } #endif - } diff --git a/arch/arm/mach-omap2/board-2430sdp-usb.c b/arch/arm/mach-omap2/usb-musb.c similarity index 60% rename from arch/arm/mach-omap2/board-2430sdp-usb.c rename to arch/arm/mach-omap2/usb-musb.c index cfbf73e0d34..cbd59f8e81c 100644 --- a/arch/arm/mach-omap2/board-2430sdp-usb.c +++ b/arch/arm/mach-omap2/usb-musb.c @@ -1,8 +1,15 @@ /* - * linux/arch/arm/mach-omap2/board-2430sdp-usb.c + * linux/arch/arm/mach-omap2/usb-musb.c * - * Copyright (C) 2007 MontaVista Software, Inc. - * Author: Kevin Hilman + * This file will contain the board specific details for the + * MENTOR USB OTG controller on OMAP3430 + * + * Copyright (C) 2007-2008 Texas Instruments + * Copyright (C) 2008 Nokia Corporation + * Author: Vikram Pandita + * + * Generalization by: + * Felipe Balbi * * 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 @@ -14,16 +21,23 @@ #include #include #include +#include +#include #include #include #include #include +#ifdef CONFIG_USB_MUSB_SOC static struct resource musb_resources[] = { [0] = { - .start = OMAP243X_HS_BASE, - .end = OMAP243X_HS_BASE + SZ_8K - 1, + .start = cpu_is_omap34xx() + ? OMAP34XX_HSUSB_OTG_BASE + : OMAP243X_HS_BASE, + .end = cpu_is_omap34xx() + ? OMAP34XX_HSUSB_OTG_BASE + SZ_8K - 1 + : OMAP243X_HS_BASE + SZ_8K -1, .flags = IORESOURCE_MEM, }, [1] = { /* general IRQ */ @@ -36,27 +50,27 @@ static struct resource musb_resources[] = { }, }; -static int usbhs_ick_on; +static int clk_on; static int musb_set_clock(struct clk *clk, int state) { - if (state) { - if (usbhs_ick_on > 0) - return -ENODEV; + if (state) { + if (clk_on > 0) + return -ENODEV; - omap2_block_sleep(); - clk_enable(clk); - usbhs_ick_on = 1; - } else { - if (usbhs_ick_on == 0) - return -ENODEV; + omap2_block_sleep(); + clk_enable(clk); + clk_on = 1; + } else { + if (clk_on == 0) + return -ENODEV; - clk_disable(clk); - usbhs_ick_on = 0; - omap2_allow_sleep(); - } + clk_disable(clk); + clk_on = 0; + omap2_allow_sleep(); + } - return 0; + return 0; } static struct musb_hdrc_platform_data musb_plat = { @@ -68,7 +82,9 @@ static struct musb_hdrc_platform_data musb_plat = { .mode = MUSB_PERIPHERAL, #endif .multipoint = 1, - .clock = "usbhs_ick", + .clock = cpu_is_omap34xx() + ? "hsotgusb_ick" + : "usbhs_ick", .set_clock = musb_set_clock, }; @@ -85,12 +101,16 @@ static struct platform_device musb_device = { .num_resources = ARRAY_SIZE(musb_resources), .resource = musb_resources, }; +#endif + -void __init sdp2430_usb_init(void) +void __init usb_musb_init(void) { +#ifdef CONFIG_USB_MUSB_SOC if (platform_device_register(&musb_device) < 0) { printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); return; } +#endif } diff --git a/include/asm-arm/arch-omap/usb-ehci.h b/include/asm-arm/arch-omap/usb-ehci.h new file mode 100644 index 00000000000..2ae3eeac2b0 --- /dev/null +++ b/include/asm-arm/arch-omap/usb-ehci.h @@ -0,0 +1,35 @@ +/* + * linux/include/asm-arm/arch-omap/usb-ehci.h + * + * Hardware definitions for Synopsys EHCI host controller. + * + * Initial creation by Felipe Balbi. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __ASM_ARCH_OMAP_USB_EHCI_H +#define __ASM_ARCH_OMAP_USB_EHCI_H + +extern void usb_ehci_init(void); + +#endif /* __ASM_ARCH_OMAP_USB_EHCI_H */ + diff --git a/include/asm-arm/arch-omap/usb-musb.h b/include/asm-arm/arch-omap/usb-musb.h new file mode 100644 index 00000000000..4f0c8309668 --- /dev/null +++ b/include/asm-arm/arch-omap/usb-musb.h @@ -0,0 +1,35 @@ +/* + * linux/include/asm-arm/arch-omap/usb-musb.h + * + * Hardware definitions for Mentor Graphics MUSBMHDRC. + * + * Initial creation by Felipe Balbi. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __ASM_ARCH_OMAP_USB_MUSB_H +#define __ASM_ARCH_OMAP_USB_MUSB_H + +extern void usb_musb_init(void); + +#endif /* __ASM_ARCH_OMAP_USB_MUSB_H */ + -- 2.41.1