Commit 15e68a80 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

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

USB: MUSB changes for 3.4

Here are a set of changes to the MUSB driver. In summary we have
a patch making modules behave better, there's a fix on debugfs'
error path, a small change removing an unnecessary pm_runtime
call on musb_shutdown() and a fix to relesect the endpoint in
Interrupt context.

This last patch is needed because we must drop musb's lock when
calling request->complete() and that could cause problems if another
thread queues a request and ends up changing MUSB_INDEX register.
parents f7c96f59 39287076
...@@ -456,7 +456,7 @@ static const struct musb_platform_ops am35x_ops = { ...@@ -456,7 +456,7 @@ static const struct musb_platform_ops am35x_ops = {
static u64 am35x_dmamask = DMA_BIT_MASK(32); static u64 am35x_dmamask = DMA_BIT_MASK(32);
static int __init am35x_probe(struct platform_device *pdev) static int __devinit am35x_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;
...@@ -561,7 +561,7 @@ static int __init am35x_probe(struct platform_device *pdev) ...@@ -561,7 +561,7 @@ static int __init am35x_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit am35x_remove(struct platform_device *pdev) 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);
...@@ -630,7 +630,8 @@ static struct dev_pm_ops am35x_pm_ops = { ...@@ -630,7 +630,8 @@ static struct dev_pm_ops am35x_pm_ops = {
#endif #endif
static struct platform_driver am35x_driver = { static struct platform_driver am35x_driver = {
.remove = __exit_p(am35x_remove), .probe = am35x_probe,
.remove = __devexit_p(am35x_remove),
.driver = { .driver = {
.name = "musb-am35x", .name = "musb-am35x",
.pm = DEV_PM_OPS, .pm = DEV_PM_OPS,
...@@ -643,9 +644,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -643,9 +644,9 @@ MODULE_LICENSE("GPL v2");
static int __init am35x_init(void) static int __init am35x_init(void)
{ {
return platform_driver_probe(&am35x_driver, am35x_probe); return platform_driver_register(&am35x_driver);
} }
subsys_initcall(am35x_init); module_init(am35x_init);
static void __exit am35x_exit(void) static void __exit am35x_exit(void)
{ {
......
...@@ -463,7 +463,7 @@ static const struct musb_platform_ops bfin_ops = { ...@@ -463,7 +463,7 @@ static const struct musb_platform_ops bfin_ops = {
static u64 bfin_dmamask = DMA_BIT_MASK(32); static u64 bfin_dmamask = DMA_BIT_MASK(32);
static int __init bfin_probe(struct platform_device *pdev) static int __devinit bfin_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;
...@@ -525,7 +525,7 @@ static int __init bfin_probe(struct platform_device *pdev) ...@@ -525,7 +525,7 @@ static int __init bfin_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit bfin_remove(struct platform_device *pdev) 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);
...@@ -575,6 +575,7 @@ static struct dev_pm_ops bfin_pm_ops = { ...@@ -575,6 +575,7 @@ static struct dev_pm_ops bfin_pm_ops = {
#endif #endif
static struct platform_driver bfin_driver = { static struct platform_driver bfin_driver = {
.probe = bfin_probe,
.remove = __exit_p(bfin_remove), .remove = __exit_p(bfin_remove),
.driver = { .driver = {
.name = "musb-blackfin", .name = "musb-blackfin",
...@@ -588,9 +589,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -588,9 +589,9 @@ MODULE_LICENSE("GPL v2");
static int __init bfin_init(void) static int __init bfin_init(void)
{ {
return platform_driver_probe(&bfin_driver, bfin_probe); return platform_driver_register(&bfin_driver);
} }
subsys_initcall(bfin_init); module_init(bfin_init);
static void __exit bfin_exit(void) static void __exit bfin_exit(void)
{ {
......
...@@ -478,7 +478,7 @@ static const struct musb_platform_ops da8xx_ops = { ...@@ -478,7 +478,7 @@ static const struct musb_platform_ops da8xx_ops = {
static u64 da8xx_dmamask = DMA_BIT_MASK(32); static u64 da8xx_dmamask = DMA_BIT_MASK(32);
static int __init da8xx_probe(struct platform_device *pdev) static int __devinit da8xx_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;
...@@ -562,7 +562,7 @@ static int __init da8xx_probe(struct platform_device *pdev) ...@@ -562,7 +562,7 @@ static int __init da8xx_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit da8xx_remove(struct platform_device *pdev) 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);
...@@ -576,7 +576,8 @@ static int __exit da8xx_remove(struct platform_device *pdev) ...@@ -576,7 +576,8 @@ static int __exit da8xx_remove(struct platform_device *pdev)
} }
static struct platform_driver da8xx_driver = { static struct platform_driver da8xx_driver = {
.remove = __exit_p(da8xx_remove), .probe = da8xx_probe,
.remove = __devexit_p(da8xx_remove),
.driver = { .driver = {
.name = "musb-da8xx", .name = "musb-da8xx",
}, },
...@@ -588,9 +589,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -588,9 +589,9 @@ MODULE_LICENSE("GPL v2");
static int __init da8xx_init(void) static int __init da8xx_init(void)
{ {
return platform_driver_probe(&da8xx_driver, da8xx_probe); return platform_driver_register(&da8xx_driver);
} }
subsys_initcall(da8xx_init); module_init(da8xx_init);
static void __exit da8xx_exit(void) static void __exit da8xx_exit(void)
{ {
......
...@@ -511,7 +511,7 @@ static const struct musb_platform_ops davinci_ops = { ...@@ -511,7 +511,7 @@ static const struct musb_platform_ops davinci_ops = {
static u64 davinci_dmamask = DMA_BIT_MASK(32); static u64 davinci_dmamask = DMA_BIT_MASK(32);
static int __init davinci_probe(struct platform_device *pdev) static int __devinit 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;
...@@ -594,7 +594,7 @@ static int __init davinci_probe(struct platform_device *pdev) ...@@ -594,7 +594,7 @@ static int __init davinci_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit davinci_remove(struct platform_device *pdev) 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);
...@@ -608,7 +608,8 @@ static int __exit davinci_remove(struct platform_device *pdev) ...@@ -608,7 +608,8 @@ static int __exit davinci_remove(struct platform_device *pdev)
} }
static struct platform_driver davinci_driver = { static struct platform_driver davinci_driver = {
.remove = __exit_p(davinci_remove), .probe = davinci_probe,
.remove = __devexit_p(davinci_remove),
.driver = { .driver = {
.name = "musb-davinci", .name = "musb-davinci",
}, },
...@@ -620,9 +621,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -620,9 +621,9 @@ MODULE_LICENSE("GPL v2");
static int __init davinci_init(void) static int __init davinci_init(void)
{ {
return platform_driver_probe(&davinci_driver, davinci_probe); return platform_driver_register(&davinci_driver);
} }
subsys_initcall(davinci_init); module_init(davinci_init);
static void __exit davinci_exit(void) static void __exit davinci_exit(void)
{ {
......
...@@ -1017,12 +1017,12 @@ static void musb_shutdown(struct platform_device *pdev) ...@@ -1017,12 +1017,12 @@ static void musb_shutdown(struct platform_device *pdev)
|| defined(CONFIG_USB_MUSB_OMAP2PLUS_MODULE) \ || defined(CONFIG_USB_MUSB_OMAP2PLUS_MODULE) \
|| defined(CONFIG_USB_MUSB_AM35X) \ || defined(CONFIG_USB_MUSB_AM35X) \
|| defined(CONFIG_USB_MUSB_AM35X_MODULE) || defined(CONFIG_USB_MUSB_AM35X_MODULE)
static ushort __initdata fifo_mode = 4; static ushort __devinitdata fifo_mode = 4;
#elif defined(CONFIG_USB_MUSB_UX500) \ #elif defined(CONFIG_USB_MUSB_UX500) \
|| defined(CONFIG_USB_MUSB_UX500_MODULE) || defined(CONFIG_USB_MUSB_UX500_MODULE)
static ushort __initdata fifo_mode = 5; static ushort __devinitdata fifo_mode = 5;
#else #else
static ushort __initdata fifo_mode = 2; static ushort __devinitdata fifo_mode = 2;
#endif #endif
/* "modprobe ... fifo_mode=1" etc */ /* "modprobe ... fifo_mode=1" etc */
...@@ -1035,7 +1035,7 @@ MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration"); ...@@ -1035,7 +1035,7 @@ MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration");
*/ */
/* mode 0 - fits in 2KB */ /* mode 0 - fits in 2KB */
static struct musb_fifo_cfg __initdata mode_0_cfg[] = { static struct musb_fifo_cfg __devinitdata mode_0_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, }, { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, },
...@@ -1044,7 +1044,7 @@ static struct musb_fifo_cfg __initdata mode_0_cfg[] = { ...@@ -1044,7 +1044,7 @@ static struct musb_fifo_cfg __initdata mode_0_cfg[] = {
}; };
/* mode 1 - fits in 4KB */ /* mode 1 - fits in 4KB */
static struct musb_fifo_cfg __initdata mode_1_cfg[] = { static struct musb_fifo_cfg __devinitdata mode_1_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, },
{ .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, }, { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, },
...@@ -1053,7 +1053,7 @@ static struct musb_fifo_cfg __initdata mode_1_cfg[] = { ...@@ -1053,7 +1053,7 @@ static struct musb_fifo_cfg __initdata mode_1_cfg[] = {
}; };
/* mode 2 - fits in 4KB */ /* mode 2 - fits in 4KB */
static struct musb_fifo_cfg __initdata mode_2_cfg[] = { static struct musb_fifo_cfg __devinitdata mode_2_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
...@@ -1063,7 +1063,7 @@ static struct musb_fifo_cfg __initdata mode_2_cfg[] = { ...@@ -1063,7 +1063,7 @@ static struct musb_fifo_cfg __initdata mode_2_cfg[] = {
}; };
/* mode 3 - fits in 4KB */ /* mode 3 - fits in 4KB */
static struct musb_fifo_cfg __initdata mode_3_cfg[] = { static struct musb_fifo_cfg __devinitdata mode_3_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, }, { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, .mode = BUF_DOUBLE, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, }, { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, .mode = BUF_DOUBLE, },
{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
...@@ -1073,7 +1073,7 @@ static struct musb_fifo_cfg __initdata mode_3_cfg[] = { ...@@ -1073,7 +1073,7 @@ static struct musb_fifo_cfg __initdata mode_3_cfg[] = {
}; };
/* mode 4 - fits in 16KB */ /* mode 4 - fits in 16KB */
static struct musb_fifo_cfg __initdata mode_4_cfg[] = { static struct musb_fifo_cfg __devinitdata mode_4_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
...@@ -1104,7 +1104,7 @@ static struct musb_fifo_cfg __initdata mode_4_cfg[] = { ...@@ -1104,7 +1104,7 @@ static struct musb_fifo_cfg __initdata mode_4_cfg[] = {
}; };
/* mode 5 - fits in 8KB */ /* mode 5 - fits in 8KB */
static struct musb_fifo_cfg __initdata mode_5_cfg[] = { static struct musb_fifo_cfg __devinitdata mode_5_cfg[] = {
{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, },
{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, { .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, },
{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, }, { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 512, },
...@@ -1140,7 +1140,7 @@ static struct musb_fifo_cfg __initdata mode_5_cfg[] = { ...@@ -1140,7 +1140,7 @@ static struct musb_fifo_cfg __initdata mode_5_cfg[] = {
* *
* returns negative errno or offset for next fifo. * returns negative errno or offset for next fifo.
*/ */
static int __init static int __devinit
fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep,
const struct musb_fifo_cfg *cfg, u16 offset) const struct musb_fifo_cfg *cfg, u16 offset)
{ {
...@@ -1211,11 +1211,11 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, ...@@ -1211,11 +1211,11 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep,
return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0)); return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0));
} }
static struct musb_fifo_cfg __initdata ep0_cfg = { static struct musb_fifo_cfg __devinitdata ep0_cfg = {
.style = FIFO_RXTX, .maxpacket = 64, .style = FIFO_RXTX, .maxpacket = 64,
}; };
static int __init ep_config_from_table(struct musb *musb) static int __devinit ep_config_from_table(struct musb *musb)
{ {
const struct musb_fifo_cfg *cfg; const struct musb_fifo_cfg *cfg;
unsigned i, n; unsigned i, n;
...@@ -1306,7 +1306,7 @@ static int __init ep_config_from_table(struct musb *musb) ...@@ -1306,7 +1306,7 @@ static int __init ep_config_from_table(struct musb *musb)
* ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false
* @param musb the controller * @param musb the controller
*/ */
static int __init ep_config_from_hw(struct musb *musb) static int __devinit ep_config_from_hw(struct musb *musb)
{ {
u8 epnum = 0; u8 epnum = 0;
struct musb_hw_ep *hw_ep; struct musb_hw_ep *hw_ep;
...@@ -1353,7 +1353,7 @@ enum { MUSB_CONTROLLER_MHDRC, MUSB_CONTROLLER_HDRC, }; ...@@ -1353,7 +1353,7 @@ enum { MUSB_CONTROLLER_MHDRC, MUSB_CONTROLLER_HDRC, };
/* Initialize MUSB (M)HDRC part of the USB hardware subsystem; /* Initialize MUSB (M)HDRC part of the USB hardware subsystem;
* configure endpoints, or take their config from silicon * configure endpoints, or take their config from silicon
*/ */
static int __init musb_core_init(u16 musb_type, struct musb *musb) static int __devinit musb_core_init(u16 musb_type, struct musb *musb)
{ {
u8 reg; u8 reg;
char *type; char *type;
...@@ -1589,7 +1589,7 @@ irqreturn_t musb_interrupt(struct musb *musb) ...@@ -1589,7 +1589,7 @@ irqreturn_t musb_interrupt(struct musb *musb)
EXPORT_SYMBOL_GPL(musb_interrupt); EXPORT_SYMBOL_GPL(musb_interrupt);
#ifndef CONFIG_MUSB_PIO_ONLY #ifndef CONFIG_MUSB_PIO_ONLY
static bool __initdata use_dma = 1; static bool __devinitdata use_dma = 1;
/* "modprobe ... use_dma=0" etc */ /* "modprobe ... use_dma=0" etc */
module_param(use_dma, bool, 0); module_param(use_dma, bool, 0);
...@@ -1777,7 +1777,7 @@ static void musb_irq_work(struct work_struct *data) ...@@ -1777,7 +1777,7 @@ static void musb_irq_work(struct work_struct *data)
* Init support * Init support
*/ */
static struct musb *__init static struct musb *__devinit
allocate_instance(struct device *dev, allocate_instance(struct device *dev,
struct musb_hdrc_config *config, void __iomem *mbase) struct musb_hdrc_config *config, void __iomem *mbase)
{ {
...@@ -1853,7 +1853,7 @@ static void musb_free(struct musb *musb) ...@@ -1853,7 +1853,7 @@ static void musb_free(struct musb *musb)
* @mregs: virtual address of controller registers, * @mregs: virtual address of controller registers,
* not yet corrected for platform-specific offsets * not yet corrected for platform-specific offsets
*/ */
static int __init static int __devinit
musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
{ {
int status; int status;
...@@ -2073,7 +2073,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -2073,7 +2073,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
static u64 *orig_dma_mask; static u64 *orig_dma_mask;
#endif #endif
static int __init musb_probe(struct platform_device *pdev) static int __devinit musb_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
int irq = platform_get_irq_byname(pdev, "mc"); int irq = platform_get_irq_byname(pdev, "mc");
...@@ -2102,7 +2102,7 @@ static int __init musb_probe(struct platform_device *pdev) ...@@ -2102,7 +2102,7 @@ static int __init musb_probe(struct platform_device *pdev)
return status; return status;
} }
static int __exit musb_remove(struct platform_device *pdev) static int __devexit musb_remove(struct platform_device *pdev)
{ {
struct musb *musb = dev_to_musb(&pdev->dev); struct musb *musb = dev_to_musb(&pdev->dev);
void __iomem *ctrl_base = musb->ctrl_base; void __iomem *ctrl_base = musb->ctrl_base;
...@@ -2112,11 +2112,9 @@ static int __exit musb_remove(struct platform_device *pdev) ...@@ -2112,11 +2112,9 @@ static int __exit musb_remove(struct platform_device *pdev)
* - Peripheral mode: peripheral is deactivated (or never-activated) * - Peripheral mode: peripheral is deactivated (or never-activated)
* - OTG mode: both roles are deactivated (or never-activated) * - OTG mode: both roles are deactivated (or never-activated)
*/ */
pm_runtime_get_sync(musb->controller);
musb_exit_debugfs(musb); musb_exit_debugfs(musb);
musb_shutdown(pdev); musb_shutdown(pdev);
pm_runtime_put(musb->controller);
musb_free(musb); musb_free(musb);
iounmap(ctrl_base); iounmap(ctrl_base);
device_init_wakeup(&pdev->dev, 0); device_init_wakeup(&pdev->dev, 0);
...@@ -2364,7 +2362,8 @@ static struct platform_driver musb_driver = { ...@@ -2364,7 +2362,8 @@ static struct platform_driver musb_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = MUSB_DEV_PM_OPS, .pm = MUSB_DEV_PM_OPS,
}, },
.remove = __exit_p(musb_remove), .probe = musb_probe,
.remove = __devexit_p(musb_remove),
.shutdown = musb_shutdown, .shutdown = musb_shutdown,
}; };
...@@ -2380,13 +2379,9 @@ static int __init musb_init(void) ...@@ -2380,13 +2379,9 @@ static int __init musb_init(void)
", " ", "
"otg (peripheral+host)", "otg (peripheral+host)",
musb_driver_name); musb_driver_name);
return platform_driver_probe(&musb_driver, musb_probe); return platform_driver_register(&musb_driver);
} }
module_init(musb_init);
/* make us init after usbcore and i2c (transceivers, regulators, etc)
* and before usb gadget and host-side drivers start to register
*/
fs_initcall(musb_init);
static void __exit musb_cleanup(void) static void __exit musb_cleanup(void)
{ {
......
...@@ -235,29 +235,29 @@ static const struct file_operations musb_test_mode_fops = { ...@@ -235,29 +235,29 @@ static const struct file_operations musb_test_mode_fops = {
.release = single_release, .release = single_release,
}; };
int __init musb_init_debugfs(struct musb *musb) int __devinit musb_init_debugfs(struct musb *musb)
{ {
struct dentry *root; struct dentry *root;
struct dentry *file; struct dentry *file;
int ret; int ret;
root = debugfs_create_dir("musb", NULL); root = debugfs_create_dir("musb", NULL);
if (IS_ERR(root)) { if (!root) {
ret = PTR_ERR(root); ret = -ENOMEM;
goto err0; goto err0;
} }
file = debugfs_create_file("regdump", S_IRUGO, root, musb, file = debugfs_create_file("regdump", S_IRUGO, root, musb,
&musb_regdump_fops); &musb_regdump_fops);
if (IS_ERR(file)) { if (!file) {
ret = PTR_ERR(file); ret = -ENOMEM;
goto err1; goto err1;
} }
file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR,
root, musb, &musb_test_mode_fops); root, musb, &musb_test_mode_fops);
if (IS_ERR(file)) { if (!file) {
ret = PTR_ERR(file); ret = -ENOMEM;
goto err1; goto err1;
} }
......
...@@ -574,6 +574,15 @@ void musb_g_tx(struct musb *musb, u8 epnum) ...@@ -574,6 +574,15 @@ void musb_g_tx(struct musb *musb, u8 epnum)
if (request->actual == request->length) { if (request->actual == request->length) {
musb_g_giveback(musb_ep, request, 0); musb_g_giveback(musb_ep, request, 0);
/*
* In the giveback function the MUSB lock is
* released and acquired after sometime. During
* this time period the INDEX register could get
* changed by the gadget_queue function especially
* on SMP systems. Reselect the INDEX to be sure
* we are reading/modifying the right registers
*/
musb_ep_select(mbase, epnum);
req = musb_ep->desc ? next_request(musb_ep) : NULL; req = musb_ep->desc ? next_request(musb_ep) : NULL;
if (!req) { if (!req) {
dev_dbg(musb->controller, "%s idle now\n", dev_dbg(musb->controller, "%s idle now\n",
...@@ -983,6 +992,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) ...@@ -983,6 +992,15 @@ void musb_g_rx(struct musb *musb, u8 epnum)
} }
#endif #endif
musb_g_giveback(musb_ep, request, 0); musb_g_giveback(musb_ep, request, 0);
/*
* In the giveback function the MUSB lock is
* released and acquired after sometime. During
* this time period the INDEX register could get
* changed by the gadget_queue function especially
* on SMP systems. Reselect the INDEX to be sure
* we are reading/modifying the right registers
*/
musb_ep_select(mbase, epnum);
req = next_request(musb_ep); req = next_request(musb_ep);
if (!req) if (!req)
...@@ -1762,7 +1780,7 @@ static void musb_gadget_release(struct device *dev) ...@@ -1762,7 +1780,7 @@ static void musb_gadget_release(struct device *dev)
} }
static void __init static void __devinit
init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in)
{ {
struct musb_hw_ep *hw_ep = musb->endpoints + epnum; struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
...@@ -1799,7 +1817,7 @@ init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) ...@@ -1799,7 +1817,7 @@ init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in)
* Initialize the endpoints exposed to peripheral drivers, with backlinks * Initialize the endpoints exposed to peripheral drivers, with backlinks
* to the rest of the driver state. * to the rest of the driver state.
*/ */
static inline void __init musb_g_init_endpoints(struct musb *musb) static inline void __devinit musb_g_init_endpoints(struct musb *musb)
{ {
u8 epnum; u8 epnum;
struct musb_hw_ep *hw_ep; struct musb_hw_ep *hw_ep;
...@@ -1832,7 +1850,7 @@ static inline void __init musb_g_init_endpoints(struct musb *musb) ...@@ -1832,7 +1850,7 @@ static inline void __init musb_g_init_endpoints(struct musb *musb)
/* called once during driver setup to initialize and link into /* called once during driver setup to initialize and link into
* the driver model; memory is zeroed. * the driver model; memory is zeroed.
*/ */
int __init musb_gadget_setup(struct musb *musb) int __devinit musb_gadget_setup(struct musb *musb)
{ {
int status; int status;
......
...@@ -408,7 +408,7 @@ static const struct musb_platform_ops omap2430_ops = { ...@@ -408,7 +408,7 @@ static const struct musb_platform_ops omap2430_ops = {
static u64 omap2430_dmamask = DMA_BIT_MASK(32); static u64 omap2430_dmamask = DMA_BIT_MASK(32);
static int __init omap2430_probe(struct platform_device *pdev) static int __devinit 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;
...@@ -471,7 +471,7 @@ static int __init omap2430_probe(struct platform_device *pdev) ...@@ -471,7 +471,7 @@ static int __init omap2430_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit omap2430_remove(struct platform_device *pdev) 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);
...@@ -524,7 +524,8 @@ static struct dev_pm_ops omap2430_pm_ops = { ...@@ -524,7 +524,8 @@ static struct dev_pm_ops omap2430_pm_ops = {
#endif #endif
static struct platform_driver omap2430_driver = { static struct platform_driver omap2430_driver = {
.remove = __exit_p(omap2430_remove), .probe = omap2430_probe,
.remove = __devexit_p(omap2430_remove),
.driver = { .driver = {
.name = "musb-omap2430", .name = "musb-omap2430",
.pm = DEV_PM_OPS, .pm = DEV_PM_OPS,
...@@ -537,9 +538,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -537,9 +538,9 @@ MODULE_LICENSE("GPL v2");
static int __init omap2430_init(void) static int __init omap2430_init(void)
{ {
return platform_driver_probe(&omap2430_driver, omap2430_probe); return platform_driver_register(&omap2430_driver);
} }
subsys_initcall(omap2430_init); module_init(omap2430_init);
static void __exit omap2430_exit(void) static void __exit omap2430_exit(void)
{ {
......
...@@ -1165,7 +1165,7 @@ static const struct musb_platform_ops tusb_ops = { ...@@ -1165,7 +1165,7 @@ static const struct musb_platform_ops tusb_ops = {
static u64 tusb_dmamask = DMA_BIT_MASK(32); static u64 tusb_dmamask = DMA_BIT_MASK(32);
static int __init tusb_probe(struct platform_device *pdev) static int __devinit tusb_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;
...@@ -1227,7 +1227,7 @@ static int __init tusb_probe(struct platform_device *pdev) ...@@ -1227,7 +1227,7 @@ static int __init tusb_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit tusb_remove(struct platform_device *pdev) 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);
...@@ -1239,7 +1239,8 @@ static int __exit tusb_remove(struct platform_device *pdev) ...@@ -1239,7 +1239,8 @@ static int __exit tusb_remove(struct platform_device *pdev)
} }
static struct platform_driver tusb_driver = { static struct platform_driver tusb_driver = {
.remove = __exit_p(tusb_remove), .probe = tusb_probe,
.remove = __devexit_p(tusb_remove),
.driver = { .driver = {
.name = "musb-tusb", .name = "musb-tusb",
}, },
...@@ -1251,9 +1252,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -1251,9 +1252,9 @@ MODULE_LICENSE("GPL v2");
static int __init tusb_init(void) static int __init tusb_init(void)
{ {
return platform_driver_probe(&tusb_driver, tusb_probe); return platform_driver_register(&tusb_driver);
} }
subsys_initcall(tusb_init); module_init(tusb_init);
static void __exit tusb_exit(void) static void __exit tusb_exit(void)
{ {
......
...@@ -58,7 +58,7 @@ static const struct musb_platform_ops ux500_ops = { ...@@ -58,7 +58,7 @@ static const struct musb_platform_ops ux500_ops = {
.exit = ux500_musb_exit, .exit = ux500_musb_exit,
}; };
static int __init ux500_probe(struct platform_device *pdev) static int __devinit ux500_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;
...@@ -141,7 +141,7 @@ static int __init ux500_probe(struct platform_device *pdev) ...@@ -141,7 +141,7 @@ static int __init ux500_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __exit ux500_remove(struct platform_device *pdev) 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);
...@@ -194,7 +194,8 @@ static const struct dev_pm_ops ux500_pm_ops = { ...@@ -194,7 +194,8 @@ static const struct dev_pm_ops ux500_pm_ops = {
#endif #endif
static struct platform_driver ux500_driver = { static struct platform_driver ux500_driver = {
.remove = __exit_p(ux500_remove), .probe = ux500_probe,
.remove = __devexit_p(ux500_remove),
.driver = { .driver = {
.name = "musb-ux500", .name = "musb-ux500",
.pm = DEV_PM_OPS, .pm = DEV_PM_OPS,
...@@ -207,9 +208,9 @@ MODULE_LICENSE("GPL v2"); ...@@ -207,9 +208,9 @@ MODULE_LICENSE("GPL v2");
static int __init ux500_init(void) static int __init ux500_init(void)
{ {
return platform_driver_probe(&ux500_driver, ux500_probe); return platform_driver_register(&ux500_driver);
} }
subsys_initcall(ux500_init); module_init(ux500_init);
static void __exit ux500_exit(void) static void __exit ux500_exit(void)
{ {
......
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