diff mbox

[U-Boot,4/4] exynos: fix and cleanup do_sdhci_init()

Message ID 1442793252-2935-2-git-send-email-tjakobi@math.uni-bielefeld.de
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Commit Message

Tobias Jakobi Sept. 20, 2015, 11:54 p.m. UTC
The CD check is currently inverted. dm_gpio_get_value() returns
one when a card is detected. All other values (zero when there
is no card, or negative values for the internal errors) indicate
failure.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
---
 drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

Comments

Łukasz Majewski Sept. 23, 2015, 9:44 a.m. UTC | #1
Hi Tobias,

> The CD check is currently inverted. dm_gpio_get_value() returns
> one when a card is detected. All other values (zero when there
> is no card, or negative values for the internal errors) indicate
> failure.
> 
> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> ---
>  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
>  1 file changed, 11 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
> index 6be3609..bc04370 100644
> --- a/drivers/mmc/s5p_sdhci.c
> +++ b/drivers/mmc/s5p_sdhci.c
> @@ -102,29 +102,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
>  
>  static int do_sdhci_init(struct sdhci_host *host)
>  {
> -	int dev_id, flag;
> -	int err = 0;
> +	int dev_id, flag, ret;
>  
>  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
> PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
>  
>  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
>  		dm_gpio_set_value(&host->pwr_gpio, 1);
> -		err = exynos_pinmux_config(dev_id, flag);
> -		if (err) {
> +		ret = exynos_pinmux_config(dev_id, flag);
> +		if (ret) {
>  			debug("MMC not configured\n");
> -			return err;
> +			return ret;
>  		}
>  	}
>  
>  	if (dm_gpio_is_valid(&host->cd_gpio)) {
> -		if (dm_gpio_get_value(&host->cd_gpio))
> +		ret = dm_gpio_get_value(&host->cd_gpio);
> +		if (ret != 1) {
> +			debug("No card detected (%d)\n", ret);
>  			return -ENODEV;
> +		}
>  
> -		err = exynos_pinmux_config(dev_id, flag);
> -		if (err) {
> +		ret = exynos_pinmux_config(dev_id, flag);
> +		if (ret) {
>  			printf("external SD not configured\n");
> -			return err;
> +			return ret;
>  		}
>  	}
>  

Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
Łukasz Majewski Sept. 23, 2015, 9:48 a.m. UTC | #2
Hi Lukasz,

> Hi Tobias,
> 
> > The CD check is currently inverted. dm_gpio_get_value() returns
> > one when a card is detected. All other values (zero when there
> > is no card, or negative values for the internal errors) indicate
> > failure.
> > 
> > Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> > ---
> >  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
> >  1 file changed, 11 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
> > index 6be3609..bc04370 100644
> > --- a/drivers/mmc/s5p_sdhci.c
> > +++ b/drivers/mmc/s5p_sdhci.c
> > @@ -102,29 +102,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
> >  
> >  static int do_sdhci_init(struct sdhci_host *host)
> >  {
> > -	int dev_id, flag;
> > -	int err = 0;
> > +	int dev_id, flag, ret;
> >  
> >  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
> > PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
> >  
> >  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
> >  		dm_gpio_set_value(&host->pwr_gpio, 1);
> > -		err = exynos_pinmux_config(dev_id, flag);
> > -		if (err) {
> > +		ret = exynos_pinmux_config(dev_id, flag);
> > +		if (ret) {
> >  			debug("MMC not configured\n");
> > -			return err;
> > +			return ret;
> >  		}
> >  	}
> >  
> >  	if (dm_gpio_is_valid(&host->cd_gpio)) {
> > -		if (dm_gpio_get_value(&host->cd_gpio))
> > +		ret = dm_gpio_get_value(&host->cd_gpio);
> > +		if (ret != 1) {
> > +			debug("No card detected (%d)\n", ret);
> >  			return -ENODEV;
> > +		}
> >  
> > -		err = exynos_pinmux_config(dev_id, flag);
> > -		if (err) {
> > +		ret = exynos_pinmux_config(dev_id, flag);
> > +		if (ret) {
> >  			printf("external SD not configured\n");
> > -			return err;
> > +			return ret;
> >  		}
> >  	}
> >  
> 
> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
> 

Sorry, I was too fast. I've read the whole thread and I can confirm
that your change would break Trats board.

I hope that we will come up with proper solution.
Jaehoon Chung Sept. 23, 2015, 9:59 a.m. UTC | #3
Hi,

On 09/23/2015 06:48 PM, Lukasz Majewski wrote:
> Hi Lukasz,
> 
>> Hi Tobias,
>>
>>> The CD check is currently inverted. dm_gpio_get_value() returns
>>> one when a card is detected. All other values (zero when there
>>> is no card, or negative values for the internal errors) indicate
>>> failure.
>>>
>>> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
>>> ---
>>>  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
>>>  1 file changed, 11 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
>>> index 6be3609..bc04370 100644
>>> --- a/drivers/mmc/s5p_sdhci.c
>>> +++ b/drivers/mmc/s5p_sdhci.c
>>> @@ -102,29 +102,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
>>>  
>>>  static int do_sdhci_init(struct sdhci_host *host)
>>>  {
>>> -	int dev_id, flag;
>>> -	int err = 0;
>>> +	int dev_id, flag, ret;
>>>  
>>>  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
>>> PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
>>>  
>>>  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
>>>  		dm_gpio_set_value(&host->pwr_gpio, 1);
>>> -		err = exynos_pinmux_config(dev_id, flag);
>>> -		if (err) {
>>> +		ret = exynos_pinmux_config(dev_id, flag);
>>> +		if (ret) {
>>>  			debug("MMC not configured\n");
>>> -			return err;
>>> +			return ret;
>>>  		}
>>>  	}
>>>  
>>>  	if (dm_gpio_is_valid(&host->cd_gpio)) {
>>> -		if (dm_gpio_get_value(&host->cd_gpio))
>>> +		ret = dm_gpio_get_value(&host->cd_gpio);
>>> +		if (ret != 1) {
>>> +			debug("No card detected (%d)\n", ret);
>>>  			return -ENODEV;
>>> +		}
>>>  
>>> -		err = exynos_pinmux_config(dev_id, flag);
>>> -		if (err) {
>>> +		ret = exynos_pinmux_config(dev_id, flag);
>>> +		if (ret) {
>>>  			printf("external SD not configured\n");
>>> -			return err;
>>> +			return ret;
>>>  		}
>>>  	}
>>>  
>>
>> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
>>
> 
> Sorry, I was too fast. I've read the whole thread and I can confirm
> that your change would break Trats board.
> ry
> I hope that we will come up with proper solution.

We can use the "cd-inverted" property like linux-kernel.
Then i think that all board based on exynos4412 can cover.
how about?

Best Regards,
Jaehoon Chung


>
Łukasz Majewski Sept. 23, 2015, 10:06 a.m. UTC | #4
Hi Jaehoon,

> Hi,
> 
> On 09/23/2015 06:48 PM, Lukasz Majewski wrote:
> > Hi Lukasz,
> > 
> >> Hi Tobias,
> >>
> >>> The CD check is currently inverted. dm_gpio_get_value() returns
> >>> one when a card is detected. All other values (zero when there
> >>> is no card, or negative values for the internal errors) indicate
> >>> failure.
> >>>
> >>> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> >>> ---
> >>>  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
> >>>  1 file changed, 11 insertions(+), 9 deletions(-)
> >>>
> >>> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
> >>> index 6be3609..bc04370 100644
> >>> --- a/drivers/mmc/s5p_sdhci.c
> >>> +++ b/drivers/mmc/s5p_sdhci.c
> >>> @@ -102,29 +102,31 @@ struct sdhci_host
> >>> sdhci_host[SDHCI_MAX_HOSTS]; 
> >>>  static int do_sdhci_init(struct sdhci_host *host)
> >>>  {
> >>> -	int dev_id, flag;
> >>> -	int err = 0;
> >>> +	int dev_id, flag, ret;
> >>>  
> >>>  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
> >>> PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
> >>>  
> >>>  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
> >>>  		dm_gpio_set_value(&host->pwr_gpio, 1);
> >>> -		err = exynos_pinmux_config(dev_id, flag);
> >>> -		if (err) {
> >>> +		ret = exynos_pinmux_config(dev_id, flag);
> >>> +		if (ret) {
> >>>  			debug("MMC not configured\n");
> >>> -			return err;
> >>> +			return ret;
> >>>  		}
> >>>  	}
> >>>  
> >>>  	if (dm_gpio_is_valid(&host->cd_gpio)) {
> >>> -		if (dm_gpio_get_value(&host->cd_gpio))
> >>> +		ret = dm_gpio_get_value(&host->cd_gpio);
> >>> +		if (ret != 1) {
> >>> +			debug("No card detected (%d)\n", ret);
> >>>  			return -ENODEV;
> >>> +		}
> >>>  
> >>> -		err = exynos_pinmux_config(dev_id, flag);
> >>> -		if (err) {
> >>> +		ret = exynos_pinmux_config(dev_id, flag);
> >>> +		if (ret) {
> >>>  			printf("external SD not configured\n");
> >>> -			return err;
> >>> +			return ret;
> >>>  		}
> >>>  	}
> >>>  
> >>
> >> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
> >>
> > 
> > Sorry, I was too fast. I've read the whole thread and I can confirm
> > that your change would break Trats board.
> > ry
> > I hope that we will come up with proper solution.
> 
> We can use the "cd-inverted" property like linux-kernel.
> Then i think that all board based on exynos4412 can cover.
> how about?

I'm ok with this approach.

> 
> Best Regards,
> Jaehoon Chung
> 
> 
> > 
>
Minkyu Kang Sept. 23, 2015, 10:06 a.m. UTC | #5
On 23/09/15 18:59, Jaehoon Chung wrote:
> Hi,
> 
> On 09/23/2015 06:48 PM, Lukasz Majewski wrote:
>> Hi Lukasz,
>>
>>> Hi Tobias,
>>>
>>>> The CD check is currently inverted. dm_gpio_get_value() returns
>>>> one when a card is detected. All other values (zero when there
>>>> is no card, or negative values for the internal errors) indicate
>>>> failure.
>>>>
>>>> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
>>>> ---
>>>>  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
>>>>  1 file changed, 11 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
>>>> index 6be3609..bc04370 100644
>>>> --- a/drivers/mmc/s5p_sdhci.c
>>>> +++ b/drivers/mmc/s5p_sdhci.c
>>>> @@ -102,29 +102,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
>>>>  
>>>>  static int do_sdhci_init(struct sdhci_host *host)
>>>>  {
>>>> -	int dev_id, flag;
>>>> -	int err = 0;
>>>> +	int dev_id, flag, ret;
>>>>  
>>>>  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
>>>> PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
>>>>  
>>>>  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
>>>>  		dm_gpio_set_value(&host->pwr_gpio, 1);
>>>> -		err = exynos_pinmux_config(dev_id, flag);
>>>> -		if (err) {
>>>> +		ret = exynos_pinmux_config(dev_id, flag);
>>>> +		if (ret) {
>>>>  			debug("MMC not configured\n");
>>>> -			return err;
>>>> +			return ret;
>>>>  		}
>>>>  	}
>>>>  
>>>>  	if (dm_gpio_is_valid(&host->cd_gpio)) {
>>>> -		if (dm_gpio_get_value(&host->cd_gpio))
>>>> +		ret = dm_gpio_get_value(&host->cd_gpio);
>>>> +		if (ret != 1) {
>>>> +			debug("No card detected (%d)\n", ret);
>>>>  			return -ENODEV;
>>>> +		}
>>>>  
>>>> -		err = exynos_pinmux_config(dev_id, flag);
>>>> -		if (err) {
>>>> +		ret = exynos_pinmux_config(dev_id, flag);
>>>> +		if (ret) {
>>>>  			printf("external SD not configured\n");
>>>> -			return err;
>>>> +			return ret;
>>>>  		}
>>>>  	}
>>>>  
>>>
>>> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
>>>
>>
>> Sorry, I was too fast. I've read the whole thread and I can confirm
>> that your change would break Trats board.
>> ry
>> I hope that we will come up with proper solution.
> 
> We can use the "cd-inverted" property like linux-kernel.
> Then i think that all board based on exynos4412 can cover.
> how about?
> 

I agree :)

Thanks,
Minkyu Kang.
Tobias Jakobi Sept. 24, 2015, 12:48 p.m. UTC | #6
Hello,


Minkyu Kang wrote:
> On 23/09/15 18:59, Jaehoon Chung wrote:
>> Hi,
>>
>> On 09/23/2015 06:48 PM, Lukasz Majewski wrote:
>>> Hi Lukasz,
>>>
>>>> Hi Tobias,
>>>>
>>>>> The CD check is currently inverted. dm_gpio_get_value() returns
>>>>> one when a card is detected. All other values (zero when there
>>>>> is no card, or negative values for the internal errors) indicate
>>>>> failure.
>>>>>
>>>>> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
>>>>> ---
>>>>>  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
>>>>>  1 file changed, 11 insertions(+), 9 deletions(-)
>>>>>
>>>>> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
>>>>> index 6be3609..bc04370 100644
>>>>> --- a/drivers/mmc/s5p_sdhci.c
>>>>> +++ b/drivers/mmc/s5p_sdhci.c
>>>>> @@ -102,29 +102,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
>>>>>  
>>>>>  static int do_sdhci_init(struct sdhci_host *host)
>>>>>  {
>>>>> -	int dev_id, flag;
>>>>> -	int err = 0;
>>>>> +	int dev_id, flag, ret;
>>>>>  
>>>>>  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
>>>>> PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
>>>>>  
>>>>>  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
>>>>>  		dm_gpio_set_value(&host->pwr_gpio, 1);
>>>>> -		err = exynos_pinmux_config(dev_id, flag);
>>>>> -		if (err) {
>>>>> +		ret = exynos_pinmux_config(dev_id, flag);
>>>>> +		if (ret) {
>>>>>  			debug("MMC not configured\n");
>>>>> -			return err;
>>>>> +			return ret;
>>>>>  		}
>>>>>  	}
>>>>>  
>>>>>  	if (dm_gpio_is_valid(&host->cd_gpio)) {
>>>>> -		if (dm_gpio_get_value(&host->cd_gpio))
>>>>> +		ret = dm_gpio_get_value(&host->cd_gpio);
>>>>> +		if (ret != 1) {
>>>>> +			debug("No card detected (%d)\n", ret);
>>>>>  			return -ENODEV;
>>>>> +		}
>>>>>  
>>>>> -		err = exynos_pinmux_config(dev_id, flag);
>>>>> -		if (err) {
>>>>> +		ret = exynos_pinmux_config(dev_id, flag);
>>>>> +		if (ret) {
>>>>>  			printf("external SD not configured\n");
>>>>> -			return err;
>>>>> +			return ret;
>>>>>  		}
>>>>>  	}
>>>>>  
>>>>
>>>> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
>>>>
>>>
>>> Sorry, I was too fast. I've read the whole thread and I can confirm
>>> that your change would break Trats board.
>>> ry
>>> I hope that we will come up with proper solution.
>>
>> We can use the "cd-inverted" property like linux-kernel.
>> Then i think that all board based on exynos4412 can cover.
>> how about?
I don't think this is going to work. I asked someone else to check
current upstream u-boot on his Odroid-U3 and he has confirmed that it
boots fine from SD card.

So this seems to be a X2 specific thing. However the 'cd-inverted'
property is present in exynos4412-odroid-common.dtsi, so it applies to
both U3 and X2 in the kernel.

So either the kernel is wrong here, or this is board difference which
can't be derived from 'cd-inverted'.

With best wishes,
Tobias





>>
> 
> I agree :)
> 
> Thanks,
> Minkyu Kang.
>
Łukasz Majewski Sept. 24, 2015, 1:27 p.m. UTC | #7
Hi Tobias,

> Hello,
> 
> 
> Minkyu Kang wrote:
> > On 23/09/15 18:59, Jaehoon Chung wrote:
> >> Hi,
> >>
> >> On 09/23/2015 06:48 PM, Lukasz Majewski wrote:
> >>> Hi Lukasz,
> >>>
> >>>> Hi Tobias,
> >>>>
> >>>>> The CD check is currently inverted. dm_gpio_get_value() returns
> >>>>> one when a card is detected. All other values (zero when there
> >>>>> is no card, or negative values for the internal errors) indicate
> >>>>> failure.
> >>>>>
> >>>>> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> >>>>> ---
> >>>>>  drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
> >>>>>  1 file changed, 11 insertions(+), 9 deletions(-)
> >>>>>
> >>>>> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
> >>>>> index 6be3609..bc04370 100644
> >>>>> --- a/drivers/mmc/s5p_sdhci.c
> >>>>> +++ b/drivers/mmc/s5p_sdhci.c
> >>>>> @@ -102,29 +102,31 @@ struct sdhci_host
> >>>>> sdhci_host[SDHCI_MAX_HOSTS]; 
> >>>>>  static int do_sdhci_init(struct sdhci_host *host)
> >>>>>  {
> >>>>> -	int dev_id, flag;
> >>>>> -	int err = 0;
> >>>>> +	int dev_id, flag, ret;
> >>>>>  
> >>>>>  	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE :
> >>>>> PINMUX_FLAG_NONE; dev_id = host->index + PERIPH_ID_SDMMC0;
> >>>>>  
> >>>>>  	if (dm_gpio_is_valid(&host->pwr_gpio)) {
> >>>>>  		dm_gpio_set_value(&host->pwr_gpio, 1);
> >>>>> -		err = exynos_pinmux_config(dev_id, flag);
> >>>>> -		if (err) {
> >>>>> +		ret = exynos_pinmux_config(dev_id, flag);
> >>>>> +		if (ret) {
> >>>>>  			debug("MMC not configured\n");
> >>>>> -			return err;
> >>>>> +			return ret;
> >>>>>  		}
> >>>>>  	}
> >>>>>  
> >>>>>  	if (dm_gpio_is_valid(&host->cd_gpio)) {
> >>>>> -		if (dm_gpio_get_value(&host->cd_gpio))
> >>>>> +		ret = dm_gpio_get_value(&host->cd_gpio);
> >>>>> +		if (ret != 1) {
> >>>>> +			debug("No card detected (%d)\n", ret);
> >>>>>  			return -ENODEV;
> >>>>> +		}
> >>>>>  
> >>>>> -		err = exynos_pinmux_config(dev_id, flag);
> >>>>> -		if (err) {
> >>>>> +		ret = exynos_pinmux_config(dev_id, flag);
> >>>>> +		if (ret) {
> >>>>>  			printf("external SD not configured\n");
> >>>>> -			return err;
> >>>>> +			return ret;
> >>>>>  		}
> >>>>>  	}
> >>>>>  
> >>>>
> >>>> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
> >>>>
> >>>
> >>> Sorry, I was too fast. I've read the whole thread and I can
> >>> confirm that your change would break Trats board.
> >>> ry
> >>> I hope that we will come up with proper solution.
> >>
> >> We can use the "cd-inverted" property like linux-kernel.
> >> Then i think that all board based on exynos4412 can cover.
> >> how about?
> I don't think this is going to work. I asked someone else to check
> current upstream u-boot on his Odroid-U3 and he has confirmed that it
> boots fine from SD card.

Have you tried the newest mainline? I'm struggling to debrick my Trats
board after some eMMC early misconfiguration.

For now I can confirm that it works with v2015.07.


> 
> So this seems to be a X2 specific thing. However the 'cd-inverted'
> property is present in exynos4412-odroid-common.dtsi, so it applies to
> both U3 and X2 in the kernel.
> 
> So either the kernel is wrong here, or this is board difference which
> can't be derived from 'cd-inverted'.
> 
> With best wishes,
> Tobias
> 
> 
> 
> 
> 
> >>
> > 
> > I agree :)
> > 
> > Thanks,
> > Minkyu Kang.
> > 
>
Przemyslaw Marczak Sept. 24, 2015, 3:05 p.m. UTC | #8
Hello Tobias,

On 09/21/2015 01:54 AM, Tobias Jakobi wrote:
> The CD check is currently inverted. dm_gpio_get_value() returns
> one when a card is detected. All other values (zero when there
> is no card, or negative values for the internal errors) indicate
> failure.
>

If you want revert the GPIO state, please modify the phandle in 
device-tree and then in the code.

> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> ---
>   drivers/mmc/s5p_sdhci.c | 20 +++++++++++---------
>   1 file changed, 11 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
> index 6be3609..bc04370 100644
> --- a/drivers/mmc/s5p_sdhci.c
> +++ b/drivers/mmc/s5p_sdhci.c
> @@ -102,29 +102,31 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
>
>   static int do_sdhci_init(struct sdhci_host *host)
>   {
> -	int dev_id, flag;
> -	int err = 0;
> +	int dev_id, flag, ret;
>
>   	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE : PINMUX_FLAG_NONE;
>   	dev_id = host->index + PERIPH_ID_SDMMC0;
>
>   	if (dm_gpio_is_valid(&host->pwr_gpio)) {
>   		dm_gpio_set_value(&host->pwr_gpio, 1);
> -		err = exynos_pinmux_config(dev_id, flag);
> -		if (err) {
> +		ret = exynos_pinmux_config(dev_id, flag);
> +		if (ret) {
>   			debug("MMC not configured\n");
> -			return err;
> +			return ret;
>   		}
>   	}
>
>   	if (dm_gpio_is_valid(&host->cd_gpio)) {
> -		if (dm_gpio_get_value(&host->cd_gpio))

Please don't revert this GPIO. This part of code was correct.
There is another source of broken SD card detect. It's about device-tree 
parsing. I will send a patches today.

> +		ret = dm_gpio_get_value(&host->cd_gpio);
> +		if (ret != 1) {
> +			debug("No card detected (%d)\n", ret);
>   			return -ENODEV;
> +		}
>
> -		err = exynos_pinmux_config(dev_id, flag);
> -		if (err) {
> +		ret = exynos_pinmux_config(dev_id, flag);
> +		if (ret) {
>   			printf("external SD not configured\n");
> -			return err;
> +			return ret;
>   		}
>   	}
>
>

Best regards,
diff mbox

Patch

diff --git a/drivers/mmc/s5p_sdhci.c b/drivers/mmc/s5p_sdhci.c
index 6be3609..bc04370 100644
--- a/drivers/mmc/s5p_sdhci.c
+++ b/drivers/mmc/s5p_sdhci.c
@@ -102,29 +102,31 @@  struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
 
 static int do_sdhci_init(struct sdhci_host *host)
 {
-	int dev_id, flag;
-	int err = 0;
+	int dev_id, flag, ret;
 
 	flag = host->bus_width == 8 ? PINMUX_FLAG_8BIT_MODE : PINMUX_FLAG_NONE;
 	dev_id = host->index + PERIPH_ID_SDMMC0;
 
 	if (dm_gpio_is_valid(&host->pwr_gpio)) {
 		dm_gpio_set_value(&host->pwr_gpio, 1);
-		err = exynos_pinmux_config(dev_id, flag);
-		if (err) {
+		ret = exynos_pinmux_config(dev_id, flag);
+		if (ret) {
 			debug("MMC not configured\n");
-			return err;
+			return ret;
 		}
 	}
 
 	if (dm_gpio_is_valid(&host->cd_gpio)) {
-		if (dm_gpio_get_value(&host->cd_gpio))
+		ret = dm_gpio_get_value(&host->cd_gpio);
+		if (ret != 1) {
+			debug("No card detected (%d)\n", ret);
 			return -ENODEV;
+		}
 
-		err = exynos_pinmux_config(dev_id, flag);
-		if (err) {
+		ret = exynos_pinmux_config(dev_id, flag);
+		if (ret) {
 			printf("external SD not configured\n");
-			return err;
+			return ret;
 		}
 	}