Skip to contentSkip to conversation

pwm: ab8500: Fix wrong value shift for disable/enable pwm

PATCH Superseded Axel Lin 4 participants 6 messages Dec 15, 2013 – Apr 9, 2014 PWM

lore
Share & tools
lore

Axel Lin

author
#0 lore raw

PATCH 1/1 pwm: ab8500: Fix wrong value shift for disable/enable pwm

Current code only works when pdev->id is 1. Fix it by passing correct bitvalues argument to abx500_mask_and_set_register_interruptible.

Having defines for DISABLE_PWM/ENABLE_PWM does not make the code better in readability because the bitvalues depends on pdev->id. Thus drop defines for DISABLE_PWM/ENABLE_PWM.

This patch also removes a unnecessary return in ab8500_pwm_disable.

---
 drivers/pwm/pwm-ab8500.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/pwm/pwm-ab8500.c +2 -7
index 1d07a6f..d51dc15 100644
@@ -20,10 +20,6 @@
 #define AB8500_PWM_OUT_CTRL2_REG	0x61
 #define AB8500_PWM_OUT_CTRL7_REG	0x66
 
-/* backlight driver constants */
-#define ENABLE_PWM			1
-#define DISABLE_PWM			0
-
 struct ab8500_pwm_chip {
 	struct pwm_chip chip;
 };
@@ -64,7 +60,7 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
 
 	ret = abx500_mask_and_set_register_interruptible(chip->dev,
 				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-				1 << (chip->base - 1), ENABLE_PWM);
+				1 << (chip->base - 1), 1 << (chip->base - 1));
 	if (ret < 0)
 		dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",
 							pwm->label, ret);
@@ -77,11 +73,10 @@ static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 
 	ret = abx500_mask_and_set_register_interruptible(chip->dev,
 				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-				1 << (chip->base - 1), DISABLE_PWM);
+				1 << (chip->base - 1), 0);
 	if (ret < 0)
 		dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
 							pwm->label, ret);
-	return;
 }
 
 static const struct pwm_ops ab8500_pwm_ops = {
Signature · 1 line
1.8.1.2
author
#1 lore raw

2013/12/15 Axel Lin <[email protected]>:

Quoted 8 lines

Current code only works when pdev->id is 1. Fix it by passing correct bitvalues argument to abx500_mask_and_set_register_interruptible.

Having defines for DISABLE_PWM/ENABLE_PWM does not make the code better in readability because the bitvalues depends on pdev->id. Thus drop defines for DISABLE_PWM/ENABLE_PWM.

This patch also removes a unnecessary return in ab8500_pwm_disable.

Hello Linus,
I don't have the hardware to test and Arun's email bounce back. So I'd appreciate if you can review and test this patch.

Thanks,
Axel

#2 lore raw
In reply to Axel Lin

On Sun, Dec 15, 2013 at 11:32:19AM +0800, Axel Lin wrote:
[...]

s/pwm/PWM/ in the subject, please.

[...]

drivers/pwm/pwm-ab8500.c static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) · line 63

Quoted 6 lines
drivers/pwm/pwm-ab8500.c +1 -1
@@ -64,7 +60,7 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
 
 	ret = abx500_mask_and_set_register_interruptible(chip->dev,
 				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-				1 << (chip->base - 1), ENABLE_PWM);
+				1 << (chip->base - 1), 1 << (chip->base - 1));

I think we really need to find some other way to do this. At some point I imagine board will move to DT, at which point we can no longer rely on chip->base being set to a meaningful value.

Thierry

Acked-by on v1 1/1
#4 lore raw
In reply to Axel Lin
Quoted 41 lines · Axel Lin

Current code only works when pdev->id is 1. Fix it by passing correct bitvalues argument to abx500_mask_and_set_register_interruptible.

Having defines for DISABLE_PWM/ENABLE_PWM does not make the code better in readability because the bitvalues depends on pdev->id. Thus drop defines for DISABLE_PWM/ENABLE_PWM.

This patch also removes a unnecessary return in ab8500_pwm_disable.

---
 drivers/pwm/pwm-ab8500.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/pwm/pwm-ab8500.c +1 -5
index 1d07a6f..d51dc15 100644
@@ -20,10 +20,6 @@
 #define AB8500_PWM_OUT_CTRL2_REG       0x61
 #define AB8500_PWM_OUT_CTRL7_REG       0x66
 
-/* backlight driver constants */
-#define ENABLE_PWM                     1
-#define DISABLE_PWM                    0
-
 struct ab8500_pwm_chip {
        struct pwm_chip chip;
 };
@@ -64,7 +60,7 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
 
        ret = abx500_mask_and_set_register_interruptible(chip->dev,
                                AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-                               1 << (chip->base - 1), ENABLE_PWM);
+                               1 << (chip->base - 1), 1 << (chip->base - 1));
        if (ret < 0)
                dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",
                                                        pwm->label, ret);
@@ -77,11 +73,10 @@ static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 
        ret = abx500_mask_and_set_register_interruptible(chip->dev,

drivers/pwm/pwm-ab8500.c static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) · line 82

