* [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device
@ 2017-01-22 15:24 Hans de Goede
2017-01-22 15:24 ` [PATCH v3 2/3] pwm: lpss: Make builtin so that i915 can find the pwm_backlight Hans de Goede
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Hans de Goede @ 2017-01-22 15:24 UTC (permalink / raw)
To: Dmitry Torokhov, Darren Hart
Cc: Hans de Goede, russianneuromancer @ ya . ru, Gregor Riepl,
linux-input, platform-driver-x86
On x86 we do not have devicetree to link the pwm controller and
the display controller together. So someone needs to call
pwm_add_table() to create the link, so that the i915 driver's
pwm_get(dev, "pwm_backlight") call returns the lpss' pwm0.
The pwm subsystem does not want to have pwm_add_table() calls
directly in pwm drivers (this leads to probe ordering issues),
so lets do it here since the acpi-lpss code is always builtin.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/acpi/acpi_lpss.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
index 8ea836c..1b4bcf6 100644
--- a/drivers/acpi/acpi_lpss.c
+++ b/drivers/acpi/acpi_lpss.c
@@ -20,6 +20,7 @@
#include <linux/platform_data/clk-lpss.h>
#include <linux/pm_domain.h>
#include <linux/pm_runtime.h>
+#include <linux/pwm.h>
#include <linux/delay.h>
#include "internal.h"
@@ -154,6 +155,17 @@ static void byt_i2c_setup(struct lpss_private_data *pdata)
writel(0, pdata->mmio_base + LPSS_I2C_ENABLE);
}
+/* BSW PWM used for backlight control by the i915 driver */
+static struct pwm_lookup bsw_pwm_lookup[] = {
+ PWM_LOOKUP("80862288:00", 0, "0000:00:02.0", "pwm_backlight", 0,
+ PWM_POLARITY_NORMAL),
+};
+
+static void bsw_pwm_setup(struct lpss_private_data *pdata)
+{
+ pwm_add_table(bsw_pwm_lookup, ARRAY_SIZE(bsw_pwm_lookup));
+}
+
static const struct lpss_device_desc lpt_dev_desc = {
.flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR,
.prv_offset = 0x800,
@@ -191,6 +203,7 @@ static const struct lpss_device_desc byt_pwm_dev_desc = {
static const struct lpss_device_desc bsw_pwm_dev_desc = {
.flags = LPSS_SAVE_CTX | LPSS_NO_D3_DELAY,
+ .setup = bsw_pwm_setup,
};
static const struct lpss_device_desc byt_uart_dev_desc = {
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/3] pwm: lpss: Make builtin so that i915 can find the pwm_backlight
2017-01-22 15:24 [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
@ 2017-01-22 15:24 ` Hans de Goede
2017-01-22 15:24 ` [PATCH v3 3/3] platform/x86: add support for devices with Silead touchscreens Hans de Goede
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2017-01-22 15:24 UTC (permalink / raw)
To: Dmitry Torokhov, Darren Hart
Cc: Hans de Goede, russianneuromancer @ ya . ru, Gregor Riepl,
linux-input, platform-driver-x86
The primary consumer of the lpss pwm is the i915 kms driver,
the i915 driver does not support get_pwm returning -EPROBE_DEFER and
its init is very complex making 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, which is used by the i915
driver on other platforms.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Jani Nikula <jani.nikula@intel.com>
---
Changes in v2:
-Drop the pwm_add_table call (this has been moved to the acpi_lpss driver)
---
drivers/pwm/Kconfig | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index f92dd41..12a6cf8 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -249,28 +249,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
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 3/3] platform/x86: add support for devices with Silead touchscreens
2017-01-22 15:24 [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
2017-01-22 15:24 ` [PATCH v3 2/3] pwm: lpss: Make builtin so that i915 can find the pwm_backlight Hans de Goede
@ 2017-01-22 15:24 ` Hans de Goede
2017-01-22 15:25 ` [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
2017-01-30 22:21 ` Andy Shevchenko
3 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2017-01-22 15:24 UTC (permalink / raw)
To: Dmitry Torokhov, Darren Hart
Cc: Hans de Goede, russianneuromancer @ ya . ru, Gregor Riepl,
linux-input, platform-driver-x86
On ACPI based tablets, the ACPI touchscreen node only contains info on
the gpio and the irq, and is missing any info on the axis. This info is
expected to be built into the tablet model specific version of the driver
shipped with the os-image for the device.
Add support for getting the missing info from a table built into the
driver, using dmi data to identify which entry of the table to use and
add info for the CUBE iwork8 Air and Jumper EZpad mini3 tablets on which
this code was tested / developed.
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=187531
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
[dmitry.torokhov@gmail.com: Move to platform/x86]
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
Changes in v2:
-Put the dmi code in a separate silead_dmi.c file
-Use device_add_properties to add the info
Changes in v3 (Dmitry Torokhov):
-Move the silead_dmi code to drivers/platform/x86
---
MAINTAINERS | 8 +++
drivers/platform/x86/Kconfig | 11 +++
drivers/platform/x86/Makefile | 1 +
drivers/platform/x86/silead_dmi.c | 136 ++++++++++++++++++++++++++++++++++++++
4 files changed, 156 insertions(+)
create mode 100644 drivers/platform/x86/silead_dmi.c
diff --git a/MAINTAINERS b/MAINTAINERS
index bdc4843..5591ac3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11255,6 +11255,14 @@ F: drivers/media/usb/siano/
F: drivers/media/usb/siano/
F: drivers/media/mmc/siano/
+SILEAD TOUCHSCREEN DRIVER
+M: Hans de Goede <hdegoede@redhat.com>
+L: linux-input@vger.kernel.org
+L: platform-driver-x86@vger.kernel.org
+S: Maintained
+F: drivers/input/touchscreen/silead.c
+F: drivers/platform/x86/silead_dmi.c
+
SIMPLEFB FB DRIVER
M: Hans de Goede <hdegoede@redhat.com>
L: linux-fbdev@vger.kernel.org
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 59aa8e3..60be7bc 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -1076,4 +1076,15 @@ config MLX_CPLD_PLATFORM
This driver handles hot-plug events for the power suppliers, power
cables and fans on the wide range Mellanox IB and Ethernet systems.
+config SILEAD_DMI
+ bool "Tablets with Silead touchscreens"
+ depends on ACPI && DMI && I2C && INPUT
+ ---help---
+ Certain ACPI based tablets with Silead touchscreens do not have
+ enough data in ACPI tables for the touchscreen driver to handle
+ the touchscreen properly, as OEMs expected the data to be baked
+ into the tablet model specific version of the driver shipped
+ with the os-image for the device. This option supplies the missing
+ information. Enable this for x86 tablets with Silead touchscreens.
+
endif # X86_PLATFORM_DEVICES
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index d4111f0..840b07b 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -76,3 +76,4 @@ obj-$(CONFIG_INTEL_TELEMETRY) += intel_telemetry_core.o \
obj-$(CONFIG_INTEL_PMC_CORE) += intel_pmc_core.o
obj-$(CONFIG_MLX_PLATFORM) += mlx-platform.o
obj-$(CONFIG_MLX_CPLD_PLATFORM) += mlxcpld-hotplug.o
+obj-$(CONFIG_SILEAD_DMI) += silead_dmi.o
diff --git a/drivers/platform/x86/silead_dmi.c b/drivers/platform/x86/silead_dmi.c
new file mode 100644
index 0000000..11b0a46
--- /dev/null
+++ b/drivers/platform/x86/silead_dmi.c
@@ -0,0 +1,136 @@
+/*
+ * Silead touchscreen driver DMI based configuration code
+ *
+ * Copyright (c) 2017 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Red Hat authors:
+ * Hans de Goede <hdegoede@redhat.com>
+ */
+
+#include <linux/acpi.h>
+#include <linux/device.h>
+#include <linux/dmi.h>
+#include <linux/i2c.h>
+#include <linux/notifier.h>
+#include <linux/property.h>
+#include <linux/string.h>
+
+struct silead_ts_dmi_data {
+ const char *acpi_name;
+ struct property_entry *properties;
+};
+
+static struct property_entry cube_iwork8_air_props[] = {
+ PROPERTY_ENTRY_U32("touchscreen-size-x", 1660),
+ PROPERTY_ENTRY_U32("touchscreen-size-y", 900),
+ PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
+ PROPERTY_ENTRY_STRING("firmware-name", "gsl3670-cube-iwork8-air.fw"),
+ PROPERTY_ENTRY_U32("silead,max-fingers", 10),
+ { }
+};
+
+static const struct silead_ts_dmi_data cube_iwork8_air_data = {
+ .acpi_name = "MSSL1680:00",
+ .properties = cube_iwork8_air_props,
+};
+
+static struct property_entry jumper_ezpad_mini3_props[] = {
+ PROPERTY_ENTRY_U32("touchscreen-size-x", 1700),
+ PROPERTY_ENTRY_U32("touchscreen-size-y", 1150),
+ PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
+ PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-jumper-ezpad-mini3.fw"),
+ PROPERTY_ENTRY_U32("silead,max-fingers", 10),
+ { }
+};
+
+static const struct silead_ts_dmi_data jumper_ezpad_mini3_data = {
+ .acpi_name = "MSSL1680:00",
+ .properties = jumper_ezpad_mini3_props,
+};
+
+static const struct dmi_system_id silead_ts_dmi_table[] = {
+ {
+ .ident = "CUBE iwork8 Air",
+ .driver_data = (void *)&cube_iwork8_air_data,
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "cube"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "i1-TF"),
+ DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
+ },
+ },
+ {
+ .ident = "Jumper EZpad mini3",
+ .driver_data = (void *)&jumper_ezpad_mini3_data,
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
+ /* jumperx.T87.KFBNEEA02 with the version-nr dropped */
+ DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"),
+ },
+ },
+ { },
+};
+
+static void silead_ts_dmi_add_props(struct device *dev)
+{
+ struct i2c_client *client = to_i2c_client(dev);
+ const struct dmi_system_id *dmi_id;
+ const struct silead_ts_dmi_data *ts_data;
+ int error;
+
+ dmi_id = dmi_first_match(silead_ts_dmi_table);
+ if (dmi_id) {
+ ts_data = dmi_id->driver_data;
+ if (ACPI_COMPANION(dev) &&
+ !strncmp(ts_data->acpi_name, client->name, I2C_NAME_SIZE)) {
+ error = device_add_properties(dev, ts_data->properties);
+ if (error)
+ dev_err(dev, "failed to add properties: %d\n",
+ error);
+ }
+ }
+}
+
+static int silead_ts_dmi_notifier_call(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct device *dev = data;
+
+ switch (action) {
+ case BUS_NOTIFY_ADD_DEVICE:
+ silead_ts_dmi_add_props(dev);
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static struct notifier_block silead_ts_dmi_notifier = {
+ .notifier_call = silead_ts_dmi_notifier_call,
+};
+
+static int __init silead_ts_dmi_init(void)
+{
+ int error;
+
+ error = bus_register_notifier(&i2c_bus_type, &silead_ts_dmi_notifier);
+ if (error)
+ pr_err("%s: failed to register i2c bus notifier: %d\n",
+ __func__, error);
+
+ return error;
+}
+
+/*
+ * We are registering out notifier after i2c core is initialized and i2c bus
+ * itself is ready (which happens at postcore initcall level), but before
+ * ACPI starts enumerating devices (at subsys initcall level).
+ */
+arch_initcall(silead_ts_dmi_init);
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device
2017-01-22 15:24 [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
2017-01-22 15:24 ` [PATCH v3 2/3] pwm: lpss: Make builtin so that i915 can find the pwm_backlight Hans de Goede
2017-01-22 15:24 ` [PATCH v3 3/3] platform/x86: add support for devices with Silead touchscreens Hans de Goede
@ 2017-01-22 15:25 ` Hans de Goede
2017-01-30 22:21 ` Andy Shevchenko
3 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2017-01-22 15:25 UTC (permalink / raw)
To: Dmitry Torokhov, Darren Hart
Cc: russianneuromancer @ ya . ru, Gregor Riepl, linux-input,
platform-driver-x86
Hi,
Ugh I somehow ended up typing "git send-email HEAD~3"
instead of "git send-email HEAD~" don't know where my
mind wandered of to. Sorry, please ignore I'll resend
just patch 3/3 which is the one I intended to send.
Regards,
Hans
On 22-01-17 16:24, Hans de Goede wrote:
> On x86 we do not have devicetree to link the pwm controller and
> the display controller together. So someone needs to call
> pwm_add_table() to create the link, so that the i915 driver's
> pwm_get(dev, "pwm_backlight") call returns the lpss' pwm0.
>
> The pwm subsystem does not want to have pwm_add_table() calls
> directly in pwm drivers (this leads to probe ordering issues),
> so lets do it here since the acpi-lpss code is always builtin.
>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> drivers/acpi/acpi_lpss.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
> index 8ea836c..1b4bcf6 100644
> --- a/drivers/acpi/acpi_lpss.c
> +++ b/drivers/acpi/acpi_lpss.c
> @@ -20,6 +20,7 @@
> #include <linux/platform_data/clk-lpss.h>
> #include <linux/pm_domain.h>
> #include <linux/pm_runtime.h>
> +#include <linux/pwm.h>
> #include <linux/delay.h>
>
> #include "internal.h"
> @@ -154,6 +155,17 @@ static void byt_i2c_setup(struct lpss_private_data *pdata)
> writel(0, pdata->mmio_base + LPSS_I2C_ENABLE);
> }
>
> +/* BSW PWM used for backlight control by the i915 driver */
> +static struct pwm_lookup bsw_pwm_lookup[] = {
> + PWM_LOOKUP("80862288:00", 0, "0000:00:02.0", "pwm_backlight", 0,
> + PWM_POLARITY_NORMAL),
> +};
> +
> +static void bsw_pwm_setup(struct lpss_private_data *pdata)
> +{
> + pwm_add_table(bsw_pwm_lookup, ARRAY_SIZE(bsw_pwm_lookup));
> +}
> +
> static const struct lpss_device_desc lpt_dev_desc = {
> .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR,
> .prv_offset = 0x800,
> @@ -191,6 +203,7 @@ static const struct lpss_device_desc byt_pwm_dev_desc = {
>
> static const struct lpss_device_desc bsw_pwm_dev_desc = {
> .flags = LPSS_SAVE_CTX | LPSS_NO_D3_DELAY,
> + .setup = bsw_pwm_setup,
> };
>
> static const struct lpss_device_desc byt_uart_dev_desc = {
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device
2017-01-22 15:24 [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
` (2 preceding siblings ...)
2017-01-22 15:25 ` [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
@ 2017-01-30 22:21 ` Andy Shevchenko
2017-01-31 8:29 ` Hans de Goede
3 siblings, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2017-01-30 22:21 UTC (permalink / raw)
To: Hans de Goede
Cc: Dmitry Torokhov, Darren Hart, russianneuromancer @ ya . ru,
Gregor Riepl, linux-input, Platform Driver
On Sun, Jan 22, 2017 at 5:24 PM, Hans de Goede <hdegoede@redhat.com> wrote:
> On x86 we do not have devicetree to link the pwm controller and
> the display controller together. So someone needs to call
> pwm_add_table() to create the link, so that the i915 driver's
> pwm_get(dev, "pwm_backlight") call returns the lpss' pwm0.
>
> The pwm subsystem does not want to have pwm_add_table() calls
> directly in pwm drivers (this leads to probe ordering issues),
> so lets do it here since the acpi-lpss code is always builtin.
Hans, just to be sure, the device you have is using LPSS pwm for backlight.
Since I just recall that on some (Baytrail) models we have PMIC
(Crystal Cove) that responsible for PWM for backlight.
And we have no PMIC driver in kernel for CherryTrail (Dollar Cove).
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device
2017-01-30 22:21 ` Andy Shevchenko
@ 2017-01-31 8:29 ` Hans de Goede
0 siblings, 0 replies; 6+ messages in thread
From: Hans de Goede @ 2017-01-31 8:29 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Dmitry Torokhov, Darren Hart, russianneuromancer @ ya . ru,
Gregor Riepl, linux-input, Platform Driver
Hi,
On 30-01-17 23:21, Andy Shevchenko wrote:
> On Sun, Jan 22, 2017 at 5:24 PM, Hans de Goede <hdegoede@redhat.com> wrote:
>> On x86 we do not have devicetree to link the pwm controller and
>> the display controller together. So someone needs to call
>> pwm_add_table() to create the link, so that the i915 driver's
>> pwm_get(dev, "pwm_backlight") call returns the lpss' pwm0.
>>
>> The pwm subsystem does not want to have pwm_add_table() calls
>> directly in pwm drivers (this leads to probe ordering issues),
>> so lets do it here since the acpi-lpss code is always builtin.
>
> Hans, just to be sure, the device you have is using LPSS pwm for backlight.
Correct, I've 2 cherrytrail tablets and one mini laptop, the 2 tablets
both use LPSS for backlight, the mini laptop just arrived and I
still need to put Linux on it.
> Since I just recall that on some (Baytrail) models we have PMIC
> (Crystal Cove) that responsible for PWM for backlight.
> And we have no PMIC driver in kernel for CherryTrail (Dollar Cove).
Right, on baytrail the pwm_crc driver is used which AFAIK is
for CRystal Cove.
Regards,
Hans
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-01-31 8:30 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-22 15:24 [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
2017-01-22 15:24 ` [PATCH v3 2/3] pwm: lpss: Make builtin so that i915 can find the pwm_backlight Hans de Goede
2017-01-22 15:24 ` [PATCH v3 3/3] platform/x86: add support for devices with Silead touchscreens Hans de Goede
2017-01-22 15:25 ` [PATCH v3 1/3] acpi: lpss: call pwm_add_table() for bsw pwm device Hans de Goede
2017-01-30 22:21 ` Andy Shevchenko
2017-01-31 8:29 ` Hans de Goede
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).