Commit a57ed579 authored by Felipe Balbi's avatar Felipe Balbi Committed by Tony Lindgren

USB: MUSB: Let board specific code handle clock initialization

Instead of clk_get() in omap2430.c driver, we can let
musb_core.c do it by setting the clock id in
musb_platform_data structure.
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 70d19cc5
...@@ -13,9 +13,11 @@ ...@@ -13,9 +13,11 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/usb/musb.h> #include <linux/usb/musb.h>
#include <asm/arch/hardware.h> #include <asm/arch/hardware.h>
#include <asm/arch/pm.h>
#include <asm/arch/usb.h> #include <asm/arch/usb.h>
static struct resource musb_resources[] = { static struct resource musb_resources[] = {
...@@ -34,6 +36,29 @@ static struct resource musb_resources[] = { ...@@ -34,6 +36,29 @@ static struct resource musb_resources[] = {
}, },
}; };
static int usbhs_ick_on;
static int musb_set_clock(struct clk *clk, int state)
{
if (state) {
if (usbhs_ick_on > 0)
return -ENODEV;
omap2_block_sleep();
clk_enable(clk);
usbhs_ick_on = 1;
} else {
if (usbhs_ick_on == 0)
return -ENODEV;
clk_disable(clk);
usbhs_ick_on = 0;
omap2_allow_sleep();
}
return 0;
}
static struct musb_hdrc_platform_data musb_plat = { static struct musb_hdrc_platform_data musb_plat = {
#ifdef CONFIG_USB_MUSB_OTG #ifdef CONFIG_USB_MUSB_OTG
.mode = MUSB_OTG, .mode = MUSB_OTG,
...@@ -43,6 +68,8 @@ static struct musb_hdrc_platform_data musb_plat = { ...@@ -43,6 +68,8 @@ static struct musb_hdrc_platform_data musb_plat = {
.mode = MUSB_PERIPHERAL, .mode = MUSB_PERIPHERAL,
#endif #endif
.multipoint = 1, .multipoint = 1,
.clock = "usbhs_ick",
.set_clock = musb_set_clock,
}; };
static u64 musb_dmamask = ~(u32)0; static u64 musb_dmamask = ~(u32)0;
......
...@@ -16,11 +16,13 @@ ...@@ -16,11 +16,13 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/arch/mux.h> #include <asm/arch/mux.h>
#include <linux/usb/musb.h> #include <linux/usb/musb.h>
#include <asm/arch/hardware.h> #include <asm/arch/hardware.h>
#include <asm/arch/pm.h>
#include <asm/arch/usb.h> #include <asm/arch/usb.h>
#ifdef CONFIG_USB_MUSB_SOC #ifdef CONFIG_USB_MUSB_SOC
...@@ -40,6 +42,29 @@ static struct resource musb_resources[] = { ...@@ -40,6 +42,29 @@ static struct resource musb_resources[] = {
}, },
}; };
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 = { static struct musb_hdrc_platform_data musb_plat = {
#ifdef CONFIG_USB_MUSB_OTG #ifdef CONFIG_USB_MUSB_OTG
.mode = MUSB_OTG, .mode = MUSB_OTG,
...@@ -49,8 +74,8 @@ static struct musb_hdrc_platform_data musb_plat = { ...@@ -49,8 +74,8 @@ static struct musb_hdrc_platform_data musb_plat = {
.mode = MUSB_PERIPHERAL, .mode = MUSB_PERIPHERAL,
#endif #endif
.multipoint = 1, .multipoint = 1,
.clock = NULL, .clock = "hsotgusb_ick",
.set_clock = NULL, .set_clock = musb_set_clock,
}; };
static u64 musb_dmamask = ~(u32)0; static u64 musb_dmamask = ~(u32)0;
......
...@@ -219,13 +219,7 @@ int __init musb_platform_init(struct musb *musb) ...@@ -219,13 +219,7 @@ int __init musb_platform_init(struct musb *musb)
#if defined(CONFIG_ARCH_OMAP2430) #if defined(CONFIG_ARCH_OMAP2430)
omap_cfg_reg(AE5_2430_USB0HS_STP); omap_cfg_reg(AE5_2430_USB0HS_STP);
/* get the clock */
musb->clock = clk_get((struct device *)musb->controller, "usbhs_ick");
#else
musb->clock = clk_get((struct device *)musb->controller, "hsotgusb_ick");
#endif #endif
if(IS_ERR(musb->clock))
return PTR_ERR(musb->clock);
musb->xceiv = *xceiv; musb->xceiv = *xceiv;
musb_platform_resume(musb); musb_platform_resume(musb);
...@@ -261,13 +255,11 @@ int musb_platform_suspend(struct musb *musb) ...@@ -261,13 +255,11 @@ int musb_platform_suspend(struct musb *musb)
OTG_SYSCONFIG_REG |= AUTOIDLE; /* enable auto idle */ OTG_SYSCONFIG_REG |= AUTOIDLE; /* enable auto idle */
musb->xceiv.set_suspend(&musb->xceiv, 1); musb->xceiv.set_suspend(&musb->xceiv, 1);
clk_disable(musb->clock);
return 0; return 0;
} }
int musb_platform_resume(struct musb *musb) int musb_platform_resume(struct musb *musb)
{ {
clk_enable(musb->clock);
musb->xceiv.set_suspend(&musb->xceiv, 0); musb->xceiv.set_suspend(&musb->xceiv, 0);
OTG_FORCESTDBY_REG &= ~ENABLEFORCE; /* disable MSTANDBY */ OTG_FORCESTDBY_REG &= ~ENABLEFORCE; /* disable MSTANDBY */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment