diff options
Diffstat (limited to 'drivers/pwm/pwm-imx.c')
-rw-r--r-- | drivers/pwm/pwm-imx.c | 17 |
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 | ||
242 | static const struct pwm_ops imx_pwm_ops = { | 242 | static 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 | |||
249 | static 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 | ||
255 | static struct imx_pwm_data imx_pwm_data_v1 = { | 263 | static 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 | ||
260 | static struct imx_pwm_data imx_pwm_data_v2 = { | 269 | static 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 | ||
265 | static const struct of_device_id imx_pwm_dt_ids[] = { | 275 | static 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 | ||