pwm: sifive: Prepare removing pwm_chip from driver data
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 14 Feb 2024 09:32:30 +0000 (10:32 +0100)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 19 Feb 2024 10:04:15 +0000 (11:04 +0100)
This prepares the driver for further changes that will drop struct
pwm_chip chip from struct pwm_sifive_ddata. Use the pwm_chip as driver
data instead of the pwm_sifive_ddata to get access to the pwm_chip in
pwm_sifive_remove() without using ddata->chip. In the clock rate
notifier it's not possible to get the pwm_chip without adding a pointer
to this to struct pwm_sifive_ddata. Instead of that add a parent device
pointer which is all that is needed there.

Link: https://lore.kernel.org/r/b7b7985f4dc746f6a36c5048d428c4ed0a2d42dc.1707900770.git.u.kleine-koenig@pengutronix.de
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
drivers/pwm/pwm-sifive.c

index cf00f902fc30a28ced7752ac8a7fdee9e71a0de2..ed40a687f9094c183544771defe94c5fd800a7cb 100644 (file)
@@ -42,6 +42,7 @@
 
 struct pwm_sifive_ddata {
        struct pwm_chip chip;
+       struct device *parent;
        struct mutex lock; /* lock to protect user_count and approx_period */
        struct notifier_block notifier;
        struct clk *clk;
@@ -102,7 +103,7 @@ static void pwm_sifive_update_clock(struct pwm_sifive_ddata *ddata,
        /* As scale <= 15 the shift operation cannot overflow. */
        num = (unsigned long long)NSEC_PER_SEC << (PWM_SIFIVE_CMPWIDTH + scale);
        ddata->real_period = div64_ul(num, rate);
-       dev_dbg(ddata->chip.dev,
+       dev_dbg(ddata->parent,
                "New real_period = %u ns\n", ddata->real_period);
 }
 
@@ -236,7 +237,7 @@ static int pwm_sifive_probe(struct platform_device *pdev)
 
        mutex_init(&ddata->lock);
        chip = &ddata->chip;
-       chip->dev = dev;
+       chip->dev = ddata->parent = dev;
        chip->ops = &pwm_sifive_ops;
        chip->npwm = 4;
 
@@ -296,7 +297,7 @@ static int pwm_sifive_probe(struct platform_device *pdev)
                goto unregister_clk;
        }
 
-       platform_set_drvdata(pdev, ddata);
+       platform_set_drvdata(pdev, chip);
        dev_dbg(dev, "SiFive PWM chip registered %d PWMs\n", chip->npwm);
 
        return 0;
@@ -314,15 +315,16 @@ disable_clk:
 
 static void pwm_sifive_remove(struct platform_device *dev)
 {
-       struct pwm_sifive_ddata *ddata = platform_get_drvdata(dev);
+       struct pwm_chip *chip = platform_get_drvdata(dev);
+       struct pwm_sifive_ddata *ddata = pwm_sifive_chip_to_ddata(chip);
        struct pwm_device *pwm;
        int ch;
 
-       pwmchip_remove(&ddata->chip);
+       pwmchip_remove(chip);
        clk_notifier_unregister(ddata->clk, &ddata->notifier);
 
-       for (ch = 0; ch < ddata->chip.npwm; ch++) {
-               pwm = &ddata->chip.pwms[ch];
+       for (ch = 0; ch < chip->npwm; ch++) {
+               pwm = &chip->pwms[ch];
                if (pwm->state.enabled)
                        clk_disable(ddata->clk);
        }