]> Git Repo - J-linux.git/blobdiff - drivers/pwm/pwm-omap-dmtimer.c
Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[J-linux.git] / drivers / pwm / pwm-omap-dmtimer.c
index 496bd73d29fe1dc154a4d3c401e3a059eae33ec9..cd51c4a938f592f1b6321867e0015b8fe3319057 100644 (file)
 /**
  * struct pwm_omap_dmtimer_chip - Structure representing a pwm chip
  *                               corresponding to omap dmtimer.
- * @chip:              PWM chip structure representing PWM controller
  * @dm_timer:          Pointer to omap dm timer.
  * @pdata:             Pointer to omap dm timer ops.
  * @dm_timer_pdev:     Pointer to omap dm timer platform device
  */
 struct pwm_omap_dmtimer_chip {
-       struct pwm_chip chip;
        /* Mutex to protect pwm apply state */
        struct omap_dm_timer *dm_timer;
        const struct omap_dm_timer_ops *pdata;
@@ -69,7 +67,7 @@ struct pwm_omap_dmtimer_chip {
 static inline struct pwm_omap_dmtimer_chip *
 to_pwm_omap_dmtimer_chip(struct pwm_chip *chip)
 {
-       return container_of(chip, struct pwm_omap_dmtimer_chip, chip);
+       return pwmchip_get_drvdata(chip);
 }
 
 /**
@@ -155,7 +153,7 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
        unsigned long clk_rate;
        struct clk *fclk;
 
-       dev_dbg(chip->dev, "requested duty cycle: %d ns, period: %d ns\n",
+       dev_dbg(pwmchip_parent(chip), "requested duty cycle: %d ns, period: %d ns\n",
                duty_ns, period_ns);
 
        if (duty_ns == pwm_get_duty_cycle(pwm) &&
@@ -164,17 +162,17 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
 
        fclk = omap->pdata->get_fclk(omap->dm_timer);
        if (!fclk) {
-               dev_err(chip->dev, "invalid pmtimer fclk\n");
+               dev_err(pwmchip_parent(chip), "invalid pmtimer fclk\n");
                return -EINVAL;
        }
 
        clk_rate = clk_get_rate(fclk);
        if (!clk_rate) {
-               dev_err(chip->dev, "invalid pmtimer fclk rate\n");
+               dev_err(pwmchip_parent(chip), "invalid pmtimer fclk rate\n");
                return -EINVAL;
        }
 
-       dev_dbg(chip->dev, "clk rate: %luHz\n", clk_rate);
+       dev_dbg(pwmchip_parent(chip), "clk rate: %luHz\n", clk_rate);
 
        /*
         * Calculate the appropriate load and match values based on the
@@ -196,27 +194,27 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
        duty_cycles = pwm_omap_dmtimer_get_clock_cycles(clk_rate, duty_ns);
 
        if (period_cycles < 2) {
-               dev_info(chip->dev,
+               dev_info(pwmchip_parent(chip),
                         "period %d ns too short for clock rate %lu Hz\n",
                         period_ns, clk_rate);
                return -EINVAL;
        }
 
        if (duty_cycles < 1) {
-               dev_dbg(chip->dev,
+               dev_dbg(pwmchip_parent(chip),
                        "duty cycle %d ns is too short for clock rate %lu Hz\n",
                        duty_ns, clk_rate);
-               dev_dbg(chip->dev, "using minimum of 1 clock cycle\n");
+               dev_dbg(pwmchip_parent(chip), "using minimum of 1 clock cycle\n");
                duty_cycles = 1;
        } else if (duty_cycles >= period_cycles) {
-               dev_dbg(chip->dev,
+               dev_dbg(pwmchip_parent(chip),
                        "duty cycle %d ns is too long for period %d ns at clock rate %lu Hz\n",
                        duty_ns, period_ns, clk_rate);
-               dev_dbg(chip->dev, "using maximum of 1 clock cycle less than period\n");
+               dev_dbg(pwmchip_parent(chip), "using maximum of 1 clock cycle less than period\n");
                duty_cycles = period_cycles - 1;
        }
 
-       dev_dbg(chip->dev, "effective duty cycle: %lld ns, period: %lld ns\n",
+       dev_dbg(pwmchip_parent(chip), "effective duty cycle: %lld ns, period: %lld ns\n",
                DIV_ROUND_CLOSEST_ULL((u64)NSEC_PER_SEC * duty_cycles,
                                      clk_rate),
                DIV_ROUND_CLOSEST_ULL((u64)NSEC_PER_SEC * period_cycles,
@@ -228,7 +226,7 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
        omap->pdata->set_load(omap->dm_timer, load_value);
        omap->pdata->set_match(omap->dm_timer, true, match_value);
 
-       dev_dbg(chip->dev, "load value: %#08x (%d), match value: %#08x (%d)\n",
+       dev_dbg(pwmchip_parent(chip), "load value: %#08x (%d), match value: %#08x (%d)\n",
                load_value, load_value, match_value, match_value);
 
        return 0;
@@ -311,6 +309,7 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev)
        struct dmtimer_platform_data *timer_pdata;
        const struct omap_dm_timer_ops *pdata;
        struct platform_device *timer_pdev;
+       struct pwm_chip *chip;
        struct pwm_omap_dmtimer_chip *omap;
        struct omap_dm_timer *dm_timer;
        struct device_node *timer;
@@ -368,11 +367,12 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev)
                goto err_request_timer;
        }
 
-       omap = devm_kzalloc(&pdev->dev, sizeof(*omap), GFP_KERNEL);
-       if (!omap) {
-               ret = -ENOMEM;
+       chip = devm_pwmchip_alloc(&pdev->dev, 1, sizeof(*omap));
+       if (IS_ERR(chip)) {
+               ret = PTR_ERR(chip);
                goto err_alloc_omap;
        }
+       omap = to_pwm_omap_dmtimer_chip(chip);
 
        omap->pdata = pdata;
        omap->dm_timer = dm_timer;
@@ -392,11 +392,9 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev)
        if (!of_property_read_u32(pdev->dev.of_node, "ti,clock-source", &v))
                omap->pdata->set_source(omap->dm_timer, v);
 
-       omap->chip.dev = &pdev->dev;
-       omap->chip.ops = &pwm_omap_dmtimer_ops;
-       omap->chip.npwm = 1;
+       chip->ops = &pwm_omap_dmtimer_ops;
 
-       ret = pwmchip_add(&omap->chip);
+       ret = pwmchip_add(chip);
        if (ret < 0) {
                dev_err(&pdev->dev, "failed to register PWM\n");
                goto err_pwmchip_add;
@@ -404,7 +402,7 @@ static int pwm_omap_dmtimer_probe(struct platform_device *pdev)
 
        of_node_put(timer);
 
-       platform_set_drvdata(pdev, omap);
+       platform_set_drvdata(pdev, chip);
 
        return 0;
 
@@ -432,9 +430,10 @@ err_find_timer_pdev:
 
 static void pwm_omap_dmtimer_remove(struct platform_device *pdev)
 {
-       struct pwm_omap_dmtimer_chip *omap = platform_get_drvdata(pdev);
+       struct pwm_chip *chip = platform_get_drvdata(pdev);
+       struct pwm_omap_dmtimer_chip *omap = to_pwm_omap_dmtimer_chip(chip);
 
-       pwmchip_remove(&omap->chip);
+       pwmchip_remove(chip);
 
        if (pm_runtime_active(&omap->dm_timer_pdev->dev))
                omap->pdata->stop(omap->dm_timer);
This page took 0.033239 seconds and 4 git commands to generate.