Skip to content

Commit

Permalink
pwm: jz4740: Let the pinctrl driver configure the pins
Browse files Browse the repository at this point in the history
Now that the JZ4740 and similar SoCs have a pinctrl driver, we rely on
the pins being properly configured before the driver probes.

One inherent problem of this new approach is that the pinctrl framework
does not allow us to configure each pin on demand, when the various PWM
channels are requested or released. For instance, the PWM channels can
be configured from sysfs, which would require all PWM pins to be configured
properly beforehand for the PWM function, eventually causing conflicts
with other platform or board drivers.

The proper solution here would be to modify the pwm-jz4740 driver to
handle only one PWM channel, and create an instance of this driver
for each one of the 8 PWM channels. Then, it could use the pinctrl
framework to dynamically configure the PWM pin it controls.

Until this can be done, the only jz4740 board supported upstream
(Qi lb60) can configure all of its connected PWM pins in PWM function
mode, since those are not used by other drivers nor by GPIOs on the
board.

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Acked-by: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
pcercuei authored and linusw committed May 22, 2017
1 parent fa5ed6b commit 47096d7
Showing 1 changed file with 0 additions and 29 deletions.
29 changes: 0 additions & 29 deletions drivers/pwm/pwm-jz4740.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,10 @@
#include <linux/platform_device.h>
#include <linux/pwm.h>

#include <asm/mach-jz4740/gpio.h>
#include <asm/mach-jz4740/timer.h>

#define NUM_PWM 8

static const unsigned int jz4740_pwm_gpio_list[NUM_PWM] = {
JZ_GPIO_PWM0,
JZ_GPIO_PWM1,
JZ_GPIO_PWM2,
JZ_GPIO_PWM3,
JZ_GPIO_PWM4,
JZ_GPIO_PWM5,
JZ_GPIO_PWM6,
JZ_GPIO_PWM7,
};

struct jz4740_pwm_chip {
struct pwm_chip chip;
struct clk *clk;
Expand All @@ -49,39 +37,22 @@ static inline struct jz4740_pwm_chip *to_jz4740(struct pwm_chip *chip)

static int jz4740_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
{
unsigned int gpio = jz4740_pwm_gpio_list[pwm->hwpwm];
int ret;

/*
* Timers 0 and 1 are used for system tasks, so they are unavailable
* for use as PWMs.
*/
if (pwm->hwpwm < 2)
return -EBUSY;

ret = gpio_request(gpio, pwm->label);
if (ret) {
dev_err(chip->dev, "Failed to request GPIO#%u for PWM: %d\n",
gpio, ret);
return ret;
}

jz_gpio_set_function(gpio, JZ_GPIO_FUNC_PWM);

jz4740_timer_start(pwm->hwpwm);

return 0;
}

static void jz4740_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
{
unsigned int gpio = jz4740_pwm_gpio_list[pwm->hwpwm];

jz4740_timer_set_ctrl(pwm->hwpwm, 0);

jz_gpio_set_function(gpio, JZ_GPIO_FUNC_NONE);
gpio_free(gpio);

jz4740_timer_stop(pwm->hwpwm);
}

Expand Down

0 comments on commit 47096d7

Please sign in to comment.