Commit 09fc7d22 authored by Felipe Balbi's avatar Felipe Balbi

usb: musb: fix incorrect usage of resource pointer

We can't simply pass the resource pointer from our
device down to our children, otherwise module
reinsertion will not work as the resource will
continue to be marked as busy.

Fix it by building a proper struct resource for
our child musb device.
Tested-by: default avatarDmitry Lifshitz <lifshitz@compulab.co.il>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent e4aa937e
...@@ -450,6 +450,7 @@ static u64 bfin_dmamask = DMA_BIT_MASK(32); ...@@ -450,6 +450,7 @@ static u64 bfin_dmamask = DMA_BIT_MASK(32);
static int bfin_probe(struct platform_device *pdev) static int bfin_probe(struct platform_device *pdev)
{ {
struct resource musb_resources[2];
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 bfin_glue *glue; struct bfin_glue *glue;
...@@ -479,8 +480,21 @@ static int bfin_probe(struct platform_device *pdev) ...@@ -479,8 +480,21 @@ static int bfin_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, glue); platform_set_drvdata(pdev, glue);
ret = platform_device_add_resources(musb, pdev->resource, memset(musb_resources, 0x00, sizeof(*musb_resources) *
pdev->num_resources); ARRAY_SIZE(musb_resources));
musb_resources[0].name = pdev->resource[0].name;
musb_resources[0].start = pdev->resource[0].start;
musb_resources[0].end = pdev->resource[0].end;
musb_resources[0].flags = pdev->resource[0].flags;
musb_resources[1].name = pdev->resource[1].name;
musb_resources[1].start = pdev->resource[1].start;
musb_resources[1].end = pdev->resource[1].end;
musb_resources[1].flags = pdev->resource[1].flags;
ret = platform_device_add_resources(musb, musb_resources,
ARRAY_SIZE(musb_resources));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err3; goto err3;
......
...@@ -476,6 +476,7 @@ static u64 da8xx_dmamask = DMA_BIT_MASK(32); ...@@ -476,6 +476,7 @@ static u64 da8xx_dmamask = DMA_BIT_MASK(32);
static int da8xx_probe(struct platform_device *pdev) static int da8xx_probe(struct platform_device *pdev)
{ {
struct resource musb_resources[2];
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 da8xx_glue *glue; struct da8xx_glue *glue;
...@@ -521,8 +522,21 @@ static int da8xx_probe(struct platform_device *pdev) ...@@ -521,8 +522,21 @@ static int da8xx_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, glue); platform_set_drvdata(pdev, glue);
ret = platform_device_add_resources(musb, pdev->resource, memset(musb_resources, 0x00, sizeof(*musb_resources) *
pdev->num_resources); ARRAY_SIZE(musb_resources));
musb_resources[0].name = pdev->resource[0].name;
musb_resources[0].start = pdev->resource[0].start;
musb_resources[0].end = pdev->resource[0].end;
musb_resources[0].flags = pdev->resource[0].flags;
musb_resources[1].name = pdev->resource[1].name;
musb_resources[1].start = pdev->resource[1].start;
musb_resources[1].end = pdev->resource[1].end;
musb_resources[1].flags = pdev->resource[1].flags;
ret = platform_device_add_resources(musb, musb_resources,
ARRAY_SIZE(musb_resources));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err5; goto err5;
......
...@@ -509,6 +509,7 @@ static u64 davinci_dmamask = DMA_BIT_MASK(32); ...@@ -509,6 +509,7 @@ static u64 davinci_dmamask = DMA_BIT_MASK(32);
static int davinci_probe(struct platform_device *pdev) static int davinci_probe(struct platform_device *pdev)
{ {
struct resource musb_resources[2];
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;
...@@ -553,8 +554,21 @@ static int davinci_probe(struct platform_device *pdev) ...@@ -553,8 +554,21 @@ static int davinci_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, glue); platform_set_drvdata(pdev, glue);
ret = platform_device_add_resources(musb, pdev->resource, memset(musb_resources, 0x00, sizeof(*musb_resources) *
pdev->num_resources); ARRAY_SIZE(musb_resources));
musb_resources[0].name = pdev->resource[0].name;
musb_resources[0].start = pdev->resource[0].start;
musb_resources[0].end = pdev->resource[0].end;
musb_resources[0].flags = pdev->resource[0].flags;
musb_resources[1].name = pdev->resource[1].name;
musb_resources[1].start = pdev->resource[1].start;
musb_resources[1].end = pdev->resource[1].end;
musb_resources[1].flags = pdev->resource[1].flags;
ret = platform_device_add_resources(musb, musb_resources,
ARRAY_SIZE(musb_resources));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err5; goto err5;
......
...@@ -481,6 +481,7 @@ static u64 omap2430_dmamask = DMA_BIT_MASK(32); ...@@ -481,6 +481,7 @@ static u64 omap2430_dmamask = DMA_BIT_MASK(32);
static int omap2430_probe(struct platform_device *pdev) static int omap2430_probe(struct platform_device *pdev)
{ {
struct resource musb_resouces[2];
struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
struct omap_musb_board_data *data; struct omap_musb_board_data *data;
struct platform_device *musb; struct platform_device *musb;
...@@ -567,8 +568,21 @@ static int omap2430_probe(struct platform_device *pdev) ...@@ -567,8 +568,21 @@ static int omap2430_probe(struct platform_device *pdev)
INIT_WORK(&glue->omap_musb_mailbox_work, omap_musb_mailbox_work); INIT_WORK(&glue->omap_musb_mailbox_work, omap_musb_mailbox_work);
ret = platform_device_add_resources(musb, pdev->resource, memset(musb_resouces, 0x00, sizeof(*musb_resources) *
pdev->num_resources); ARRAY_SIZE(musb_resources));
musb_resources[0].name = pdev->resource[0].name;
musb_resources[0].start = pdev->resource[0].start;
musb_resources[0].end = pdev->resource[0].end;
musb_resources[0].flags = pdev->resource[0].flags;
musb_resources[1].name = pdev->resource[1].name;
musb_resources[1].start = pdev->resource[1].start;
musb_resources[1].end = pdev->resource[1].end;
musb_resources[1].flags = pdev->resource[1].flags;
ret = platform_device_add_resources(musb, musb_resources,
ARRAY_SIZE(musb_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 err2;
......
...@@ -1156,6 +1156,7 @@ static u64 tusb_dmamask = DMA_BIT_MASK(32); ...@@ -1156,6 +1156,7 @@ static u64 tusb_dmamask = DMA_BIT_MASK(32);
static int tusb_probe(struct platform_device *pdev) static int tusb_probe(struct platform_device *pdev)
{ {
struct resource musb_resources[2];
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 tusb6010_glue *glue; struct tusb6010_glue *glue;
...@@ -1185,8 +1186,21 @@ static int tusb_probe(struct platform_device *pdev) ...@@ -1185,8 +1186,21 @@ static int tusb_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, glue); platform_set_drvdata(pdev, glue);
ret = platform_device_add_resources(musb, pdev->resource, memset(musb_resources, 0x00, sizeof(*musb_resources) *
pdev->num_resources); ARRAY_SIZE(musb_resources));
musb_resources[0].name = pdev->resource[0].name;
musb_resources[0].start = pdev->resource[0].start;
musb_resources[0].end = pdev->resource[0].end;
musb_resources[0].flags = pdev->resource[0].flags;
musb_resources[1].name = pdev->resource[1].name;
musb_resources[1].start = pdev->resource[1].start;
musb_resources[1].end = pdev->resource[1].end;
musb_resources[1].flags = pdev->resource[1].flags;
ret = platform_device_add_resources(musb, musb_resources,
ARRAY_SIZE(musb_resources));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err3; goto err3;
......
...@@ -189,6 +189,7 @@ static const struct musb_platform_ops ux500_ops = { ...@@ -189,6 +189,7 @@ static const struct musb_platform_ops ux500_ops = {
static int ux500_probe(struct platform_device *pdev) static int ux500_probe(struct platform_device *pdev)
{ {
struct resource musb_resources[2];
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 ux500_glue *glue; struct ux500_glue *glue;
...@@ -232,8 +233,21 @@ static int ux500_probe(struct platform_device *pdev) ...@@ -232,8 +233,21 @@ static int ux500_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, glue); platform_set_drvdata(pdev, glue);
ret = platform_device_add_resources(musb, pdev->resource, memset(musb_resources, 0x00, sizeof(*musb_resources) *
pdev->num_resources); ARRAY_SIZE(musb_resources));
musb_resources[0].name = pdev->resource[0].name;
musb_resources[0].start = pdev->resource[0].start;
musb_resources[0].end = pdev->resource[0].end;
musb_resources[0].flags = pdev->resource[0].flags;
musb_resources[1].name = pdev->resource[1].name;
musb_resources[1].start = pdev->resource[1].start;
musb_resources[1].end = pdev->resource[1].end;
musb_resources[1].flags = pdev->resource[1].flags;
ret = platform_device_add_resources(musb, musb_resources,
ARRAY_SIZE(musb_resources));
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to add resources\n"); dev_err(&pdev->dev, "failed to add resources\n");
goto err5; goto err5;
......
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