diff options
Diffstat (limited to 'drivers/pwm/pwm-meson.c')
| -rw-r--r-- | drivers/pwm/pwm-meson.c | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c index b2f97dfb01bb..98e6c1533312 100644 --- a/drivers/pwm/pwm-meson.c +++ b/drivers/pwm/pwm-meson.c @@ -460,6 +460,37 @@ static int meson_pwm_init_channels_meson8b_v2(struct pwm_chip *chip)  	return meson_pwm_init_clocks_meson8b(chip, mux_parent_data);  } +static void meson_pwm_s4_put_clk(void *data) +{ +	struct clk *clk = data; + +	clk_put(clk); +} + +static int meson_pwm_init_channels_s4(struct pwm_chip *chip) +{ +	struct device *dev = pwmchip_parent(chip); +	struct device_node *np = dev->of_node; +	struct meson_pwm *meson = to_meson_pwm(chip); +	int i, ret; + +	for (i = 0; i < MESON_NUM_PWMS; i++) { +		meson->channels[i].clk = of_clk_get(np, i); +		if (IS_ERR(meson->channels[i].clk)) +			return dev_err_probe(dev, +					     PTR_ERR(meson->channels[i].clk), +					     "Failed to get clk\n"); + +		ret = devm_add_action_or_reset(dev, meson_pwm_s4_put_clk, +					       meson->channels[i].clk); +		if (ret) +			return dev_err_probe(dev, ret, +					     "Failed to add clk_put action\n"); +	} + +	return 0; +} +  static const struct meson_pwm_data pwm_meson8b_data = {  	.parent_names = { "xtal", NULL, "fclk_div4", "fclk_div3" },  	.channels_init = meson_pwm_init_channels_meson8b_legacy, @@ -498,6 +529,10 @@ static const struct meson_pwm_data pwm_meson8_v2_data = {  	.channels_init = meson_pwm_init_channels_meson8b_v2,  }; +static const struct meson_pwm_data pwm_s4_data = { +	.channels_init = meson_pwm_init_channels_s4, +}; +  static const struct of_device_id meson_pwm_matches[] = {  	{  		.compatible = "amlogic,meson8-pwm-v2", @@ -536,6 +571,10 @@ static const struct of_device_id meson_pwm_matches[] = {  		.compatible = "amlogic,meson-g12a-ao-pwm-cd",  		.data = &pwm_g12a_ao_cd_data  	}, +	{ +		.compatible = "amlogic,meson-s4-pwm", +		.data = &pwm_s4_data +	},  	{},  };  MODULE_DEVICE_TABLE(of, meson_pwm_matches); |