18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Platform level USB initialization for FS USB OTG controller on omap1
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2004 Texas Instruments, Inc.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/module.h>
98c2ecf20Sopenharmony_ci#include <linux/kernel.h>
108c2ecf20Sopenharmony_ci#include <linux/init.h>
118c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
128c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h>
138c2ecf20Sopenharmony_ci#include <linux/io.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <asm/irq.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include <mach/mux.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include <mach/usb.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include "common.h"
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci/* These routines should handle the standard chip-specific modes
248c2ecf20Sopenharmony_ci * for usb0/1/2 ports, covering basic mux and transceiver setup.
258c2ecf20Sopenharmony_ci *
268c2ecf20Sopenharmony_ci * Some board-*.c files will need to set up additional mux options,
278c2ecf20Sopenharmony_ci * like for suspend handling, vbus sensing, GPIOs, and the D+ pullup.
288c2ecf20Sopenharmony_ci */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci/* TESTED ON:
318c2ecf20Sopenharmony_ci *  - 1611B H2 (with usb1 mini-AB) using standard Mini-B or OTG cables
328c2ecf20Sopenharmony_ci *  - 5912 OSK OHCI (with usb0 standard-A), standard A-to-B cables
338c2ecf20Sopenharmony_ci *  - 5912 OSK UDC, with *nonstandard* A-to-A cable
348c2ecf20Sopenharmony_ci *  - 1510 Innovator UDC with bundled usb0 cable
358c2ecf20Sopenharmony_ci *  - 1510 Innovator OHCI with bundled usb1/usb2 cable
368c2ecf20Sopenharmony_ci *  - 1510 Innovator OHCI with custom usb0 cable, feeding 5V VBUS
378c2ecf20Sopenharmony_ci *  - 1710 custom development board using alternate pin group
388c2ecf20Sopenharmony_ci *  - 1710 H3 (with usb1 mini-AB) using standard Mini-B or OTG cables
398c2ecf20Sopenharmony_ci */
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define INT_USB_IRQ_GEN		IH2_BASE + 20
428c2ecf20Sopenharmony_ci#define INT_USB_IRQ_NISO	IH2_BASE + 30
438c2ecf20Sopenharmony_ci#define INT_USB_IRQ_ISO		IH2_BASE + 29
448c2ecf20Sopenharmony_ci#define INT_USB_IRQ_HGEN	INT_USB_HHC_1
458c2ecf20Sopenharmony_ci#define INT_USB_IRQ_OTG		IH2_BASE + 8
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#ifdef	CONFIG_ARCH_OMAP_OTG
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cistatic void __init
508c2ecf20Sopenharmony_ciomap_otg_init(struct omap_usb_config *config)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	u32		syscon;
538c2ecf20Sopenharmony_ci	int		alt_pingroup = 0;
548c2ecf20Sopenharmony_ci	u16		w;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	/* NOTE:  no bus or clock setup (yet?) */
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	syscon = omap_readl(OTG_SYSCON_1) & 0xffff;
598c2ecf20Sopenharmony_ci	if (!(syscon & OTG_RESET_DONE))
608c2ecf20Sopenharmony_ci		pr_debug("USB resets not complete?\n");
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	//omap_writew(0, OTG_IRQ_EN);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	/* pin muxing and transceiver pinouts */
658c2ecf20Sopenharmony_ci	if (config->pins[0] > 2)	/* alt pingroup 2 */
668c2ecf20Sopenharmony_ci		alt_pingroup = 1;
678c2ecf20Sopenharmony_ci	syscon |= config->usb0_init(config->pins[0], is_usb0_device(config));
688c2ecf20Sopenharmony_ci	syscon |= config->usb1_init(config->pins[1]);
698c2ecf20Sopenharmony_ci	syscon |= config->usb2_init(config->pins[2], alt_pingroup);
708c2ecf20Sopenharmony_ci	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1));
718c2ecf20Sopenharmony_ci	omap_writel(syscon, OTG_SYSCON_1);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	syscon = config->hmc_mode;
748c2ecf20Sopenharmony_ci	syscon |= USBX_SYNCHRO | (4 << 16) /* B_ASE0_BRST */;
758c2ecf20Sopenharmony_ci#ifdef	CONFIG_USB_OTG
768c2ecf20Sopenharmony_ci	if (config->otg)
778c2ecf20Sopenharmony_ci		syscon |= OTG_EN;
788c2ecf20Sopenharmony_ci#endif
798c2ecf20Sopenharmony_ci	pr_debug("USB_TRANSCEIVER_CTRL = %03x\n",
808c2ecf20Sopenharmony_ci		 omap_readl(USB_TRANSCEIVER_CTRL));
818c2ecf20Sopenharmony_ci	pr_debug("OTG_SYSCON_2 = %08x\n", omap_readl(OTG_SYSCON_2));
828c2ecf20Sopenharmony_ci	omap_writel(syscon, OTG_SYSCON_2);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	printk("USB: hmc %d", config->hmc_mode);
858c2ecf20Sopenharmony_ci	if (!alt_pingroup)
868c2ecf20Sopenharmony_ci		pr_cont(", usb2 alt %d wires", config->pins[2]);
878c2ecf20Sopenharmony_ci	else if (config->pins[0])
888c2ecf20Sopenharmony_ci		pr_cont(", usb0 %d wires%s", config->pins[0],
898c2ecf20Sopenharmony_ci			is_usb0_device(config) ? " (dev)" : "");
908c2ecf20Sopenharmony_ci	if (config->pins[1])
918c2ecf20Sopenharmony_ci		pr_cont(", usb1 %d wires", config->pins[1]);
928c2ecf20Sopenharmony_ci	if (!alt_pingroup && config->pins[2])
938c2ecf20Sopenharmony_ci		pr_cont(", usb2 %d wires", config->pins[2]);
948c2ecf20Sopenharmony_ci	if (config->otg)
958c2ecf20Sopenharmony_ci		pr_cont(", Mini-AB on usb%d", config->otg - 1);
968c2ecf20Sopenharmony_ci	pr_cont("\n");
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	/* leave USB clocks/controllers off until needed */
998c2ecf20Sopenharmony_ci	w = omap_readw(ULPD_SOFT_REQ);
1008c2ecf20Sopenharmony_ci	w &= ~SOFT_USB_CLK_REQ;
1018c2ecf20Sopenharmony_ci	omap_writew(w, ULPD_SOFT_REQ);
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	w = omap_readw(ULPD_CLOCK_CTRL);
1048c2ecf20Sopenharmony_ci	w &= ~USB_MCLK_EN;
1058c2ecf20Sopenharmony_ci	w |= DIS_USB_PVCI_CLK;
1068c2ecf20Sopenharmony_ci	omap_writew(w, ULPD_CLOCK_CTRL);
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci	syscon = omap_readl(OTG_SYSCON_1);
1098c2ecf20Sopenharmony_ci	syscon |= HST_IDLE_EN|DEV_IDLE_EN|OTG_IDLE_EN;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_OMAP)
1128c2ecf20Sopenharmony_ci	if (config->otg || config->register_dev) {
1138c2ecf20Sopenharmony_ci		struct platform_device *udc_device = config->udc_device;
1148c2ecf20Sopenharmony_ci		int status;
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci		syscon &= ~DEV_IDLE_EN;
1178c2ecf20Sopenharmony_ci		udc_device->dev.platform_data = config;
1188c2ecf20Sopenharmony_ci		status = platform_device_register(udc_device);
1198c2ecf20Sopenharmony_ci		if (status)
1208c2ecf20Sopenharmony_ci			pr_debug("can't register UDC device, %d\n", status);
1218c2ecf20Sopenharmony_ci	}
1228c2ecf20Sopenharmony_ci#endif
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci#if	IS_ENABLED(CONFIG_USB_OHCI_HCD)
1258c2ecf20Sopenharmony_ci	if (config->otg || config->register_host) {
1268c2ecf20Sopenharmony_ci		struct platform_device *ohci_device = config->ohci_device;
1278c2ecf20Sopenharmony_ci		int status;
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci		syscon &= ~HST_IDLE_EN;
1308c2ecf20Sopenharmony_ci		ohci_device->dev.platform_data = config;
1318c2ecf20Sopenharmony_ci		status = platform_device_register(ohci_device);
1328c2ecf20Sopenharmony_ci		if (status)
1338c2ecf20Sopenharmony_ci			pr_debug("can't register OHCI device, %d\n", status);
1348c2ecf20Sopenharmony_ci	}
1358c2ecf20Sopenharmony_ci#endif
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci#ifdef	CONFIG_USB_OTG
1388c2ecf20Sopenharmony_ci	if (config->otg) {
1398c2ecf20Sopenharmony_ci		struct platform_device *otg_device = config->otg_device;
1408c2ecf20Sopenharmony_ci		int status;
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci		syscon &= ~OTG_IDLE_EN;
1438c2ecf20Sopenharmony_ci		otg_device->dev.platform_data = config;
1448c2ecf20Sopenharmony_ci		status = platform_device_register(otg_device);
1458c2ecf20Sopenharmony_ci		if (status)
1468c2ecf20Sopenharmony_ci			pr_debug("can't register OTG device, %d\n", status);
1478c2ecf20Sopenharmony_ci	}
1488c2ecf20Sopenharmony_ci#endif
1498c2ecf20Sopenharmony_ci	pr_debug("OTG_SYSCON_1 = %08x\n", omap_readl(OTG_SYSCON_1));
1508c2ecf20Sopenharmony_ci	omap_writel(syscon, OTG_SYSCON_1);
1518c2ecf20Sopenharmony_ci}
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci#else
1548c2ecf20Sopenharmony_cistatic void omap_otg_init(struct omap_usb_config *config) {}
1558c2ecf20Sopenharmony_ci#endif
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_OMAP)
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_cistatic struct resource udc_resources[] = {
1608c2ecf20Sopenharmony_ci	/* order is significant! */
1618c2ecf20Sopenharmony_ci	{		/* registers */
1628c2ecf20Sopenharmony_ci		.start		= UDC_BASE,
1638c2ecf20Sopenharmony_ci		.end		= UDC_BASE + 0xff,
1648c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_MEM,
1658c2ecf20Sopenharmony_ci	}, {		/* general IRQ */
1668c2ecf20Sopenharmony_ci		.start		= INT_USB_IRQ_GEN,
1678c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_IRQ,
1688c2ecf20Sopenharmony_ci	}, {		/* PIO IRQ */
1698c2ecf20Sopenharmony_ci		.start		= INT_USB_IRQ_NISO,
1708c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_IRQ,
1718c2ecf20Sopenharmony_ci	}, {		/* SOF IRQ */
1728c2ecf20Sopenharmony_ci		.start		= INT_USB_IRQ_ISO,
1738c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_IRQ,
1748c2ecf20Sopenharmony_ci	},
1758c2ecf20Sopenharmony_ci};
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_cistatic u64 udc_dmamask = ~(u32)0;
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cistatic struct platform_device udc_device = {
1808c2ecf20Sopenharmony_ci	.name		= "omap_udc",
1818c2ecf20Sopenharmony_ci	.id		= -1,
1828c2ecf20Sopenharmony_ci	.dev = {
1838c2ecf20Sopenharmony_ci		.dma_mask		= &udc_dmamask,
1848c2ecf20Sopenharmony_ci		.coherent_dma_mask	= 0xffffffff,
1858c2ecf20Sopenharmony_ci	},
1868c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(udc_resources),
1878c2ecf20Sopenharmony_ci	.resource	= udc_resources,
1888c2ecf20Sopenharmony_ci};
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_cistatic inline void udc_device_init(struct omap_usb_config *pdata)
1918c2ecf20Sopenharmony_ci{
1928c2ecf20Sopenharmony_ci	/* IRQ numbers for omap7xx */
1938c2ecf20Sopenharmony_ci	if(cpu_is_omap7xx()) {
1948c2ecf20Sopenharmony_ci		udc_resources[1].start = INT_7XX_USB_GENI;
1958c2ecf20Sopenharmony_ci		udc_resources[2].start = INT_7XX_USB_NON_ISO;
1968c2ecf20Sopenharmony_ci		udc_resources[3].start = INT_7XX_USB_ISO;
1978c2ecf20Sopenharmony_ci	}
1988c2ecf20Sopenharmony_ci	pdata->udc_device = &udc_device;
1998c2ecf20Sopenharmony_ci}
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci#else
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_cistatic inline void udc_device_init(struct omap_usb_config *pdata)
2048c2ecf20Sopenharmony_ci{
2058c2ecf20Sopenharmony_ci}
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci#endif
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci#if	IS_ENABLED(CONFIG_USB_OHCI_HCD)
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci/* The dmamask must be set for OHCI to work */
2128c2ecf20Sopenharmony_cistatic u64 ohci_dmamask = ~(u32)0;
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_cistatic struct resource ohci_resources[] = {
2158c2ecf20Sopenharmony_ci	{
2168c2ecf20Sopenharmony_ci		.start	= OMAP_OHCI_BASE,
2178c2ecf20Sopenharmony_ci		.end	= OMAP_OHCI_BASE + 0xff,
2188c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2198c2ecf20Sopenharmony_ci	},
2208c2ecf20Sopenharmony_ci	{
2218c2ecf20Sopenharmony_ci		.start	= INT_USB_IRQ_HGEN,
2228c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_IRQ,
2238c2ecf20Sopenharmony_ci	},
2248c2ecf20Sopenharmony_ci};
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_cistatic struct platform_device ohci_device = {
2278c2ecf20Sopenharmony_ci	.name			= "ohci",
2288c2ecf20Sopenharmony_ci	.id			= -1,
2298c2ecf20Sopenharmony_ci	.dev = {
2308c2ecf20Sopenharmony_ci		.dma_mask		= &ohci_dmamask,
2318c2ecf20Sopenharmony_ci		.coherent_dma_mask	= 0xffffffff,
2328c2ecf20Sopenharmony_ci	},
2338c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(ohci_resources),
2348c2ecf20Sopenharmony_ci	.resource		= ohci_resources,
2358c2ecf20Sopenharmony_ci};
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_cistatic inline void ohci_device_init(struct omap_usb_config *pdata)
2388c2ecf20Sopenharmony_ci{
2398c2ecf20Sopenharmony_ci	if (cpu_is_omap7xx())
2408c2ecf20Sopenharmony_ci		ohci_resources[1].start = INT_7XX_USB_HHC_1;
2418c2ecf20Sopenharmony_ci	pdata->ohci_device = &ohci_device;
2428c2ecf20Sopenharmony_ci	pdata->ocpi_enable = &ocpi_enable;
2438c2ecf20Sopenharmony_ci}
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci#else
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistatic inline void ohci_device_init(struct omap_usb_config *pdata)
2488c2ecf20Sopenharmony_ci{
2498c2ecf20Sopenharmony_ci}
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci#endif
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci#if	defined(CONFIG_USB_OTG) && defined(CONFIG_ARCH_OMAP_OTG)
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_cistatic struct resource otg_resources[] = {
2568c2ecf20Sopenharmony_ci	/* order is significant! */
2578c2ecf20Sopenharmony_ci	{
2588c2ecf20Sopenharmony_ci		.start		= OTG_BASE,
2598c2ecf20Sopenharmony_ci		.end		= OTG_BASE + 0xff,
2608c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_MEM,
2618c2ecf20Sopenharmony_ci	}, {
2628c2ecf20Sopenharmony_ci		.start		= INT_USB_IRQ_OTG,
2638c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_IRQ,
2648c2ecf20Sopenharmony_ci	},
2658c2ecf20Sopenharmony_ci};
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_cistatic struct platform_device otg_device = {
2688c2ecf20Sopenharmony_ci	.name		= "omap_otg",
2698c2ecf20Sopenharmony_ci	.id		= -1,
2708c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(otg_resources),
2718c2ecf20Sopenharmony_ci	.resource	= otg_resources,
2728c2ecf20Sopenharmony_ci};
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cistatic inline void otg_device_init(struct omap_usb_config *pdata)
2758c2ecf20Sopenharmony_ci{
2768c2ecf20Sopenharmony_ci	if (cpu_is_omap7xx())
2778c2ecf20Sopenharmony_ci		otg_resources[1].start = INT_7XX_USB_OTG;
2788c2ecf20Sopenharmony_ci	pdata->otg_device = &otg_device;
2798c2ecf20Sopenharmony_ci}
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci#else
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_cistatic inline void otg_device_init(struct omap_usb_config *pdata)
2848c2ecf20Sopenharmony_ci{
2858c2ecf20Sopenharmony_ci}
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_ci#endif
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_cistatic u32 __init omap1_usb0_init(unsigned nwires, unsigned is_device)
2908c2ecf20Sopenharmony_ci{
2918c2ecf20Sopenharmony_ci	u32	syscon1 = 0;
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci	if (nwires == 0) {
2948c2ecf20Sopenharmony_ci		if (!cpu_is_omap15xx()) {
2958c2ecf20Sopenharmony_ci			u32 l;
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci			/* pulldown D+/D- */
2988c2ecf20Sopenharmony_ci			l = omap_readl(USB_TRANSCEIVER_CTRL);
2998c2ecf20Sopenharmony_ci			l &= ~(3 << 1);
3008c2ecf20Sopenharmony_ci			omap_writel(l, USB_TRANSCEIVER_CTRL);
3018c2ecf20Sopenharmony_ci		}
3028c2ecf20Sopenharmony_ci		return 0;
3038c2ecf20Sopenharmony_ci	}
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci	if (is_device) {
3068c2ecf20Sopenharmony_ci		if (cpu_is_omap7xx()) {
3078c2ecf20Sopenharmony_ci			omap_cfg_reg(AA17_7XX_USB_DM);
3088c2ecf20Sopenharmony_ci			omap_cfg_reg(W16_7XX_USB_PU_EN);
3098c2ecf20Sopenharmony_ci			omap_cfg_reg(W17_7XX_USB_VBUSI);
3108c2ecf20Sopenharmony_ci			omap_cfg_reg(W18_7XX_USB_DMCK_OUT);
3118c2ecf20Sopenharmony_ci			omap_cfg_reg(W19_7XX_USB_DCRST);
3128c2ecf20Sopenharmony_ci		} else
3138c2ecf20Sopenharmony_ci			omap_cfg_reg(W4_USB_PUEN);
3148c2ecf20Sopenharmony_ci	}
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci	if (nwires == 2) {
3178c2ecf20Sopenharmony_ci		u32 l;
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci		// omap_cfg_reg(P9_USB_DP);
3208c2ecf20Sopenharmony_ci		// omap_cfg_reg(R8_USB_DM);
3218c2ecf20Sopenharmony_ci
3228c2ecf20Sopenharmony_ci		if (cpu_is_omap15xx()) {
3238c2ecf20Sopenharmony_ci			/* This works on 1510-Innovator */
3248c2ecf20Sopenharmony_ci			return 0;
3258c2ecf20Sopenharmony_ci		}
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_ci		/* NOTES:
3288c2ecf20Sopenharmony_ci		 *  - peripheral should configure VBUS detection!
3298c2ecf20Sopenharmony_ci		 *  - only peripherals may use the internal D+/D- pulldowns
3308c2ecf20Sopenharmony_ci		 *  - OTG support on this port not yet written
3318c2ecf20Sopenharmony_ci		 */
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci		/* Don't do this for omap7xx -- it causes USB to not work correctly */
3348c2ecf20Sopenharmony_ci		if (!cpu_is_omap7xx()) {
3358c2ecf20Sopenharmony_ci			l = omap_readl(USB_TRANSCEIVER_CTRL);
3368c2ecf20Sopenharmony_ci			l &= ~(7 << 4);
3378c2ecf20Sopenharmony_ci			if (!is_device)
3388c2ecf20Sopenharmony_ci				l |= (3 << 1);
3398c2ecf20Sopenharmony_ci			omap_writel(l, USB_TRANSCEIVER_CTRL);
3408c2ecf20Sopenharmony_ci		}
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci		return 3 << 16;
3438c2ecf20Sopenharmony_ci	}
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci	/* alternate pin config, external transceiver */
3468c2ecf20Sopenharmony_ci	if (cpu_is_omap15xx()) {
3478c2ecf20Sopenharmony_ci		printk(KERN_ERR "no usb0 alt pin config on 15xx\n");
3488c2ecf20Sopenharmony_ci		return 0;
3498c2ecf20Sopenharmony_ci	}
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci	omap_cfg_reg(V6_USB0_TXD);
3528c2ecf20Sopenharmony_ci	omap_cfg_reg(W9_USB0_TXEN);
3538c2ecf20Sopenharmony_ci	omap_cfg_reg(W5_USB0_SE0);
3548c2ecf20Sopenharmony_ci	if (nwires != 3)
3558c2ecf20Sopenharmony_ci		omap_cfg_reg(Y5_USB0_RCV);
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ci	/* NOTE:  SPEED and SUSP aren't configured here.  OTG hosts
3588c2ecf20Sopenharmony_ci	 * may be able to use I2C requests to set those bits along
3598c2ecf20Sopenharmony_ci	 * with VBUS switching and overcurrent detection.
3608c2ecf20Sopenharmony_ci	 */
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci	if (nwires != 6) {
3638c2ecf20Sopenharmony_ci		u32 l;
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci		l = omap_readl(USB_TRANSCEIVER_CTRL);
3668c2ecf20Sopenharmony_ci		l &= ~CONF_USB2_UNI_R;
3678c2ecf20Sopenharmony_ci		omap_writel(l, USB_TRANSCEIVER_CTRL);
3688c2ecf20Sopenharmony_ci	}
3698c2ecf20Sopenharmony_ci
3708c2ecf20Sopenharmony_ci	switch (nwires) {
3718c2ecf20Sopenharmony_ci	case 3:
3728c2ecf20Sopenharmony_ci		syscon1 = 2;
3738c2ecf20Sopenharmony_ci		break;
3748c2ecf20Sopenharmony_ci	case 4:
3758c2ecf20Sopenharmony_ci		syscon1 = 1;
3768c2ecf20Sopenharmony_ci		break;
3778c2ecf20Sopenharmony_ci	case 6:
3788c2ecf20Sopenharmony_ci		syscon1 = 3;
3798c2ecf20Sopenharmony_ci		{
3808c2ecf20Sopenharmony_ci			u32 l;
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci			omap_cfg_reg(AA9_USB0_VP);
3838c2ecf20Sopenharmony_ci			omap_cfg_reg(R9_USB0_VM);
3848c2ecf20Sopenharmony_ci			l = omap_readl(USB_TRANSCEIVER_CTRL);
3858c2ecf20Sopenharmony_ci			l |= CONF_USB2_UNI_R;
3868c2ecf20Sopenharmony_ci			omap_writel(l, USB_TRANSCEIVER_CTRL);
3878c2ecf20Sopenharmony_ci		}
3888c2ecf20Sopenharmony_ci		break;
3898c2ecf20Sopenharmony_ci	default:
3908c2ecf20Sopenharmony_ci		printk(KERN_ERR "illegal usb%d %d-wire transceiver\n",
3918c2ecf20Sopenharmony_ci			0, nwires);
3928c2ecf20Sopenharmony_ci	}
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	return syscon1 << 16;
3958c2ecf20Sopenharmony_ci}
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_cistatic u32 __init omap1_usb1_init(unsigned nwires)
3988c2ecf20Sopenharmony_ci{
3998c2ecf20Sopenharmony_ci	u32	syscon1 = 0;
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci	if (!cpu_is_omap15xx() && nwires != 6) {
4028c2ecf20Sopenharmony_ci		u32 l;
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ci		l = omap_readl(USB_TRANSCEIVER_CTRL);
4058c2ecf20Sopenharmony_ci		l &= ~CONF_USB1_UNI_R;
4068c2ecf20Sopenharmony_ci		omap_writel(l, USB_TRANSCEIVER_CTRL);
4078c2ecf20Sopenharmony_ci	}
4088c2ecf20Sopenharmony_ci	if (nwires == 0)
4098c2ecf20Sopenharmony_ci		return 0;
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci	/* external transceiver */
4128c2ecf20Sopenharmony_ci	omap_cfg_reg(USB1_TXD);
4138c2ecf20Sopenharmony_ci	omap_cfg_reg(USB1_TXEN);
4148c2ecf20Sopenharmony_ci	if (nwires != 3)
4158c2ecf20Sopenharmony_ci		omap_cfg_reg(USB1_RCV);
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci	if (cpu_is_omap15xx()) {
4188c2ecf20Sopenharmony_ci		omap_cfg_reg(USB1_SEO);
4198c2ecf20Sopenharmony_ci		omap_cfg_reg(USB1_SPEED);
4208c2ecf20Sopenharmony_ci		// SUSP
4218c2ecf20Sopenharmony_ci	} else if (cpu_is_omap1610() || cpu_is_omap5912()) {
4228c2ecf20Sopenharmony_ci		omap_cfg_reg(W13_1610_USB1_SE0);
4238c2ecf20Sopenharmony_ci		omap_cfg_reg(R13_1610_USB1_SPEED);
4248c2ecf20Sopenharmony_ci		// SUSP
4258c2ecf20Sopenharmony_ci	} else if (cpu_is_omap1710()) {
4268c2ecf20Sopenharmony_ci		omap_cfg_reg(R13_1710_USB1_SE0);
4278c2ecf20Sopenharmony_ci		// SUSP
4288c2ecf20Sopenharmony_ci	} else {
4298c2ecf20Sopenharmony_ci		pr_debug("usb%d cpu unrecognized\n", 1);
4308c2ecf20Sopenharmony_ci		return 0;
4318c2ecf20Sopenharmony_ci	}
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci	switch (nwires) {
4348c2ecf20Sopenharmony_ci	case 2:
4358c2ecf20Sopenharmony_ci		goto bad;
4368c2ecf20Sopenharmony_ci	case 3:
4378c2ecf20Sopenharmony_ci		syscon1 = 2;
4388c2ecf20Sopenharmony_ci		break;
4398c2ecf20Sopenharmony_ci	case 4:
4408c2ecf20Sopenharmony_ci		syscon1 = 1;
4418c2ecf20Sopenharmony_ci		break;
4428c2ecf20Sopenharmony_ci	case 6:
4438c2ecf20Sopenharmony_ci		syscon1 = 3;
4448c2ecf20Sopenharmony_ci		omap_cfg_reg(USB1_VP);
4458c2ecf20Sopenharmony_ci		omap_cfg_reg(USB1_VM);
4468c2ecf20Sopenharmony_ci		if (!cpu_is_omap15xx()) {
4478c2ecf20Sopenharmony_ci			u32 l;
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_ci			l = omap_readl(USB_TRANSCEIVER_CTRL);
4508c2ecf20Sopenharmony_ci			l |= CONF_USB1_UNI_R;
4518c2ecf20Sopenharmony_ci			omap_writel(l, USB_TRANSCEIVER_CTRL);
4528c2ecf20Sopenharmony_ci		}
4538c2ecf20Sopenharmony_ci		break;
4548c2ecf20Sopenharmony_ci	default:
4558c2ecf20Sopenharmony_cibad:
4568c2ecf20Sopenharmony_ci		printk(KERN_ERR "illegal usb%d %d-wire transceiver\n",
4578c2ecf20Sopenharmony_ci			1, nwires);
4588c2ecf20Sopenharmony_ci	}
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci	return syscon1 << 20;
4618c2ecf20Sopenharmony_ci}
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_cistatic u32 __init omap1_usb2_init(unsigned nwires, unsigned alt_pingroup)
4648c2ecf20Sopenharmony_ci{
4658c2ecf20Sopenharmony_ci	u32	syscon1 = 0;
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	/* NOTE omap1 erratum: must leave USB2_UNI_R set if usb0 in use */
4688c2ecf20Sopenharmony_ci	if (alt_pingroup || nwires == 0)
4698c2ecf20Sopenharmony_ci		return 0;
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ci	if (!cpu_is_omap15xx() && nwires != 6) {
4728c2ecf20Sopenharmony_ci		u32 l;
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_ci		l = omap_readl(USB_TRANSCEIVER_CTRL);
4758c2ecf20Sopenharmony_ci		l &= ~CONF_USB2_UNI_R;
4768c2ecf20Sopenharmony_ci		omap_writel(l, USB_TRANSCEIVER_CTRL);
4778c2ecf20Sopenharmony_ci	}
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci	/* external transceiver */
4808c2ecf20Sopenharmony_ci	if (cpu_is_omap15xx()) {
4818c2ecf20Sopenharmony_ci		omap_cfg_reg(USB2_TXD);
4828c2ecf20Sopenharmony_ci		omap_cfg_reg(USB2_TXEN);
4838c2ecf20Sopenharmony_ci		omap_cfg_reg(USB2_SEO);
4848c2ecf20Sopenharmony_ci		if (nwires != 3)
4858c2ecf20Sopenharmony_ci			omap_cfg_reg(USB2_RCV);
4868c2ecf20Sopenharmony_ci		/* there is no USB2_SPEED */
4878c2ecf20Sopenharmony_ci	} else if (cpu_is_omap16xx()) {
4888c2ecf20Sopenharmony_ci		omap_cfg_reg(V6_USB2_TXD);
4898c2ecf20Sopenharmony_ci		omap_cfg_reg(W9_USB2_TXEN);
4908c2ecf20Sopenharmony_ci		omap_cfg_reg(W5_USB2_SE0);
4918c2ecf20Sopenharmony_ci		if (nwires != 3)
4928c2ecf20Sopenharmony_ci			omap_cfg_reg(Y5_USB2_RCV);
4938c2ecf20Sopenharmony_ci		// FIXME omap_cfg_reg(USB2_SPEED);
4948c2ecf20Sopenharmony_ci	} else {
4958c2ecf20Sopenharmony_ci		pr_debug("usb%d cpu unrecognized\n", 1);
4968c2ecf20Sopenharmony_ci		return 0;
4978c2ecf20Sopenharmony_ci	}
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_ci	// omap_cfg_reg(USB2_SUSP);
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_ci	switch (nwires) {
5028c2ecf20Sopenharmony_ci	case 2:
5038c2ecf20Sopenharmony_ci		goto bad;
5048c2ecf20Sopenharmony_ci	case 3:
5058c2ecf20Sopenharmony_ci		syscon1 = 2;
5068c2ecf20Sopenharmony_ci		break;
5078c2ecf20Sopenharmony_ci	case 4:
5088c2ecf20Sopenharmony_ci		syscon1 = 1;
5098c2ecf20Sopenharmony_ci		break;
5108c2ecf20Sopenharmony_ci	case 5:
5118c2ecf20Sopenharmony_ci		goto bad;
5128c2ecf20Sopenharmony_ci	case 6:
5138c2ecf20Sopenharmony_ci		syscon1 = 3;
5148c2ecf20Sopenharmony_ci		if (cpu_is_omap15xx()) {
5158c2ecf20Sopenharmony_ci			omap_cfg_reg(USB2_VP);
5168c2ecf20Sopenharmony_ci			omap_cfg_reg(USB2_VM);
5178c2ecf20Sopenharmony_ci		} else {
5188c2ecf20Sopenharmony_ci			u32 l;
5198c2ecf20Sopenharmony_ci
5208c2ecf20Sopenharmony_ci			omap_cfg_reg(AA9_USB2_VP);
5218c2ecf20Sopenharmony_ci			omap_cfg_reg(R9_USB2_VM);
5228c2ecf20Sopenharmony_ci			l = omap_readl(USB_TRANSCEIVER_CTRL);
5238c2ecf20Sopenharmony_ci			l |= CONF_USB2_UNI_R;
5248c2ecf20Sopenharmony_ci			omap_writel(l, USB_TRANSCEIVER_CTRL);
5258c2ecf20Sopenharmony_ci		}
5268c2ecf20Sopenharmony_ci		break;
5278c2ecf20Sopenharmony_ci	default:
5288c2ecf20Sopenharmony_cibad:
5298c2ecf20Sopenharmony_ci		printk(KERN_ERR "illegal usb%d %d-wire transceiver\n",
5308c2ecf20Sopenharmony_ci			2, nwires);
5318c2ecf20Sopenharmony_ci	}
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci	return syscon1 << 24;
5348c2ecf20Sopenharmony_ci}
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci#ifdef	CONFIG_ARCH_OMAP15XX
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_ci/* ULPD_DPLL_CTRL */
5398c2ecf20Sopenharmony_ci#define DPLL_IOB		(1 << 13)
5408c2ecf20Sopenharmony_ci#define DPLL_PLL_ENABLE		(1 << 4)
5418c2ecf20Sopenharmony_ci#define DPLL_LOCK		(1 << 0)
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ci/* ULPD_APLL_CTRL */
5448c2ecf20Sopenharmony_ci#define APLL_NDPLL_SWITCH	(1 << 0)
5458c2ecf20Sopenharmony_ci
5468c2ecf20Sopenharmony_cistatic int omap_1510_usb_ohci_notifier(struct notifier_block *nb,
5478c2ecf20Sopenharmony_ci		unsigned long event, void *data)
5488c2ecf20Sopenharmony_ci{
5498c2ecf20Sopenharmony_ci	struct device *dev = data;
5508c2ecf20Sopenharmony_ci
5518c2ecf20Sopenharmony_ci	if (event != BUS_NOTIFY_ADD_DEVICE)
5528c2ecf20Sopenharmony_ci		return NOTIFY_DONE;
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci	if (strncmp(dev_name(dev), "ohci", 4) == 0 &&
5558c2ecf20Sopenharmony_ci	    dma_direct_set_offset(dev, PHYS_OFFSET, OMAP1510_LB_OFFSET,
5568c2ecf20Sopenharmony_ci			(u64)-1))
5578c2ecf20Sopenharmony_ci		WARN_ONCE(1, "failed to set DMA offset\n");
5588c2ecf20Sopenharmony_ci	return NOTIFY_OK;
5598c2ecf20Sopenharmony_ci}
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_cistatic struct notifier_block omap_1510_usb_ohci_nb = {
5628c2ecf20Sopenharmony_ci	.notifier_call		= omap_1510_usb_ohci_notifier,
5638c2ecf20Sopenharmony_ci};
5648c2ecf20Sopenharmony_ci
5658c2ecf20Sopenharmony_cistatic void __init omap_1510_usb_init(struct omap_usb_config *config)
5668c2ecf20Sopenharmony_ci{
5678c2ecf20Sopenharmony_ci	unsigned int val;
5688c2ecf20Sopenharmony_ci	u16 w;
5698c2ecf20Sopenharmony_ci
5708c2ecf20Sopenharmony_ci	config->usb0_init(config->pins[0], is_usb0_device(config));
5718c2ecf20Sopenharmony_ci	config->usb1_init(config->pins[1]);
5728c2ecf20Sopenharmony_ci	config->usb2_init(config->pins[2], 0);
5738c2ecf20Sopenharmony_ci
5748c2ecf20Sopenharmony_ci	val = omap_readl(MOD_CONF_CTRL_0) & ~(0x3f << 1);
5758c2ecf20Sopenharmony_ci	val |= (config->hmc_mode << 1);
5768c2ecf20Sopenharmony_ci	omap_writel(val, MOD_CONF_CTRL_0);
5778c2ecf20Sopenharmony_ci
5788c2ecf20Sopenharmony_ci	printk("USB: hmc %d", config->hmc_mode);
5798c2ecf20Sopenharmony_ci	if (config->pins[0])
5808c2ecf20Sopenharmony_ci		pr_cont(", usb0 %d wires%s", config->pins[0],
5818c2ecf20Sopenharmony_ci			is_usb0_device(config) ? " (dev)" : "");
5828c2ecf20Sopenharmony_ci	if (config->pins[1])
5838c2ecf20Sopenharmony_ci		pr_cont(", usb1 %d wires", config->pins[1]);
5848c2ecf20Sopenharmony_ci	if (config->pins[2])
5858c2ecf20Sopenharmony_ci		pr_cont(", usb2 %d wires", config->pins[2]);
5868c2ecf20Sopenharmony_ci	pr_cont("\n");
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci	/* use DPLL for 48 MHz function clock */
5898c2ecf20Sopenharmony_ci	pr_debug("APLL %04x DPLL %04x REQ %04x\n", omap_readw(ULPD_APLL_CTRL),
5908c2ecf20Sopenharmony_ci			omap_readw(ULPD_DPLL_CTRL), omap_readw(ULPD_SOFT_REQ));
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_ci	w = omap_readw(ULPD_APLL_CTRL);
5938c2ecf20Sopenharmony_ci	w &= ~APLL_NDPLL_SWITCH;
5948c2ecf20Sopenharmony_ci	omap_writew(w, ULPD_APLL_CTRL);
5958c2ecf20Sopenharmony_ci
5968c2ecf20Sopenharmony_ci	w = omap_readw(ULPD_DPLL_CTRL);
5978c2ecf20Sopenharmony_ci	w |= DPLL_IOB | DPLL_PLL_ENABLE;
5988c2ecf20Sopenharmony_ci	omap_writew(w, ULPD_DPLL_CTRL);
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_ci	w = omap_readw(ULPD_SOFT_REQ);
6018c2ecf20Sopenharmony_ci	w |= SOFT_UDC_REQ | SOFT_DPLL_REQ;
6028c2ecf20Sopenharmony_ci	omap_writew(w, ULPD_SOFT_REQ);
6038c2ecf20Sopenharmony_ci
6048c2ecf20Sopenharmony_ci	while (!(omap_readw(ULPD_DPLL_CTRL) & DPLL_LOCK))
6058c2ecf20Sopenharmony_ci		cpu_relax();
6068c2ecf20Sopenharmony_ci
6078c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_OMAP)
6088c2ecf20Sopenharmony_ci	if (config->register_dev) {
6098c2ecf20Sopenharmony_ci		int status;
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci		udc_device.dev.platform_data = config;
6128c2ecf20Sopenharmony_ci		status = platform_device_register(&udc_device);
6138c2ecf20Sopenharmony_ci		if (status)
6148c2ecf20Sopenharmony_ci			pr_debug("can't register UDC device, %d\n", status);
6158c2ecf20Sopenharmony_ci		/* udc driver gates 48MHz by D+ pullup */
6168c2ecf20Sopenharmony_ci	}
6178c2ecf20Sopenharmony_ci#endif
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_ci#if	IS_ENABLED(CONFIG_USB_OHCI_HCD)
6208c2ecf20Sopenharmony_ci	if (config->register_host) {
6218c2ecf20Sopenharmony_ci		int status;
6228c2ecf20Sopenharmony_ci
6238c2ecf20Sopenharmony_ci		bus_register_notifier(&platform_bus_type,
6248c2ecf20Sopenharmony_ci				      &omap_1510_usb_ohci_nb);
6258c2ecf20Sopenharmony_ci		ohci_device.dev.platform_data = config;
6268c2ecf20Sopenharmony_ci		status = platform_device_register(&ohci_device);
6278c2ecf20Sopenharmony_ci		if (status)
6288c2ecf20Sopenharmony_ci			pr_debug("can't register OHCI device, %d\n", status);
6298c2ecf20Sopenharmony_ci		/* hcd explicitly gates 48MHz */
6308c2ecf20Sopenharmony_ci	}
6318c2ecf20Sopenharmony_ci#endif
6328c2ecf20Sopenharmony_ci}
6338c2ecf20Sopenharmony_ci
6348c2ecf20Sopenharmony_ci#else
6358c2ecf20Sopenharmony_cistatic inline void omap_1510_usb_init(struct omap_usb_config *config) {}
6368c2ecf20Sopenharmony_ci#endif
6378c2ecf20Sopenharmony_ci
6388c2ecf20Sopenharmony_civoid __init omap1_usb_init(struct omap_usb_config *_pdata)
6398c2ecf20Sopenharmony_ci{
6408c2ecf20Sopenharmony_ci	struct omap_usb_config *pdata;
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci	pdata = kmemdup(_pdata, sizeof(*pdata), GFP_KERNEL);
6438c2ecf20Sopenharmony_ci	if (!pdata)
6448c2ecf20Sopenharmony_ci		return;
6458c2ecf20Sopenharmony_ci
6468c2ecf20Sopenharmony_ci	pdata->usb0_init = omap1_usb0_init;
6478c2ecf20Sopenharmony_ci	pdata->usb1_init = omap1_usb1_init;
6488c2ecf20Sopenharmony_ci	pdata->usb2_init = omap1_usb2_init;
6498c2ecf20Sopenharmony_ci	udc_device_init(pdata);
6508c2ecf20Sopenharmony_ci	ohci_device_init(pdata);
6518c2ecf20Sopenharmony_ci	otg_device_init(pdata);
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_ci	if (cpu_is_omap7xx() || cpu_is_omap16xx())
6548c2ecf20Sopenharmony_ci		omap_otg_init(pdata);
6558c2ecf20Sopenharmony_ci	else if (cpu_is_omap15xx())
6568c2ecf20Sopenharmony_ci		omap_1510_usb_init(pdata);
6578c2ecf20Sopenharmony_ci	else
6588c2ecf20Sopenharmony_ci		printk(KERN_ERR "USB: No init for your chip yet\n");
6598c2ecf20Sopenharmony_ci}
660