Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-block.git] / drivers / pwm / pwm-dwc.c
index bd2308812096d60812c927a2eb0b258544830b23..3bbb26c862c35c6f866d6129c2a488ff9979cab6 100644 (file)
@@ -198,20 +198,35 @@ static const struct pwm_ops dwc_pwm_ops = {
        .owner = THIS_MODULE,
 };
 
+static struct dwc_pwm *dwc_pwm_alloc(struct device *dev)
+{
+       struct dwc_pwm *dwc;
+
+       dwc = devm_kzalloc(dev, sizeof(*dwc), GFP_KERNEL);
+       if (!dwc)
+               return NULL;
+
+       dwc->chip.dev = dev;
+       dwc->chip.ops = &dwc_pwm_ops;
+       dwc->chip.npwm = DWC_TIMERS_TOTAL;
+
+       dev_set_drvdata(dev, dwc);
+       return dwc;
+}
+
 static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
 {
        struct device *dev = &pci->dev;
        struct dwc_pwm *dwc;
        int ret;
 
-       dwc = devm_kzalloc(&pci->dev, sizeof(*dwc), GFP_KERNEL);
+       dwc = dwc_pwm_alloc(dev);
        if (!dwc)
                return -ENOMEM;
 
        ret = pcim_enable_device(pci);
        if (ret) {
-               dev_err(&pci->dev,
-                       "Failed to enable device (%pe)\n", ERR_PTR(ret));
+               dev_err(dev, "Failed to enable device (%pe)\n", ERR_PTR(ret));
                return ret;
        }
 
@@ -219,24 +234,17 @@ static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        ret = pcim_iomap_regions(pci, BIT(0), pci_name(pci));
        if (ret) {
-               dev_err(&pci->dev,
-                       "Failed to iomap PCI BAR (%pe)\n", ERR_PTR(ret));
+               dev_err(dev, "Failed to iomap PCI BAR (%pe)\n", ERR_PTR(ret));
                return ret;
        }
 
        dwc->base = pcim_iomap_table(pci)[0];
        if (!dwc->base) {
-               dev_err(&pci->dev, "Base address missing\n");
+               dev_err(dev, "Base address missing\n");
                return -ENOMEM;
        }
 
-       pci_set_drvdata(pci, dwc);
-
-       dwc->chip.dev = dev;
-       dwc->chip.ops = &dwc_pwm_ops;
-       dwc->chip.npwm = DWC_TIMERS_TOTAL;
-
-       ret = pwmchip_add(&dwc->chip);
+       ret = devm_pwmchip_add(dev, &dwc->chip);
        if (ret)
                return ret;
 
@@ -248,12 +256,8 @@ static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
 static void dwc_pwm_remove(struct pci_dev *pci)
 {
-       struct dwc_pwm *dwc = pci_get_drvdata(pci);
-
        pm_runtime_forbid(&pci->dev);
        pm_runtime_get_noresume(&pci->dev);
-
-       pwmchip_remove(&dwc->chip);
 }
 
 #ifdef CONFIG_PM_SLEEP