[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <f65aeebb6c372a7138e496a30ce39f879d4e24ed.camel@pengutronix.de>
Date: Wed, 12 Aug 2020 14:08:19 +0200
From: Philipp Zabel <p.zabel@...gutronix.de>
To: Wenbin Mei <wenbin.mei@...iatek.com>,
Ulf Hansson <ulf.hansson@...aro.org>,
Rob Herring <robh+dt@...nel.org>
Cc: Chaotian Jing <chaotian.jing@...iatek.com>,
Matthias Brugger <matthias.bgg@...il.com>,
linux-mmc@...r.kernel.org, devicetree@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org,
linux-mediatek@...ts.infradead.org, linux-kernel@...r.kernel.org,
srv_heupstream@...iatek.com
Subject: Re: [PATCH 3/3] mmc: mediatek: add optional module reset property
On Wed, 2020-08-12 at 17:37 +0800, Wenbin Mei wrote:
> This patch adds a optional reset management for msdc.
> Sometimes the bootloader does not bring msdc register
> to default state, so need reset the msdc controller.
>
> Signed-off-by: Wenbin Mei <wenbin.mei@...iatek.com>
> ---
> drivers/mmc/host/mtk-sd.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index 39e7fc54c438..2b243c03c9b2 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -22,6 +22,7 @@
> #include <linux/slab.h>
> #include <linux/spinlock.h>
> #include <linux/interrupt.h>
> +#include <linux/reset.h>
>
> #include <linux/mmc/card.h>
> #include <linux/mmc/core.h>
> @@ -434,6 +435,7 @@ struct msdc_host {
> struct msdc_save_para save_para; /* used when gate HCLK */
> struct msdc_tune_para def_tune_para; /* default tune setting */
> struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */
> + struct reset_control *reset;
> };
>
> static const struct mtk_mmc_compatible mt8135_compat = {
> @@ -1516,6 +1518,12 @@ static void msdc_init_hw(struct msdc_host *host)
> u32 val;
> u32 tune_reg = host->dev_comp->pad_tune_reg;
>
> + if (!IS_ERR(host->reset)) {
> + reset_control_assert(host->reset);
> + usleep_range(10, 50);
> + reset_control_deassert(host->reset);
> + }
> +
This should be:
if (host->reset) {
reset_control_assert(host->reset);
usleep_range(10, 50);
reset_control_deassert(host->reset);
}
> /* Configure to MMC/SD mode, clock free running */
> sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_MODE | MSDC_CFG_CKPDN);
>
> @@ -2273,6 +2281,11 @@ static int msdc_drv_probe(struct platform_device *pdev)
> if (IS_ERR(host->src_clk_cg))
> host->src_clk_cg = NULL;
>
> + host->reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
> + "hrst");
> + if (PTR_ERR(host->reset) == -EPROBE_DEFER)
> + return PTR_ERR(host->reset);
> +
This should be:
host->reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
"hrst");
if (IS_ERR(host->reset))
return PTR_ERR(host->reset);
If the reset is configured in DT then it should be used, even if the
reset driver is loaded later.
If the DT does not contain the reset-names = "hrst" property at all,
devm_reset_control_get_optional_*() will return NULL.
With these two changes,
Reviewed-by: Philipp Zabel <p.zabel@...gutronix.de>
regards
Philipp
Powered by blists - more mailing lists