On Thu, Aug 1, 2019 at 12:44 PM Dinh Nguyen <dinguyen@xxxxxxxxxx> wrote: > > From: Dinh Nguyen <dinh.nguyen@xxxxxxxxx> > > The primecell controller on some SoCs, i.e. SoCFPGA, is held in reset by > default. Until recently, the DMA controller was brought out of reset by the > bootloader(i.e. U-Boot). But a recent change in U-Boot, the peripherals that > are not used are held in reset and are left to Linux to bring them out of > reset. You can fix this in the kernel, but any versions before this change will remain broken. IMO, the u-boot change should be reverted because it is breaking an ABI (though not a good one). > Add a mechanism for getting the reset property and de-assert the primecell > module from reset if found. This is a not a hard fail if the reset property > is not present in the device tree node, so the driver will continue to probe. I think this belongs in the AMBA bus code, not the DT code, as that is where we already have clock control code for similar reasons. > > Signed-off-by: Dinh Nguyen <dinguyen@xxxxxxxxxx> > --- > drivers/of/platform.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/of/platform.c b/drivers/of/platform.c > index 7801e25e6895..d8945705313d 100644 > --- a/drivers/of/platform.c > +++ b/drivers/of/platform.c > @@ -21,6 +21,7 @@ > #include <linux/of_irq.h> > #include <linux/of_platform.h> > #include <linux/platform_device.h> > +#include <linux/reset.h> > > const struct of_device_id of_default_bus_match_table[] = { > { .compatible = "simple-bus", }, > @@ -229,6 +230,7 @@ static struct amba_device *of_amba_device_create(struct device_node *node, > struct amba_device *dev; > const void *prop; > int i, ret; > + struct reset_control *rstc; > > pr_debug("Creating amba device %pOF\n", node); > > @@ -270,6 +272,18 @@ static struct amba_device *of_amba_device_create(struct device_node *node, > goto err_free; > } > > + /* > + * reset control of the primecell block is optional > + * and will not fail if the reset property is not found. > + */ > + rstc = of_reset_control_get_exclusive(node, "dma"); 'dma' doesn't sound very generic. > + if (!IS_ERR(rstc)) { > + reset_control_deassert(rstc); > + reset_control_put(rstc); > + } else { > + pr_debug("amba: reset control not found\n"); > + } > + > ret = amba_device_add(dev, &iomem_resource); > if (ret) { > pr_err("amba_device_add() failed (%d) for %pOF\n", > -- > 2.20.0 >