Commit 03491761 authored by Felipe Balbi's avatar Felipe Balbi

usb: musb: move clock handling to glue layer

musb core doesn't need to know about platform
specific details. So start moving clock
handling to platform glue layer and make
musb core agnostic about that.
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 3b702967
...@@ -1983,7 +1983,7 @@ static struct omap_clk omap2430_clks[] = { ...@@ -1983,7 +1983,7 @@ static struct omap_clk omap2430_clks[] = {
CLK("omap-aes", "ick", &aes_ick, CK_243X), CLK("omap-aes", "ick", &aes_ick, CK_243X),
CLK(NULL, "pka_ick", &pka_ick, CK_243X), CLK(NULL, "pka_ick", &pka_ick, CK_243X),
CLK(NULL, "usb_fck", &usb_fck, CK_243X), CLK(NULL, "usb_fck", &usb_fck, CK_243X),
CLK("musb-hdrc", "ick", &usbhs_ick, CK_243X), CLK("musb-omap2430", "ick", &usbhs_ick, CK_243X),
CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_243X), CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_243X),
CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_243X), CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_243X),
CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_243X), CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_243X),
......
...@@ -3306,8 +3306,8 @@ static struct omap_clk omap3xxx_clks[] = { ...@@ -3306,8 +3306,8 @@ static struct omap_clk omap3xxx_clks[] = {
CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1), CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1),
CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2), CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2),
CLK(NULL, "core_l3_ick", &core_l3_ick, CK_3XXX), CLK(NULL, "core_l3_ick", &core_l3_ick, CK_3XXX),
CLK("musb-hdrc", "ick", &hsotgusb_ick_3430es1, CK_3430ES1), CLK("musb-omap2430", "ick", &hsotgusb_ick_3430es1, CK_3430ES1),
CLK("musb-hdrc", "ick", &hsotgusb_ick_3430es2, CK_3430ES2), CLK("musb-omap2430", "ick", &hsotgusb_ick_3430es2, CK_3430ES2),
CLK(NULL, "sdrc_ick", &sdrc_ick, CK_3XXX), CLK(NULL, "sdrc_ick", &sdrc_ick, CK_3XXX),
CLK(NULL, "gpmc_fck", &gpmc_fck, CK_3XXX), CLK(NULL, "gpmc_fck", &gpmc_fck, CK_3XXX),
CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X), CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X),
...@@ -3442,8 +3442,8 @@ static struct omap_clk omap3xxx_clks[] = { ...@@ -3442,8 +3442,8 @@ static struct omap_clk omap3xxx_clks[] = {
CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX), CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX),
CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX),
CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX),
CLK("musb-hdrc", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), CLK("musb-am35x", "ick", &hsotgusb_ick_am35xx, CK_AM35XX),
CLK("musb-hdrc", "fck", &hsotgusb_fck_am35xx, CK_AM35XX), CLK("musb-am35x", "fck", &hsotgusb_fck_am35xx, CK_AM35XX),
CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX), CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX),
CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX), CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX),
}; };
......
...@@ -2953,7 +2953,7 @@ static struct omap_clk omap44xx_clks[] = { ...@@ -2953,7 +2953,7 @@ static struct omap_clk omap44xx_clks[] = {
CLK("ehci-omap.0", "usbhost_ick", &dummy_ck, CK_443X), CLK("ehci-omap.0", "usbhost_ick", &dummy_ck, CK_443X),
CLK(NULL, "otg_60m_gfclk", &otg_60m_gfclk, CK_443X), CLK(NULL, "otg_60m_gfclk", &otg_60m_gfclk, CK_443X),
CLK(NULL, "usb_otg_hs_xclk", &usb_otg_hs_xclk, CK_443X), CLK(NULL, "usb_otg_hs_xclk", &usb_otg_hs_xclk, CK_443X),
CLK("musb-hdrc", "ick", &usb_otg_hs_ick, CK_443X), CLK("musb-omap2430", "ick", &usb_otg_hs_ick, CK_443X),
CLK(NULL, "usb_phy_cm_clk32k", &usb_phy_cm_clk32k, CK_443X), CLK(NULL, "usb_phy_cm_clk32k", &usb_phy_cm_clk32k, CK_443X),
CLK(NULL, "usb_tll_hs_usb_ch2_clk", &usb_tll_hs_usb_ch2_clk, CK_443X), CLK(NULL, "usb_tll_hs_usb_ch2_clk", &usb_tll_hs_usb_ch2_clk, CK_443X),
CLK(NULL, "usb_tll_hs_usb_ch0_clk", &usb_tll_hs_usb_ch0_clk, CK_443X), CLK(NULL, "usb_tll_hs_usb_ch0_clk", &usb_tll_hs_usb_ch0_clk, CK_443X),
......
...@@ -85,6 +85,8 @@ ...@@ -85,6 +85,8 @@
struct am35x_glue { struct am35x_glue {
struct device *dev; struct device *dev;
struct platform_device *musb; struct platform_device *musb;
struct clk *phy_clk;
struct clk *clk;
}; };
static inline void phy_on(void) static inline void phy_on(void)
...@@ -402,34 +404,18 @@ static int am35x_musb_init(struct musb *musb) ...@@ -402,34 +404,18 @@ static int am35x_musb_init(struct musb *musb)
{ {
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 rev, lvl_intr, sw_reset; u32 rev, lvl_intr, sw_reset;
int status;
musb->mregs += USB_MENTOR_CORE_OFFSET; musb->mregs += USB_MENTOR_CORE_OFFSET;
clk_enable(musb->clock);
DBG(2, "musb->clock=%lud\n", clk_get_rate(musb->clock));
musb->phy_clock = clk_get(musb->controller, "fck");
if (IS_ERR(musb->phy_clock)) {
status = PTR_ERR(musb->phy_clock);
goto exit0;
}
clk_enable(musb->phy_clock);
DBG(2, "musb->phy_clock=%lud\n", clk_get_rate(musb->phy_clock));
/* Returns zero if e.g. not clocked */ /* Returns zero if e.g. not clocked */
rev = musb_readl(reg_base, USB_REVISION_REG); rev = musb_readl(reg_base, USB_REVISION_REG);
if (!rev) { if (!rev)
status = -ENODEV; return -ENODEV;
goto exit1;
}
usb_nop_xceiv_register(); usb_nop_xceiv_register();
musb->xceiv = otg_get_transceiver(); musb->xceiv = otg_get_transceiver();
if (!musb->xceiv) { if (!musb->xceiv)
status = -ENODEV; return -ENODEV;
goto exit1;
}
if (is_host_enabled(musb)) if (is_host_enabled(musb))
setup_timer(&otg_workaround, otg_timer, (unsigned long) musb); setup_timer(&otg_workaround, otg_timer, (unsigned long) musb);
...@@ -459,13 +445,8 @@ static int am35x_musb_init(struct musb *musb) ...@@ -459,13 +445,8 @@ static int am35x_musb_init(struct musb *musb)
lvl_intr = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); lvl_intr = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
lvl_intr |= AM35XX_USBOTGSS_INT_CLR; lvl_intr |= AM35XX_USBOTGSS_INT_CLR;
omap_ctrl_writel(lvl_intr, AM35XX_CONTROL_LVL_INTR_CLEAR); omap_ctrl_writel(lvl_intr, AM35XX_CONTROL_LVL_INTR_CLEAR);
return 0; return 0;
exit1:
clk_disable(musb->phy_clock);
clk_put(musb->phy_clock);
exit0:
clk_disable(musb->clock);
return status;
} }
static int am35x_musb_exit(struct musb *musb) static int am35x_musb_exit(struct musb *musb)
...@@ -478,11 +459,6 @@ static int am35x_musb_exit(struct musb *musb) ...@@ -478,11 +459,6 @@ static int am35x_musb_exit(struct musb *musb)
otg_put_transceiver(musb->xceiv); otg_put_transceiver(musb->xceiv);
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
clk_disable(musb->clock);
clk_disable(musb->phy_clock);
clk_put(musb->phy_clock);
return 0; return 0;
} }
...@@ -551,6 +527,9 @@ static int __init am35x_probe(struct platform_device *pdev) ...@@ -551,6 +527,9 @@ static int __init am35x_probe(struct platform_device *pdev)
struct platform_device *musb; struct platform_device *musb;
struct am35x_glue *glue; struct am35x_glue *glue;
struct clk *phy_clk;
struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
...@@ -565,12 +544,40 @@ static int __init am35x_probe(struct platform_device *pdev) ...@@ -565,12 +544,40 @@ static int __init am35x_probe(struct platform_device *pdev)
goto err1; goto err1;
} }
phy_clk = clk_get(&pdev->dev, "fck");
if (IS_ERR(phy_clk)) {
dev_err(&pdev->dev, "failed to get PHY clock\n");
ret = PTR_ERR(phy_clk);
goto err2;
}
clk = clk_get(&pdev->dev, "ick");
if (IS_ERR(clk)) {
dev_err(&pdev->dev, "failed to get clock\n");
ret = PTR_ERR(clk);
goto err3;
}
ret = clk_enable(phy_clk);
if (ret) {
dev_err(&pdev->dev, "failed to enable PHY clock\n");
goto err4;
}
ret = clk_enable(clk);
if (ret) {
dev_err(&pdev->dev, "failed to enable clock\n");
goto err5;
}
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &am35x_dmamask; musb->dev.dma_mask = &am35x_dmamask;
musb->dev.coherent_dma_mask = am35x_dmamask; musb->dev.coherent_dma_mask = am35x_dmamask;
glue->dev = &pdev->dev; glue->dev = &pdev->dev;
glue->musb = musb; glue->musb = musb;
glue->phy_clk = phy_clk;
glue->clk = clk;
pdata->platform_ops = &am35x_ops; pdata->platform_ops = &am35x_ops;
...@@ -580,23 +587,35 @@ static int __init am35x_probe(struct platform_device *pdev) ...@@ -580,23 +587,35 @@ static int __init am35x_probe(struct platform_device *pdev)
pdev->num_resources); pdev->num_resources);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err2; goto err6;
} }
ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add platform_data\n"); dev_err(&pdev->dev, "failed to add platform_data\n");
goto err2; goto err6;
} }
ret = platform_device_add(musb); ret = platform_device_add(musb);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register musb device\n"); dev_err(&pdev->dev, "failed to register musb device\n");
goto err2; goto err6;
} }
return 0; return 0;
err6:
clk_disable(clk);
err5:
clk_disable(phy_clk);
err4:
clk_put(clk);
err3:
clk_put(phy_clk);
err2: err2:
platform_device_put(musb); platform_device_put(musb);
...@@ -613,6 +632,10 @@ static int __exit am35x_remove(struct platform_device *pdev) ...@@ -613,6 +632,10 @@ static int __exit am35x_remove(struct platform_device *pdev)
platform_device_del(glue->musb); platform_device_del(glue->musb);
platform_device_put(glue->musb); platform_device_put(glue->musb);
clk_disable(glue->clk);
clk_disable(glue->phy_clk);
clk_put(glue->clk);
clk_put(glue->phy_clk);
kfree(glue); kfree(glue);
return 0; return 0;
......
...@@ -83,6 +83,7 @@ ...@@ -83,6 +83,7 @@
struct da8xx_glue { struct da8xx_glue {
struct device *dev; struct device *dev;
struct platform_device *musb; struct platform_device *musb;
struct clk *clk;
}; };
/* /*
...@@ -423,8 +424,6 @@ static int da8xx_musb_init(struct musb *musb) ...@@ -423,8 +424,6 @@ static int da8xx_musb_init(struct musb *musb)
musb->mregs += DA8XX_MENTOR_CORE_OFFSET; musb->mregs += DA8XX_MENTOR_CORE_OFFSET;
clk_enable(musb->clock);
/* Returns zero if e.g. not clocked */ /* Returns zero if e.g. not clocked */
rev = musb_readl(reg_base, DA8XX_USB_REVISION_REG); rev = musb_readl(reg_base, DA8XX_USB_REVISION_REG);
if (!rev) if (!rev)
...@@ -456,7 +455,6 @@ static int da8xx_musb_init(struct musb *musb) ...@@ -456,7 +455,6 @@ static int da8xx_musb_init(struct musb *musb)
musb->isr = da8xx_musb_interrupt; musb->isr = da8xx_musb_interrupt;
return 0; return 0;
fail: fail:
clk_disable(musb->clock);
return -ENODEV; return -ENODEV;
} }
...@@ -470,8 +468,6 @@ static int da8xx_musb_exit(struct musb *musb) ...@@ -470,8 +468,6 @@ static int da8xx_musb_exit(struct musb *musb)
otg_put_transceiver(musb->xceiv); otg_put_transceiver(musb->xceiv);
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
clk_disable(musb->clock);
return 0; return 0;
} }
...@@ -496,6 +492,8 @@ static int __init da8xx_probe(struct platform_device *pdev) ...@@ -496,6 +492,8 @@ static int __init da8xx_probe(struct platform_device *pdev)
struct platform_device *musb; struct platform_device *musb;
struct da8xx_glue *glue; struct da8xx_glue *glue;
struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
...@@ -510,12 +508,26 @@ static int __init da8xx_probe(struct platform_device *pdev) ...@@ -510,12 +508,26 @@ static int __init da8xx_probe(struct platform_device *pdev)
goto err1; goto err1;
} }
clk = clk_get(&pdev->dev, "usb20");
if (IS_ERR(clk)) {
dev_err(&pdev->dev, "failed to get clock\n");
ret = PTR_ERR(clk);
goto err2;
}
ret = clk_enable(clk);
if (ret) {
dev_err(&pdev->dev, "failed to enable clock\n");
goto err3;
}
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &da8xx_dmamask; musb->dev.dma_mask = &da8xx_dmamask;
musb->dev.coherent_dma_mask = da8xx_dmamask; musb->dev.coherent_dma_mask = da8xx_dmamask;
glue->dev = &pdev->dev; glue->dev = &pdev->dev;
glue->musb = musb; glue->musb = musb;
glue->clk = clk;
pdata->platform_ops = &da8xx_ops; pdata->platform_ops = &da8xx_ops;
...@@ -525,23 +537,29 @@ static int __init da8xx_probe(struct platform_device *pdev) ...@@ -525,23 +537,29 @@ static int __init da8xx_probe(struct platform_device *pdev)
pdev->num_resources); pdev->num_resources);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err2; goto err4;
} }
ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add platform_data\n"); dev_err(&pdev->dev, "failed to add platform_data\n");
goto err2; goto err4;
} }
ret = platform_device_add(musb); ret = platform_device_add(musb);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register musb device\n"); dev_err(&pdev->dev, "failed to register musb device\n");
goto err2; goto err4;
} }
return 0; return 0;
err4:
clk_disable(clk);
err3:
clk_put(clk);
err2: err2:
platform_device_put(musb); platform_device_put(musb);
...@@ -558,6 +576,8 @@ static int __exit da8xx_remove(struct platform_device *pdev) ...@@ -558,6 +576,8 @@ static int __exit da8xx_remove(struct platform_device *pdev)
platform_device_del(glue->musb); platform_device_del(glue->musb);
platform_device_put(glue->musb); platform_device_put(glue->musb);
clk_disable(glue->clk);
clk_put(glue->clk);
kfree(glue); kfree(glue);
return 0; return 0;
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
struct davinci_glue { struct davinci_glue {
struct device *dev; struct device *dev;
struct platform_device *musb; struct platform_device *musb;
struct clk *clk;
}; };
/* REVISIT (PM) we should be able to keep the PHY in low power mode most /* REVISIT (PM) we should be able to keep the PHY in low power mode most
...@@ -395,8 +396,6 @@ static int davinci_musb_init(struct musb *musb) ...@@ -395,8 +396,6 @@ static int davinci_musb_init(struct musb *musb)
musb->mregs += DAVINCI_BASE_OFFSET; musb->mregs += DAVINCI_BASE_OFFSET;
clk_enable(musb->clock);
/* returns zero if e.g. not clocked */ /* returns zero if e.g. not clocked */
revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG); revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG);
if (revision == 0) if (revision == 0)
...@@ -451,8 +450,6 @@ static int davinci_musb_init(struct musb *musb) ...@@ -451,8 +450,6 @@ static int davinci_musb_init(struct musb *musb)
return 0; return 0;
fail: fail:
clk_disable(musb->clock);
otg_put_transceiver(musb->xceiv); otg_put_transceiver(musb->xceiv);
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
return -ENODEV; return -ENODEV;
...@@ -502,8 +499,6 @@ static int davinci_musb_exit(struct musb *musb) ...@@ -502,8 +499,6 @@ static int davinci_musb_exit(struct musb *musb)
phy_off(); phy_off();
clk_disable(musb->clock);
otg_put_transceiver(musb->xceiv); otg_put_transceiver(musb->xceiv);
usb_nop_xceiv_unregister(); usb_nop_xceiv_unregister();
...@@ -529,6 +524,7 @@ static int __init davinci_probe(struct platform_device *pdev) ...@@ -529,6 +524,7 @@ static int __init davinci_probe(struct platform_device *pdev)
struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
struct platform_device *musb; struct platform_device *musb;
struct davinci_glue *glue; struct davinci_glue *glue;
struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
...@@ -544,12 +540,26 @@ static int __init davinci_probe(struct platform_device *pdev) ...@@ -544,12 +540,26 @@ static int __init davinci_probe(struct platform_device *pdev)
goto err1; goto err1;
} }
clk = clk_get(&pdev->dev, "usb");
if (IS_ERR(clk)) {
dev_err(&pdev->dev, "failed to get clock\n");
ret = PTR_ERR(clk);
goto err2;
}
ret = clk_enable(clk);
if (ret) {
dev_err(&pdev->dev, "failed to enable clock\n");
goto err3;
}
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &davinci_dmamask; musb->dev.dma_mask = &davinci_dmamask;
musb->dev.coherent_dma_mask = davinci_dmamask; musb->dev.coherent_dma_mask = davinci_dmamask;
glue->dev = &pdev->dev; glue->dev = &pdev->dev;
glue->musb = musb; glue->musb = musb;
glue->clk = clk;
pdata->platform_ops = &davinci_ops; pdata->platform_ops = &davinci_ops;
...@@ -559,23 +569,29 @@ static int __init davinci_probe(struct platform_device *pdev) ...@@ -559,23 +569,29 @@ static int __init davinci_probe(struct platform_device *pdev)
pdev->num_resources); pdev->num_resources);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err2; goto err4;
} }
ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add platform_data\n"); dev_err(&pdev->dev, "failed to add platform_data\n");
goto err2; goto err4;
} }
ret = platform_device_add(musb); ret = platform_device_add(musb);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register musb device\n"); dev_err(&pdev->dev, "failed to register musb device\n");
goto err2; goto err4;
} }
return 0; return 0;
err4:
clk_disable(clk);
err3:
clk_put(clk);
err2: err2:
platform_device_put(musb); platform_device_put(musb);
...@@ -592,6 +608,8 @@ static int __exit davinci_remove(struct platform_device *pdev) ...@@ -592,6 +608,8 @@ static int __exit davinci_remove(struct platform_device *pdev)
platform_device_del(glue->musb); platform_device_del(glue->musb);
platform_device_put(glue->musb); platform_device_put(glue->musb);
clk_disable(glue->clk);
clk_put(glue->clk);
kfree(glue); kfree(glue);
return 0; return 0;
......
...@@ -1048,8 +1048,6 @@ static void musb_shutdown(struct platform_device *pdev) ...@@ -1048,8 +1048,6 @@ static void musb_shutdown(struct platform_device *pdev)
spin_lock_irqsave(&musb->lock, flags); spin_lock_irqsave(&musb->lock, flags);
musb_platform_disable(musb); musb_platform_disable(musb);
musb_generic_disable(musb); musb_generic_disable(musb);
if (musb->clock)
clk_put(musb->clock);
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
/* FIXME power down */ /* FIXME power down */
...@@ -1994,29 +1992,13 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -1994,29 +1992,13 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
spin_lock_init(&musb->lock); spin_lock_init(&musb->lock);
musb->board_mode = plat->mode; musb->board_mode = plat->mode;
musb->board_set_power = plat->set_power; musb->board_set_power = plat->set_power;
musb->set_clock = plat->set_clock;
musb->min_power = plat->min_power; musb->min_power = plat->min_power;
musb->ops = plat->platform_ops; musb->ops = plat->platform_ops;
/* Clock usage is chip-specific ... functional clock (DaVinci,
* OMAP2430), or PHY ref (some TUSB6010 boards). All this core
* code does is make sure a clock handle is available; platform
* code manages it during start/stop and suspend/resume.
*/
if (plat->clock) {
musb->clock = clk_get(dev, plat->clock);
if (IS_ERR(musb->clock)) {
status = PTR_ERR(musb->clock);
musb->clock = NULL;
goto fail1;
}
}
/* The musb_platform_init() call: /* The musb_platform_init() call:
* - adjusts musb->mregs and musb->isr if needed, * - adjusts musb->mregs and musb->isr if needed,
* - may initialize an integrated tranceiver * - may initialize an integrated tranceiver
* - initializes musb->xceiv, usually by otg_get_transceiver() * - initializes musb->xceiv, usually by otg_get_transceiver()
* - activates clocks.
* - stops powering VBUS * - stops powering VBUS
* - assigns musb->board_set_vbus if host mode is enabled * - assigns musb->board_set_vbus if host mode is enabled
* *
...@@ -2028,7 +2010,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -2028,7 +2010,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
musb->isr = generic_interrupt; musb->isr = generic_interrupt;
status = musb_platform_init(musb); status = musb_platform_init(musb);
if (status < 0) if (status < 0)
goto fail2; goto fail1;
if (!musb->isr) { if (!musb->isr) {
status = -ENODEV; status = -ENODEV;
...@@ -2178,10 +2160,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -2178,10 +2160,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
device_init_wakeup(dev, 0); device_init_wakeup(dev, 0);
musb_platform_exit(musb); musb_platform_exit(musb);
fail2:
if (musb->clock)
clk_put(musb->clock);
fail1: fail1:
dev_err(musb->controller, dev_err(musb->controller,
"musb_init_controller failed with status %d\n", status); "musb_init_controller failed with status %d\n", status);
...@@ -2410,9 +2388,6 @@ static int musb_suspend(struct device *dev) ...@@ -2410,9 +2388,6 @@ static int musb_suspend(struct device *dev)
unsigned long flags; unsigned long flags;
struct musb *musb = dev_to_musb(&pdev->dev); struct musb *musb = dev_to_musb(&pdev->dev);
if (!musb->clock)
return 0;
spin_lock_irqsave(&musb->lock, flags); spin_lock_irqsave(&musb->lock, flags);
if (is_peripheral_active(musb)) { if (is_peripheral_active(musb)) {
...@@ -2427,10 +2402,6 @@ static int musb_suspend(struct device *dev) ...@@ -2427,10 +2402,6 @@ static int musb_suspend(struct device *dev)
musb_save_context(musb); musb_save_context(musb);
if (musb->set_clock)
musb->set_clock(musb->clock, 0);
else
clk_disable(musb->clock);
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
return 0; return 0;
} }
...@@ -2440,14 +2411,6 @@ static int musb_resume_noirq(struct device *dev) ...@@ -2440,14 +2411,6 @@ static int musb_resume_noirq(struct device *dev)
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct musb *musb = dev_to_musb(&pdev->dev); struct musb *musb = dev_to_musb(&pdev->dev);
if (!musb->clock)
return 0;
if (musb->set_clock)
musb->set_clock(musb->clock, 1);
else
clk_enable(musb->clock);
musb_restore_context(musb); musb_restore_context(musb);
/* for static cmos like DaVinci, register values were preserved /* for static cmos like DaVinci, register values were preserved
......
...@@ -384,8 +384,6 @@ struct musb_context_registers { ...@@ -384,8 +384,6 @@ struct musb_context_registers {
struct musb { struct musb {
/* device lock */ /* device lock */
spinlock_t lock; spinlock_t lock;
struct clk *clock;
struct clk *phy_clock;
const struct musb_platform_ops *ops; const struct musb_platform_ops *ops;
struct musb_context_registers context; struct musb_context_registers context;
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
struct omap2430_glue { struct omap2430_glue {
struct device *dev; struct device *dev;
struct platform_device *musb; struct platform_device *musb;
struct clk *clk;
}; };
static struct timer_list musb_idle_timer; static struct timer_list musb_idle_timer;
...@@ -277,9 +278,6 @@ static int omap2430_musb_suspend(struct musb *musb) ...@@ -277,9 +278,6 @@ static int omap2430_musb_suspend(struct musb *musb)
{ {
u32 l; u32 l;
if (!musb->clock)
return 0;
/* in any role */ /* in any role */
l = musb_readl(musb->mregs, OTG_FORCESTDBY); l = musb_readl(musb->mregs, OTG_FORCESTDBY);
l |= ENABLEFORCE; /* enable MSTANDBY */ l |= ENABLEFORCE; /* enable MSTANDBY */
...@@ -291,11 +289,6 @@ static int omap2430_musb_suspend(struct musb *musb) ...@@ -291,11 +289,6 @@ static int omap2430_musb_suspend(struct musb *musb)
otg_set_suspend(musb->xceiv, 1); otg_set_suspend(musb->xceiv, 1);
if (musb->set_clock)
musb->set_clock(musb->clock, 0);
else
clk_disable(musb->clock);
return 0; return 0;
} }
...@@ -303,16 +296,8 @@ static int omap2430_musb_resume(struct musb *musb) ...@@ -303,16 +296,8 @@ static int omap2430_musb_resume(struct musb *musb)
{ {
u32 l; u32 l;
if (!musb->clock)
return 0;
otg_set_suspend(musb->xceiv, 0); otg_set_suspend(musb->xceiv, 0);
if (musb->set_clock)
musb->set_clock(musb->clock, 1);
else
clk_enable(musb->clock);
l = musb_readl(musb->mregs, OTG_SYSCONFIG); l = musb_readl(musb->mregs, OTG_SYSCONFIG);
l &= ~ENABLEWAKEUP; /* disable wakeup */ l &= ~ENABLEWAKEUP; /* disable wakeup */
musb_writel(musb->mregs, OTG_SYSCONFIG, l); musb_writel(musb->mregs, OTG_SYSCONFIG, l);
...@@ -356,6 +341,7 @@ static int __init omap2430_probe(struct platform_device *pdev) ...@@ -356,6 +341,7 @@ static int __init omap2430_probe(struct platform_device *pdev)
struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
struct platform_device *musb; struct platform_device *musb;
struct omap2430_glue *glue; struct omap2430_glue *glue;
struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
...@@ -371,12 +357,26 @@ static int __init omap2430_probe(struct platform_device *pdev) ...@@ -371,12 +357,26 @@ static int __init omap2430_probe(struct platform_device *pdev)
goto err1; goto err1;
} }
clk = clk_get(&pdev->dev, "ick");
if (IS_ERR(clk)) {
dev_err(&pdev->dev, "failed to get clock\n");
ret = PTR_ERR(clk);
goto err2;
}
ret = clk_enable(clk);
if (ret) {
dev_err(&pdev->dev, "failed to enable clock\n");
goto err3;
}
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &omap2430_dmamask; musb->dev.dma_mask = &omap2430_dmamask;
musb->dev.coherent_dma_mask = omap2430_dmamask; musb->dev.coherent_dma_mask = omap2430_dmamask;
glue->dev = &pdev->dev; glue->dev = &pdev->dev;
glue->musb = musb; glue->musb = musb;
glue->clk = clk;
pdata->platform_ops = &omap2430_ops; pdata->platform_ops = &omap2430_ops;
...@@ -386,23 +386,29 @@ static int __init omap2430_probe(struct platform_device *pdev) ...@@ -386,23 +386,29 @@ static int __init omap2430_probe(struct platform_device *pdev)
pdev->num_resources); pdev->num_resources);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err2; goto err4;
} }
ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add platform_data\n"); dev_err(&pdev->dev, "failed to add platform_data\n");
goto err2; goto err4;
} }
ret = platform_device_add(musb); ret = platform_device_add(musb);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register musb device\n"); dev_err(&pdev->dev, "failed to register musb device\n");
goto err2; goto err4;
} }
return 0; return 0;
err4:
clk_disable(clk);
err3:
clk_put(clk);
err2: err2:
platform_device_put(musb); platform_device_put(musb);
...@@ -419,6 +425,8 @@ static int __exit omap2430_remove(struct platform_device *pdev) ...@@ -419,6 +425,8 @@ static int __exit omap2430_remove(struct platform_device *pdev)
platform_device_del(glue->musb); platform_device_del(glue->musb);
platform_device_put(glue->musb); platform_device_put(glue->musb);
clk_disable(glue->clk);
clk_put(glue->clk);
kfree(glue); kfree(glue);
return 0; return 0;
......
...@@ -281,17 +281,6 @@ static int tusb_draw_power(struct otg_transceiver *x, unsigned mA) ...@@ -281,17 +281,6 @@ static int tusb_draw_power(struct otg_transceiver *x, unsigned mA)
void __iomem *tbase = musb->ctrl_base; void __iomem *tbase = musb->ctrl_base;
u32 reg; u32 reg;
/*
* Keep clock active when enabled. Note that this is not tied to
* drawing VBUS, as with OTG mA can be less than musb->min_power.
*/
if (musb->set_clock) {
if (mA)
musb->set_clock(musb->clock, 1);
else
musb->set_clock(musb->clock, 0);
}
/* tps65030 seems to consume max 100mA, with maybe 60mA available /* tps65030 seems to consume max 100mA, with maybe 60mA available
* (measured on one board) for things other than tps and tusb. * (measured on one board) for things other than tps and tusb.
* *
...@@ -537,8 +526,6 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on) ...@@ -537,8 +526,6 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
devctl = musb_readb(musb->mregs, MUSB_DEVCTL); devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
if (is_on) { if (is_on) {
if (musb->set_clock)
musb->set_clock(musb->clock, 1);
timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE); timer = OTG_TIMER_MS(OTG_TIME_A_WAIT_VRISE);
musb->xceiv->default_a = 1; musb->xceiv->default_a = 1;
musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
...@@ -577,8 +564,6 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on) ...@@ -577,8 +564,6 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
devctl &= ~MUSB_DEVCTL_SESSION; devctl &= ~MUSB_DEVCTL_SESSION;
conf &= ~TUSB_DEV_CONF_USB_HOST_MODE; conf &= ~TUSB_DEV_CONF_USB_HOST_MODE;
if (musb->set_clock)
musb->set_clock(musb->clock, 0);
} }
prcm &= ~(TUSB_PRCM_MNGMT_15_SW_EN | TUSB_PRCM_MNGMT_33_SW_EN); prcm &= ~(TUSB_PRCM_MNGMT_15_SW_EN | TUSB_PRCM_MNGMT_33_SW_EN);
......
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