On Fri, 02 Dec 2016, Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > The primary consumer of the lpss pwm is the i915 kms driver, but > currently that driver cannot get the pwm because i915 platforms are > not using devicetree and pwm-lpss does not call pwm_add_table. > > Another problem is that i915 does not support get_pwm returning > -EPROBE_DEFER and i915's init is very complex and this is almost > impossible to fix. > > This commit changes the PWM_LPSS Kconfig from a tristate to a bool, so > that when the i915 driver loads the lpss pwm will be available avoiding > the -EPROBE_DEFER issue. Note that this is identical to how the same > problem was solved for the pwm-crc driver. Arguably this solution was worse for pwm-crc than pwm-lpss here, because bool CONFIG_PWM_CRC depends on INTEL_SOC_PMIC which depends on I2C being built-in. This one doesn't have all that bad dependencies. FWIW, both patches are Acked-by: Jani Nikula <jani.nikula@xxxxxxxxx> > > Being builtin also allows calling pwm_add_table directly from the > pwm-lpss code, otherwise the pwm_add_table call would need to be put > somewhere else to ensure it happens before i915 calls pwm_get, > even if i915 would support -EPROBE_DEFER. > > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > --- > drivers/pwm/Kconfig | 12 +++--------- > drivers/pwm/pwm-lpss.c | 11 +++++++++++ > 2 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig > index bf01288..cda31ea 100644 > --- a/drivers/pwm/Kconfig > +++ b/drivers/pwm/Kconfig > @@ -240,28 +240,22 @@ config PWM_LPC32XX > will be called pwm-lpc32xx. > > config PWM_LPSS > - tristate > + bool > > config PWM_LPSS_PCI > - tristate "Intel LPSS PWM PCI driver" > + bool "Intel LPSS PWM PCI driver" > depends on X86 && PCI > select PWM_LPSS > help > The PCI driver for Intel Low Power Subsystem PWM controller. > > - To compile this driver as a module, choose M here: the module > - will be called pwm-lpss-pci. > - > config PWM_LPSS_PLATFORM > - tristate "Intel LPSS PWM platform driver" > + bool "Intel LPSS PWM platform driver" > depends on X86 && ACPI > select PWM_LPSS > help > The platform driver for Intel Low Power Subsystem PWM controller. > > - To compile this driver as a module, choose M here: the module > - will be called pwm-lpss-platform. > - > config PWM_MESON > tristate "Amlogic Meson PWM driver" > depends on ARCH_MESON > diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c > index 72c0bce..b4d8835 100644 > --- a/drivers/pwm/pwm-lpss.c > +++ b/drivers/pwm/pwm-lpss.c > @@ -161,6 +161,12 @@ static const struct pwm_ops pwm_lpss_ops = { > .owner = THIS_MODULE, > }; > > +/* PWM consumed by the Intel GFX */ > +static struct pwm_lookup pwm_lpss_lookup[] = { > + PWM_LOOKUP("pwm-lpss", 0, "0000:00:02.0", "pwm_backlight", 0, > + PWM_POLARITY_NORMAL), > +}; > + > struct pwm_lpss_chip *pwm_lpss_probe(struct device *dev, struct resource *r, > const struct pwm_lpss_boardinfo *info) > { > @@ -193,12 +199,17 @@ struct pwm_lpss_chip *pwm_lpss_probe(struct device *dev, struct resource *r, > return ERR_PTR(ret); > } > > + /* Add lookup table for pwm_backlight */ > + pwm_lpss_lookup[0].provider = dev_name(dev); > + pwm_add_table(pwm_lpss_lookup, ARRAY_SIZE(pwm_lpss_lookup)); > + > return lpwm; > } > EXPORT_SYMBOL_GPL(pwm_lpss_probe); > > int pwm_lpss_remove(struct pwm_lpss_chip *lpwm) > { > + pwm_remove_table(pwm_lpss_lookup, ARRAY_SIZE(pwm_lpss_lookup)); > return pwmchip_remove(&lpwm->chip); > } > EXPORT_SYMBOL_GPL(pwm_lpss_remove); -- Jani Nikula, Intel Open Source Technology Center _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel