Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45f780a0 authored by Cory Maccarrone's avatar Cory Maccarrone Committed by Tony Lindgren
Browse files

omap1: omap_udc: Add clocking and disable vbus sense for omap7xx



The l3_ocpi_ck clock is needed on omap7xx processors for USB.
Additionally, bit 8 of the SOFT_REQ_REG needs to be enabled for
the usb_dc_ck on omap7xx, which is a different bit than that
of the omap16xx-defined clock of the same name.

I added a provision for the usb_dc_ck and l3_ocpi_ck clocks as
dc_clk and hhc_clk, respectively, for omap7xx CPUs.  Additionally,
I added a check in machine_without_vbus_sense for all omap7xx
devices, as presently I know of no omap7xx-based devices that
have vbus sense, and it made more sense to me to use a cpu check
here than to spell out each machine one at a time.  Finally, DMA
is disabled for omap7xx, as it causes problems with these chips.

Cc: linux-usb@vger.kernel.org
Cc: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarCory Maccarrone <darkstar6262@gmail.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 490a5665
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ config ARCH_OMAP850
	depends on ARCH_OMAP1
	bool "OMAP850 Based System"
	select CPU_ARM926T
	select ARCH_OMAP_OTG

config ARCH_OMAP15XX
	depends on ARCH_OMAP1
+2 −1
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ static struct omap_clk omap_clks[] = {
	/* CK_GEN3 clocks */
	CLK(NULL,	"tc_ck",	&tc_ck.clk,	CK_16XX | CK_1510 | CK_310 | CK_7XX),
	CLK(NULL,	"tipb_ck",	&tipb_ck,	CK_1510 | CK_310),
	CLK(NULL,	"l3_ocpi_ck",	&l3_ocpi_ck,	CK_16XX),
	CLK(NULL,	"l3_ocpi_ck",	&l3_ocpi_ck,	CK_16XX | CK_7XX),
	CLK(NULL,	"tc1_ck",	&tc1_ck,	CK_16XX),
	CLK(NULL,	"tc2_ck",	&tc2_ck,	CK_16XX),
	CLK(NULL,	"dma_ck",	&dma_ck,	CK_16XX | CK_1510 | CK_310),
@@ -120,6 +120,7 @@ static struct omap_clk omap_clks[] = {
	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck1510, CK_1510 | CK_310),
	CLK(NULL,	"usb_hhc_ck",	&usb_hhc_ck16xx, CK_16XX),
	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck,	CK_16XX),
	CLK(NULL,	"usb_dc_ck",	&usb_dc_ck7xx,	CK_7XX),
	CLK(NULL,	"mclk",		&mclk_1510,	CK_1510 | CK_310),
	CLK(NULL,	"mclk",		&mclk_16xx,	CK_16XX),
	CLK(NULL,	"bclk",		&bclk_1510,	CK_1510 | CK_310),
+10 −0
Original line number Diff line number Diff line
@@ -574,6 +574,16 @@ static struct clk usb_dc_ck = {
	.enable_bit	= 4,
};

static struct clk usb_dc_ck7xx = {
	.name		= "usb_dc_ck",
	.ops		= &clkops_generic,
	/* Direct from ULPD, no parent */
	.rate		= 48000000,
	.flags		= RATE_FIXED,
	.enable_reg	= OMAP1_IO_ADDRESS(SOFT_REQ_REG),
	.enable_bit	= 8,
};

static struct clk mclk_1510 = {
	.name		= "mclk",
	.ops		= &clkops_generic,
+14 −6
Original line number Diff line number Diff line
@@ -159,11 +159,14 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
		 *  - OTG support on this port not yet written
		 */

		/* Don't do this for omap7xx -- it causes USB to not work correctly */
		if (!cpu_is_omap7xx()) {
			l = omap_readl(USB_TRANSCEIVER_CTRL);
			l &= ~(7 << 4);
			if (!is_device)
				l |= (3 << 1);
			omap_writel(l, USB_TRANSCEIVER_CTRL);
		}

		return 3 << 16;
	}
@@ -603,7 +606,12 @@ omap_otg_init(struct omap_usb_config *config)
	if (config->otg || config->register_dev) {
		syscon &= ~DEV_IDLE_EN;
		udc_device.dev.platform_data = config;
		/* FIXME patch IRQ numbers for omap730 */
		/* IRQ numbers for omap7xx */
		if(cpu_is_omap7xx()) {
			udc_resources[1].start = INT_7XX_USB_GENI;
			udc_resources[2].start = INT_7XX_USB_NON_ISO;
			udc_resources[3].start = INT_7XX_USB_ISO;
		}
		status = platform_device_register(&udc_device);
		if (status)
			pr_debug("can't register UDC device, %d\n", status);
+17 −2
Original line number Diff line number Diff line
@@ -2098,6 +2098,7 @@ static inline int machine_without_vbus_sense(void)
		|| machine_is_omap_h4()
#endif
		|| machine_is_sx1()
		|| cpu_is_omap7xx() /* No known omap7xx boards with vbus sense */
		);
}

@@ -2838,6 +2839,16 @@ static int __init omap_udc_probe(struct platform_device *pdev)
		udelay(100);
	}

	if (cpu_is_omap7xx()) {
		dc_clk = clk_get(&pdev->dev, "usb_dc_ck");
		hhc_clk = clk_get(&pdev->dev, "l3_ocpi_ck");
		BUG_ON(IS_ERR(dc_clk) || IS_ERR(hhc_clk));
		/* can't use omap_udc_enable_clock yet */
		clk_enable(dc_clk);
		clk_enable(hhc_clk);
		udelay(100);
	}

	INFO("OMAP UDC rev %d.%d%s\n",
		omap_readw(UDC_REV) >> 4, omap_readw(UDC_REV) & 0xf,
		config->otg ? ", Mini-AB" : "");
@@ -2970,7 +2981,7 @@ static int __init omap_udc_probe(struct platform_device *pdev)
		goto cleanup3;
	}
#endif
	if (cpu_is_omap16xx()) {
	if (cpu_is_omap16xx() || cpu_is_omap7xx()) {
		udc->dc_clk = dc_clk;
		udc->hhc_clk = hhc_clk;
		clk_disable(hhc_clk);
@@ -3008,7 +3019,7 @@ static int __init omap_udc_probe(struct platform_device *pdev)
	if (xceiv)
		otg_put_transceiver(xceiv);

	if (cpu_is_omap16xx() || cpu_is_omap24xx()) {
	if (cpu_is_omap16xx() || cpu_is_omap24xx() || cpu_is_omap7xx()) {
		clk_disable(hhc_clk);
		clk_disable(dc_clk);
		clk_put(hhc_clk);
@@ -3115,6 +3126,10 @@ static struct platform_driver udc_driver = {

static int __init udc_init(void)
{
	/* Disable DMA for omap7xx -- it doesn't work right. */
	if (cpu_is_omap7xx())
		use_dma = 0;

	INFO("%s, version: " DRIVER_VERSION
#ifdef	USE_ISO
		" (iso)"