diff mbox series

[v2] mmc: renesas_sdhi: Set the SDBUF after reset

Message ID 20240410135416.2139173-1-claudiu.beznea.uj@bp.renesas.com
State New
Headers show
Series [v2] mmc: renesas_sdhi: Set the SDBUF after reset | expand

Commit Message

Claudiu April 10, 2024, 1:54 p.m. UTC
For development purpose, renesas_sdhi_probe() could be called w/
dma_ops = NULL to force the usage of PIO mode. In this case the
renesas_sdhi_enable_dma() will not be called before transferring data.

If renesas_sdhi_enable_dma() is not called, renesas_sdhi_clk_enable()
call from renesas_sdhi_probe() will configure SDBUF by calling the
renesas_sdhi_sdbuf_width() function, but then SDBUF will be reset in
tmio_mmc_host_probe() when calling tmio_mmc_reset() though host->reset().
If SDBUF is zero the data transfer will not work in PIO mode for RZ/G3S.

To fix this call again the renesas_sdhi_sdbuf_width(host, 16) in
renesas_sdhi_reset(). The call of renesas_sdhi_sdbuf_width() was not
removed from renesas_sdhi_clk_enable() as the host->reset() is optional.

Co-developed-by: Hien Huynh <hien.huynh.px@renesas.com>
Signed-off-by: Hien Huynh <hien.huynh.px@renesas.com>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---

Changes in v2:
- fixed typos in commit description
- limit the comment lines to 80 chars

 drivers/mmc/host/renesas_sdhi_core.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Ulf Hansson April 26, 2024, 5:08 a.m. UTC | #1
On Wed, 10 Apr 2024 at 15:54, Claudiu Beznea <claudiu.beznea@tuxon.dev> wrote:
>
> For development purpose, renesas_sdhi_probe() could be called w/
> dma_ops = NULL to force the usage of PIO mode. In this case the
> renesas_sdhi_enable_dma() will not be called before transferring data.
>
> If renesas_sdhi_enable_dma() is not called, renesas_sdhi_clk_enable()
> call from renesas_sdhi_probe() will configure SDBUF by calling the
> renesas_sdhi_sdbuf_width() function, but then SDBUF will be reset in
> tmio_mmc_host_probe() when calling tmio_mmc_reset() though host->reset().
> If SDBUF is zero the data transfer will not work in PIO mode for RZ/G3S.
>
> To fix this call again the renesas_sdhi_sdbuf_width(host, 16) in
> renesas_sdhi_reset(). The call of renesas_sdhi_sdbuf_width() was not
> removed from renesas_sdhi_clk_enable() as the host->reset() is optional.
>
> Co-developed-by: Hien Huynh <hien.huynh.px@renesas.com>
> Signed-off-by: Hien Huynh <hien.huynh.px@renesas.com>
> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Wolfram, when you have the time, can we get your opinion on this one?

Kind regards
Uffe

> ---
>
> Changes in v2:
> - fixed typos in commit description
> - limit the comment lines to 80 chars
>
>  drivers/mmc/host/renesas_sdhi_core.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
> index f84f60139bcf..5233731a94c4 100644
> --- a/drivers/mmc/host/renesas_sdhi_core.c
> +++ b/drivers/mmc/host/renesas_sdhi_core.c
> @@ -589,6 +589,12 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve)
>                         sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
>                         priv->needs_adjust_hs400 = false;
>                         renesas_sdhi_set_clock(host, host->clk_cache);
> +
> +                       /*
> +                        * In case the controller works in PIO mode the SDBUF
> +                        * needs to be set as its reset value is zero.
> +                        */
> +                       renesas_sdhi_sdbuf_width(host, 16);
>                 } else if (priv->scc_ctl) {
>                         renesas_sdhi_scc_reset(host, priv);
>                 }
> --
> 2.39.2
>
Wolfram Sang April 26, 2024, 6:19 a.m. UTC | #2
On Fri, Apr 26, 2024 at 07:08:10AM +0200, Ulf Hansson wrote:
> On Wed, 10 Apr 2024 at 15:54, Claudiu Beznea <claudiu.beznea@tuxon.dev> wrote:
> >
> > For development purpose, renesas_sdhi_probe() could be called w/
> > dma_ops = NULL to force the usage of PIO mode. In this case the
> > renesas_sdhi_enable_dma() will not be called before transferring data.
> >
> > If renesas_sdhi_enable_dma() is not called, renesas_sdhi_clk_enable()
> > call from renesas_sdhi_probe() will configure SDBUF by calling the
> > renesas_sdhi_sdbuf_width() function, but then SDBUF will be reset in
> > tmio_mmc_host_probe() when calling tmio_mmc_reset() though host->reset().
> > If SDBUF is zero the data transfer will not work in PIO mode for RZ/G3S.
> >
> > To fix this call again the renesas_sdhi_sdbuf_width(host, 16) in
> > renesas_sdhi_reset(). The call of renesas_sdhi_sdbuf_width() was not
> > removed from renesas_sdhi_clk_enable() as the host->reset() is optional.
> >
> > Co-developed-by: Hien Huynh <hien.huynh.px@renesas.com>
> > Signed-off-by: Hien Huynh <hien.huynh.px@renesas.com>
> > Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> 
> Wolfram, when you have the time, can we get your opinion on this one?

