pwm: jz4740: Allow selection of PWM channels 0 and 1
authorPaul Cercueil <paul@crapouillou.net>
Mon, 23 Mar 2020 14:24:21 +0000 (15:24 +0100)
committerThierry Reding <thierry.reding@gmail.com>
Mon, 30 Mar 2020 16:03:10 +0000 (18:03 +0200)
The TCU channels 0 and 1 were previously reserved for system tasks, and
thus unavailable for PWM.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Tested-by: Mathieu Malaterre <malat@debian.org>
Tested-by: Artur Rojek <contact@artur-rojek.eu>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/pwm-jz4740.c

index 549e6c750bacc65bb25e4ce731b6d67b429f1986..3cd5c054ad9aff82c7f8b7465419d9682fbce753 100644 (file)
@@ -33,6 +33,19 @@ static inline struct jz4740_pwm_chip *to_jz4740(struct pwm_chip *chip)
        return container_of(chip, struct jz4740_pwm_chip, chip);
 }
 
+static bool jz4740_pwm_can_use_chn(struct jz4740_pwm_chip *jz,
+                                  unsigned int channel)
+{
+       /* Enable all TCU channels for PWM use by default except channels 0/1 */
+       u32 pwm_channels_mask = GENMASK(NUM_PWM - 1, 2);
+
+       device_property_read_u32(jz->chip.dev->parent,
+                                "ingenic,pwm-channels-mask",
+                                &pwm_channels_mask);
+
+       return !!(pwm_channels_mask & BIT(channel));
+}
+
 static int jz4740_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
 {
        struct jz4740_pwm_chip *jz = to_jz4740(chip);
@@ -40,11 +53,7 @@ static int jz4740_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
        char name[16];
        int err;
 
-       /*
-        * Timers 0 and 1 are used for system tasks, so they are unavailable
-        * for use as PWMs.
-        */
-       if (pwm->hwpwm < 2)
+       if (!jz4740_pwm_can_use_chn(jz, pwm->hwpwm))
                return -EBUSY;
 
        snprintf(name, sizeof(name), "timer%u", pwm->hwpwm);