| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * NXP LPC18xx State Configurable Timer - Pulse Width Modulator driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (c) 2015 Ariel D'Alessandro <ariel@vanguardiasur.com> |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 8 | | - * the Free Software Foundation; either version 2 of the License. |
|---|
| 9 | 6 | * |
|---|
| 10 | 7 | * Notes |
|---|
| 11 | 8 | * ===== |
|---|
| .. | .. |
|---|
| 296 | 293 | |
|---|
| 297 | 294 | set_bit(event, &lpc18xx_pwm->event_map); |
|---|
| 298 | 295 | lpc18xx_data->duty_event = event; |
|---|
| 299 | | - lpc18xx_pwm_config_duty(chip, pwm, pwm_get_duty_cycle(pwm)); |
|---|
| 300 | 296 | |
|---|
| 301 | 297 | return 0; |
|---|
| 302 | 298 | } |
|---|
| .. | .. |
|---|
| 306 | 302 | struct lpc18xx_pwm_chip *lpc18xx_pwm = to_lpc18xx_pwm_chip(chip); |
|---|
| 307 | 303 | struct lpc18xx_pwm_data *lpc18xx_data = pwm_get_chip_data(pwm); |
|---|
| 308 | 304 | |
|---|
| 309 | | - pwm_disable(pwm); |
|---|
| 310 | | - pwm_set_duty_cycle(pwm, 0); |
|---|
| 311 | 305 | clear_bit(lpc18xx_data->duty_event, &lpc18xx_pwm->event_map); |
|---|
| 312 | 306 | } |
|---|
| 313 | 307 | |
|---|
| .. | .. |
|---|
| 331 | 325 | { |
|---|
| 332 | 326 | struct lpc18xx_pwm_chip *lpc18xx_pwm; |
|---|
| 333 | 327 | struct pwm_device *pwm; |
|---|
| 334 | | - struct resource *res; |
|---|
| 335 | 328 | int ret, i; |
|---|
| 336 | 329 | u64 val; |
|---|
| 337 | 330 | |
|---|
| .. | .. |
|---|
| 342 | 335 | |
|---|
| 343 | 336 | lpc18xx_pwm->dev = &pdev->dev; |
|---|
| 344 | 337 | |
|---|
| 345 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 346 | | - lpc18xx_pwm->base = devm_ioremap_resource(&pdev->dev, res); |
|---|
| 338 | + lpc18xx_pwm->base = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 347 | 339 | if (IS_ERR(lpc18xx_pwm->base)) |
|---|
| 348 | 340 | return PTR_ERR(lpc18xx_pwm->base); |
|---|
| 349 | 341 | |
|---|
| .. | .. |
|---|
| 406 | 398 | lpc18xx_pwm_writel(lpc18xx_pwm, LPC18XX_PWM_LIMIT, |
|---|
| 407 | 399 | BIT(lpc18xx_pwm->period_event)); |
|---|
| 408 | 400 | |
|---|
| 409 | | - ret = pwmchip_add(&lpc18xx_pwm->chip); |
|---|
| 410 | | - if (ret < 0) { |
|---|
| 411 | | - dev_err(&pdev->dev, "pwmchip_add failed: %d\n", ret); |
|---|
| 412 | | - goto disable_pwmclk; |
|---|
| 413 | | - } |
|---|
| 414 | | - |
|---|
| 415 | 401 | for (i = 0; i < lpc18xx_pwm->chip.npwm; i++) { |
|---|
| 416 | 402 | struct lpc18xx_pwm_data *data; |
|---|
| 417 | 403 | |
|---|
| .. | .. |
|---|
| 421 | 407 | GFP_KERNEL); |
|---|
| 422 | 408 | if (!data) { |
|---|
| 423 | 409 | ret = -ENOMEM; |
|---|
| 424 | | - goto remove_pwmchip; |
|---|
| 410 | + goto disable_pwmclk; |
|---|
| 425 | 411 | } |
|---|
| 426 | 412 | |
|---|
| 427 | 413 | pwm_set_chip_data(pwm, data); |
|---|
| 428 | 414 | } |
|---|
| 429 | | - |
|---|
| 430 | | - platform_set_drvdata(pdev, lpc18xx_pwm); |
|---|
| 431 | 415 | |
|---|
| 432 | 416 | val = lpc18xx_pwm_readl(lpc18xx_pwm, LPC18XX_PWM_CTRL); |
|---|
| 433 | 417 | val &= ~LPC18XX_PWM_BIDIR; |
|---|
| .. | .. |
|---|
| 436 | 420 | val |= LPC18XX_PWM_PRE(0); |
|---|
| 437 | 421 | lpc18xx_pwm_writel(lpc18xx_pwm, LPC18XX_PWM_CTRL, val); |
|---|
| 438 | 422 | |
|---|
| 423 | + ret = pwmchip_add(&lpc18xx_pwm->chip); |
|---|
| 424 | + if (ret < 0) { |
|---|
| 425 | + dev_err(&pdev->dev, "pwmchip_add failed: %d\n", ret); |
|---|
| 426 | + goto disable_pwmclk; |
|---|
| 427 | + } |
|---|
| 428 | + |
|---|
| 429 | + platform_set_drvdata(pdev, lpc18xx_pwm); |
|---|
| 430 | + |
|---|
| 439 | 431 | return 0; |
|---|
| 440 | 432 | |
|---|
| 441 | | -remove_pwmchip: |
|---|
| 442 | | - pwmchip_remove(&lpc18xx_pwm->chip); |
|---|
| 443 | 433 | disable_pwmclk: |
|---|
| 444 | 434 | clk_disable_unprepare(lpc18xx_pwm->pwm_clk); |
|---|
| 445 | 435 | return ret; |
|---|