diff --git a/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi b/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi index 9a0940b64a1b..4f26951dae8a 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi @@ -254,8 +254,18 @@ tv_bit_mode = <1>; }; +&pwm_cd { + status = "disabled"; + pinctrl-names = "pwm_pins","gpio_periphs"; + pinctrl-0 = <&pwm_c_pins2 &pwm_d_pins1>; + pinctrl-1 = <&pwmcd_to_gpios>; +}; + &pwm_ef { - status = "okay"; + status = "disabled"; + pinctrl-names = "pwm_pins","gpio_periphs"; + pinctrl-0 = <&pwm_e_pins &pwm_f_pins1>; + pinctrl-1 = <&pwmef_to_gpios>; }; &pwm_AO_cd { @@ -478,4 +488,16 @@ function = "spdif_out"; }; }; + pwmcd_to_gpios:pwmcd_gpio { + mux { + groups = "GPIOX_5", "GPIOX_3"; + function = "gpio_periphs"; + }; + }; + pwmef_to_gpios:pwmef_gpio { + mux { + groups = "GPIOX_16", "GPIOX_7"; + function = "gpio_periphs"; + }; + }; }; /* end of pinctrl_periphs */ diff --git a/drivers/amlogic/pwm/pwm_meson.c b/drivers/amlogic/pwm/pwm_meson.c index 19747d8d2a5d..695f45df7294 100644 --- a/drivers/amlogic/pwm/pwm_meson.c +++ b/drivers/amlogic/pwm/pwm_meson.c @@ -61,6 +61,10 @@ #include #include +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) +#include +#endif + struct meson_pwm_channel { unsigned int hi; unsigned int lo; @@ -125,6 +129,9 @@ static int meson_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); struct device *dev = chip->dev; int err; +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + struct meson_pwm *meson = to_meson_pwm(chip); +#endif if (!channel) return -ENODEV; @@ -148,6 +155,13 @@ static int meson_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) chip->ops->get_state(chip, pwm, &channel->state); +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + meson->p_pinctrl = devm_pinctrl_get_select(dev, "pwm_pins"); + if (IS_ERR(meson->p_pinctrl)) { + meson->p_pinctrl = NULL; + dev_err(dev, "pwm pinmux : can't get pinctrl\n"); + } +#endif return 0; } @@ -155,6 +169,16 @@ static void meson_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) { struct meson_pwm_channel *channel = pwm_get_chip_data(pwm); +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + struct meson_pwm *meson = to_meson_pwm(chip); + struct device *dev = chip->dev; + + if (meson->p_pinctrl) + devm_pinctrl_put(meson->p_pinctrl); + meson->p_pinctrl = devm_pinctrl_get_select(dev, "gpio_periphs"); + devm_pinctrl_put(meson->p_pinctrl); + meson->p_pinctrl = NULL; +#endif if (channel) clk_disable_unprepare(channel->clk); } @@ -652,6 +676,9 @@ static int meson_pwm_probe(struct platform_device *pdev) meson->chip.npwm = 2; meson->inverter_mask = BIT(meson->chip.npwm) - 1; +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + meson->p_pinctrl = NULL; +#endif channels = devm_kcalloc(&pdev->dev, meson->chip.npwm, sizeof(*channels), GFP_KERNEL); if (!channels) diff --git a/include/linux/amlogic/pwm_meson.h b/include/linux/amlogic/pwm_meson.h index 3065323ebf91..09259e03f05c 100644 --- a/include/linux/amlogic/pwm_meson.h +++ b/include/linux/amlogic/pwm_meson.h @@ -124,6 +124,9 @@ struct meson_pwm { struct mutex lock; spinlock_t pwm_lock; unsigned int clk_mask; +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + struct pinctrl *p_pinctrl; +#endif }; /*the functions only use for meson pwm driver*/