Message ID | 20190903141215.18283-1-dinguyen@kernel.org (mailing list archive) |
---|---|
State | Mainlined |
Commit | 79bdcb202a35bf2701779afafa0db07e2852d46b |
Headers | show |
Series | [PATCHv7] drivers/amba: add reset control to amba bus probe | expand |
On Tue, Sep 3, 2019 at 4:20 PM Dinh Nguyen <dinguyen@kernel.org> wrote: > 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. > > 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 properti > is not present in the device tree node, so the driver will continue to > probe. > > Because there are different variants of the controller that may have > multiple reset signals, the code will find all reset(s) specified and > de-assert them. > > Signed-off-by: Dinh Nguyen <dinguyen@kernel.org> > Reviewed-by: Rob Herring <robh@kernel.org> > Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Please put this patch into Russell's patch tracker. Yours, Linus Walleij
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 100e798a5c82..f39f075abff9 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -18,6 +18,7 @@ #include <linux/limits.h> #include <linux/clk/clk-conf.h> #include <linux/platform_device.h> +#include <linux/reset.h> #include <asm/irq.h> @@ -401,6 +402,19 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent) ret = amba_get_enable_pclk(dev); if (ret == 0) { u32 pid, cid; + struct reset_control *rstc; + + /* + * Find reset control(s) of the amba bus and de-assert them. + */ + rstc = of_reset_control_array_get_optional_shared(dev->dev.of_node); + if (IS_ERR(rstc)) { + if (PTR_ERR(rstc) != -EPROBE_DEFER) + dev_err(&dev->dev, "Can't get amba reset!\n"); + return PTR_ERR(rstc); + } + reset_control_deassert(rstc); + reset_control_put(rstc); /* * Read pid and cid based on size of resource