On Fri, Aug 05, 2022 at 05:50:29PM +0100, Ben Dooks wrote: > The dwc pwm controller can be used in non-PCI systems, so allow > either platform or OF based probing. > > Signed-off-by: Ben Dooks <ben.dooks@xxxxxxxxxx> > --- > v3: > - changed compatible name > --- > drivers/pwm/Kconfig | 5 ++-- > drivers/pwm/pwm-dwc.c | 53 +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 56 insertions(+), 2 deletions(-) > > diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig > index 60d13a949bc5..b8717877a524 100644 > --- a/drivers/pwm/Kconfig > +++ b/drivers/pwm/Kconfig > @@ -176,9 +176,10 @@ config PWM_CROS_EC > > config PWM_DWC > tristate "DesignWare PWM Controller" > - depends on PCI > + depends on PCI || OF > help > - PWM driver for Synopsys DWC PWM Controller attached to a PCI bus. > + PWM driver for Synopsys DWC PWM Controller attached to either a > + PCI or platform bus. > > To compile this driver as a module, choose M here: the module > will be called pwm-dwc. > diff --git a/drivers/pwm/pwm-dwc.c b/drivers/pwm/pwm-dwc.c > index 61f11e0a9319..d5f2df6fee62 100644 > --- a/drivers/pwm/pwm-dwc.c > +++ b/drivers/pwm/pwm-dwc.c > @@ -18,6 +18,7 @@ > #include <linux/kernel.h> > #include <linux/module.h> > #include <linux/pci.h> > +#include <linux/platform_device.h> > #include <linux/pm_runtime.h> > #include <linux/pwm.h> > > @@ -319,6 +320,58 @@ static struct pci_driver dwc_pwm_driver = { > > module_pci_driver(dwc_pwm_driver); > > +#ifdef CONFIG_OF > +static int dwc_pwm_plat_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct dwc_pwm *dwc; > + int ret; > + > + dwc = dwc_pwm_alloc(dev); > + if (!dwc) > + return -ENOMEM; > + > + dwc->base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(dwc->base)) > + return dev_err_probe(dev, PTR_ERR(dwc->base), > + "failed to map IO\n"); devm_platform_ioremap_resource already provides an error message, so drop the message here. > + ret = pwmchip_add(&dwc->chip); > + if (ret) > + return ret; > + > + return 0; the last three code lines are equivalent to just return ret; An error message would be nice after pwmchip_add failed. > +} > + > +static int dwc_pwm_plat_remove(struct platform_device *pdev) > +{ > + struct dwc_pwm *dwc = platform_get_drvdata(pdev); > + > + pwmchip_remove(&dwc->chip); > + return 0; > +} Please consider using devm_pwmchip_add() which makes it unnecessary to provide a remove callback. > +static const struct of_device_id dwc_pwm_dt_ids[] = { > + { .compatible = "snps,dw-apb-timers-pwm2" }, > + { }, > +}; > +MODULE_DEVICE_TABLE(of, dwc_pwm_dt_ids); > + > +static struct platform_driver dwc_pwm_plat_driver = { > + .driver = { > + .name = "dwc-pwm", > + .of_match_table = dwc_pwm_dt_ids, I'm not a fan of aligning the = signs, for sure, don't use tabs for one and spaces for the other. If you ask me, use a single space. > + }, > + .probe = dwc_pwm_plat_probe, > + .remove = dwc_pwm_plat_remove, > +}; > + > +module_platform_driver(dwc_pwm_plat_driver); > + > +MODULE_ALIAS("platform:dwc-pwm"); > +#endif /* CONFIG_OF */ > + > + > MODULE_AUTHOR("Felipe Balbi (Intel)"); > MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@xxxxxxxxxxxxxxx>"); > MODULE_AUTHOR("Raymond Tan <raymond.tan@xxxxxxxxx>"); > Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |
Attachment:
signature.asc
Description: PGP signature