On 02/11/2016 02:03 PM, Petr Kulhavy wrote:
This adds DT support for TI DA8xx/OMAP-L1x/AM17xx/AM18xx MUSB driver Signed-off-by: Petr Kulhavy <petr@xxxxxxxxx> --- drivers/usb/musb/da8xx.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index b03d3b8..371fd74 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c
[...]
+static inline int get_phy_refclk_cfg(struct device_node *np) +{ + u32 freq; + + if (!of_property_read_u32(np, "ti,phy20-refclock-frequency", &freq)) + return -EINVAL;
This function returns a negative error code on failure and 0 on success! Did you test the patch at all? [...]
@@ -482,6 +517,12 @@ static const struct platform_device_info da8xx_dev_info = { .dma_mask = DMA_BIT_MASK(32), }; +static const struct musb_hdrc_config da830_config = {
You may call it 'da8xx_config'. I'm pretty sure there won't be other variants. [...]
@@ -515,6 +557,43 @@ static int da8xx_probe(struct platform_device *pdev) glue->dev = &pdev->dev; glue->clk = clk; + if (IS_ENABLED(CONFIG_OF) && np) { + int phy20_refclk_cfg; + u32 cfgchip2; + + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + ret = -ENOMEM; + goto err5; + } + + pdata->config = &da830_config; + pdata->mode = musb_get_mode(&pdev->dev); + pdata->power = musb_get_power(&pdev->dev); + + cfgchip2 = __raw_readl(CFGCHIP2); + cfgchip2 &= ~CFGCHIP2_USB2PHYCLKMUX; + /* optional parameter reference clock source + * true = use PLL, false = use external clock pin + */
The kernel code (except the networking) prefers to format comments: /* * Like * this. */ You used the networking style. :-)
+ if (of_property_read_bool(np, "ti,phy20-clkmux-pll")) + cfgchip2 |= CFGCHIP2_USB2PHYCLKMUX; + __raw_writel(cfgchip2, CFGCHIP2); + + phy20_refclk_cfg = get_phy_refclk_cfg(np); + if (phy20_refclk_cfg < 0) { + dev_err(&pdev->dev, + "PHY 2.0 clock frequency invalid or undefined\n"); + ret = -EINVAL; + goto err5; + } + + cfgchip2 = __raw_readl(CFGCHIP2); + cfgchip2 &= ~CFGCHIP2_REFFREQ; + cfgchip2 |= phy20_refclk_cfg; + __raw_writel(cfgchip2, CFGCHIP2);
You can do everything in one read-modify-write, no need for intermediate writre/readback.
[...] MBR, Sergei -- 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