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: Cory Maccarrone <darkstar6262@gmail.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
committed by
Tony Lindgren
parent
490a566522
commit
45f780a061
@@ -11,6 +11,7 @@ config ARCH_OMAP850
|
|||||||
depends on ARCH_OMAP1
|
depends on ARCH_OMAP1
|
||||||
bool "OMAP850 Based System"
|
bool "OMAP850 Based System"
|
||||||
select CPU_ARM926T
|
select CPU_ARM926T
|
||||||
|
select ARCH_OMAP_OTG
|
||||||
|
|
||||||
config ARCH_OMAP15XX
|
config ARCH_OMAP15XX
|
||||||
depends on ARCH_OMAP1
|
depends on ARCH_OMAP1
|
||||||
|
@@ -99,7 +99,7 @@ static struct omap_clk omap_clks[] = {
|
|||||||
/* CK_GEN3 clocks */
|
/* CK_GEN3 clocks */
|
||||||
CLK(NULL, "tc_ck", &tc_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
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, "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, "tc1_ck", &tc1_ck, CK_16XX),
|
||||||
CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
|
CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
|
||||||
CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
|
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_ck1510, CK_1510 | CK_310),
|
||||||
CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),
|
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_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_1510, CK_1510 | CK_310),
|
||||||
CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
|
CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
|
||||||
CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),
|
CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),
|
||||||
|
@@ -574,6 +574,16 @@ static struct clk usb_dc_ck = {
|
|||||||
.enable_bit = 4,
|
.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 = {
|
static struct clk mclk_1510 = {
|
||||||
.name = "mclk",
|
.name = "mclk",
|
||||||
.ops = &clkops_generic,
|
.ops = &clkops_generic,
|
||||||
|
@@ -159,11 +159,14 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
|
|||||||
* - OTG support on this port not yet written
|
* - OTG support on this port not yet written
|
||||||
*/
|
*/
|
||||||
|
|
||||||
l = omap_readl(USB_TRANSCEIVER_CTRL);
|
/* Don't do this for omap7xx -- it causes USB to not work correctly */
|
||||||
l &= ~(7 << 4);
|
if (!cpu_is_omap7xx()) {
|
||||||
if (!is_device)
|
l = omap_readl(USB_TRANSCEIVER_CTRL);
|
||||||
l |= (3 << 1);
|
l &= ~(7 << 4);
|
||||||
omap_writel(l, USB_TRANSCEIVER_CTRL);
|
if (!is_device)
|
||||||
|
l |= (3 << 1);
|
||||||
|
omap_writel(l, USB_TRANSCEIVER_CTRL);
|
||||||
|
}
|
||||||
|
|
||||||
return 3 << 16;
|
return 3 << 16;
|
||||||
}
|
}
|
||||||
@@ -603,7 +606,12 @@ omap_otg_init(struct omap_usb_config *config)
|
|||||||
if (config->otg || config->register_dev) {
|
if (config->otg || config->register_dev) {
|
||||||
syscon &= ~DEV_IDLE_EN;
|
syscon &= ~DEV_IDLE_EN;
|
||||||
udc_device.dev.platform_data = config;
|
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);
|
status = platform_device_register(&udc_device);
|
||||||
if (status)
|
if (status)
|
||||||
pr_debug("can't register UDC device, %d\n", status);
|
pr_debug("can't register UDC device, %d\n", status);
|
||||||
|
@@ -2098,6 +2098,7 @@ static inline int machine_without_vbus_sense(void)
|
|||||||
|| machine_is_omap_h4()
|
|| machine_is_omap_h4()
|
||||||
#endif
|
#endif
|
||||||
|| machine_is_sx1()
|
|| 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);
|
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",
|
INFO("OMAP UDC rev %d.%d%s\n",
|
||||||
omap_readw(UDC_REV) >> 4, omap_readw(UDC_REV) & 0xf,
|
omap_readw(UDC_REV) >> 4, omap_readw(UDC_REV) & 0xf,
|
||||||
config->otg ? ", Mini-AB" : "");
|
config->otg ? ", Mini-AB" : "");
|
||||||
@@ -2970,7 +2981,7 @@ known:
|
|||||||
goto cleanup3;
|
goto cleanup3;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (cpu_is_omap16xx()) {
|
if (cpu_is_omap16xx() || cpu_is_omap7xx()) {
|
||||||
udc->dc_clk = dc_clk;
|
udc->dc_clk = dc_clk;
|
||||||
udc->hhc_clk = hhc_clk;
|
udc->hhc_clk = hhc_clk;
|
||||||
clk_disable(hhc_clk);
|
clk_disable(hhc_clk);
|
||||||
@@ -3008,7 +3019,7 @@ cleanup0:
|
|||||||
if (xceiv)
|
if (xceiv)
|
||||||
otg_put_transceiver(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(hhc_clk);
|
||||||
clk_disable(dc_clk);
|
clk_disable(dc_clk);
|
||||||
clk_put(hhc_clk);
|
clk_put(hhc_clk);
|
||||||
@@ -3115,6 +3126,10 @@ static struct platform_driver udc_driver = {
|
|||||||
|
|
||||||
static int __init udc_init(void)
|
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
|
INFO("%s, version: " DRIVER_VERSION
|
||||||
#ifdef USE_ISO
|
#ifdef USE_ISO
|
||||||
" (iso)"
|
" (iso)"
|
||||||
|
Reference in New Issue
Block a user