pwm: dwc: Prepare removing pwm_chip from driver data
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 14 Feb 2024 09:31:19 +0000 (10:31 +0100)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 19 Feb 2024 10:02:57 +0000 (11:02 +0100)
This prepares the driver for further changes that will drop struct
pwm_chip chip from struct dwc_pwm. Use the pwm_chip as driver
data and return value of dwc_pwm_alloc() instead of the dwc_pwm to get
access to the pwm_chip in dwc_pwm_probe() and dwc_pwm_suspend() without
using dwc->chip.

Thanks to Raag Jadav for providing a hunk of this patch that Uwe missed
during creation of this patch.

Link: https://lore.kernel.org/r/008ce5ab84b8e3baa3e81ab6d36dbb0e4be5c319.1707900770.git.u.kleine-koenig@pengutronix.de
Link: https://lore.kernel.org/r/20240219033835.11369-2-raag.jadav@intel.com
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
drivers/pwm/pwm-dwc-core.c
drivers/pwm/pwm-dwc.c
drivers/pwm/pwm-dwc.h

index ea63dd741f5cc6020d0b8cba2ac2b6db51f57236..ac7a0b2cb8b926688fd71219eb39dbae06f35ab2 100644 (file)
@@ -159,21 +159,23 @@ static const struct pwm_ops dwc_pwm_ops = {
        .get_state = dwc_pwm_get_state,
 };
 
-struct dwc_pwm *dwc_pwm_alloc(struct device *dev)
+struct pwm_chip *dwc_pwm_alloc(struct device *dev)
 {
+       struct pwm_chip *chip;
        struct dwc_pwm *dwc;
 
        dwc = devm_kzalloc(dev, sizeof(*dwc), GFP_KERNEL);
        if (!dwc)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
+       chip = &dwc->chip;
 
        dwc->clk_ns = 10;
-       dwc->chip.dev = dev;
-       dwc->chip.ops = &dwc_pwm_ops;
-       dwc->chip.npwm = DWC_TIMERS_TOTAL;
+       chip->dev = dev;
+       chip->ops = &dwc_pwm_ops;
+       chip->npwm = DWC_TIMERS_TOTAL;
 
-       dev_set_drvdata(dev, dwc);
-       return dwc;
+       dev_set_drvdata(dev, chip);
+       return chip;
 }
 EXPORT_SYMBOL_GPL(dwc_pwm_alloc);
 
index 9a1b156ead2643c7f784a36b1cce4a01c7535e97..c0e586688e57fe761a56a1eeb4193ccdee7d3846 100644 (file)
 static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
 {
        struct device *dev = &pci->dev;
+       struct pwm_chip *chip;
        struct dwc_pwm *dwc;
        int ret;
 
-       dwc = dwc_pwm_alloc(dev);
-       if (!dwc)
-               return -ENOMEM;
+       chip = dwc_pwm_alloc(dev);
+       if (IS_ERR(chip))
+               return PTR_ERR(chip);
+       dwc = to_dwc_pwm(chip);
 
        ret = pcim_enable_device(pci);
        if (ret) {
@@ -55,7 +57,7 @@ static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
                return -ENOMEM;
        }
 
-       ret = devm_pwmchip_add(dev, &dwc->chip);
+       ret = devm_pwmchip_add(dev, chip);
        if (ret)
                return ret;
 
@@ -73,13 +75,14 @@ static void dwc_pwm_remove(struct pci_dev *pci)
 
 static int dwc_pwm_suspend(struct device *dev)
 {
-       struct dwc_pwm *dwc = dev_get_drvdata(dev);
+       struct pwm_chip *chip = dev_get_drvdata(dev);
+       struct dwc_pwm *dwc = to_dwc_pwm(chip);
        int i;
 
        for (i = 0; i < DWC_TIMERS_TOTAL; i++) {
-               if (dwc->chip.pwms[i].state.enabled) {
+               if (chip->pwms[i].state.enabled) {
                        dev_err(dev, "PWM %u in use by consumer (%s)\n",
-                               i, dwc->chip.pwms[i].label);
+                               i, chip->pwms[i].label);
                        return -EBUSY;
                }
                dwc->ctx[i].cnt = dwc_pwm_readl(dwc, DWC_TIM_LD_CNT(i));
@@ -92,7 +95,8 @@ static int dwc_pwm_suspend(struct device *dev)
 
 static int dwc_pwm_resume(struct device *dev)
 {
-       struct dwc_pwm *dwc = dev_get_drvdata(dev);
+       struct pwm_chip *chip = dev_get_drvdata(dev);
+       struct dwc_pwm *dwc = to_dwc_pwm(chip);
        int i;
 
        for (i = 0; i < DWC_TIMERS_TOTAL; i++) {
index 64795247c54ceccc02dc59a73d5fa810884a3b74..432a3b4c81fd1dfcbf4fc03f09b95640ce6d7d48 100644 (file)
@@ -57,4 +57,4 @@ static inline void dwc_pwm_writel(struct dwc_pwm *dwc, u32 value, u32 offset)
        writel(value, dwc->base + offset);
 }
 
-extern struct dwc_pwm *dwc_pwm_alloc(struct device *dev);
+extern struct pwm_chip *dwc_pwm_alloc(struct device *dev);