diff mbox series

[U-Boot,v3,1/3] mmc: dwmmc: socfpga: Add reset ctrl to driver

Message ID 1525749566-50769-2-git-send-email-ley.foon.tan@intel.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series drivers: Add reset ctrl to drivers | expand

Commit Message

Ley Foon Tan May 8, 2018, 3:19 a.m. UTC
Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
so only print out a warning and do not fail if a reset property is not present.

If a reset property is discovered, then use it to deassert, thus bringing the
IP out of reset.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
---
 drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

Comments

Simon Glass May 13, 2018, 10:01 p.m. UTC | #1
On 8 May 2018 at 13:19, Ley Foon Tan <ley.foon.tan@intel.com> wrote:
> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
> so only print out a warning and do not fail if a reset property is not present.
>
> If a reset property is discovered, then use it to deassert, thus bringing the
> IP out of reset.
>
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> ---
>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
>  1 files changed, 17 insertions(+), 0 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Ley Foon Tan May 24, 2018, 2:27 a.m. UTC | #2
On Mon, May 14, 2018 at 6:01 AM, Simon Glass <sjg@chromium.org> wrote:
> On 8 May 2018 at 13:19, Ley Foon Tan <ley.foon.tan@intel.com> wrote:
>> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
>> so only print out a warning and do not fail if a reset property is not present.
>>
>> If a reset property is discovered, then use it to deassert, thus bringing the
>> IP out of reset.
>>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> ---
>>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
>>  1 files changed, 17 insertions(+), 0 deletions(-)
>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Hi Jaehoon

Can you help to merge this patch?

Regards
Ley Foon
Tom Rini May 24, 2018, 12:39 p.m. UTC | #3
On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:

> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
> so only print out a warning and do not fail if a reset property is not present.
> 
> If a reset property is discovered, then use it to deassert, thus bringing the
> IP out of reset.
> 
> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> ---
>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
>  1 files changed, 17 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
> index fa0e449..eb7e64e 100644
> --- a/drivers/mmc/socfpga_dw_mmc.c
> +++ b/drivers/mmc/socfpga_dw_mmc.c
> @@ -13,6 +13,7 @@
>  #include <linux/libfdt.h>
>  #include <linux/err.h>
>  #include <malloc.h>
> +#include <reset.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data {
>  	unsigned int		smplsel;
>  };
>  
> +static void socfpga_dwmci_reset(struct udevice *dev)
> +{
> +	struct reset_ctl_bulk reset_bulk;
> +	int ret;
> +
> +	ret = reset_get_bulk(dev, &reset_bulk);
> +	if (ret) {
> +		dev_warn(dev, "Can't get reset: %d\n", ret);
> +		return;
> +	}
> +
> +	reset_deassert_bulk(&reset_bulk);
> +}

The driver doesn't depend on DM_RESET and this code hunk doesn't either
so it fails to build on a number of platforms.  This type of comment
applies to the whole series, and may be fixed differently in different
cases (it might be OK to enforce DM_RESET for this driver, but not for
the ns16550 driver).
Ley Foon Tan May 25, 2018, 2:45 a.m. UTC | #4
On Thu, May 24, 2018 at 8:39 PM, Tom Rini <trini@konsulko.com> wrote:
> On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:
>
>> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
>> so only print out a warning and do not fail if a reset property is not present.
>>
>> If a reset property is discovered, then use it to deassert, thus bringing the
>> IP out of reset.
>>
>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>> ---
>>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
>>  1 files changed, 17 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
>> index fa0e449..eb7e64e 100644
>> --- a/drivers/mmc/socfpga_dw_mmc.c
>> +++ b/drivers/mmc/socfpga_dw_mmc.c
>> @@ -13,6 +13,7 @@
>>  #include <linux/libfdt.h>
>>  #include <linux/err.h>
>>  #include <malloc.h>
>> +#include <reset.h>
>>
>>  DECLARE_GLOBAL_DATA_PTR;
>>
>> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data {
>>       unsigned int            smplsel;
>>  };
>>
>> +static void socfpga_dwmci_reset(struct udevice *dev)
>> +{
>> +     struct reset_ctl_bulk reset_bulk;
>> +     int ret;
>> +
>> +     ret = reset_get_bulk(dev, &reset_bulk);
>> +     if (ret) {
>> +             dev_warn(dev, "Can't get reset: %d\n", ret);
>> +             return;
>> +     }
>> +
>> +     reset_deassert_bulk(&reset_bulk);
>> +}
>
> The driver doesn't depend on DM_RESET and this code hunk doesn't either
> so it fails to build on a number of platforms.  This type of comment
> applies to the whole series, and may be fixed differently in different
> cases (it might be OK to enforce DM_RESET for this driver, but not for
> the ns16550 driver).
>
> --
> Tom
>
include/reset.h has the DM_RESET wrapper, so it will not cause the
compilation error if the CONFIG_DM_RESET is disabled.

