Add a function that sets up necessary data structures. In older kernels this was done in a board_ file. To support initialization via a DT, this now needs to be included in the probe() function. Also declare a new device 'compatible' name (am35x-musb) to differentiate it from omap3-musb. Signed-off-by: Rolf Peukert <rolf.peukert@xxxxxxx> --- drivers/usb/musb/am35x.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index c41fe58..3c1477a 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c @@ -462,6 +462,59 @@ static const struct platform_device_info am35x_dev_info = { .dma_mask = DMA_BIT_MASK(32), }; +static struct musb_hdrc_platform_data *am35x_get_config( + struct platform_device *pdev) +{ + struct musb_hdrc_platform_data *pdata; + struct omap_musb_board_data *bdata; + struct musb_hdrc_config *config; + struct device_node *np; + int val, ret; + + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + goto err_out; + + bdata = devm_kzalloc(&pdev->dev, sizeof(*bdata), GFP_KERNEL); + if (!bdata) + goto err_pdata; + + config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL); + if (!config) + goto err_bdata; + + bdata->clear_irq = am35x_musb_clear_irq; + bdata->reset = am35x_musb_reset; + bdata->set_mode = am35x_set_mode; + bdata->set_phy_power = am35x_musb_phy_power; + + pdata->board_data = bdata; + pdata->config = config; + + /* Read settings from device tree */ + np = pdev->dev.of_node; + if (np) { + of_property_read_u32(np, "mode", (u32 *)&pdata->mode); + of_property_read_u32(np, "interface-type", + (u32 *)&bdata->interface_type); + of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps); + of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits); + of_property_read_u32(np, "power", (u32 *)&pdata->power); + + ret = of_property_read_u32(np, "multipoint", &val); + if (!ret && val) + config->multipoint = true; + } + return pdata; + +err_bdata: + devm_kfree(&pdev->dev, bdata); +err_pdata: + devm_kfree(&pdev->dev, pdata); +err_out: + return NULL; +} + static int am35x_probe(struct platform_device *pdev) { struct musb_hdrc_platform_data *pdata = dev_get_platdata(&pdev->dev); @@ -479,6 +532,12 @@ static int am35x_probe(struct platform_device *pdev) goto err0; } + if (!pdata) { + pdata = am35x_get_config(pdev); + if (!pdata) + goto err1; + } + phy_clk = clk_get(&pdev->dev, "fck"); if (IS_ERR(phy_clk)) { dev_err(&pdev->dev, "failed to get PHY clock\n"); @@ -548,6 +607,7 @@ err4: clk_put(phy_clk); err3: +err1: kfree(glue); err0: @@ -615,12 +675,25 @@ static int am35x_resume(struct device *dev) static SIMPLE_DEV_PM_OPS(am35x_pm_ops, am35x_suspend, am35x_resume); +#ifdef CONFIG_OF +static const struct of_device_id am35x_id_table[] = { + { + .compatible = "ti,am35x-musb" + }, + {}, +}; +MODULE_DEVICE_TABLE(of, am35x_id_table); +#endif + static struct platform_driver am35x_driver = { .probe = am35x_probe, .remove = am35x_remove, .driver = { .name = "musb-am35x", .pm = &am35x_pm_ops, +#ifdef CONFIG_OF + .of_match_table = of_match_ptr(am35x_id_table), +#endif }, }; -- 2.4.10 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html