video: simplefb: switch to use clk_bulk API to simplify clock operations

Started by Dong Aisheng on Aug 29, 2018 · 3 messages from 2 authors · Last reply Aug 31, 2018

Subsystems (3)

Maintainers (3)

STALE2996d SUPERSEDED · 1 review, 0 by maintainers

Status: Superseded by v6 (posted 2018-08-31). [go to v6]

Revision v5 (5 revisions archived); 1 review trailer.

Revisions (5)
  1. v2 re-posted go to this post
  2. v3 [diff against previous]
  3. v4 [diff against previous]
  4. v5 current [diff against previous] re-posted go to this post
  5. v6 [diff against previous]

open the first message on its own page

  1. [PATCH V5 4/4] video: simplefb: switch to use clk_bulk API to simplify clock operations
    Revisions and related patches
    Revisions (5)
    1. v2 re-posted go to this post
    2. v3 [diff against previous]
    3. v4 [diff against previous]
    4. v5 current [diff against previous] re-posted current
    5. v6 [diff against previous]
Message details and related content
Switching to use clk_bulk API to simplify clock operations.

Cc: Hans de Goede <redacted>
Cc: Bartlomiej Zolnierkiewicz <redacted>
Cc: <redacted>
Cc: Masahiro Yamada <redacted>
Cc: Stephen Boyd <redacted>
Tested-by: Thor Thayer <redacted>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
v4->v5:
 * fix wrong setting of par->clks_enabled
v3->v4:
 * no changes
v2->v3:
 * fix a build warning on x86 platform due to a wrong
   of the prototype of simplefb_clocks_enable
v1->v2:
 * switch to clk_bulk_get_all from of_clk_bulk_get_all
---
 drivers/video/fbdev/simplefb.c | 68 +++++++++---------------------------------
 1 file changed, 14 insertions(+), 54 deletions(-)
diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
index 9a9d748..8d1fbd6 100644
--- a/drivers/video/fbdev/simplefb.c
+++ b/drivers/video/fbdev/simplefb.c
@@ -182,7 +182,7 @@ struct simplefb_par {
 #if defined CONFIG_OF && defined CONFIG_COMMON_CLK
 	bool clks_enabled;
 	unsigned int clk_count;
-	struct clk **clks;
+	struct clk_bulk_data *clks;
 #endif
 #if defined CONFIG_OF && defined CONFIG_REGULATOR
 	bool regulators_enabled;
@@ -214,37 +214,13 @@ static int simplefb_clocks_get(struct simplefb_par *par,
 			       struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
-	struct clk *clock;
-	int i;
 
 	if (dev_get_platdata(&pdev->dev) || !np)
 		return 0;
 
-	par->clk_count = of_clk_get_parent_count(np);
-	if (!par->clk_count)
-		return 0;
-
-	par->clks = kcalloc(par->clk_count, sizeof(struct clk *), GFP_KERNEL);
-	if (!par->clks)
-		return -ENOMEM;
-
-	for (i = 0; i < par->clk_count; i++) {
-		clock = of_clk_get(np, i);
-		if (IS_ERR(clock)) {
-			if (PTR_ERR(clock) = -EPROBE_DEFER) {
-				while (--i >= 0) {
-					if (par->clks[i])
-						clk_put(par->clks[i]);
-				}
-				kfree(par->clks);
-				return -EPROBE_DEFER;
-			}
-			dev_err(&pdev->dev, "%s: clock %d not found: %ld\n",
-				__func__, i, PTR_ERR(clock));
-			continue;
-		}
-		par->clks[i] = clock;
-	}
+	par->clk_count = clk_bulk_get_all(&pdev->dev, &par->clks);
+	if ((par->clk_count < 0) && (par->clk_count = -EPROBE_DEFER))
+		return -EPROBE_DEFER;
 
 	return 0;
 }
@@ -252,39 +228,23 @@ static int simplefb_clocks_get(struct simplefb_par *par,
 static void simplefb_clocks_enable(struct simplefb_par *par,
 				   struct platform_device *pdev)
 {
-	int i, ret;
+	int ret;
 
-	for (i = 0; i < par->clk_count; i++) {
-		if (par->clks[i]) {
-			ret = clk_prepare_enable(par->clks[i]);
-			if (ret) {
-				dev_err(&pdev->dev,
-					"%s: failed to enable clock %d: %d\n",
-					__func__, i, ret);
-				clk_put(par->clks[i]);
-				par->clks[i] = NULL;
-			}
-		}
+	ret = clk_bulk_prepare_enable(par->clk_count, par->clks);
+	if (ret) {
+		par->clks_enabled = false;
+		dev_warn(&pdev->dev, "failed to enable clocks\n");
+	} else {
+		par->clks_enabled = true;
 	}
-	par->clks_enabled = true;
 }
 
 static void simplefb_clocks_destroy(struct simplefb_par *par)
 {
-	int i;
-
-	if (!par->clks)
-		return;
-
-	for (i = 0; i < par->clk_count; i++) {
-		if (par->clks[i]) {
-			if (par->clks_enabled)
-				clk_disable_unprepare(par->clks[i]);
-			clk_put(par->clks[i]);
-		}
-	}
+	if (par->clks_enabled)
+		clk_bulk_disable_unprepare(par->clk_count, par->clks);
 
-	kfree(par->clks);
+	clk_bulk_put_all(par->clk_count, par->clks);
 }
 #else
 static int simplefb_clocks_get(struct simplefb_par *par,
-- 
2.7.4
Message details and related content
Hi,

On 29-08-18 16:41, Dong Aisheng wrote:
quoted hunk
Switching to use clk_bulk API to simplify clock operations.

Cc: Hans de Goede <redacted>
Cc: Bartlomiej Zolnierkiewicz <redacted>
Cc: <redacted>
Cc: Masahiro Yamada <redacted>
Cc: Stephen Boyd <redacted>
Tested-by: Thor Thayer <redacted>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
---
v4->v5:
  * fix wrong setting of par->clks_enabled
v3->v4:
  * no changes
v2->v3:
  * fix a build warning on x86 platform due to a wrong
    of the prototype of simplefb_clocks_enable
v1->v2:
  * switch to clk_bulk_get_all from of_clk_bulk_get_all
---
  drivers/video/fbdev/simplefb.c | 68 +++++++++---------------------------------
  1 file changed, 14 insertions(+), 54 deletions(-)
diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
index 9a9d748..8d1fbd6 100644
--- a/drivers/video/fbdev/simplefb.c
+++ b/drivers/video/fbdev/simplefb.c
@@ -182,7 +182,7 @@ struct simplefb_par {
  #if defined CONFIG_OF && defined CONFIG_COMMON_CLK
  	bool clks_enabled;
  	unsigned int clk_count;
-	struct clk **clks;
+	struct clk_bulk_data *clks;
  #endif
  #if defined CONFIG_OF && defined CONFIG_REGULATOR
  	bool regulators_enabled;
@@ -214,37 +214,13 @@ static int simplefb_clocks_get(struct simplefb_par *par,
  			       struct platform_device *pdev)
  {
  	struct device_node *np = pdev->dev.of_node;

34 more quoted lines

I just noticed this now, but clk_count is unsigned so it will never
be < 0, please make it signed.

Also there is no need to check for < 0 just (par->clk_count = -EPROBE_DEFER)
is enough (if that is true < 0 also always is true).
quoted hunk
  
  	return 0;
  }
@@ -252,39 +228,23 @@ static int simplefb_clocks_get(struct simplefb_par *par,
  static void simplefb_clocks_enable(struct simplefb_par *par,
  				   struct platform_device *pdev)
  {
-	int i, ret;
+	int ret;
  
-	for (i = 0; i < par->clk_count; i++) {
-		if (par->clks[i]) {
-			ret = clk_prepare_enable(par->clks[i]);
-			if (ret) {
-				dev_err(&pdev->dev,
-					"%s: failed to enable clock %d: %d\n",
-					__func__, i, ret);
-				clk_put(par->clks[i]);
-				par->clks[i] = NULL;
-			}
-		}
+	ret = clk_bulk_prepare_enable(par->clk_count, par->clks);
Hmm, what happens if par->clk_count < 0 (another <0 value then
-EPROBEDEFER) ?
+	if (ret) {
+		par->clks_enabled = false;
No need to set false here.
quoted hunk
+		dev_warn(&pdev->dev, "failed to enable clocks\n");
+	} else {
+		par->clks_enabled = true;
  	}
-	par->clks_enabled = true;
  }
  
  static void simplefb_clocks_destroy(struct simplefb_par *par)
  {
-	int i;
-
-	if (!par->clks)
-		return;
-
-	for (i = 0; i < par->clk_count; i++) {
-		if (par->clks[i]) {
-			if (par->clks_enabled)
-				clk_disable_unprepare(par->clks[i]);
-			clk_put(par->clks[i]);
-		}
-	}
+	if (par->clks_enabled)
+		clk_bulk_disable_unprepare(par->clk_count, par->clks);
  
-	kfree(par->clks);
+	clk_bulk_put_all(par->clk_count, par->clks);
Again what about par->clk_count < 0 ?

Regards,

Hans
Message details and related content
PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBIYW5zIGRlIEdvZWRlIFttYWls
dG86aGRlZ29lZGVAcmVkaGF0LmNvbV0NCj4gU2VudDogV2VkbmVzZGF5LCBBdWd1c3QgMjksIDIw
MTggMTE6MjIgUE0NCg0KWy4uLl0NCg0KPiBPbiAyOS0wOC0xOCAxNjo0MSwgRG9uZyBBaXNoZW5n
IHdyb3RlOg0KPiA+IFN3aXRjaGluZyB0byB1c2UgY2xrX2J1bGsgQVBJIHRvIHNpbXBsaWZ5IGNs
b2NrIG9wZXJhdGlvbnMuDQo+ID4NCj4gPiBDYzogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVk
aGF0LmNvbT4NCj4gPiBDYzogQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Yi56b2xuaWVya2ll
QHNhbXN1bmcuY29tPg0KPiA+IENjOiBsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcNCj4gPiBD
YzogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4NCj4gPiBD
YzogU3RlcGhlbiBCb3lkIDxzYm95ZEBjb2RlYXVyb3JhLm9yZz4NCj4gPiBUZXN0ZWQtYnk6IFRo
b3IgVGhheWVyIDx0aG9yLnRoYXllckBsaW51eC5pbnRlbC5jb20+DQo+ID4gU2lnbmVkLW9mZi1i
eTogRG9uZyBBaXNoZW5nIDxhaXNoZW5nLmRvbmdAbnhwLmNvbT4NCj4gPiAtLS0NCj4gPiB2NC0+
djU6DQo+ID4gICAqIGZpeCB3cm9uZyBzZXR0aW5nIG9mIHBhci0+Y2xrc19lbmFibGVkDQo+ID4g
djMtPnY0Og0KPiA+ICAgKiBubyBjaGFuZ2VzDQo+ID4gdjItPnYzOg0KPiA+ICAgKiBmaXggYSBi
dWlsZCB3YXJuaW5nIG9uIHg4NiBwbGF0Zm9ybSBkdWUgdG8gYSB3cm9uZw0KPiA+ICAgICBvZiB0
aGUgcHJvdG90eXBlIG9mIHNpbXBsZWZiX2Nsb2Nrc19lbmFibGUNCj4gPiB2MS0+djI6DQo+ID4g
ICAqIHN3aXRjaCB0byBjbGtfYnVsa19nZXRfYWxsIGZyb20gb2ZfY2xrX2J1bGtfZ2V0X2FsbA0K
PiA+IC0tLQ0KPiA+ICAgZHJpdmVycy92aWRlby9mYmRldi9zaW1wbGVmYi5jIHwgNjggKysrKysr
KysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ID4gICAxIGZpbGUgY2hhbmdl
ZCwgMTQgaW5zZXJ0aW9ucygrKSwgNTQgZGVsZXRpb25zKC0pDQo+ID4NCj4gPiBkaWZmIC0tZ2l0
IGEvZHJpdmVycy92aWRlby9mYmRldi9zaW1wbGVmYi5jDQo+ID4gYi9kcml2ZXJzL3ZpZGVvL2Zi
ZGV2L3NpbXBsZWZiLmMgaW5kZXggOWE5ZDc0OC4uOGQxZmJkNiAxMDA2NDQNCj4gPiAtLS0gYS9k
cml2ZXJzL3ZpZGVvL2ZiZGV2L3NpbXBsZWZiLmMNCj4gPiArKysgYi9kcml2ZXJzL3ZpZGVvL2Zi
ZGV2L3NpbXBsZWZiLmMNCj4gPiBAQCAtMTgyLDcgKzE4Miw3IEBAIHN0cnVjdCBzaW1wbGVmYl9w
YXIgew0KPiA+ICAgI2lmIGRlZmluZWQgQ09ORklHX09GICYmIGRlZmluZWQgQ09ORklHX0NPTU1P
Tl9DTEsNCj4gPiAgIAlib29sIGNsa3NfZW5hYmxlZDsNCj4gPiAgIAl1bnNpZ25lZCBpbnQgY2xr
X2NvdW50Ow0KPiA+IC0Jc3RydWN0IGNsayAqKmNsa3M7DQo+ID4gKwlzdHJ1Y3QgY2xrX2J1bGtf
ZGF0YSAqY2xrczsNCj4gPiAgICNlbmRpZg0KPiA+ICAgI2lmIGRlZmluZWQgQ09ORklHX09GICYm
IGRlZmluZWQgQ09ORklHX1JFR1VMQVRPUg0KPiA+ICAgCWJvb2wgcmVndWxhdG9yc19lbmFibGVk
Ow0KPiA+IEBAIC0yMTQsMzcgKzIxNCwxMyBAQCBzdGF0aWMgaW50IHNpbXBsZWZiX2Nsb2Nrc19n
ZXQoc3RydWN0IHNpbXBsZWZiX3Bhcg0KPiAqcGFyLA0KPiA+ICAgCQkJICAgICAgIHN0cnVjdCBw
bGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ID4gICB7DQo+ID4gICAJc3RydWN0IGRldmljZV9ub2Rl
ICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOw0KPiA+IC0Jc3RydWN0IGNsayAqY2xvY2s7DQo+ID4g
LQlpbnQgaTsNCj4gPg0KPiA+ICAgCWlmIChkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpIHx8
ICFucCkNCj4gPiAgIAkJcmV0dXJuIDA7DQo+ID4NCj4gPiAtCXBhci0+Y2xrX2NvdW50ID0gb2Zf
Y2xrX2dldF9wYXJlbnRfY291bnQobnApOw0KPiA+IC0JaWYgKCFwYXItPmNsa19jb3VudCkNCj4g
PiAtCQlyZXR1cm4gMDsNCj4gPiAtDQo+ID4gLQlwYXItPmNsa3MgPSBrY2FsbG9jKHBhci0+Y2xr
X2NvdW50LCBzaXplb2Yoc3RydWN0IGNsayAqKSwgR0ZQX0tFUk5FTCk7DQo+ID4gLQlpZiAoIXBh
ci0+Y2xrcykNCj4gPiAtCQlyZXR1cm4gLUVOT01FTTsNCj4gPiAtDQo+ID4gLQlmb3IgKGkgPSAw
OyBpIDwgcGFyLT5jbGtfY291bnQ7IGkrKykgew0KPiA+IC0JCWNsb2NrID0gb2ZfY2xrX2dldChu
cCwgaSk7DQo+ID4gLQkJaWYgKElTX0VSUihjbG9jaykpIHsNCj4gPiAtCQkJaWYgKFBUUl9FUlIo

62 more lines

Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help