linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] More meson HDMI fixes
@ 2020-11-20  9:42 Marc Zyngier
  2020-11-20  9:42 ` [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown Marc Zyngier
  2020-11-20  9:42 ` [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough Marc Zyngier
  0 siblings, 2 replies; 10+ messages in thread
From: Marc Zyngier @ 2020-11-20  9:42 UTC (permalink / raw)
  To: Neil Armstrong, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Guillaume Tucker,
	kernel-team, dri-devel, linux-amlogic, linux-arm-kernel,
	linux-kernel

Guillaume reported that my earlier fixes for the meson HDMI driver
broke another set of machines which are now exploding (clock not
enabled).

I have thus reconsidered the approach and came up with an alternative
fix (enable a missing clock), which Guillaume confirmed to be working.
Jerome pointed out that this driver is leaking clock references like a
sieve, so that needed addressing too.

The first patch start by fixing the clock leakage using a devm
facility.

The second patch addresses the earlier crash by reusing the
infrastructure put together in the first patch.

Tested on VIM3l.

Marc Zyngier (2):
  drm/meson: dw-hdmi: Disable clocks on driver teardown
  drm/meson: dw-hdmi: Enable the iahb clock early enough

 drivers/gpu/drm/meson/meson_dw_hdmi.c | 51 ++++++++++++++++++---------
 1 file changed, 35 insertions(+), 16 deletions(-)

-- 
2.28.0


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

* [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown
  2020-11-20  9:42 [PATCH 0/2] More meson HDMI fixes Marc Zyngier
@ 2020-11-20  9:42 ` Marc Zyngier
  2020-11-20 12:26   ` Neil Armstrong
  2020-11-23 14:03   ` Jerome Brunet
  2020-11-20  9:42 ` [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough Marc Zyngier
  1 sibling, 2 replies; 10+ messages in thread
From: Marc Zyngier @ 2020-11-20  9:42 UTC (permalink / raw)
  To: Neil Armstrong, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Guillaume Tucker,
	kernel-team, dri-devel, linux-amlogic, linux-arm-kernel,
	linux-kernel

The HDMI driver request clocks early, but never disable them, leaving
the clocks on even when the driver is removed.

Fix it by slightly refactoring the clock code, and register a devm
action that will eventually disable/unprepare the enabled clocks.

Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 drivers/gpu/drm/meson/meson_dw_hdmi.c | 43 ++++++++++++++++++---------
 1 file changed, 29 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 7f8eea494147..29623b309cb1 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -145,8 +145,6 @@ struct meson_dw_hdmi {
 	struct reset_control *hdmitx_apb;
 	struct reset_control *hdmitx_ctrl;
 	struct reset_control *hdmitx_phy;
-	struct clk *hdmi_pclk;
-	struct clk *venci_clk;
 	struct regulator *hdmi_supply;
 	u32 irq_stat;
 	struct dw_hdmi *hdmi;
@@ -946,6 +944,29 @@ static void meson_disable_regulator(void *data)
 	regulator_disable(data);
 }
 
+static void meson_disable_clk(void *data)
+{
+	clk_disable_unprepare(data);
+}
+
+static int meson_enable_clk(struct device *dev, char *name)
+{
+	struct clk *clk;
+	int ret;
+
+	clk = devm_clk_get(dev, name);
+	if (IS_ERR(clk)) {
+		dev_err(dev, "Unable to get %s pclk\n", name);
+		return PTR_ERR(clk);
+	}
+
+	ret = clk_prepare_enable(clk);
+	if (!ret)
+		ret = devm_add_action_or_reset(dev, meson_disable_clk, clk);
+
+	return ret;
+}
+
 static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 				void *data)
 {
@@ -1026,19 +1047,13 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 	if (IS_ERR(meson_dw_hdmi->hdmitx))
 		return PTR_ERR(meson_dw_hdmi->hdmitx);
 
-	meson_dw_hdmi->hdmi_pclk = devm_clk_get(dev, "isfr");
-	if (IS_ERR(meson_dw_hdmi->hdmi_pclk)) {
-		dev_err(dev, "Unable to get HDMI pclk\n");
-		return PTR_ERR(meson_dw_hdmi->hdmi_pclk);
-	}
-	clk_prepare_enable(meson_dw_hdmi->hdmi_pclk);
+	ret = meson_enable_clk(dev, "isfr");
+	if (ret)
+		return ret;
 
-	meson_dw_hdmi->venci_clk = devm_clk_get(dev, "venci");
-	if (IS_ERR(meson_dw_hdmi->venci_clk)) {
-		dev_err(dev, "Unable to get venci clk\n");
-		return PTR_ERR(meson_dw_hdmi->venci_clk);
-	}
-	clk_prepare_enable(meson_dw_hdmi->venci_clk);
+	ret = meson_enable_clk(dev, "venci");
+	if (ret)
+		return ret;
 
 	dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
 					      &meson_dw_hdmi_regmap_config);
-- 
2.28.0


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

* [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough
  2020-11-20  9:42 [PATCH 0/2] More meson HDMI fixes Marc Zyngier
  2020-11-20  9:42 ` [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown Marc Zyngier
@ 2020-11-20  9:42 ` Marc Zyngier
  2020-11-20 10:54   ` Guillaume Tucker
  2020-11-20 12:27   ` Neil Armstrong
  1 sibling, 2 replies; 10+ messages in thread
From: Marc Zyngier @ 2020-11-20  9:42 UTC (permalink / raw)
  To: Neil Armstrong, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Guillaume Tucker,
	kernel-team, dri-devel, linux-amlogic, linux-arm-kernel,
	linux-kernel

Instead of moving meson_dw_hdmi_init() around which breaks existing
platform, let's enable the clock meson_dw_hdmi_init() depends on.
This means we don't have to worry about this clock being enabled or
not, depending on the boot-loader features.

Fixes: b33340e33acd ("drm/meson: dw-hdmi: Ensure that clocks are enabled before touching the TOP registers")
Reported-by: Guillaume Tucker <guillaume.tucker@collabora.com>
Tested-by: Guillaume Tucker <guillaume.tucker@collabora.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 drivers/gpu/drm/meson/meson_dw_hdmi.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 29623b309cb1..aad75a22dc33 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -1051,6 +1051,10 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 	if (ret)
 		return ret;
 
+	ret = meson_enable_clk(dev, "iahb");
+	if (ret)
+		return ret;
+
 	ret = meson_enable_clk(dev, "venci");
 	if (ret)
 		return ret;
@@ -1086,6 +1090,8 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 
 	encoder->possible_crtcs = BIT(0);
 
+	meson_dw_hdmi_init(meson_dw_hdmi);
+
 	DRM_DEBUG_DRIVER("encoder initialized\n");
 
 	/* Bridge / Connector */
@@ -1110,8 +1116,6 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
 	if (IS_ERR(meson_dw_hdmi->hdmi))
 		return PTR_ERR(meson_dw_hdmi->hdmi);
 
-	meson_dw_hdmi_init(meson_dw_hdmi);
-
 	next_bridge = of_drm_find_bridge(pdev->dev.of_node);
 	if (next_bridge)
 		drm_bridge_attach(encoder, next_bridge,
-- 
2.28.0


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

* Re: [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough
  2020-11-20  9:42 ` [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough Marc Zyngier
@ 2020-11-20 10:54   ` Guillaume Tucker
  2020-11-20 11:10     ` Marc Zyngier
  2020-11-20 12:27   ` Neil Armstrong
  1 sibling, 1 reply; 10+ messages in thread
From: Guillaume Tucker @ 2020-11-20 10:54 UTC (permalink / raw)
  To: Marc Zyngier, Neil Armstrong, Kevin Hilman
  Cc: Martin Blumenstingl, linux-kernel, dri-devel, linux-amlogic,
	kernel-team, linux-arm-kernel, Jerome Brunet

On 20/11/2020 09:42, Marc Zyngier wrote:
> Instead of moving meson_dw_hdmi_init() around which breaks existing
> platform, let's enable the clock meson_dw_hdmi_init() depends on.
> This means we don't have to worry about this clock being enabled or
> not, depending on the boot-loader features.
> 
> Fixes: b33340e33acd ("drm/meson: dw-hdmi: Ensure that clocks are enabled before touching the TOP registers")
> Reported-by: Guillaume Tucker <guillaume.tucker@collabora.com>

Although I am triaging kernelci bisections, it was initially
found thanks to our friendly bot.  So if you're OK with this, it
would most definitely appreciate a mention:

  Reported-by: "kernelci.org bot" <bot@kernelci.org>

Thanks,
Guillaume

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

* Re: [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough
  2020-11-20 10:54   ` Guillaume Tucker
@ 2020-11-20 11:10     ` Marc Zyngier
  2020-11-20 12:18       ` Neil Armstrong
  0 siblings, 1 reply; 10+ messages in thread
From: Marc Zyngier @ 2020-11-20 11:10 UTC (permalink / raw)
  To: Guillaume Tucker
  Cc: Neil Armstrong, Kevin Hilman, Martin Blumenstingl, linux-kernel,
	dri-devel, linux-amlogic, kernel-team, linux-arm-kernel,
	Jerome Brunet

On 2020-11-20 10:54, Guillaume Tucker wrote:
> On 20/11/2020 09:42, Marc Zyngier wrote:
>> Instead of moving meson_dw_hdmi_init() around which breaks existing
>> platform, let's enable the clock meson_dw_hdmi_init() depends on.
>> This means we don't have to worry about this clock being enabled or
>> not, depending on the boot-loader features.
>> 
>> Fixes: b33340e33acd ("drm/meson: dw-hdmi: Ensure that clocks are 
>> enabled before touching the TOP registers")
>> Reported-by: Guillaume Tucker <guillaume.tucker@collabora.com>
> 
> Although I am triaging kernelci bisections, it was initially
> found thanks to our friendly bot.  So if you're OK with this, it
> would most definitely appreciate a mention:
> 
>   Reported-by: "kernelci.org bot" <bot@kernelci.org>

Sure. Neil can add this when (and if) he applies these patches.

Thanks,

         M.
-- 
Jazz is not dead. It just smells funny...

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

* Re: [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough
  2020-11-20 11:10     ` Marc Zyngier
@ 2020-11-20 12:18       ` Neil Armstrong
  0 siblings, 0 replies; 10+ messages in thread
From: Neil Armstrong @ 2020-11-20 12:18 UTC (permalink / raw)
  To: Marc Zyngier, Guillaume Tucker
  Cc: Kevin Hilman, Martin Blumenstingl, linux-kernel, dri-devel,
	linux-amlogic, kernel-team, linux-arm-kernel, Jerome Brunet

On 20/11/2020 12:10, Marc Zyngier wrote:
> On 2020-11-20 10:54, Guillaume Tucker wrote:
>> On 20/11/2020 09:42, Marc Zyngier wrote:
>>> Instead of moving meson_dw_hdmi_init() around which breaks existing
>>> platform, let's enable the clock meson_dw_hdmi_init() depends on.
>>> This means we don't have to worry about this clock being enabled or
>>> not, depending on the boot-loader features.
>>>
>>> Fixes: b33340e33acd ("drm/meson: dw-hdmi: Ensure that clocks are enabled before touching the TOP registers")
>>> Reported-by: Guillaume Tucker <guillaume.tucker@collabora.com>
>>
>> Although I am triaging kernelci bisections, it was initially
>> found thanks to our friendly bot.  So if you're OK with this, it
>> would most definitely appreciate a mention:
>>
>>   Reported-by: "kernelci.org bot" <bot@kernelci.org>
> 
> Sure. Neil can add this when (and if) he applies these patches.

Yep applying to drm-misc-next and switching to `Reported-by: "kernelci.org bot" <bot@kernelci.org>`

Thanks
Neil

> 
> Thanks,
> 
>         M.


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

* Re: [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown
  2020-11-20  9:42 ` [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown Marc Zyngier
@ 2020-11-20 12:26   ` Neil Armstrong
  2020-11-23 14:03   ` Jerome Brunet
  1 sibling, 0 replies; 10+ messages in thread
From: Neil Armstrong @ 2020-11-20 12:26 UTC (permalink / raw)
  To: Marc Zyngier, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Guillaume Tucker,
	kernel-team, dri-devel, linux-amlogic, linux-arm-kernel,
	linux-kernel

On 20/11/2020 10:42, Marc Zyngier wrote:
> The HDMI driver request clocks early, but never disable them, leaving
> the clocks on even when the driver is removed.
> 
> Fix it by slightly refactoring the clock code, and register a devm
> action that will eventually disable/unprepare the enabled clocks.
> 
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  drivers/gpu/drm/meson/meson_dw_hdmi.c | 43 ++++++++++++++++++---------
>  1 file changed, 29 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 7f8eea494147..29623b309cb1 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -145,8 +145,6 @@ struct meson_dw_hdmi {
>  	struct reset_control *hdmitx_apb;
>  	struct reset_control *hdmitx_ctrl;
>  	struct reset_control *hdmitx_phy;
> -	struct clk *hdmi_pclk;
> -	struct clk *venci_clk;
>  	struct regulator *hdmi_supply;
>  	u32 irq_stat;
>  	struct dw_hdmi *hdmi;
> @@ -946,6 +944,29 @@ static void meson_disable_regulator(void *data)
>  	regulator_disable(data);
>  }
>  
> +static void meson_disable_clk(void *data)
> +{
> +	clk_disable_unprepare(data);
> +}
> +
> +static int meson_enable_clk(struct device *dev, char *name)
> +{
> +	struct clk *clk;
> +	int ret;
> +
> +	clk = devm_clk_get(dev, name);
> +	if (IS_ERR(clk)) {
> +		dev_err(dev, "Unable to get %s pclk\n", name);
> +		return PTR_ERR(clk);
> +	}
> +
> +	ret = clk_prepare_enable(clk);
> +	if (!ret)
> +		ret = devm_add_action_or_reset(dev, meson_disable_clk, clk);
> +
> +	return ret;
> +}
> +
>  static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  				void *data)
>  {
> @@ -1026,19 +1047,13 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  	if (IS_ERR(meson_dw_hdmi->hdmitx))
>  		return PTR_ERR(meson_dw_hdmi->hdmitx);
>  
> -	meson_dw_hdmi->hdmi_pclk = devm_clk_get(dev, "isfr");
> -	if (IS_ERR(meson_dw_hdmi->hdmi_pclk)) {
> -		dev_err(dev, "Unable to get HDMI pclk\n");
> -		return PTR_ERR(meson_dw_hdmi->hdmi_pclk);
> -	}
> -	clk_prepare_enable(meson_dw_hdmi->hdmi_pclk);
> +	ret = meson_enable_clk(dev, "isfr");
> +	if (ret)
> +		return ret;
>  
> -	meson_dw_hdmi->venci_clk = devm_clk_get(dev, "venci");
> -	if (IS_ERR(meson_dw_hdmi->venci_clk)) {
> -		dev_err(dev, "Unable to get venci clk\n");
> -		return PTR_ERR(meson_dw_hdmi->venci_clk);
> -	}
> -	clk_prepare_enable(meson_dw_hdmi->venci_clk);
> +	ret = meson_enable_clk(dev, "venci");
> +	if (ret)
> +		return ret;
>  
>  	dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
>  					      &meson_dw_hdmi_regmap_config);
> 

Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>


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

* Re: [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough
  2020-11-20  9:42 ` [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough Marc Zyngier
  2020-11-20 10:54   ` Guillaume Tucker
@ 2020-11-20 12:27   ` Neil Armstrong
  1 sibling, 0 replies; 10+ messages in thread
From: Neil Armstrong @ 2020-11-20 12:27 UTC (permalink / raw)
  To: Marc Zyngier, Kevin Hilman
  Cc: Jerome Brunet, Martin Blumenstingl, Guillaume Tucker,
	kernel-team, dri-devel, linux-amlogic, linux-arm-kernel,
	linux-kernel

On 20/11/2020 10:42, Marc Zyngier wrote:
> Instead of moving meson_dw_hdmi_init() around which breaks existing
> platform, let's enable the clock meson_dw_hdmi_init() depends on.
> This means we don't have to worry about this clock being enabled or
> not, depending on the boot-loader features.
> 
> Fixes: b33340e33acd ("drm/meson: dw-hdmi: Ensure that clocks are enabled before touching the TOP registers")
> Reported-by: Guillaume Tucker <guillaume.tucker@collabora.com>
> Tested-by: Guillaume Tucker <guillaume.tucker@collabora.com>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  drivers/gpu/drm/meson/meson_dw_hdmi.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 29623b309cb1..aad75a22dc33 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -1051,6 +1051,10 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  	if (ret)
>  		return ret;
>  
> +	ret = meson_enable_clk(dev, "iahb");
> +	if (ret)
> +		return ret;
> +
>  	ret = meson_enable_clk(dev, "venci");
>  	if (ret)
>  		return ret;
> @@ -1086,6 +1090,8 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  
>  	encoder->possible_crtcs = BIT(0);
>  
> +	meson_dw_hdmi_init(meson_dw_hdmi);
> +
>  	DRM_DEBUG_DRIVER("encoder initialized\n");
>  
>  	/* Bridge / Connector */
> @@ -1110,8 +1116,6 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  	if (IS_ERR(meson_dw_hdmi->hdmi))
>  		return PTR_ERR(meson_dw_hdmi->hdmi);
>  
> -	meson_dw_hdmi_init(meson_dw_hdmi);
> -
>  	next_bridge = of_drm_find_bridge(pdev->dev.of_node);
>  	if (next_bridge)
>  		drm_bridge_attach(encoder, next_bridge,
> 
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>

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

* Re: [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown
  2020-11-20  9:42 ` [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown Marc Zyngier
  2020-11-20 12:26   ` Neil Armstrong
@ 2020-11-23 14:03   ` Jerome Brunet
  2020-11-23 14:15     ` Marc Zyngier
  1 sibling, 1 reply; 10+ messages in thread
From: Jerome Brunet @ 2020-11-23 14:03 UTC (permalink / raw)
  To: Marc Zyngier, Neil Armstrong, Kevin Hilman
  Cc: Martin Blumenstingl, Guillaume Tucker, kernel-team, dri-devel,
	linux-amlogic, linux-arm-kernel, linux-kernel


On Fri 20 Nov 2020 at 10:42, Marc Zyngier <maz@kernel.org> wrote:

> The HDMI driver request clocks early, but never disable them, leaving
> the clocks on even when the driver is removed.
>
> Fix it by slightly refactoring the clock code, and register a devm
> action that will eventually disable/unprepare the enabled clocks.
>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  drivers/gpu/drm/meson/meson_dw_hdmi.c | 43 ++++++++++++++++++---------
>  1 file changed, 29 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 7f8eea494147..29623b309cb1 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -145,8 +145,6 @@ struct meson_dw_hdmi {
>  	struct reset_control *hdmitx_apb;
>  	struct reset_control *hdmitx_ctrl;
>  	struct reset_control *hdmitx_phy;
> -	struct clk *hdmi_pclk;
> -	struct clk *venci_clk;
>  	struct regulator *hdmi_supply;
>  	u32 irq_stat;
>  	struct dw_hdmi *hdmi;
> @@ -946,6 +944,29 @@ static void meson_disable_regulator(void *data)
>  	regulator_disable(data);
>  }
>  
> +static void meson_disable_clk(void *data)
> +{
> +	clk_disable_unprepare(data);
> +}
> +
> +static int meson_enable_clk(struct device *dev, char *name)
> +{
> +	struct clk *clk;
> +	int ret;
> +
> +	clk = devm_clk_get(dev, name);
> +	if (IS_ERR(clk)) {
> +		dev_err(dev, "Unable to get %s pclk\n", name);
> +		return PTR_ERR(clk);
> +	}
> +
> +	ret = clk_prepare_enable(clk);
> +	if (!ret)
> +		ret = devm_add_action_or_reset(dev, meson_disable_clk,
> clk);

Thanks for fixing this Marc.

FYI, while it is fine to declare a function to disable the clocks, a quick
cast may avoid it

devm_add_action_or_reset(dev, (void(*)(void *))clk_disable_unprepare, clk);

> +
> +	return ret;
> +}
> +
>  static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  				void *data)
>  {
> @@ -1026,19 +1047,13 @@ static int meson_dw_hdmi_bind(struct device *dev, struct device *master,
>  	if (IS_ERR(meson_dw_hdmi->hdmitx))
>  		return PTR_ERR(meson_dw_hdmi->hdmitx);
>  
> -	meson_dw_hdmi->hdmi_pclk = devm_clk_get(dev, "isfr");
> -	if (IS_ERR(meson_dw_hdmi->hdmi_pclk)) {
> -		dev_err(dev, "Unable to get HDMI pclk\n");
> -		return PTR_ERR(meson_dw_hdmi->hdmi_pclk);
> -	}
> -	clk_prepare_enable(meson_dw_hdmi->hdmi_pclk);
> +	ret = meson_enable_clk(dev, "isfr");
> +	if (ret)
> +		return ret;
>  
> -	meson_dw_hdmi->venci_clk = devm_clk_get(dev, "venci");
> -	if (IS_ERR(meson_dw_hdmi->venci_clk)) {
> -		dev_err(dev, "Unable to get venci clk\n");
> -		return PTR_ERR(meson_dw_hdmi->venci_clk);
> -	}
> -	clk_prepare_enable(meson_dw_hdmi->venci_clk);
> +	ret = meson_enable_clk(dev, "venci");
> +	if (ret)
> +		return ret;
>  
>  	dw_plat_data->regm = devm_regmap_init(dev, NULL, meson_dw_hdmi,
>  					      &meson_dw_hdmi_regmap_config);


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

* Re: [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown
  2020-11-23 14:03   ` Jerome Brunet
@ 2020-11-23 14:15     ` Marc Zyngier
  0 siblings, 0 replies; 10+ messages in thread
From: Marc Zyngier @ 2020-11-23 14:15 UTC (permalink / raw)
  To: Jerome Brunet
  Cc: Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
	Guillaume Tucker, kernel-team, dri-devel, linux-amlogic,
	linux-arm-kernel, linux-kernel

On 2020-11-23 14:03, Jerome Brunet wrote:
> On Fri 20 Nov 2020 at 10:42, Marc Zyngier <maz@kernel.org> wrote:
> 
>> The HDMI driver request clocks early, but never disable them, leaving
>> the clocks on even when the driver is removed.
>> 
>> Fix it by slightly refactoring the clock code, and register a devm
>> action that will eventually disable/unprepare the enabled clocks.
>> 
>> Signed-off-by: Marc Zyngier <maz@kernel.org>
>> ---
>>  drivers/gpu/drm/meson/meson_dw_hdmi.c | 43 
>> ++++++++++++++++++---------
>>  1 file changed, 29 insertions(+), 14 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c 
>> b/drivers/gpu/drm/meson/meson_dw_hdmi.c
>> index 7f8eea494147..29623b309cb1 100644
>> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
>> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
>> @@ -145,8 +145,6 @@ struct meson_dw_hdmi {
>>  	struct reset_control *hdmitx_apb;
>>  	struct reset_control *hdmitx_ctrl;
>>  	struct reset_control *hdmitx_phy;
>> -	struct clk *hdmi_pclk;
>> -	struct clk *venci_clk;
>>  	struct regulator *hdmi_supply;
>>  	u32 irq_stat;
>>  	struct dw_hdmi *hdmi;
>> @@ -946,6 +944,29 @@ static void meson_disable_regulator(void *data)
>>  	regulator_disable(data);
>>  }
>> 
>> +static void meson_disable_clk(void *data)
>> +{
>> +	clk_disable_unprepare(data);
>> +}
>> +
>> +static int meson_enable_clk(struct device *dev, char *name)
>> +{
>> +	struct clk *clk;
>> +	int ret;
>> +
>> +	clk = devm_clk_get(dev, name);
>> +	if (IS_ERR(clk)) {
>> +		dev_err(dev, "Unable to get %s pclk\n", name);
>> +		return PTR_ERR(clk);
>> +	}
>> +
>> +	ret = clk_prepare_enable(clk);
>> +	if (!ret)
>> +		ret = devm_add_action_or_reset(dev, meson_disable_clk,
>> clk);
> 
> Thanks for fixing this Marc.
> 
> FYI, while it is fine to declare a function to disable the clocks, a 
> quick
> cast may avoid it
> 
> devm_add_action_or_reset(dev, (void(*)(void *))clk_disable_unprepare, 
> clk);

While this works for now, a change to the clk_disable_unprepare()
prototype (such as adding a second argument) would now go completely
unnoticed (after all, you've cast the function, it *must* be correct,
right?), and someone would spend a few hours trying to track down memory
corruption or some other interesting results.

Yes, casting C functions can be hilarious.

I can see a few uses of this hack in the tree, and I have my pop-corn
ready.

Thanks,

         M.
-- 
Jazz is not dead. It just smells funny...

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

end of thread, other threads:[~2020-11-23 14:16 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-20  9:42 [PATCH 0/2] More meson HDMI fixes Marc Zyngier
2020-11-20  9:42 ` [PATCH 1/2] drm/meson: dw-hdmi: Disable clocks on driver teardown Marc Zyngier
2020-11-20 12:26   ` Neil Armstrong
2020-11-23 14:03   ` Jerome Brunet
2020-11-23 14:15     ` Marc Zyngier
2020-11-20  9:42 ` [PATCH 2/2] drm/meson: dw-hdmi: Enable the iahb clock early enough Marc Zyngier
2020-11-20 10:54   ` Guillaume Tucker
2020-11-20 11:10     ` Marc Zyngier
2020-11-20 12:18       ` Neil Armstrong
2020-11-20 12:27   ` Neil Armstrong

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