I have tried compile the uboot with CONFIG_DM_RESET disabled,
compilation is fine.

Thanks.

Regards
Ley Foon
Tom Rini May 25, 2018, 11:16 a.m. UTC | #5
On Fri, May 25, 2018 at 10:45:53AM +0800, Ley Foon Tan wrote:
> On Thu, May 24, 2018 at 8:39 PM, Tom Rini <trini@konsulko.com> wrote:
> > On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:
> >
> >> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
> >> so only print out a warning and do not fail if a reset property is not present.
> >>
> >> If a reset property is discovered, then use it to deassert, thus bringing the
> >> IP out of reset.
> >>
> >> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> >> Reviewed-by: Simon Glass <sjg@chromium.org>
> >> ---
> >>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
> >>  1 files changed, 17 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
> >> index fa0e449..eb7e64e 100644
> >> --- a/drivers/mmc/socfpga_dw_mmc.c
> >> +++ b/drivers/mmc/socfpga_dw_mmc.c
> >> @@ -13,6 +13,7 @@
> >>  #include <linux/libfdt.h>
> >>  #include <linux/err.h>
> >>  #include <malloc.h>
> >> +#include <reset.h>
> >>
> >>  DECLARE_GLOBAL_DATA_PTR;
> >>
> >> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data {
> >>       unsigned int            smplsel;
> >>  };
> >>
> >> +static void socfpga_dwmci_reset(struct udevice *dev)
> >> +{
> >> +     struct reset_ctl_bulk reset_bulk;
> >> +     int ret;
> >> +
> >> +     ret = reset_get_bulk(dev, &reset_bulk);
> >> +     if (ret) {
> >> +             dev_warn(dev, "Can't get reset: %d\n", ret);
> >> +             return;
> >> +     }
> >> +
> >> +     reset_deassert_bulk(&reset_bulk);
> >> +}
> >
> > The driver doesn't depend on DM_RESET and this code hunk doesn't either
> > so it fails to build on a number of platforms.  This type of comment
> > applies to the whole series, and may be fixed differently in different
> > cases (it might be OK to enforce DM_RESET for this driver, but not for
> > the ns16550 driver).
> >
> > --
> > Tom
> >
> include/reset.h has the DM_RESET wrapper, so it will not cause the
> compilation error if the CONFIG_DM_RESET is disabled.
> 
> I have tried compile the uboot with CONFIG_DM_RESET disabled,
> compilation is fine.

This whole series causes a good percent of the world to fail to link, so
something is off about the wrappers or use of them.  See:
https://travis-ci.org/trini/u-boot/jobs/382783645
Dinh Nguyen May 29, 2018, 1:30 p.m. UTC | #6
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256



