Skip to contentSkip to conversation

regulator: ad5398: Fix min/max current limit boundary checking

PATCH Applied Axel Lin 3 participants 3 messages Jul 4, 2012

Subsystems (2)
lore
Share & tools
lore

Axel Lin

author
#0 lore raw

PATCH v3 1/1 regulator: ad5398: Fix min/max current limit boundary checking

It is ok to request current limit with min_uA < chip->min_uA and max_uA > chip->max_uA.

We need to set min_uA = chip->min_uA if (min_uA < chip->min_uA), this ensures the equation to calcuate selator does not return negative number.

Also set max_uA = chip->max_uA if (max_uA > chip->max_uA), as suggested by Sonic.

---
 drivers/regulator/ad5398.c |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/regulator/ad5398.c +6 -3
index 46d05f3..f123f7e 100644
@@ -89,9 +89,12 @@ static int ad5398_set_current_limit(struct regulator_dev *rdev, int min_uA, int
 	unsigned short data;
 	int ret;
 
-	if (min_uA > chip->max_uA || min_uA < chip->min_uA)
-		return -EINVAL;
-	if (max_uA > chip->max_uA || max_uA < chip->min_uA)
+	if (min_uA < chip->min_uA)
+		min_uA = chip->min_uA;
+	if (max_uA > chip->max_uA)
+		max_uA = chip->max_uA;
+
+	if (min_uA > chip->max_uA || max_uA < chip->min_uA)
 		return -EINVAL;
 
 	selector = DIV_ROUND_UP((min_uA - chip->min_uA) * chip->current_level,
Signature · 1 line
1.7.9.5
Acked-by on v3 1/1
#1 lore raw
Quoted 44 lines

-----Original Message-----
From: Axel Lin [mailto:[email protected]]
Sent: Wednesday, July 04, 2012 11:55 AM
To: Mark Brown
Cc: [email protected]; Zhang, Sonic; Lars-Peter Clausen; Liam Girdwood
Subject: [PATCH v3] regulator: ad5398: Fix min/max current limit boundary checking

It is ok to request current limit with min_uA < chip->min_uA and max_uA > chip->max_uA.

We need to set min_uA = chip->min_uA if (min_uA < chip->min_uA), this ensures the equation to calcuate selator does not return negative number.

Also set max_uA = chip->max_uA if (max_uA > chip->max_uA), as suggested by Sonic.

---
drivers/regulator/ad5398.c | 9 ++++++---

1 file changed, 6 insertions(+), 3 deletions(-)
drivers/regulator/ad5398.c +6 -3
index 46d05f3..f123f7e 100644
@@ -89,9 +89,12 @@ static int ad5398_set_current_limit(struct regulator_dev
 *rdev, int min_uA, int
      unsigned short data;
      int ret;
 
-      if (min_uA > chip->max_uA || min_uA < chip->min_uA)
-              return -EINVAL;
-      if (max_uA > chip->max_uA || max_uA < chip->min_uA)
+      if (min_uA < chip->min_uA)
+              min_uA = chip->min_uA;
+      if (max_uA > chip->max_uA)
+              max_uA = chip->max_uA;
+
+      if (min_uA > chip->max_uA || max_uA < chip->min_uA)
              return -EINVAL;
 
      selector = DIV_ROUND_UP((min_uA - chip->min_uA) * chip->current_level,
Quoted 5 lines

--
1.7.9.5

���{.n�+�������+%�����ݶ��w��{.n�+����{��G�����{ay�ʇڙ�,j��f���h��������z_�(�階�ݢj"���m������G������?����&���~��iO��z��v�^�m���� ������?�I�

Applied
#2 lore raw
In reply to Axel Lin
Quoted 2 lines · Axel Lin

It is ok to request current limit with min_uA < chip->min_uA and max_uA > chip->max_uA.

Applied, thanks.