On 4/30/19 12:21 PM, Adam Ford wrote:
[..]

> +#if CONFIG_IS_ENABLED(DM_USB)
> +static int ohci_da8xx_probe(struct udevice *dev)
> +{
> +     struct ohci_regs *regs = (struct ohci_regs *)devfdt_get_addr(dev);
> +     struct da8xx_ohci *priv = dev_get_priv(dev);
> +     int i, err, ret, clock_nb;
> +
> +     err = 0;
> +     priv->clock_count = 0;
> +     clock_nb = dev_count_phandle_with_args(dev, "clocks", "#clock-cells");
> +     if (clock_nb > 0) {

What happens if clock_nb == -ENOENT ?

I think what you want here is

if (clock_nb < 0) {
        ...
        return clock_nb;
}

if (clock_nb > 0) {
        ...
}

> +             priv->clocks = devm_kcalloc(dev, clock_nb, sizeof(struct clk),
> +                                         GFP_KERNEL);
> +             if (!priv->clocks)
> +                     return -ENOMEM;
> +
> +             for (i = 0; i < clock_nb; i++) {
> +                     err = clk_get_by_index(dev, i, &priv->clocks[i]);
> +                     if (err < 0)
> +                             break;
> +
> +                     err = clk_enable(&priv->clocks[i]);
> +                     if (err) {
> +                             dev_err(dev, "failed to enable clock %d\n", i);
> +                             clk_free(&priv->clocks[i]);
> +                             goto clk_err;
> +                     }
> +                     priv->clock_count++;
> +             }
> +     } else if (clock_nb != -ENOENT) {
> +             dev_err(dev, "failed to get clock phandle(%d)\n", clock_nb);
> +             return clock_nb;
> +     }
> +
> +     err = usb_cpu_init();
> +
> +     if (err)
> +             goto clk_err;
> +
> +     err = ohci_register(dev, regs);
> +     if (err)
> +             goto phy_err;
> +
> +     return 0;
> +
> +phy_err:
> +     ret = usb_cpu_stop();
> +     if (ret)
> +             dev_err(dev, "failed to shutdown usb phy\n");
> +
> +clk_err:
> +     ret = clk_release_all(priv->clocks, priv->clock_count);
> +     if (ret)
> +             dev_err(dev, "failed to disable all clocks\n");
> +
> +     return err;
> +}
> +
> +static int ohci_da8xx_remove(struct udevice *dev)
> +{
> +     struct da8xx_ohci *priv = dev_get_priv(dev);
> +     int ret;
> +
> +     ret = ohci_deregister(dev);
> +     if (ret)
> +             return ret;
> +
> +     ret = usb_cpu_stop();
> +     if (ret)
> +             return ret;
> +
> +     return clk_release_all(priv->clocks, priv->clock_count);
> +}
> +
> +static const struct udevice_id da8xx_ohci_ids[] = {
> +     { .compatible = "ti,da830-ohci" },
> +     { }
> +};
> +
> +U_BOOT_DRIVER(ohci_generic) = {
> +     .name   = "ohci-da8xx",
> +     .id     = UCLASS_USB,
> +     .of_match = da8xx_ohci_ids,
> +     .probe = ohci_da8xx_probe,
> +     .remove = ohci_da8xx_remove,

Add DM_FLAG_OS_PREPARE for this to work IIRC.

> +     .ops    = &ohci_usb_ops,
> +     .priv_auto_alloc_size = sizeof(struct da8xx_ohci),
> +     .flags  = DM_FLAG_ALLOC_PRIV_DMA,
> +};
> +#endif
> 


-- 
Best regards,
Marek Vasut
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to