On 05/25/2018 06:16 AM, Tom Rini wrote:
> On Fri, May 25, 2018 at 10:45:53AM +0800, Ley Foon Tan wrote:
>> On Thu, May 24, 2018 at 8:39 PM, Tom Rini <trini@konsulko.com>
>> wrote:
>>> On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:
>>> 
>>>> Add code to reset all reset signals as in mmc DT node. A
>>>> reset property is an optional feature, so only print out a
>>>> warning and do not fail if a reset property is not present.
>>>> 
>>>> If a reset property is discovered, then use it to deassert,
>>>> thus bringing the IP out of reset.
>>>> 
>>>> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> 
>>>> Reviewed-by: Simon Glass <sjg@chromium.org> --- 
>>>> drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++ 1 files
>>>> changed, 17 insertions(+), 0 deletions(-)
>>>> 
>>>> diff --git a/drivers/mmc/socfpga_dw_mmc.c
>>>> b/drivers/mmc/socfpga_dw_mmc.c index fa0e449..eb7e64e 100644 
>>>> --- a/drivers/mmc/socfpga_dw_mmc.c +++
>>>> b/drivers/mmc/socfpga_dw_mmc.c @@ -13,6 +13,7 @@ #include
>>>> <linux/libfdt.h> #include <linux/err.h> #include <malloc.h> 
>>>> +#include <reset.h>
>>>> 
>>>> DECLARE_GLOBAL_DATA_PTR;
>>>> 
>>>> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data { unsigned
>>>> int            smplsel; };
>>>> 
>>>> +static void socfpga_dwmci_reset(struct udevice *dev) +{ +
>>>> struct reset_ctl_bulk reset_bulk; +     int ret; + +     ret
>>>> = reset_get_bulk(dev, &reset_bulk); +     if (ret) { +
>>>> dev_warn(dev, "Can't get reset: %d\n", ret); +
>>>> return; +     } + +     reset_deassert_bulk(&reset_bulk); +}
>>> 
>>> The driver doesn't depend on DM_RESET and this code hunk
>>> doesn't either so it fails to build on a number of platforms.
>>> This type of comment applies to the whole series, and may be
>>> fixed differently in different cases (it might be OK to enforce
>>> DM_RESET for this driver, but not for the ns16550 driver).
>>> 
>>> -- Tom
>>> 
>> include/reset.h has the DM_RESET wrapper, so it will not cause
>> the compilation error if the CONFIG_DM_RESET is disabled.
>> 
>> I have tried compile the uboot with CONFIG_DM_RESET disabled, 
>> compilation is fine.

The case is fine when CONFIG_DM_RESET is disabled, but it fails when
CONFIG_DM_RESET is enabled.

You need:

CONFIG_SPL_RESET_SUPPORT=y

