aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pwm/pwm-imx.c
diff options
context:
space:
mode:
authorLukasz Majewski <l.majewski@majess.pl>2017-01-29 16:54:07 -0500
committerThierry Reding <thierry.reding@gmail.com>2017-01-30 03:12:39 -0500
commit0038922954236a6af424e2604ece88404dfbc41c (patch)
tree5bf1151ff4182748bad0cb8beda795c3904b94c6 /drivers/pwm/pwm-imx.c
parent9fb27fac39f47632aa32ffd787b4de1dbd0b8655 (diff)
pwm: imx: Add separate set of PWM ops for v1 and v2
This patch provides separate set of PWM operations utilized by i.MX's v1 and v2 of the PWM hardware. Signed-off-by: Lothar Waßmann <LW@KARO-electronics.de> Signed-off-by: Bhuvanchandra DV <bhuvanchandra.dv@toradex.com> Signed-off-by: Lukasz Majewski <l.majewski@majess.pl> Acked-by: Shawn Guo <shawn.guo@linaro.org> Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de> Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
Diffstat (limited to 'drivers/pwm/pwm-imx.c')
-rw-r--r--drivers/pwm/pwm-imx.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c
index bb64122a74be..c405cb777808 100644
--- a/drivers/pwm/pwm-imx.c
+++ b/drivers/pwm/pwm-imx.c
@@ -239,7 +239,14 @@ static void imx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
239 clk_disable_unprepare(imx->clk_per); 239 clk_disable_unprepare(imx->clk_per);
240} 240}
241 241
242static const struct pwm_ops imx_pwm_ops = { 242static const struct pwm_ops imx_pwm_ops_v1 = {
243 .enable = imx_pwm_enable,
244 .disable = imx_pwm_disable,
245 .config = imx_pwm_config,
246 .owner = THIS_MODULE,
247};
248
249static const struct pwm_ops imx_pwm_ops_v2 = {
243 .enable = imx_pwm_enable, 250 .enable = imx_pwm_enable,
244 .disable = imx_pwm_disable, 251 .disable = imx_pwm_disable,
245 .config = imx_pwm_config, 252 .config = imx_pwm_config,
@@ -250,16 +257,19 @@ struct imx_pwm_data {
250 int (*config)(struct pwm_chip *chip, 257 int (*config)(struct pwm_chip *chip,
251 struct pwm_device *pwm, int duty_ns, int period_ns); 258 struct pwm_device *pwm, int duty_ns, int period_ns);
252 void (*set_enable)(struct pwm_chip *chip, bool enable); 259 void (*set_enable)(struct pwm_chip *chip, bool enable);
260 const struct pwm_ops *ops;
253}; 261};
254 262
255static struct imx_pwm_data imx_pwm_data_v1 = { 263static struct imx_pwm_data imx_pwm_data_v1 = {
256 .config = imx_pwm_config_v1, 264 .config = imx_pwm_config_v1,
257 .set_enable = imx_pwm_set_enable_v1, 265 .set_enable = imx_pwm_set_enable_v1,
266 .ops = &imx_pwm_ops_v1,
258}; 267};
259 268
260static struct imx_pwm_data imx_pwm_data_v2 = { 269static struct imx_pwm_data imx_pwm_data_v2 = {
261 .config = imx_pwm_config_v2, 270 .config = imx_pwm_config_v2,
262 .set_enable = imx_pwm_set_enable_v2, 271 .set_enable = imx_pwm_set_enable_v2,
272 .ops = &imx_pwm_ops_v2,
263}; 273};
264 274
265static const struct of_device_id imx_pwm_dt_ids[] = { 275static const struct of_device_id imx_pwm_dt_ids[] = {
@@ -281,6 +291,8 @@ static int imx_pwm_probe(struct platform_device *pdev)
281 if (!of_id) 291 if (!of_id)
282 return -ENODEV; 292 return -ENODEV;
283 293
294 data = of_id->data;
295
284 imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL); 296 imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL);
285 if (imx == NULL) 297 if (imx == NULL)
286 return -ENOMEM; 298 return -ENOMEM;
@@ -292,7 +304,7 @@ static int imx_pwm_probe(struct platform_device *pdev)
292 return PTR_ERR(imx->clk_per); 304 return PTR_ERR(imx->clk_per);
293 } 305 }
294 306
295 imx->chip.ops = &imx_pwm_ops; 307 imx->chip.ops = data->ops;
296 imx->chip.dev = &pdev->dev; 308 imx->chip.dev = &pdev->dev;
297 imx->chip.base = -1; 309 imx->chip.base = -1;
298 imx->chip.npwm = 1; 310 imx->chip.npwm = 1;
@@ -303,7 +315,6 @@ static int imx_pwm_probe(struct platform_device *pdev)
303 if (IS_ERR(imx->mmio_base)) 315 if (IS_ERR(imx->mmio_base))
304 return PTR_ERR(imx->mmio_base); 316 return PTR_ERR(imx->mmio_base);
305 317
306 data = of_id->data;
307 imx->config = data->config; 318 imx->config = data->config;
308 imx->set_enable = data->set_enable; 319 imx->set_enable = data->set_enable;
309 320