Quoted 10 lines
drivers/pwm/pwm-ab8500.c +1 -2
                                AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-                               1 << (chip->base - 1), DISABLE_PWM);
+                               1 << (chip->base - 1), 0);
        if (ret < 0)
                dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
                                                        pwm->label, ret);
-       return;
 }
 
 static const struct pwm_ops ab8500_pwm_ops = {

Quoting verbatim som my colleagues can see it.

This patch makes a lot of sense after inspection, so

But allow Philippe & Alexandre (now added to To:)
to have a look at it too.

Yours,
Linus Walleij

Acked-by Linus Walleij
#5 lore raw

Hi,
That is fine for me.

Best regards and happy new year
Alexandre BOURDIOL

-----Original Message-----
From: Linus Walleij [mailto:[email protected]]
Sent: vendredi 20 décembre 2013 18:10
To: Axel Lin; Philippe BEGNIC ST; Alexandre BOURDIOL
Cc: Thierry Reding; [email protected]
Subject: Re: [PATCH] pwm: ab8500: Fix wrong value shift for disable/enable pwm

Quoted 45 lines · Axel Lin

Current code only works when pdev->id is 1. Fix it by passing correct bitvalues argument to abx500_mask_and_set_register_interruptible.

Having defines for DISABLE_PWM/ENABLE_PWM does not make the code better in readability because the bitvalues depends on pdev->id. Thus drop defines for DISABLE_PWM/ENABLE_PWM.

This patch also removes a unnecessary return in ab8500_pwm_disable.

---
 drivers/pwm/pwm-ab8500.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/pwm/pwm-ab8500.c index renamed from drivers/pwm/pwm-ab8500.c +0 -0

1d07a6f..d51dc15 100644

drivers/pwm/pwm-ab8500.c +2 -5
@@ -20,10 +20,6 @@
 #define AB8500_PWM_OUT_CTRL2_REG       0x61
 #define AB8500_PWM_OUT_CTRL7_REG       0x66
 
-/* backlight driver constants */
-#define ENABLE_PWM                     1
-#define DISABLE_PWM                    0
-
 struct ab8500_pwm_chip {
        struct pwm_chip chip;
 };
@@ -64,7 +60,7 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, 
 struct pwm_device *pwm)
 
        ret = abx500_mask_and_set_register_interruptible(chip->dev,
                                AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-                               1 << (chip->base - 1), ENABLE_PWM);
+                               1 << (chip->base - 1), 1 << 
+ (chip->base - 1));
        if (ret < 0)
                dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",
                                                        pwm->label, 

ret); @@ -77,11 +73,10 @@ static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)

        ret = abx500_mask_and_set_register_interruptible(chip->dev,
                                AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,

drivers/pwm/pwm-ab8500.c static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) · line 82

Quoted 9 lines
drivers/pwm/pwm-ab8500.c +1 -2
-                               1 << (chip->base - 1), DISABLE_PWM);
+                               1 << (chip->base - 1), 0);
        if (ret < 0)
                dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
                                                        pwm->label, ret);
-       return;
 }
 
 static const struct pwm_ops ab8500_pwm_ops = {

Quoting verbatim som my colleagues can see it.

This patch makes a lot of sense after inspection, so

But allow Philippe & Alexandre (now added to To:) to have a look at it too.

Yours,
Linus Walleij

author
#3 lore raw
In reply to Thierry Reding

2013-12-17 17:30 GMT+08:00 Thierry Reding <[email protected]>:

Quoted 8 lines · Axel Lin

[...]

s/pwm/PWM/ in the subject, please.

[...]

Quoted 2 lines
(quoted diff) +0 -0
@@ -64,7 +60,7 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
 
Quoted 8 lines

drivers/pwm/pwm-ab8500.c static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) · line 63

Quoted 4 lines
drivers/pwm/pwm-ab8500.c +1 -1
      ret = abx500_mask_and_set_register_interruptible(chip->dev,
                              AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-                             1 << (chip->base - 1), ENABLE_PWM);
+                             1 << (chip->base - 1), 1 << (chip->base - 1));

I think we really need to find some other way to do this. At some point I imagine board will move to DT, at which point we can no longer rely on chip->base being set to a meaningful value.

Hi Thierry,

(I almost forgot this thread...)
I just check the code in drivers/mfd/ab8500-core.c.

In ab8500_devs[]:

        {
                .name = "ab8500-pwm",
                .of_compatible = "stericsson,ab8500-pwm",
                .id = 1,
        },
        {
                .name = "ab8500-pwm",
                .of_compatible = "stericsson,ab8500-pwm",
                .id = 2,
        },
        {
                .name = "ab8500-pwm",
                .of_compatible = "stericsson,ab8500-pwm",
                .id = 3,
        },

And in ab8500_pwm_probe():

        ab8500->chip.base = pdev->id;

My understanding is the chip->base setting is the same for DT and non-DT case.

(I'm not sure if you still have the patch, so I'm re-sending the patch now.)

Regards,
Axel