devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] drivers/amba: add reset control to primecell probe
@ 2019-08-01 18:43 Dinh Nguyen
  2019-08-02 14:37 ` Rob Herring
  0 siblings, 1 reply; 4+ messages in thread
From: Dinh Nguyen @ 2019-08-01 18:43 UTC (permalink / raw)
  To: devicetree
  Cc: dinguyen, linux-kernel, robh+dt, frowand.list, keescook, anton,
	ccross, tony.luck, Dinh Nguyen

From: Dinh Nguyen <dinh.nguyen@intel.com>

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 property
is not present in the device tree node, so the driver will continue to probe.

Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
---
 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");
+	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

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] drivers/amba: add reset control to primecell probe
  2019-08-01 18:43 [PATCH] drivers/amba: add reset control to primecell probe Dinh Nguyen
@ 2019-08-02 14:37 ` Rob Herring
  2019-08-02 14:42   ` Dinh Nguyen
  0 siblings, 1 reply; 4+ messages in thread
From: Rob Herring @ 2019-08-02 14:37 UTC (permalink / raw)
  To: Dinh Nguyen
  Cc: devicetree, linux-kernel, Frank Rowand, Kees Cook,
	Anton Vorontsov, Colin Cross, Tony Luck, Dinh Nguyen

On Thu, Aug 1, 2019 at 12:44 PM Dinh Nguyen <dinguyen@kernel.org> wrote:
>
> From: Dinh Nguyen <dinh.nguyen@intel.com>
>
> 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@kernel.org>
> ---
>  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
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] drivers/amba: add reset control to primecell probe
  2019-08-02 14:37 ` Rob Herring
@ 2019-08-02 14:42   ` Dinh Nguyen
  2019-08-02 15:29     ` Rob Herring
  0 siblings, 1 reply; 4+ messages in thread
From: Dinh Nguyen @ 2019-08-02 14:42 UTC (permalink / raw)
  To: Rob Herring
  Cc: devicetree, linux-kernel, Frank Rowand, Kees Cook,
	Anton Vorontsov, Colin Cross, Tony Luck, Dinh Nguyen



On 8/2/19 9:37 AM, Rob Herring wrote:
> On Thu, Aug 1, 2019 at 12:44 PM Dinh Nguyen <dinguyen@kernel.org> wrote:
>>
>> From: Dinh Nguyen <dinh.nguyen@intel.com>
>>
>> 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).
> 

Right, there exists in U-Boot to support legacy platforms before this
recent change. This would be for future versions.

>> 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.
> 

Ok.

>>
>> Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
>> ---
>>  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.
>

how about 'primecell' ?

Thanks for the review!

Dinh

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] drivers/amba: add reset control to primecell probe
  2019-08-02 14:42   ` Dinh Nguyen
@ 2019-08-02 15:29     ` Rob Herring
  0 siblings, 0 replies; 4+ messages in thread
From: Rob Herring @ 2019-08-02 15:29 UTC (permalink / raw)
  To: Dinh Nguyen
  Cc: devicetree, linux-kernel, Frank Rowand, Kees Cook,
	Anton Vorontsov, Colin Cross, Tony Luck, Dinh Nguyen

On Fri, Aug 2, 2019 at 8:42 AM Dinh Nguyen <dinguyen@kernel.org> wrote:
>
>
>
> On 8/2/19 9:37 AM, Rob Herring wrote:
> > On Thu, Aug 1, 2019 at 12:44 PM Dinh Nguyen <dinguyen@kernel.org> wrote:
> >>
> >> From: Dinh Nguyen <dinh.nguyen@intel.com>
> >>
> >> 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).
> >
>
> Right, there exists in U-Boot to support legacy platforms before this
> recent change. This would be for future versions.
>
> >> 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.
> >
>
> Ok.
>
> >>
> >> Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
> >> ---
> >>  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.
> >
>
> how about 'primecell' ?

It should be based on what is in the TRMs. Unlike pclk, there doesn't
appear to be a standard name or number of resets:

pl011: PRESETn and nUARTRST
pl330: ARESETn

Can't you just retrieve all of them and deassert them all and ignore the name?

Also, you might need to use the shared variant as the core code has to
work for either dedicated or shared resets.

Rob

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-08-02 15:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-01 18:43 [PATCH] drivers/amba: add reset control to primecell probe Dinh Nguyen
2019-08-02 14:37 ` Rob Herring
2019-08-02 14:42   ` Dinh Nguyen
2019-08-02 15:29     ` Rob Herring

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).