提交 3a3f2e50 编写于 作者: G Greg Kroah-Hartman

Merge tag 'musb-for-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next

USB musb merge from Felipe:

"usb: musb: patches for v3.8 merge window

We have here the usual set of cleanups for the MUSB driver; a
big set of patches converting platform_device_del() and
platform_device_put() into platform_device_unregister().

Another big set was applied converting to module_platform_driver()
macro in order to reduce some boilerplate code from all glue
layers.

Other than that, we had a series fixing one known silicon errata
where we couldn't read a few registers. In order to fix that
we're now using shadow variables for reads and only writing
to the registers which are known to break functionality when
read."
...@@ -3,12 +3,12 @@ AM33XX MUSB GLUE ...@@ -3,12 +3,12 @@ AM33XX MUSB GLUE
- ti,hwmods : must be "usb_otg_hs" - ti,hwmods : must be "usb_otg_hs"
- multipoint : Should be "1" indicating the musb controller supports - multipoint : Should be "1" indicating the musb controller supports
multipoint. This is a MUSB configuration-specific setting. multipoint. This is a MUSB configuration-specific setting.
- num_eps : Specifies the number of endpoints. This is also a - num-eps : Specifies the number of endpoints. This is also a
MUSB configuration-specific setting. Should be set to "16" MUSB configuration-specific setting. Should be set to "16"
- ram_bits : Specifies the ram address size. Should be set to "12" - ram-bits : Specifies the ram address size. Should be set to "12"
- port0_mode : Should be "3" to represent OTG. "1" signifies HOST and "2" - port0-mode : Should be "3" to represent OTG. "1" signifies HOST and "2"
represents PERIPHERAL. represents PERIPHERAL.
- port1_mode : Should be "1" to represent HOST. "3" signifies OTG and "2" - port1-mode : Should be "1" to represent HOST. "3" signifies OTG and "2"
represents PERIPHERAL. represents PERIPHERAL.
- power : Should be "250". This signifies the controller can supply upto - power : Should be "250". This signifies the controller can supply upto
500mA when operating in host mode. 500mA when operating in host mode.
...@@ -465,7 +465,6 @@ static int __devinit am35x_probe(struct platform_device *pdev) ...@@ -465,7 +465,6 @@ static int __devinit am35x_probe(struct platform_device *pdev)
struct clk *clk; struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
int musbid;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) { if (!glue) {
...@@ -473,18 +472,10 @@ static int __devinit am35x_probe(struct platform_device *pdev) ...@@ -473,18 +472,10 @@ static int __devinit am35x_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err1;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err2; goto err1;
} }
phy_clk = clk_get(&pdev->dev, "fck"); phy_clk = clk_get(&pdev->dev, "fck");
...@@ -513,7 +504,6 @@ static int __devinit am35x_probe(struct platform_device *pdev) ...@@ -513,7 +504,6 @@ static int __devinit am35x_probe(struct platform_device *pdev)
goto err6; goto err6;
} }
musb->id = musbid;
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;
...@@ -563,9 +553,6 @@ static int __devinit am35x_probe(struct platform_device *pdev) ...@@ -563,9 +553,6 @@ static int __devinit am35x_probe(struct platform_device *pdev)
err3: err3:
platform_device_put(musb); platform_device_put(musb);
err2:
musb_put_id(&pdev->dev, musbid);
err1: err1:
kfree(glue); kfree(glue);
...@@ -577,9 +564,7 @@ static int __devexit am35x_remove(struct platform_device *pdev) ...@@ -577,9 +564,7 @@ static int __devexit am35x_remove(struct platform_device *pdev)
{ {
struct am35x_glue *glue = platform_get_drvdata(pdev); struct am35x_glue *glue = platform_get_drvdata(pdev);
musb_put_id(&pdev->dev, glue->musb->id); platform_device_unregister(glue->musb);
platform_device_del(glue->musb);
platform_device_put(glue->musb);
clk_disable(glue->clk); clk_disable(glue->clk);
clk_disable(glue->phy_clk); clk_disable(glue->phy_clk);
clk_put(glue->clk); clk_put(glue->clk);
...@@ -654,15 +639,4 @@ static struct platform_driver am35x_driver = { ...@@ -654,15 +639,4 @@ static struct platform_driver am35x_driver = {
MODULE_DESCRIPTION("AM35x MUSB Glue Layer"); MODULE_DESCRIPTION("AM35x MUSB Glue Layer");
MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>"); MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
module_platform_driver(am35x_driver);
static int __init am35x_init(void)
{
return platform_driver_register(&am35x_driver);
}
module_init(am35x_init);
static void __exit am35x_exit(void)
{
platform_driver_unregister(&am35x_driver);
}
module_exit(am35x_exit);
...@@ -455,7 +455,6 @@ static int __devinit bfin_probe(struct platform_device *pdev) ...@@ -455,7 +455,6 @@ static int __devinit bfin_probe(struct platform_device *pdev)
struct bfin_glue *glue; struct bfin_glue *glue;
int ret = -ENOMEM; int ret = -ENOMEM;
int musbid;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) { if (!glue) {
...@@ -463,21 +462,12 @@ static int __devinit bfin_probe(struct platform_device *pdev) ...@@ -463,21 +462,12 @@ static int __devinit bfin_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err1;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err2; goto err1;
} }
musb->id = musbid;
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &bfin_dmamask; musb->dev.dma_mask = &bfin_dmamask;
musb->dev.coherent_dma_mask = bfin_dmamask; musb->dev.coherent_dma_mask = bfin_dmamask;
...@@ -513,9 +503,6 @@ static int __devinit bfin_probe(struct platform_device *pdev) ...@@ -513,9 +503,6 @@ static int __devinit bfin_probe(struct platform_device *pdev)
err3: err3:
platform_device_put(musb); platform_device_put(musb);
err2:
musb_put_id(&pdev->dev, musbid);
err1: err1:
kfree(glue); kfree(glue);
...@@ -527,9 +514,7 @@ static int __devexit bfin_remove(struct platform_device *pdev) ...@@ -527,9 +514,7 @@ static int __devexit bfin_remove(struct platform_device *pdev)
{ {
struct bfin_glue *glue = platform_get_drvdata(pdev); struct bfin_glue *glue = platform_get_drvdata(pdev);
musb_put_id(&pdev->dev, glue->musb->id); platform_device_unregister(glue->musb);
platform_device_del(glue->musb);
platform_device_put(glue->musb);
kfree(glue); kfree(glue);
return 0; return 0;
...@@ -585,15 +570,4 @@ static struct platform_driver bfin_driver = { ...@@ -585,15 +570,4 @@ static struct platform_driver bfin_driver = {
MODULE_DESCRIPTION("Blackfin MUSB Glue Layer"); MODULE_DESCRIPTION("Blackfin MUSB Glue Layer");
MODULE_AUTHOR("Bryan Wy <cooloney@kernel.org>"); MODULE_AUTHOR("Bryan Wy <cooloney@kernel.org>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
module_platform_driver(bfin_driver);
static int __init bfin_init(void)
{
return platform_driver_register(&bfin_driver);
}
module_init(bfin_init);
static void __exit bfin_exit(void)
{
platform_driver_unregister(&bfin_driver);
}
module_exit(bfin_exit);
...@@ -1314,6 +1314,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) ...@@ -1314,6 +1314,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
EXPORT_SYMBOL_GPL(cppi_interrupt);
/* Instantiate a software object representing a DMA controller. */ /* Instantiate a software object representing a DMA controller. */
struct dma_controller *__devinit struct dma_controller *__devinit
......
...@@ -480,7 +480,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev) ...@@ -480,7 +480,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
struct clk *clk; struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
int musbid;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) { if (!glue) {
...@@ -488,18 +487,10 @@ static int __devinit da8xx_probe(struct platform_device *pdev) ...@@ -488,18 +487,10 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err1;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err2; goto err1;
} }
clk = clk_get(&pdev->dev, "usb20"); clk = clk_get(&pdev->dev, "usb20");
...@@ -515,7 +506,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev) ...@@ -515,7 +506,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
goto err4; goto err4;
} }
musb->id = musbid;
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;
...@@ -558,9 +548,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev) ...@@ -558,9 +548,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
err3: err3:
platform_device_put(musb); platform_device_put(musb);
err2:
musb_put_id(&pdev->dev, musbid);
err1: err1:
kfree(glue); kfree(glue);
...@@ -572,9 +559,7 @@ static int __devexit da8xx_remove(struct platform_device *pdev) ...@@ -572,9 +559,7 @@ static int __devexit da8xx_remove(struct platform_device *pdev)
{ {
struct da8xx_glue *glue = platform_get_drvdata(pdev); struct da8xx_glue *glue = platform_get_drvdata(pdev);
musb_put_id(&pdev->dev, glue->musb->id); platform_device_unregister(glue->musb);
platform_device_del(glue->musb);
platform_device_put(glue->musb);
clk_disable(glue->clk); clk_disable(glue->clk);
clk_put(glue->clk); clk_put(glue->clk);
kfree(glue); kfree(glue);
...@@ -593,15 +578,4 @@ static struct platform_driver da8xx_driver = { ...@@ -593,15 +578,4 @@ static struct platform_driver da8xx_driver = {
MODULE_DESCRIPTION("DA8xx/OMAP-L1x MUSB Glue Layer"); MODULE_DESCRIPTION("DA8xx/OMAP-L1x MUSB Glue Layer");
MODULE_AUTHOR("Sergei Shtylyov <sshtylyov@ru.mvista.com>"); MODULE_AUTHOR("Sergei Shtylyov <sshtylyov@ru.mvista.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
module_platform_driver(da8xx_driver);
static int __init da8xx_init(void)
{
return platform_driver_register(&da8xx_driver);
}
module_init(da8xx_init);
static void __exit da8xx_exit(void)
{
platform_driver_unregister(&da8xx_driver);
}
module_exit(da8xx_exit);
...@@ -512,7 +512,6 @@ static int __devinit davinci_probe(struct platform_device *pdev) ...@@ -512,7 +512,6 @@ static int __devinit davinci_probe(struct platform_device *pdev)
struct clk *clk; struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
int musbid;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) { if (!glue) {
...@@ -520,18 +519,10 @@ static int __devinit davinci_probe(struct platform_device *pdev) ...@@ -520,18 +519,10 @@ static int __devinit davinci_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err1;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err2; goto err1;
} }
clk = clk_get(&pdev->dev, "usb"); clk = clk_get(&pdev->dev, "usb");
...@@ -547,7 +538,6 @@ static int __devinit davinci_probe(struct platform_device *pdev) ...@@ -547,7 +538,6 @@ static int __devinit davinci_probe(struct platform_device *pdev)
goto err4; goto err4;
} }
musb->id = musbid;
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;
...@@ -590,9 +580,6 @@ static int __devinit davinci_probe(struct platform_device *pdev) ...@@ -590,9 +580,6 @@ static int __devinit davinci_probe(struct platform_device *pdev)
err3: err3:
platform_device_put(musb); platform_device_put(musb);
err2:
musb_put_id(&pdev->dev, musbid);
err1: err1:
kfree(glue); kfree(glue);
...@@ -604,9 +591,7 @@ static int __devexit davinci_remove(struct platform_device *pdev) ...@@ -604,9 +591,7 @@ static int __devexit davinci_remove(struct platform_device *pdev)
{ {
struct davinci_glue *glue = platform_get_drvdata(pdev); struct davinci_glue *glue = platform_get_drvdata(pdev);
musb_put_id(&pdev->dev, glue->musb->id); platform_device_unregister(glue->musb);
platform_device_del(glue->musb);
platform_device_put(glue->musb);
clk_disable(glue->clk); clk_disable(glue->clk);
clk_put(glue->clk); clk_put(glue->clk);
kfree(glue); kfree(glue);
...@@ -625,15 +610,4 @@ static struct platform_driver davinci_driver = { ...@@ -625,15 +610,4 @@ static struct platform_driver davinci_driver = {
MODULE_DESCRIPTION("DaVinci MUSB Glue Layer"); MODULE_DESCRIPTION("DaVinci MUSB Glue Layer");
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
module_platform_driver(davinci_driver);
static int __init davinci_init(void)
{
return platform_driver_register(&davinci_driver);
}
module_init(davinci_init);
static void __exit davinci_exit(void)
{
platform_driver_unregister(&davinci_driver);
}
module_exit(davinci_exit);
...@@ -116,7 +116,6 @@ ...@@ -116,7 +116,6 @@
#define MUSB_DRIVER_NAME "musb-hdrc" #define MUSB_DRIVER_NAME "musb-hdrc"
const char musb_driver_name[] = MUSB_DRIVER_NAME; const char musb_driver_name[] = MUSB_DRIVER_NAME;
static DEFINE_IDA(musb_ida);
MODULE_DESCRIPTION(DRIVER_INFO); MODULE_DESCRIPTION(DRIVER_INFO);
MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_AUTHOR(DRIVER_AUTHOR);
...@@ -133,35 +132,6 @@ static inline struct musb *dev_to_musb(struct device *dev) ...@@ -133,35 +132,6 @@ static inline struct musb *dev_to_musb(struct device *dev)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
int musb_get_id(struct device *dev, gfp_t gfp_mask)
{
int ret;
int id;
ret = ida_pre_get(&musb_ida, gfp_mask);
if (!ret) {
dev_err(dev, "failed to reserve resource for id\n");
return -ENOMEM;
}
ret = ida_get_new(&musb_ida, &id);
if (ret < 0) {
dev_err(dev, "failed to allocate a new id\n");
return ret;
}
return id;
}
EXPORT_SYMBOL_GPL(musb_get_id);
void musb_put_id(struct device *dev, int id)
{
dev_dbg(dev, "removing id %d\n", id);
ida_remove(&musb_ida, id);
}
EXPORT_SYMBOL_GPL(musb_put_id);
#ifndef CONFIG_BLACKFIN #ifndef CONFIG_BLACKFIN
static int musb_ulpi_read(struct usb_phy *phy, u32 offset) static int musb_ulpi_read(struct usb_phy *phy, u32 offset)
{ {
...@@ -467,12 +437,12 @@ void musb_hnp_stop(struct musb *musb) ...@@ -467,12 +437,12 @@ void musb_hnp_stop(struct musb *musb)
*/ */
static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
u8 devctl, u8 power) u8 devctl)
{ {
struct usb_otg *otg = musb->xceiv->otg; struct usb_otg *otg = musb->xceiv->otg;
irqreturn_t handled = IRQ_NONE; irqreturn_t handled = IRQ_NONE;
dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl, dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl,
int_usb); int_usb);
/* in host mode, the peripheral may issue remote wakeup. /* in host mode, the peripheral may issue remote wakeup.
...@@ -485,6 +455,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, ...@@ -485,6 +455,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
if (devctl & MUSB_DEVCTL_HM) { if (devctl & MUSB_DEVCTL_HM) {
void __iomem *mbase = musb->mregs; void __iomem *mbase = musb->mregs;
u8 power;
switch (musb->xceiv->state) { switch (musb->xceiv->state) {
case OTG_STATE_A_SUSPEND: case OTG_STATE_A_SUSPEND:
...@@ -492,6 +463,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, ...@@ -492,6 +463,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
* will stop RESUME signaling * will stop RESUME signaling
*/ */
power = musb_readb(musb->mregs, MUSB_POWER);
if (power & MUSB_POWER_SUSPENDM) { if (power & MUSB_POWER_SUSPENDM) {
/* spurious */ /* spurious */
musb->int_usb &= ~MUSB_INTR_SUSPEND; musb->int_usb &= ~MUSB_INTR_SUSPEND;
...@@ -655,8 +627,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, ...@@ -655,8 +627,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
} }
if (int_usb & MUSB_INTR_SUSPEND) { if (int_usb & MUSB_INTR_SUSPEND) {
dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x power %02x\n", dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n",
otg_state_string(musb->xceiv->state), devctl, power); otg_state_string(musb->xceiv->state), devctl);
handled = IRQ_HANDLED; handled = IRQ_HANDLED;
switch (musb->xceiv->state) { switch (musb->xceiv->state) {
...@@ -722,8 +694,10 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, ...@@ -722,8 +694,10 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
if (is_peripheral_active(musb)) { if (is_peripheral_active(musb)) {
/* REVISIT HNP; just force disconnect */ /* REVISIT HNP; just force disconnect */
} }
musb_writew(musb->mregs, MUSB_INTRTXE, musb->epmask); musb->intrtxe = musb->epmask;
musb_writew(musb->mregs, MUSB_INTRRXE, musb->epmask & 0xfffe); musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe);
musb->intrrxe = musb->epmask & 0xfffe;
musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe);
musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7); musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7);
musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED
|USB_PORT_STAT_HIGH_SPEED |USB_PORT_STAT_HIGH_SPEED
...@@ -944,8 +918,10 @@ void musb_start(struct musb *musb) ...@@ -944,8 +918,10 @@ void musb_start(struct musb *musb)
dev_dbg(musb->controller, "<== devctl %02x\n", devctl); dev_dbg(musb->controller, "<== devctl %02x\n", devctl);
/* Set INT enable registers, enable interrupts */ /* Set INT enable registers, enable interrupts */
musb_writew(regs, MUSB_INTRTXE, musb->epmask); musb->intrtxe = musb->epmask;
musb_writew(regs, MUSB_INTRRXE, musb->epmask & 0xfffe); musb_writew(regs, MUSB_INTRTXE, musb->intrtxe);
musb->intrrxe = musb->epmask & 0xfffe;
musb_writew(regs, MUSB_INTRRXE, musb->intrrxe);
musb_writeb(regs, MUSB_INTRUSBE, 0xf7); musb_writeb(regs, MUSB_INTRUSBE, 0xf7);
musb_writeb(regs, MUSB_TESTMODE, 0); musb_writeb(regs, MUSB_TESTMODE, 0);
...@@ -983,7 +959,9 @@ static void musb_generic_disable(struct musb *musb) ...@@ -983,7 +959,9 @@ static void musb_generic_disable(struct musb *musb)
/* disable interrupts */ /* disable interrupts */
musb_writeb(mbase, MUSB_INTRUSBE, 0); musb_writeb(mbase, MUSB_INTRUSBE, 0);
musb->intrtxe = 0;
musb_writew(mbase, MUSB_INTRTXE, 0); musb_writew(mbase, MUSB_INTRTXE, 0);
musb->intrrxe = 0;
musb_writew(mbase, MUSB_INTRRXE, 0); musb_writew(mbase, MUSB_INTRRXE, 0);
/* off */ /* off */
...@@ -1523,33 +1501,6 @@ static int __devinit musb_core_init(u16 musb_type, struct musb *musb) ...@@ -1523,33 +1501,6 @@ static int __devinit musb_core_init(u16 musb_type, struct musb *musb)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430) || \
defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_ARCH_U8500)
static irqreturn_t generic_interrupt(int irq, void *__hci)
{
unsigned long flags;
irqreturn_t retval = IRQ_NONE;
struct musb *musb = __hci;
spin_lock_irqsave(&musb->lock, flags);
musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
if (musb->int_usb || musb->int_tx || musb->int_rx)
retval = musb_interrupt(musb);
spin_unlock_irqrestore(&musb->lock, flags);
return retval;
}
#else
#define generic_interrupt NULL
#endif
/* /*
* handle all the irqs defined by the HDRC core. for now we expect: other * handle all the irqs defined by the HDRC core. for now we expect: other
* irq sources (phy, dma, etc) will be handled first, musb->int_* values * irq sources (phy, dma, etc) will be handled first, musb->int_* values
...@@ -1560,12 +1511,11 @@ static irqreturn_t generic_interrupt(int irq, void *__hci) ...@@ -1560,12 +1511,11 @@ static irqreturn_t generic_interrupt(int irq, void *__hci)
irqreturn_t musb_interrupt(struct musb *musb) irqreturn_t musb_interrupt(struct musb *musb)
{ {
irqreturn_t retval = IRQ_NONE; irqreturn_t retval = IRQ_NONE;
u8 devctl, power; u8 devctl;
int ep_num; int ep_num;
u32 reg; u32 reg;
devctl = musb_readb(musb->mregs, MUSB_DEVCTL); devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
power = musb_readb(musb->mregs, MUSB_POWER);
dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n", dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n",
(devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral", (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral",
...@@ -1576,7 +1526,7 @@ irqreturn_t musb_interrupt(struct musb *musb) ...@@ -1576,7 +1526,7 @@ irqreturn_t musb_interrupt(struct musb *musb)
*/ */
if (musb->int_usb) if (musb->int_usb)
retval |= musb_stage0_irq(musb, musb->int_usb, retval |= musb_stage0_irq(musb, musb->int_usb,
devctl, power); devctl);
/* "stage 1" is handling endpoint irqs */ /* "stage 1" is handling endpoint irqs */
...@@ -1919,7 +1869,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -1919,7 +1869,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
musb->ops = plat->platform_ops; musb->ops = plat->platform_ops;
/* The musb_platform_init() call: /* The musb_platform_init() call:
* - adjusts musb->mregs and musb->isr if needed, * - adjusts musb->mregs
* - sets the musb->isr
* - may initialize an integrated tranceiver * - may initialize an integrated tranceiver
* - initializes musb->xceiv, usually by otg_get_phy() * - initializes musb->xceiv, usually by otg_get_phy()
* - stops powering VBUS * - stops powering VBUS
...@@ -1929,7 +1880,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -1929,7 +1880,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
* external/discrete ones in various flavors (twl4030 family, * external/discrete ones in various flavors (twl4030 family,
* isp1504, non-OTG, etc) mostly hooking up through ULPI. * isp1504, non-OTG, etc) mostly hooking up through ULPI.
*/ */
musb->isr = generic_interrupt;
status = musb_platform_init(musb); status = musb_platform_init(musb);
if (status < 0) if (status < 0)
goto fail1; goto fail1;
...@@ -2120,8 +2070,6 @@ static void musb_save_context(struct musb *musb) ...@@ -2120,8 +2070,6 @@ static void musb_save_context(struct musb *musb)
musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE); musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE);
musb->context.busctl = musb_read_ulpi_buscontrol(musb->mregs); musb->context.busctl = musb_read_ulpi_buscontrol(musb->mregs);
musb->context.power = musb_readb(musb_base, MUSB_POWER); musb->context.power = musb_readb(musb_base, MUSB_POWER);
musb->context.intrtxe = musb_readw(musb_base, MUSB_INTRTXE);
musb->context.intrrxe = musb_readw(musb_base, MUSB_INTRRXE);
musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE); musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE);
musb->context.index = musb_readb(musb_base, MUSB_INDEX); musb->context.index = musb_readb(musb_base, MUSB_INDEX);
musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL); musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL);
...@@ -2194,8 +2142,8 @@ static void musb_restore_context(struct musb *musb) ...@@ -2194,8 +2142,8 @@ static void musb_restore_context(struct musb *musb)
musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode); musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode);
musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl); musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl);
musb_writeb(musb_base, MUSB_POWER, musb->context.power); musb_writeb(musb_base, MUSB_POWER, musb->context.power);
musb_writew(musb_base, MUSB_INTRTXE, musb->context.intrtxe); musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe);
musb_writew(musb_base, MUSB_INTRRXE, musb->context.intrrxe); musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe);
musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe); musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe);
musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl); musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl);
......
...@@ -288,7 +288,6 @@ struct musb_csr_regs { ...@@ -288,7 +288,6 @@ struct musb_csr_regs {
struct musb_context_registers { struct musb_context_registers {
u8 power; u8 power;
u16 intrtxe, intrrxe;
u8 intrusbe; u8 intrusbe;
u16 frame; u16 frame;
u8 index, testmode; u8 index, testmode;
...@@ -313,6 +312,8 @@ struct musb { ...@@ -313,6 +312,8 @@ struct musb {
struct work_struct irq_work; struct work_struct irq_work;
u16 hwvers; u16 hwvers;
u16 intrrxe;
u16 intrtxe;
/* this hub status bit is reserved by USB 2.0 and not seen by usbcore */ /* this hub status bit is reserved by USB 2.0 and not seen by usbcore */
#define MUSB_PORT_STAT_RESUME (1 << 31) #define MUSB_PORT_STAT_RESUME (1 << 31)
...@@ -521,8 +522,6 @@ extern const char musb_driver_name[]; ...@@ -521,8 +522,6 @@ extern const char musb_driver_name[];
extern void musb_start(struct musb *musb); extern void musb_start(struct musb *musb);
extern void musb_stop(struct musb *musb); extern void musb_stop(struct musb *musb);
extern int musb_get_id(struct device *dev, gfp_t gfp_mask);
extern void musb_put_id(struct device *dev, int id);
extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src); extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src);
extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst); extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst);
......
...@@ -124,8 +124,44 @@ struct dsps_glue { ...@@ -124,8 +124,44 @@ struct dsps_glue {
const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */ const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
struct timer_list timer[2]; /* otg_workaround timer */ struct timer_list timer[2]; /* otg_workaround timer */
unsigned long last_timer[2]; /* last timer data for each instance */ unsigned long last_timer[2]; /* last timer data for each instance */
u32 __iomem *usb_ctrl[2];
}; };
#define DSPS_AM33XX_CONTROL_MODULE_PHYS_0 0x44e10620
#define DSPS_AM33XX_CONTROL_MODULE_PHYS_1 0x44e10628
static const resource_size_t dsps_control_module_phys[] = {
DSPS_AM33XX_CONTROL_MODULE_PHYS_0,
DSPS_AM33XX_CONTROL_MODULE_PHYS_1,
};
/**
* musb_dsps_phy_control - phy on/off
* @glue: struct dsps_glue *
* @id: musb instance
* @on: flag for phy to be switched on or off
*
* This is to enable the PHY using usb_ctrl register in system control
* module space.
*
* XXX: This function will be removed once we have a seperate driver for
* control module
*/
static void musb_dsps_phy_control(struct dsps_glue *glue, u8 id, u8 on)
{
u32 usbphycfg;
usbphycfg = readl(glue->usb_ctrl[id]);
if (on) {
usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
} else {
usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
}
writel(usbphycfg, glue->usb_ctrl[id]);
}
/** /**
* dsps_musb_enable - enable interrupts * dsps_musb_enable - enable interrupts
*/ */
...@@ -365,11 +401,9 @@ static irqreturn_t dsps_interrupt(int irq, void *hci) ...@@ -365,11 +401,9 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
static int dsps_musb_init(struct musb *musb) static int dsps_musb_init(struct musb *musb)
{ {
struct device *dev = musb->controller; struct device *dev = musb->controller;
struct musb_hdrc_platform_data *plat = dev->platform_data;
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct dsps_glue *glue = dev_get_drvdata(dev->parent); struct dsps_glue *glue = dev_get_drvdata(dev->parent);
const struct dsps_musb_wrapper *wrp = glue->wrp; const struct dsps_musb_wrapper *wrp = glue->wrp;
struct omap_musb_board_data *data = plat->board_data;
void __iomem *reg_base = musb->ctrl_base; void __iomem *reg_base = musb->ctrl_base;
u32 rev, val; u32 rev, val;
int status; int status;
...@@ -377,7 +411,8 @@ static int dsps_musb_init(struct musb *musb) ...@@ -377,7 +411,8 @@ static int dsps_musb_init(struct musb *musb)
/* mentor core register starts at offset of 0x400 from musb base */ /* mentor core register starts at offset of 0x400 from musb base */
musb->mregs += wrp->musb_core_offset; musb->mregs += wrp->musb_core_offset;
/* Get the NOP PHY */ /* NOP driver needs change if supporting dual instance */
usb_nop_xceiv_register();
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
if (IS_ERR_OR_NULL(musb->xceiv)) if (IS_ERR_OR_NULL(musb->xceiv))
return -ENODEV; return -ENODEV;
...@@ -395,8 +430,7 @@ static int dsps_musb_init(struct musb *musb) ...@@ -395,8 +430,7 @@ static int dsps_musb_init(struct musb *musb)
dsps_writel(reg_base, wrp->control, (1 << wrp->reset)); dsps_writel(reg_base, wrp->control, (1 << wrp->reset));
/* Start the on-chip PHY and its PLL. */ /* Start the on-chip PHY and its PLL. */
if (data->set_phy_power) musb_dsps_phy_control(glue, pdev->id, 1);
data->set_phy_power(1);
musb->isr = dsps_interrupt; musb->isr = dsps_interrupt;
...@@ -418,16 +452,13 @@ static int dsps_musb_init(struct musb *musb) ...@@ -418,16 +452,13 @@ static int dsps_musb_init(struct musb *musb)
static int dsps_musb_exit(struct musb *musb) static int dsps_musb_exit(struct musb *musb)
{ {
struct device *dev = musb->controller; struct device *dev = musb->controller;
struct musb_hdrc_platform_data *plat = dev->platform_data;
struct omap_musb_board_data *data = plat->board_data;
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct dsps_glue *glue = dev_get_drvdata(dev->parent); struct dsps_glue *glue = dev_get_drvdata(dev->parent);
del_timer_sync(&glue->timer[pdev->id]); del_timer_sync(&glue->timer[pdev->id]);
/* Shutdown the on-chip PHY and its PLL. */ /* Shutdown the on-chip PHY and its PLL. */
if (data->set_phy_power) musb_dsps_phy_control(glue, pdev->id, 0);
data->set_phy_power(0);
/* NOP driver needs change if supporting dual instance */ /* NOP driver needs change if supporting dual instance */
usb_put_phy(musb->xceiv); usb_put_phy(musb->xceiv);
...@@ -459,24 +490,33 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) ...@@ -459,24 +490,33 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
struct resource *res; struct resource *res;
struct resource resources[2]; struct resource resources[2];
char res_name[11]; char res_name[11];
int ret, musbid; int ret;
/* get memory resource */ resources[0].start = dsps_control_module_phys[id];
snprintf(res_name, sizeof(res_name), "musb%d", id); resources[0].end = resources[0].start + SZ_4 - 1;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name); resources[0].flags = IORESOURCE_MEM;
glue->usb_ctrl[id] = devm_request_and_ioremap(&pdev->dev, resources);
if (glue->usb_ctrl[id] == NULL) {
dev_err(dev, "Failed to obtain usb_ctrl%d memory\n", id);
ret = -ENODEV;
goto err0;
}
/* first resource is for usbss, so start index from 1 */
res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1);
if (!res) { if (!res) {
dev_err(dev, "%s get mem resource failed\n", res_name); dev_err(dev, "failed to get memory for instance %d\n", id);
ret = -ENODEV; ret = -ENODEV;
goto err0; goto err0;
} }
res->parent = NULL; res->parent = NULL;
resources[0] = *res; resources[0] = *res;
/* get irq resource */ /* first resource is for usbss, so start index from 1 */
snprintf(res_name, sizeof(res_name), "musb%d-irq", id); res = platform_get_resource(pdev, IORESOURCE_IRQ, id + 1);
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name);
if (!res) { if (!res) {
dev_err(dev, "%s get irq resource failed\n", res_name); dev_err(dev, "failed to get irq for instance %d\n", id);
ret = -ENODEV; ret = -ENODEV;
goto err0; goto err0;
} }
...@@ -484,22 +524,14 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) ...@@ -484,22 +524,14 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
resources[1] = *res; resources[1] = *res;
resources[1].name = "mc"; resources[1].name = "mc";
/* get the musb id */
musbid = musb_get_id(dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err0;
}
/* allocate the child platform device */ /* allocate the child platform device */
musb = platform_device_alloc("musb-hdrc", musbid); musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
if (!musb) { if (!musb) {
dev_err(dev, "failed to allocate musb device\n"); dev_err(dev, "failed to allocate musb device\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err1; goto err0;
} }
musb->id = musbid;
musb->dev.parent = dev; musb->dev.parent = dev;
musb->dev.dma_mask = &musb_dmamask; musb->dev.dma_mask = &musb_dmamask;
musb->dev.coherent_dma_mask = musb_dmamask; musb->dev.coherent_dma_mask = musb_dmamask;
...@@ -556,19 +588,10 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id) ...@@ -556,19 +588,10 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
err2: err2:
platform_device_put(musb); platform_device_put(musb);
err1:
musb_put_id(dev, musbid);
err0: err0:
return ret; return ret;
} }
static void dsps_delete_musb_pdev(struct dsps_glue *glue, u8 id)
{
musb_put_id(glue->dev, glue->musb[id]->id);
platform_device_del(glue->musb[id]);
platform_device_put(glue->musb[id]);
}
static int __devinit dsps_probe(struct platform_device *pdev) static int __devinit dsps_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
...@@ -628,7 +651,7 @@ static int __devinit dsps_probe(struct platform_device *pdev) ...@@ -628,7 +651,7 @@ static int __devinit dsps_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "failed to create child pdev\n"); dev_err(&pdev->dev, "failed to create child pdev\n");
/* release resources of previously created instances */ /* release resources of previously created instances */
for (i--; i >= 0 ; i--) for (i--; i >= 0 ; i--)
dsps_delete_musb_pdev(glue, i); platform_device_unregister(glue->musb[i]);
goto err3; goto err3;
} }
} }
...@@ -653,7 +676,7 @@ static int __devexit dsps_remove(struct platform_device *pdev) ...@@ -653,7 +676,7 @@ static int __devexit dsps_remove(struct platform_device *pdev)
/* delete the child platform device */ /* delete the child platform device */
for (i = 0; i < wrp->instances ; i++) for (i = 0; i < wrp->instances ; i++)
dsps_delete_musb_pdev(glue, i); platform_device_unregister(glue->musb[i]);
/* disable usbss clocks */ /* disable usbss clocks */
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
...@@ -666,24 +689,26 @@ static int __devexit dsps_remove(struct platform_device *pdev) ...@@ -666,24 +689,26 @@ static int __devexit dsps_remove(struct platform_device *pdev)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int dsps_suspend(struct device *dev) static int dsps_suspend(struct device *dev)
{ {
struct musb_hdrc_platform_data *plat = dev->platform_data; struct platform_device *pdev = to_platform_device(dev->parent);
struct omap_musb_board_data *data = plat->board_data; struct dsps_glue *glue = platform_get_drvdata(pdev);
const struct dsps_musb_wrapper *wrp = glue->wrp;
int i;
/* Shutdown the on-chip PHY and its PLL. */ for (i = 0; i < wrp->instances; i++)
if (data->set_phy_power) musb_dsps_phy_control(glue, i, 0);
data->set_phy_power(0);
return 0; return 0;
} }
static int dsps_resume(struct device *dev) static int dsps_resume(struct device *dev)
{ {
struct musb_hdrc_platform_data *plat = dev->platform_data; struct platform_device *pdev = to_platform_device(dev->parent);
struct omap_musb_board_data *data = plat->board_data; struct dsps_glue *glue = platform_get_drvdata(pdev);
const struct dsps_musb_wrapper *wrp = glue->wrp;
int i;
/* Start the on-chip PHY and its PLL. */ for (i = 0; i < wrp->instances; i++)
if (data->set_phy_power) musb_dsps_phy_control(glue, i, 1);
data->set_phy_power(1);
return 0; return 0;
} }
...@@ -719,7 +744,7 @@ static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = { ...@@ -719,7 +744,7 @@ static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = {
.rxep_bitmap = (0xfffe << 16), .rxep_bitmap = (0xfffe << 16),
.musb_core_offset = 0x400, .musb_core_offset = 0x400,
.poll_seconds = 2, .poll_seconds = 2,
.instances = 2, .instances = 1,
}; };
static const struct platform_device_id musb_dsps_id_table[] __devinitconst = { static const struct platform_device_id musb_dsps_id_table[] __devinitconst = {
......
...@@ -1068,7 +1068,6 @@ static int musb_gadget_enable(struct usb_ep *ep, ...@@ -1068,7 +1068,6 @@ static int musb_gadget_enable(struct usb_ep *ep,
*/ */
musb_ep_select(mbase, epnum); musb_ep_select(mbase, epnum);
if (usb_endpoint_dir_in(desc)) { if (usb_endpoint_dir_in(desc)) {
u16 int_txe = musb_readw(mbase, MUSB_INTRTXE);
if (hw_ep->is_shared_fifo) if (hw_ep->is_shared_fifo)
musb_ep->is_in = 1; musb_ep->is_in = 1;
...@@ -1080,8 +1079,8 @@ static int musb_gadget_enable(struct usb_ep *ep, ...@@ -1080,8 +1079,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
goto fail; goto fail;
} }
int_txe |= (1 << epnum); musb->intrtxe |= (1 << epnum);
musb_writew(mbase, MUSB_INTRTXE, int_txe); musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe);
/* REVISIT if can_bulk_split(), use by updating "tmp"; /* REVISIT if can_bulk_split(), use by updating "tmp";
* likewise high bandwidth periodic tx * likewise high bandwidth periodic tx
...@@ -1108,7 +1107,6 @@ static int musb_gadget_enable(struct usb_ep *ep, ...@@ -1108,7 +1107,6 @@ static int musb_gadget_enable(struct usb_ep *ep,
musb_writew(regs, MUSB_TXCSR, csr); musb_writew(regs, MUSB_TXCSR, csr);
} else { } else {
u16 int_rxe = musb_readw(mbase, MUSB_INTRRXE);
if (hw_ep->is_shared_fifo) if (hw_ep->is_shared_fifo)
musb_ep->is_in = 0; musb_ep->is_in = 0;
...@@ -1120,8 +1118,8 @@ static int musb_gadget_enable(struct usb_ep *ep, ...@@ -1120,8 +1118,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
goto fail; goto fail;
} }
int_rxe |= (1 << epnum); musb->intrrxe |= (1 << epnum);
musb_writew(mbase, MUSB_INTRRXE, int_rxe); musb_writew(mbase, MUSB_INTRRXE, musb->intrrxe);
/* REVISIT if can_bulk_combine() use by updating "tmp" /* REVISIT if can_bulk_combine() use by updating "tmp"
* likewise high bandwidth periodic rx * likewise high bandwidth periodic rx
...@@ -1209,14 +1207,12 @@ static int musb_gadget_disable(struct usb_ep *ep) ...@@ -1209,14 +1207,12 @@ static int musb_gadget_disable(struct usb_ep *ep)
/* zero the endpoint sizes */ /* zero the endpoint sizes */
if (musb_ep->is_in) { if (musb_ep->is_in) {
u16 int_txe = musb_readw(musb->mregs, MUSB_INTRTXE); musb->intrtxe &= ~(1 << epnum);
int_txe &= ~(1 << epnum); musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe);
musb_writew(musb->mregs, MUSB_INTRTXE, int_txe);
musb_writew(epio, MUSB_TXMAXP, 0); musb_writew(epio, MUSB_TXMAXP, 0);
} else { } else {
u16 int_rxe = musb_readw(musb->mregs, MUSB_INTRRXE); musb->intrrxe &= ~(1 << epnum);
int_rxe &= ~(1 << epnum); musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe);
musb_writew(musb->mregs, MUSB_INTRRXE, int_rxe);
musb_writew(epio, MUSB_RXMAXP, 0); musb_writew(epio, MUSB_RXMAXP, 0);
} }
...@@ -1532,7 +1528,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) ...@@ -1532,7 +1528,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep)
void __iomem *epio = musb->endpoints[epnum].regs; void __iomem *epio = musb->endpoints[epnum].regs;
void __iomem *mbase; void __iomem *mbase;
unsigned long flags; unsigned long flags;
u16 csr, int_txe; u16 csr;
mbase = musb->mregs; mbase = musb->mregs;
...@@ -1540,8 +1536,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) ...@@ -1540,8 +1536,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep)
musb_ep_select(mbase, (u8) epnum); musb_ep_select(mbase, (u8) epnum);
/* disable interrupts */ /* disable interrupts */
int_txe = musb_readw(mbase, MUSB_INTRTXE); musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe & ~(1 << epnum));
musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum));
if (musb_ep->is_in) { if (musb_ep->is_in) {
csr = musb_readw(epio, MUSB_TXCSR); csr = musb_readw(epio, MUSB_TXCSR);
...@@ -1565,7 +1560,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) ...@@ -1565,7 +1560,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep)
} }
/* re-enable interrupt */ /* re-enable interrupt */
musb_writew(mbase, MUSB_INTRTXE, int_txe); musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe);
spin_unlock_irqrestore(&musb->lock, flags); spin_unlock_irqrestore(&musb->lock, flags);
} }
...@@ -2154,10 +2149,9 @@ __acquires(musb->lock) ...@@ -2154,10 +2149,9 @@ __acquires(musb->lock)
u8 devctl = musb_readb(mbase, MUSB_DEVCTL); u8 devctl = musb_readb(mbase, MUSB_DEVCTL);
u8 power; u8 power;
dev_dbg(musb->controller, "<== %s addr=%x driver '%s'\n", dev_dbg(musb->controller, "<== %s driver '%s'\n",
(devctl & MUSB_DEVCTL_BDEVICE) (devctl & MUSB_DEVCTL_BDEVICE)
? "B-Device" : "A-Device", ? "B-Device" : "A-Device",
musb_readb(mbase, MUSB_FADDR),
musb->gadget_driver musb->gadget_driver
? musb->gadget_driver->driver.name ? musb->gadget_driver->driver.name
: NULL : NULL
......
...@@ -673,10 +673,8 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) ...@@ -673,10 +673,8 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
csr = musb_readw(regs, MUSB_CSR0); csr = musb_readw(regs, MUSB_CSR0);
len = musb_readb(regs, MUSB_COUNT0); len = musb_readb(regs, MUSB_COUNT0);
dev_dbg(musb->controller, "csr %04x, count %d, myaddr %d, ep0stage %s\n", dev_dbg(musb->controller, "csr %04x, count %d, ep0stage %s\n",
csr, len, csr, len, decode_ep0stage(musb->ep0_state));
musb_readb(mbase, MUSB_FADDR),
decode_ep0stage(musb->ep0_state));
if (csr & MUSB_CSR0_P_DATAEND) { if (csr & MUSB_CSR0_P_DATAEND) {
/* /*
......
...@@ -740,7 +740,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum, ...@@ -740,7 +740,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
csr = musb_readw(epio, MUSB_TXCSR); csr = musb_readw(epio, MUSB_TXCSR);
/* disable interrupt in case we flush */ /* disable interrupt in case we flush */
int_txe = musb_readw(mbase, MUSB_INTRTXE); int_txe = musb->intrtxe;
musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum)); musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum));
/* general endpoint setup */ /* general endpoint setup */
......
...@@ -31,10 +31,6 @@ ...@@ -31,10 +31,6 @@
* *
*/ */
#if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430)
#include "omap2430.h"
#endif
#ifndef CONFIG_BLACKFIN #ifndef CONFIG_BLACKFIN
#define MUSB_HSDMA_BASE 0x200 #define MUSB_HSDMA_BASE 0x200
......
...@@ -333,6 +333,26 @@ static void omap_musb_mailbox_work(struct work_struct *mailbox_work) ...@@ -333,6 +333,26 @@ static void omap_musb_mailbox_work(struct work_struct *mailbox_work)
omap_musb_set_mailbox(glue); omap_musb_set_mailbox(glue);
} }
static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci)
{
unsigned long flags;
irqreturn_t retval = IRQ_NONE;
struct musb *musb = __hci;
spin_lock_irqsave(&musb->lock, flags);
musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
if (musb->int_usb || musb->int_tx || musb->int_rx)
retval = musb_interrupt(musb);
spin_unlock_irqrestore(&musb->lock, flags);
return retval;
}
static int omap2430_musb_init(struct musb *musb) static int omap2430_musb_init(struct musb *musb)
{ {
u32 l; u32 l;
...@@ -352,6 +372,8 @@ static int omap2430_musb_init(struct musb *musb) ...@@ -352,6 +372,8 @@ static int omap2430_musb_init(struct musb *musb)
return -ENODEV; return -ENODEV;
} }
musb->isr = omap2430_musb_interrupt;
status = pm_runtime_get_sync(dev); status = pm_runtime_get_sync(dev);
if (status < 0) { if (status < 0) {
dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status); dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status);
...@@ -478,7 +500,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev) ...@@ -478,7 +500,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
struct musb_hdrc_config *config; struct musb_hdrc_config *config;
struct resource *res; struct resource *res;
int ret = -ENOMEM; int ret = -ENOMEM;
int musbid;
glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
if (!glue) { if (!glue) {
...@@ -486,21 +507,12 @@ static int __devinit omap2430_probe(struct platform_device *pdev) ...@@ -486,21 +507,12 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err0;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err1; goto err0;
} }
musb->id = musbid;
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;
...@@ -521,7 +533,7 @@ static int __devinit omap2430_probe(struct platform_device *pdev) ...@@ -521,7 +533,7 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"failed to allocate musb platfrom data\n"); "failed to allocate musb platfrom data\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err1; goto err2;
} }
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
...@@ -529,14 +541,14 @@ static int __devinit omap2430_probe(struct platform_device *pdev) ...@@ -529,14 +541,14 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"failed to allocate musb board data\n"); "failed to allocate musb board data\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err1; goto err2;
} }
config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL); config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);
if (!data) { if (!data) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"failed to allocate musb hdrc config\n"); "failed to allocate musb hdrc config\n");
goto err1; goto err2;
} }
of_property_read_u32(np, "mode", (u32 *)&pdata->mode); of_property_read_u32(np, "mode", (u32 *)&pdata->mode);
...@@ -589,9 +601,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev) ...@@ -589,9 +601,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
err2: err2:
platform_device_put(musb); platform_device_put(musb);
err1:
musb_put_id(&pdev->dev, musbid);
err0: err0:
return ret; return ret;
} }
...@@ -601,7 +610,6 @@ static int __devexit omap2430_remove(struct platform_device *pdev) ...@@ -601,7 +610,6 @@ static int __devexit omap2430_remove(struct platform_device *pdev)
struct omap2430_glue *glue = platform_get_drvdata(pdev); struct omap2430_glue *glue = platform_get_drvdata(pdev);
cancel_work_sync(&glue->omap_musb_mailbox_work); cancel_work_sync(&glue->omap_musb_mailbox_work);
musb_put_id(&pdev->dev, glue->musb->id);
platform_device_unregister(glue->musb); platform_device_unregister(glue->musb);
return 0; return 0;
......
...@@ -1160,7 +1160,6 @@ static int __devinit tusb_probe(struct platform_device *pdev) ...@@ -1160,7 +1160,6 @@ static int __devinit tusb_probe(struct platform_device *pdev)
struct tusb6010_glue *glue; struct tusb6010_glue *glue;
int ret = -ENOMEM; int ret = -ENOMEM;
int musbid;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
if (!glue) { if (!glue) {
...@@ -1168,21 +1167,12 @@ static int __devinit tusb_probe(struct platform_device *pdev) ...@@ -1168,21 +1167,12 @@ static int __devinit tusb_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err1;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err2; goto err1;
} }
musb->id = musbid;
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = &tusb_dmamask; musb->dev.dma_mask = &tusb_dmamask;
musb->dev.coherent_dma_mask = tusb_dmamask; musb->dev.coherent_dma_mask = tusb_dmamask;
...@@ -1218,9 +1208,6 @@ static int __devinit tusb_probe(struct platform_device *pdev) ...@@ -1218,9 +1208,6 @@ static int __devinit tusb_probe(struct platform_device *pdev)
err3: err3:
platform_device_put(musb); platform_device_put(musb);
err2:
musb_put_id(&pdev->dev, musbid);
err1: err1:
kfree(glue); kfree(glue);
...@@ -1232,9 +1219,7 @@ static int __devexit tusb_remove(struct platform_device *pdev) ...@@ -1232,9 +1219,7 @@ static int __devexit tusb_remove(struct platform_device *pdev)
{ {
struct tusb6010_glue *glue = platform_get_drvdata(pdev); struct tusb6010_glue *glue = platform_get_drvdata(pdev);
musb_put_id(&pdev->dev, glue->musb->id); platform_device_unregister(glue->musb);
platform_device_del(glue->musb);
platform_device_put(glue->musb);
kfree(glue); kfree(glue);
return 0; return 0;
...@@ -1251,15 +1236,4 @@ static struct platform_driver tusb_driver = { ...@@ -1251,15 +1236,4 @@ static struct platform_driver tusb_driver = {
MODULE_DESCRIPTION("TUSB6010 MUSB Glue Layer"); MODULE_DESCRIPTION("TUSB6010 MUSB Glue Layer");
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
module_platform_driver(tusb_driver);
static int __init tusb_init(void)
{
return platform_driver_register(&tusb_driver);
}
module_init(tusb_init);
static void __exit tusb_exit(void)
{
platform_driver_unregister(&tusb_driver);
}
module_exit(tusb_exit);
...@@ -36,6 +36,26 @@ struct ux500_glue { ...@@ -36,6 +36,26 @@ struct ux500_glue {
}; };
#define glue_to_musb(g) platform_get_drvdata(g->musb) #define glue_to_musb(g) platform_get_drvdata(g->musb)
static irqreturn_t ux500_musb_interrupt(int irq, void *__hci)
{
unsigned long flags;
irqreturn_t retval = IRQ_NONE;
struct musb *musb = __hci;
spin_lock_irqsave(&musb->lock, flags);
musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
if (musb->int_usb || musb->int_tx || musb->int_rx)
retval = musb_interrupt(musb);
spin_unlock_irqrestore(&musb->lock, flags);
return retval;
}
static int ux500_musb_init(struct musb *musb) static int ux500_musb_init(struct musb *musb)
{ {
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
...@@ -44,6 +64,8 @@ static int ux500_musb_init(struct musb *musb) ...@@ -44,6 +64,8 @@ static int ux500_musb_init(struct musb *musb)
return -ENODEV; return -ENODEV;
} }
musb->isr = ux500_musb_interrupt;
return 0; return 0;
} }
...@@ -65,7 +87,6 @@ static int __devinit ux500_probe(struct platform_device *pdev) ...@@ -65,7 +87,6 @@ static int __devinit ux500_probe(struct platform_device *pdev)
struct platform_device *musb; struct platform_device *musb;
struct ux500_glue *glue; struct ux500_glue *glue;
struct clk *clk; struct clk *clk;
int ret = -ENOMEM; int ret = -ENOMEM;
glue = kzalloc(sizeof(*glue), GFP_KERNEL); glue = kzalloc(sizeof(*glue), GFP_KERNEL);
...@@ -74,18 +95,10 @@ static int __devinit ux500_probe(struct platform_device *pdev) ...@@ -74,18 +95,10 @@ static int __devinit ux500_probe(struct platform_device *pdev)
goto err0; goto err0;
} }
/* get the musb id */ musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
if (musbid < 0) {
dev_err(&pdev->dev, "failed to allocate musb id\n");
ret = -ENOMEM;
goto err1;
}
musb = platform_device_alloc("musb-hdrc", musbid);
if (!musb) { if (!musb) {
dev_err(&pdev->dev, "failed to allocate musb device\n"); dev_err(&pdev->dev, "failed to allocate musb device\n");
goto err2; goto err1;
} }
clk = clk_get(&pdev->dev, "usb"); clk = clk_get(&pdev->dev, "usb");
...@@ -101,7 +114,6 @@ static int __devinit ux500_probe(struct platform_device *pdev) ...@@ -101,7 +114,6 @@ static int __devinit ux500_probe(struct platform_device *pdev)
goto err4; goto err4;
} }
musb->id = musbid;
musb->dev.parent = &pdev->dev; musb->dev.parent = &pdev->dev;
musb->dev.dma_mask = pdev->dev.dma_mask; musb->dev.dma_mask = pdev->dev.dma_mask;
musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask; musb->dev.coherent_dma_mask = pdev->dev.coherent_dma_mask;
...@@ -144,9 +156,6 @@ static int __devinit ux500_probe(struct platform_device *pdev) ...@@ -144,9 +156,6 @@ static int __devinit ux500_probe(struct platform_device *pdev)
err3: err3:
platform_device_put(musb); platform_device_put(musb);
err2:
musb_put_id(&pdev->dev, musbid);
err1: err1:
kfree(glue); kfree(glue);
...@@ -158,9 +167,7 @@ static int __devexit ux500_remove(struct platform_device *pdev) ...@@ -158,9 +167,7 @@ static int __devexit ux500_remove(struct platform_device *pdev)
{ {
struct ux500_glue *glue = platform_get_drvdata(pdev); struct ux500_glue *glue = platform_get_drvdata(pdev);
musb_put_id(&pdev->dev, glue->musb->id); platform_device_unregister(glue->musb);
platform_device_del(glue->musb);
platform_device_put(glue->musb);
clk_disable(glue->clk); clk_disable(glue->clk);
clk_put(glue->clk); clk_put(glue->clk);
kfree(glue); kfree(glue);
...@@ -219,15 +226,4 @@ static struct platform_driver ux500_driver = { ...@@ -219,15 +226,4 @@ static struct platform_driver ux500_driver = {
MODULE_DESCRIPTION("UX500 MUSB Glue Layer"); MODULE_DESCRIPTION("UX500 MUSB Glue Layer");
MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>"); MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
module_platform_driver(ux500_driver);
static int __init ux500_init(void)
{
return platform_driver_register(&ux500_driver);
}
module_init(ux500_init);
static void __exit ux500_exit(void)
{
platform_driver_unregister(&ux500_driver);
}
module_exit(ux500_exit);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册