Dinh
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJbDVXVAAoJEBmUBAuBoyj0GrwP/1UAMiFWllpyq/19Lktr8yDa
hZxl4Ynj6HHOSSUWorZeAdaAE0r79lPMR037G7XLV1EiVfe7XkKgVXp8EUusNbMA
nYY+TOe321MoSF+agXoVr6QbwTwH67lAJO5uZ+sbStlElkH1ATTbbsNE092P6Gp9
WgwK8fT1p78BJQ4djTUwDnxIFe9hW3O4VhIeKEte0Ny7cgxsoYH0a6eXd1ozjOp/
H7j31vgjemPUYQI7gf+2JEz/38DaFOMvF4n5eofftIV44Nx8yE/VzgM+9ry+QxNn
h+7/VM2LYbTTwDA+9YuRyleLrv8hcIgbcd/TFnxkBr8Yw4N3JSQjhyjeK/LkTGge
hyixyy132bng89GcGZn3oXxKLTdUi3v9pwBI5payjZ/sKuH8nySM3OAas3nrPWI3
g62t8/x3ufD+ZegaVWL66Sp2kLt3xamJe+WrLtcGgXzOLJDC9lsE8/iV+d2Jrat6
4x6gvcxPJvd0WieEapzsP6SqU/J0yA/RrMAtTwASQrXd9yH5CH6+FD/Yw+ShyEiO
FiIz/p80NL3yqkFOBASm422r8RKPZ84hOeHNbV79rWNrBaQHAlK/mKwPrNjhao7l
j3izAGOi75/aQO8QBnD2uCDXHRDL0+mCPPcwBzX90/HtubIjB/ZHiZuDuwCa+JrN
wwbHCJO6WDj3sqv0iErz
=JhCN
-----END PGP SIGNATURE-----
Ley Foon Tan May 31, 2018, 3:02 a.m. UTC | #7
On Fri, May 25, 2018 at 7:16 PM, Tom Rini <trini@konsulko.com> wrote:
> On Fri, May 25, 2018 at 10:45:53AM +0800, Ley Foon Tan wrote:
>> On Thu, May 24, 2018 at 8:39 PM, Tom Rini <trini@konsulko.com> wrote:
>> > On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:
>> >
>> >> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
>> >> so only print out a warning and do not fail if a reset property is not present.
>> >>
>> >> If a reset property is discovered, then use it to deassert, thus bringing the
>> >> IP out of reset.
>> >>
>> >> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> >> Reviewed-by: Simon Glass <sjg@chromium.org>
>> >> ---
>> >>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
>> >>  1 files changed, 17 insertions(+), 0 deletions(-)
>> >>
>> >> diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
>> >> index fa0e449..eb7e64e 100644
>> >> --- a/drivers/mmc/socfpga_dw_mmc.c
>> >> +++ b/drivers/mmc/socfpga_dw_mmc.c
>> >> @@ -13,6 +13,7 @@
>> >>  #include <linux/libfdt.h>
>> >>  #include <linux/err.h>
>> >>  #include <malloc.h>
>> >> +#include <reset.h>
>> >>
>> >>  DECLARE_GLOBAL_DATA_PTR;
>> >>
>> >> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data {
>> >>       unsigned int            smplsel;
>> >>  };
>> >>
>> >> +static void socfpga_dwmci_reset(struct udevice *dev)
>> >> +{
>> >> +     struct reset_ctl_bulk reset_bulk;
>> >> +     int ret;
>> >> +
>> >> +     ret = reset_get_bulk(dev, &reset_bulk);
>> >> +     if (ret) {
>> >> +             dev_warn(dev, "Can't get reset: %d\n", ret);
>> >> +             return;
>> >> +     }
>> >> +
>> >> +     reset_deassert_bulk(&reset_bulk);
>> >> +}
>> >
>> > The driver doesn't depend on DM_RESET and this code hunk doesn't either
>> > so it fails to build on a number of platforms.  This type of comment
>> > applies to the whole series, and may be fixed differently in different
>> > cases (it might be OK to enforce DM_RESET for this driver, but not for
>> > the ns16550 driver).
>> >
>> > --
>> > Tom
>> >
>> include/reset.h has the DM_RESET wrapper, so it will not cause the
>> compilation error if the CONFIG_DM_RESET is disabled.
>>
>> I have tried compile the uboot with CONFIG_DM_RESET disabled,
>> compilation is fine.
>
> This whole series causes a good percent of the world to fail to link, so
> something is off about the wrappers or use of them.  See:
> https://travis-ci.org/trini/u-boot/jobs/382783645
>
This build is happened in SPL build, when CONF_DM_RESET is enabled,
but CONFIG_SPL_RESET_SUPPORT is disabled.
So, adding #ifdef CONFIG_DM_RESET checking in these peripherals also
can't resolve the compilation error.
Two possible fix below, or you have better suggestion.

(1) select SPL_RESET_SUPPORT when DM_RESET is enabled.

diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index 33c39b7..b43cd89 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -3,6 +3,7 @@ menu "Reset Controller Support"
 config DM_RESET
        bool "Enable reset controllers using Driver Model"
        depends on DM && OF_CONTROL
+       select SPL_RESET_SUPPORT
        help



(2) Add CONFIG_SPL_RESET_SUPPORT checking in reset.h file