Sure, I'll try to squeeze it in today. Thanks for the heads up!
Wolfram Sang April 30, 2024, 9:10 a.m. UTC | #3
Hi Claudiu,

On Wed, Apr 10, 2024 at 04:54:16PM +0300, Claudiu Beznea wrote:
> For development purpose, renesas_sdhi_probe() could be called w/
> dma_ops = NULL to force the usage of PIO mode. In this case the
> renesas_sdhi_enable_dma() will not be called before transferring data.
> 
> If renesas_sdhi_enable_dma() is not called, renesas_sdhi_clk_enable()
> call from renesas_sdhi_probe() will configure SDBUF by calling the
> renesas_sdhi_sdbuf_width() function, but then SDBUF will be reset in
> tmio_mmc_host_probe() when calling tmio_mmc_reset() though host->reset().
> If SDBUF is zero the data transfer will not work in PIO mode for RZ/G3S.
> 
> To fix this call again the renesas_sdhi_sdbuf_width(host, 16) in
> renesas_sdhi_reset(). The call of renesas_sdhi_sdbuf_width() was not
> removed from renesas_sdhi_clk_enable() as the host->reset() is optional.

So, I tried to find a place where we would need only one call to
renesas_sdhi_sdbuf_width() but I also couldn't find a sweet spot. So,
this approach seems also best to me.

> +
> +			/*
> +			 * In case the controller works in PIO mode the SDBUF
> +			 * needs to be set as its reset value is zero.
> +			 */

But I think we can shorten the above comment to something like:

			/* Ensure default value for this driver */
> +			renesas_sdhi_sdbuf_width(host, 16);

D'accord?

Happy hacking,

   Wolfram
Claudiu April 30, 2024, 9:27 a.m. UTC | #4
Hi, Wolfram,

On 30.04.2024 12:10, Wolfram Sang wrote:
> Hi Claudiu,
> 
> On Wed, Apr 10, 2024 at 04:54:16PM +0300, Claudiu Beznea wrote:
>> For development purpose, renesas_sdhi_probe() could be called w/
>> dma_ops = NULL to force the usage of PIO mode. In this case the
>> renesas_sdhi_enable_dma() will not be called before transferring data.
>>
>> If renesas_sdhi_enable_dma() is not called, renesas_sdhi_clk_enable()
>> call from renesas_sdhi_probe() will configure SDBUF by calling the
>> renesas_sdhi_sdbuf_width() function, but then SDBUF will be reset in
>> tmio_mmc_host_probe() when calling tmio_mmc_reset() though host->reset().
>> If SDBUF is zero the data transfer will not work in PIO mode for RZ/G3S.
>>
>> To fix this call again the renesas_sdhi_sdbuf_width(host, 16) in
>> renesas_sdhi_reset(). The call of renesas_sdhi_sdbuf_width() was not
>> removed from renesas_sdhi_clk_enable() as the host->reset() is optional.
> 
> So, I tried to find a place where we would need only one call to
> renesas_sdhi_sdbuf_width() but I also couldn't find a sweet spot. So,
> this approach seems also best to me.
> 
>> +
>> +			/*
>> +			 * In case the controller works in PIO mode the SDBUF
>> +			 * needs to be set as its reset value is zero.
>> +			 */
> 
> But I think we can shorten the above comment to something like:
> 
> 			/* Ensure default value for this driver */
>> +			renesas_sdhi_sdbuf_width(host, 16);
> 
> D'accord?

Ok! I'm going to prepare a new version to change the comment.

Thank you,
Claudiu Beznea

> 
> Happy hacking,
> 
>    Wolfram
>
diff mbox series

Patch

diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index f84f60139bcf..5233731a94c4 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -589,6 +589,12 @@  static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve)
 			sd_ctrl_write16(host, CTL_RESET_SD, 0x0001);
 			priv->needs_adjust_hs400 = false;
 			renesas_sdhi_set_clock(host, host->clk_cache);
+
+			/*
+			 * In case the controller works in PIO mode the SDBUF
+			 * needs to be set as its reset value is zero.
+			 */
+			renesas_sdhi_sdbuf_width(host, 16);
 		} else if (priv->scc_ctl) {
 			renesas_sdhi_scc_reset(host, priv);
 		}