diff --git a/include/reset.h b/include/reset.h
index 201bafc..0ac0a47 100644
--- a/include/reset.h
+++ b/include/reset.h
@@ -77,7 +77,8 @@ struct reset_ctl_bulk {
        unsigned int count;
 };

-#ifdef CONFIG_DM_RESET
+#if (!defined(CONFIG_SPL_BUILD) && defined(CONFIG_DM_RESET)) ||        \
+    (defined(CONFIG_SPL_RESET_SUPPORT) && defined(CONFIG_DM_RESET))


Regards
Ley Foon
Tom Rini May 31, 2018, 11:16 a.m. UTC | #8
On Thu, May 31, 2018 at 11:02:39AM +0800, Ley Foon Tan wrote:
> On Fri, May 25, 2018 at 7:16 PM, Tom Rini <trini@konsulko.com> wrote:
> > On Fri, May 25, 2018 at 10:45:53AM +0800, Ley Foon Tan wrote:
> >> On Thu, May 24, 2018 at 8:39 PM, Tom Rini <trini@konsulko.com> wrote:
> >> > On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:
> >> >
> >> >> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
> >> >> so only print out a warning and do not fail if a reset property is not present.
> >> >>
> >> >> If a reset property is discovered, then use it to deassert, thus bringing the
> >> >> IP out of reset.
> >> >>
> >> >> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
> >> >> Reviewed-by: Simon Glass <sjg@chromium.org>
> >> >> ---
> >> >>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
> >> >>  1 files changed, 17 insertions(+), 0 deletions(-)
> >> >>
> >> >> diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
> >> >> index fa0e449..eb7e64e 100644
> >> >> --- a/drivers/mmc/socfpga_dw_mmc.c
> >> >> +++ b/drivers/mmc/socfpga_dw_mmc.c
> >> >> @@ -13,6 +13,7 @@
> >> >>  #include <linux/libfdt.h>
> >> >>  #include <linux/err.h>
> >> >>  #include <malloc.h>
> >> >> +#include <reset.h>
> >> >>
> >> >>  DECLARE_GLOBAL_DATA_PTR;
> >> >>
> >> >> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data {
> >> >>       unsigned int            smplsel;
> >> >>  };
> >> >>
> >> >> +static void socfpga_dwmci_reset(struct udevice *dev)
> >> >> +{
> >> >> +     struct reset_ctl_bulk reset_bulk;
> >> >> +     int ret;
> >> >> +
> >> >> +     ret = reset_get_bulk(dev, &reset_bulk);
> >> >> +     if (ret) {
> >> >> +             dev_warn(dev, "Can't get reset: %d\n", ret);
> >> >> +             return;
> >> >> +     }
> >> >> +
> >> >> +     reset_deassert_bulk(&reset_bulk);
> >> >> +}
> >> >
> >> > The driver doesn't depend on DM_RESET and this code hunk doesn't either
> >> > so it fails to build on a number of platforms.  This type of comment
> >> > applies to the whole series, and may be fixed differently in different
> >> > cases (it might be OK to enforce DM_RESET for this driver, but not for
> >> > the ns16550 driver).
> >> >
> >> > --
> >> > Tom
> >> >
> >> include/reset.h has the DM_RESET wrapper, so it will not cause the
> >> compilation error if the CONFIG_DM_RESET is disabled.
> >>
> >> I have tried compile the uboot with CONFIG_DM_RESET disabled,
> >> compilation is fine.
> >
> > This whole series causes a good percent of the world to fail to link, so
> > something is off about the wrappers or use of them.  See:
> > https://travis-ci.org/trini/u-boot/jobs/382783645
> >
> This build is happened in SPL build, when CONF_DM_RESET is enabled,
> but CONFIG_SPL_RESET_SUPPORT is disabled.
> So, adding #ifdef CONFIG_DM_RESET checking in these peripherals also
> can't resolve the compilation error.
> Two possible fix below, or you have better suggestion.
> 
> (1) select SPL_RESET_SUPPORT when DM_RESET is enabled.
> 
> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> index 33c39b7..b43cd89 100644
> --- a/drivers/reset/Kconfig
> +++ b/drivers/reset/Kconfig
> @@ -3,6 +3,7 @@ menu "Reset Controller Support"
>  config DM_RESET
>         bool "Enable reset controllers using Driver Model"
>         depends on DM && OF_CONTROL
> +       select SPL_RESET_SUPPORT
>         help
> 
> 
> 
> (2) Add CONFIG_SPL_RESET_SUPPORT checking in reset.h file
> 
> diff --git a/include/reset.h b/include/reset.h
> index 201bafc..0ac0a47 100644
> --- a/include/reset.h
> +++ b/include/reset.h
> @@ -77,7 +77,8 @@ struct reset_ctl_bulk {
>         unsigned int count;
>  };
> 
> -#ifdef CONFIG_DM_RESET
> +#if (!defined(CONFIG_SPL_BUILD) && defined(CONFIG_DM_RESET)) ||        \
> +    (defined(CONFIG_SPL_RESET_SUPPORT) && defined(CONFIG_DM_RESET))

We need option #2, thanks!
Ley Foon Tan June 1, 2018, 2:01 a.m. UTC | #9
On Thu, May 31, 2018 at 7:16 PM, Tom Rini <trini@konsulko.com> wrote:
> On Thu, May 31, 2018 at 11:02:39AM +0800, Ley Foon Tan wrote:
>> On Fri, May 25, 2018 at 7:16 PM, Tom Rini <trini@konsulko.com> wrote:
>> > On Fri, May 25, 2018 at 10:45:53AM +0800, Ley Foon Tan wrote:
>> >> On Thu, May 24, 2018 at 8:39 PM, Tom Rini <trini@konsulko.com> wrote:
>> >> > On Tue, May 08, 2018 at 11:19:24AM +0800, Ley Foon Tan wrote:
>> >> >
>> >> >> Add code to reset all reset signals as in mmc DT node. A reset property is an optional feature,
>> >> >> so only print out a warning and do not fail if a reset property is not present.
>> >> >>
>> >> >> If a reset property is discovered, then use it to deassert, thus bringing the
>> >> >> IP out of reset.
>> >> >>
>> >> >> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
>> >> >> Reviewed-by: Simon Glass <sjg@chromium.org>
>> >> >> ---
>> >> >>  drivers/mmc/socfpga_dw_mmc.c |   17 +++++++++++++++++
>> >> >>  1 files changed, 17 insertions(+), 0 deletions(-)
>> >> >>
>> >> >> diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
>> >> >> index fa0e449..eb7e64e 100644
>> >> >> --- a/drivers/mmc/socfpga_dw_mmc.c
>> >> >> +++ b/drivers/mmc/socfpga_dw_mmc.c
>> >> >> @@ -13,6 +13,7 @@
>> >> >>  #include <linux/libfdt.h>
>> >> >>  #include <linux/err.h>
>> >> >>  #include <malloc.h>
>> >> >> +#include <reset.h>
>> >> >>
>> >> >>  DECLARE_GLOBAL_DATA_PTR;
>> >> >>
>> >> >> @@ -33,6 +34,20 @@ struct dwmci_socfpga_priv_data {
>> >> >>       unsigned int            smplsel;
>> >> >>  };
>> >> >>
>> >> >> +static void socfpga_dwmci_reset(struct udevice *dev)
>> >> >> +{
>> >> >> +     struct reset_ctl_bulk reset_bulk;
>> >> >> +     int ret;
>> >> >> +
>> >> >> +     ret = reset_get_bulk(dev, &reset_bulk);
>> >> >> +     if (ret) {
>> >> >> +             dev_warn(dev, "Can't get reset: %d\n", ret);
>> >> >> +             return;
>> >> >> +     }
>> >> >> +
>> >> >> +     reset_deassert_bulk(&reset_bulk);
>> >> >> +}
>> >> >
>> >> > The driver doesn't depend on DM_RESET and this code hunk doesn't either
>> >> > so it fails to build on a number of platforms.  This type of comment
>> >> > applies to the whole series, and may be fixed differently in different
>> >> > cases (it might be OK to enforce DM_RESET for this driver, but not for
>> >> > the ns16550 driver).
>> >> >
>> >> > --
>> >> > Tom
>> >> >
>> >> include/reset.h has the DM_RESET wrapper, so it will not cause the
>> >> compilation error if the CONFIG_DM_RESET is disabled.
>> >>
>> >> I have tried compile the uboot with CONFIG_DM_RESET disabled,
>> >> compilation is fine.
>> >
>> > This whole series causes a good percent of the world to fail to link, so
>> > something is off about the wrappers or use of them.  See:
>> > https://travis-ci.org/trini/u-boot/jobs/382783645
>> >
>> This build is happened in SPL build, when CONF_DM_RESET is enabled,
>> but CONFIG_SPL_RESET_SUPPORT is disabled.
>> So, adding #ifdef CONFIG_DM_RESET checking in these peripherals also
>> can't resolve the compilation error.
>> Two possible fix below, or you have better suggestion.
>>
>> (1) select SPL_RESET_SUPPORT when DM_RESET is enabled.
>>
>> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
>> index 33c39b7..b43cd89 100644
>> --- a/drivers/reset/Kconfig
>> +++ b/drivers/reset/Kconfig
>> @@ -3,6 +3,7 @@ menu "Reset Controller Support"
>>  config DM_RESET
>>         bool "Enable reset controllers using Driver Model"
>>         depends on DM && OF_CONTROL
>> +       select SPL_RESET_SUPPORT
>>         help
>>
>>
>>
>> (2) Add CONFIG_SPL_RESET_SUPPORT checking in reset.h file
>>
>> diff --git a/include/reset.h b/include/reset.h
>> index 201bafc..0ac0a47 100644
>> --- a/include/reset.h
>> +++ b/include/reset.h
>> @@ -77,7 +77,8 @@ struct reset_ctl_bulk {
>>         unsigned int count;
>>  };
>>
>> -#ifdef CONFIG_DM_RESET
>> +#if (!defined(CONFIG_SPL_BUILD) && defined(CONFIG_DM_RESET)) ||        \
>> +    (defined(CONFIG_SPL_RESET_SUPPORT) && defined(CONFIG_DM_RESET))
>
> We need option #2, thanks!
 Okay, will add this patch in new revision.

Regards
Ley Foon
diff mbox series

Patch

diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
index fa0e449..eb7e64e 100644
--- a/drivers/mmc/socfpga_dw_mmc.c
+++ b/drivers/mmc/socfpga_dw_mmc.c
@@ -13,6 +13,7 @@ 
 #include <linux/libfdt.h>
 #include <linux/err.h>
 #include <malloc.h>
+#include <reset.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -33,6 +34,20 @@  struct dwmci_socfpga_priv_data {
 	unsigned int		smplsel;
 };
 
+static void socfpga_dwmci_reset(struct udevice *dev)
+{
+	struct reset_ctl_bulk reset_bulk;
+	int ret;
+
+	ret = reset_get_bulk(dev, &reset_bulk);
+	if (ret) {
+	       dev_warn(dev, "Can't get reset: %d\n", ret);
+	       return;
+	}
+
+	reset_deassert_bulk(&reset_bulk);
+}
+
 static void socfpga_dwmci_clksel(struct dwmci_host *host)
 {
 	struct dwmci_socfpga_priv_data *priv = host->priv;
@@ -109,6 +124,8 @@  static int socfpga_dwmmc_probe(struct udevice *dev)
 	struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev);
 	struct dwmci_host *host = &priv->host;
 
+	socfpga_dwmci_reset(dev);
+
 #ifdef CONFIG_BLK
 	dwmci_setup_cfg(&plat->cfg, host, host->bus_hz, 400000);
 	host->mmc = &plat->mmc;