* [PATCH v2] Input: silead - Add support for setting resolution based on dmi data
@ 2017-01-02 10:55 Hans de Goede
2017-01-21 19:04 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: Hans de Goede @ 2017-01-02 10:55 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: russianneuromancer @ ya . ru, Gregor Riepl, linux-input,
Hans de Goede
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>
---
Changes in v2:
-Put the dmi code in a separate silead_dmi.c file
-Use device_add_properties to add the info
---
drivers/input/touchscreen/Makefile | 4 +-
drivers/input/touchscreen/silead.c | 3 ++
drivers/input/touchscreen/silead_dmi.c | 71 ++++++++++++++++++++++++++++++++++
drivers/input/touchscreen/silead_dmi.h | 26 +++++++++++++
4 files changed, 103 insertions(+), 1 deletion(-)
create mode 100644 drivers/input/touchscreen/silead_dmi.c
create mode 100644 drivers/input/touchscreen/silead_dmi.h
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 81b8645..7e7e310 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -5,6 +5,7 @@
# Each configuration option enables a list of files.
wm97xx-ts-y := wm97xx-core.o
+silead-ts-y := silead.o
obj-$(CONFIG_TOUCHSCREEN_PROPERTIES) += of_touchscreen.o
obj-$(CONFIG_TOUCHSCREEN_88PM860X) += 88pm860x-ts.o
@@ -64,7 +65,8 @@ obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o
obj-$(CONFIG_TOUCHSCREEN_PIXCIR) += pixcir_i2c_ts.o
obj-$(CONFIG_TOUCHSCREEN_RM_TS) += raydium_i2c_ts.o
obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
-obj-$(CONFIG_TOUCHSCREEN_SILEAD) += silead.o
+obj-$(CONFIG_TOUCHSCREEN_SILEAD) += silead-ts.o
+silead-ts-$(CONFIG_DMI) += silead_dmi.o
obj-$(CONFIG_TOUCHSCREEN_SIS_I2C) += sis_i2c.o
obj-$(CONFIG_TOUCHSCREEN_ST1232) += st1232.o
obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o
diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c
index d3dd9bb..b35120f 100644
--- a/drivers/input/touchscreen/silead.c
+++ b/drivers/input/touchscreen/silead.c
@@ -33,6 +33,8 @@
#include <acpi/acpi_bus.h>
#include <asm/unaligned.h>
+#include "silead_dmi.h"
+
#define SILEAD_TS_NAME "silead_ts"
#define SILEAD_REG_RESET 0xE0
@@ -468,6 +470,7 @@ static int silead_ts_probe(struct i2c_client *client,
if (error)
return error;
+ silead_ts_dmi_add_props(client);
silead_ts_read_props(client);
/* We must have the IRQ provided by DT or ACPI subsytem */
diff --git a/drivers/input/touchscreen/silead_dmi.c b/drivers/input/touchscreen/silead_dmi.c
new file mode 100644
index 0000000..dfbd823
--- /dev/null
+++ b/drivers/input/touchscreen/silead_dmi.c
@@ -0,0 +1,71 @@
+/*
+ * 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/device.h>
+#include <linux/dmi.h>
+#include <linux/i2c.h>
+#include <linux/property.h>
+
+static const 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 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 dmi_system_id silead_ts_dmi_table[] = {
+ {
+ .ident = "CUBE iwork8 Air",
+ .driver_data = (void *)&cube_iwork8_air_props,
+ .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_props,
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
+ /* jumperx.T87.KFBNEEA02 with the version-nr dropped */
+ DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"),
+ },
+ },
+ { },
+};
+
+void silead_ts_dmi_add_props(struct i2c_client *client)
+{
+ const struct dmi_system_id *dmi_id;
+ int ret;
+
+ dmi_id = dmi_first_match(silead_ts_dmi_table);
+ if (dmi_id) {
+ ret = device_add_properties(&client->dev, dmi_id->driver_data);
+ if (ret)
+ dev_err(&client->dev, "Add properties error %d\n", ret);
+ }
+}
diff --git a/drivers/input/touchscreen/silead_dmi.h b/drivers/input/touchscreen/silead_dmi.h
new file mode 100644
index 0000000..dc86017
--- /dev/null
+++ b/drivers/input/touchscreen/silead_dmi.h
@@ -0,0 +1,26 @@
+/*
+ * 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>
+ */
+
+#ifndef _SILEAD_DMI_H_
+#define _SILEAD_DMI_H_
+
+#include <linux/i2c.h>
+
+#ifdef CONFIG_DMI
+void silead_ts_dmi_add_props(struct i2c_client *client);
+#else
+static inline void silead_ts_dmi_add_props(struct i2c_client *client) {}
+#endif
+
+#endif
--
2.9.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] Input: silead - Add support for setting resolution based on dmi data
2017-01-02 10:55 [PATCH v2] Input: silead - Add support for setting resolution based on dmi data Hans de Goede
@ 2017-01-21 19:04 ` Dmitry Torokhov
2017-01-22 11:03 ` Hans de Goede
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Torokhov @ 2017-01-21 19:04 UTC (permalink / raw)
To: Hans de Goede; +Cc: russianneuromancer @ ya . ru, Gregor Riepl, linux-input
Hi Hans,
On Mon, Jan 02, 2017 at 11:55:38AM +0100, Hans de Goede wrote:
> 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>
> ---
> Changes in v2:
> -Put the dmi code in a separate silead_dmi.c file
> -Use device_add_properties to add the info
This leaks data (device_add_properties() does deep copy of properties)
you unbind and rebind the driver.
Also I would prefer this all be kept in the swamp that is platform
drivers and I believe we have enough infrastructure to do just that.
Could you please tell me if the following version of the patch works on
your devices?
Note that I guessed the ACPI name for the Cube and EZpad is "FIXME" so
please adjust as needed.
Thanks!.
--
Dmitry
platform/x86: add support for devices with Silead touchscreens
From: Hans de Goede <hdegoede@redhat.com>
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>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/platform/x86/Kconfig | 14 +++
drivers/platform/x86/Makefile | 1
drivers/platform/x86/silead_dmi.c | 153 +++++++++++++++++++++++++++++++++++++
3 files changed, 168 insertions(+)
create mode 100644 drivers/platform/x86/silead_dmi.c
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index b8a21d7b25d4..85c27bc52478 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -1027,4 +1027,18 @@ config INTEL_TELEMETRY
used to get various SoC events and parameters
directly via debugfs files. Various tools may use
this interface for SoC state monitoring.
+
+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 supplied the
+ missing information. Enable it if you have one of the following
+ tablets:
+ - CUBE iwork8 Air
+ - Jumper EZpad mini3
endif # X86_PLATFORM_DEVICES
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
index 2efa86d2a1a7..192a0a8b9a15 100644
--- a/drivers/platform/x86/Makefile
+++ b/drivers/platform/x86/Makefile
@@ -71,3 +71,4 @@ obj-$(CONFIG_INTEL_TELEMETRY) += intel_telemetry_core.o \
intel_telemetry_pltdrv.o \
intel_telemetry_debugfs.o
obj-$(CONFIG_INTEL_PMC_CORE) += intel_pmc_core.o
+obj-$(CONFIG_SLIEAD_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 000000000000..28f5d69f707b
--- /dev/null
+++ b/drivers/platform/x86/silead_dmi.c
@@ -0,0 +1,153 @@
+/*
+ * 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[] __initdata = {
+ 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 __initconst = {
+ .acpi_name = "GSL3670",
+ .properties = cube_iwork8_air_props,
+};
+
+static struct property_entry jumper_ezpad_mini3_props[] __initdata = {
+ 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 __initconst = {
+ .acpi_name = "FIXME",
+ .properties = jumper_ezpad_mini3_props,
+};
+
+static const struct dmi_system_id silead_ts_dmi_table[] __initconst = {
+ {
+ .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 __init 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 __init 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 __initdata = {
+ .notifier_call = silead_ts_dmi_notifier_call,
+};
+
+static bool silead_ts_dmi_registered __initdata;
+
+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;
+ }
+
+ silead_ts_dmi_registered = true;
+ return 0;
+}
+/*
+ * 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 sysbsys initcall level).
+ */
+arch_initcall(silead_ts_dmi_init);
+
+static int __init silead_ts_dmi_exit(void)
+{
+ if (silead_ts_dmi_registered)
+ bus_unregister_notifier(&i2c_bus_type, &silead_ts_dmi_notifier);
+
+ return 0;
+}
+/*
+ * We do not expect touchscreen ACPI devices come and go, so we can unregister
+ * and free memory once we get to late initcalls.
+ */
+late_initcall(silead_ts_dmi_exit);
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] Input: silead - Add support for setting resolution based on dmi data
2017-01-21 19:04 ` Dmitry Torokhov
@ 2017-01-22 11:03 ` Hans de Goede
2017-01-22 22:23 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: Hans de Goede @ 2017-01-22 11:03 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: russianneuromancer @ ya . ru, Gregor Riepl, linux-input
Hi,
On 21-01-17 20:04, Dmitry Torokhov wrote:
> Hi Hans,
>
> On Mon, Jan 02, 2017 at 11:55:38AM +0100, Hans de Goede wrote:
>> 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>
>> ---
>> Changes in v2:
>> -Put the dmi code in a separate silead_dmi.c file
>> -Use device_add_properties to add the info
>
> This leaks data (device_add_properties() does deep copy of properties)
> you unbind and rebind the driver.
>
> Also I would prefer this all be kept in the swamp that is platform
> drivers and I believe we have enough infrastructure to do just that.
> Could you please tell me if the following version of the patch works on
> your devices?
I had to drop the unregistering of the bus-notifier, as the i2c controller
driver may be a module (and in my case is as I'm testing with a Fedora
distro kernel based .config) so the device may not get registered
till after late_init.
With that + the ACPI names fixed it works. I still need to test on the
ezpad (only tested on the cube so far) then I'll submit this (as v3)
to the platform drivers maintainer with you in the Cc.
Regards,
Hans
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] Input: silead - Add support for setting resolution based on dmi data
2017-01-22 11:03 ` Hans de Goede
@ 2017-01-22 22:23 ` Dmitry Torokhov
0 siblings, 0 replies; 4+ messages in thread
From: Dmitry Torokhov @ 2017-01-22 22:23 UTC (permalink / raw)
To: Hans de Goede; +Cc: russianneuromancer @ ya . ru, Gregor Riepl, linux-input
On Sun, Jan 22, 2017 at 12:03:07PM +0100, Hans de Goede wrote:
> Hi,
>
> On 21-01-17 20:04, Dmitry Torokhov wrote:
> >Hi Hans,
> >
> >On Mon, Jan 02, 2017 at 11:55:38AM +0100, Hans de Goede wrote:
> >>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>
> >>---
> >>Changes in v2:
> >>-Put the dmi code in a separate silead_dmi.c file
> >>-Use device_add_properties to add the info
> >
> >This leaks data (device_add_properties() does deep copy of properties)
> >you unbind and rebind the driver.
> >
> >Also I would prefer this all be kept in the swamp that is platform
> >drivers and I believe we have enough infrastructure to do just that.
> >Could you please tell me if the following version of the patch works on
> >your devices?
>
> I had to drop the unregistering of the bus-notifier, as the i2c controller
> driver may be a module (and in my case is as I'm testing with a Fedora
> distro kernel based .config) so the device may not get registered
> till after late_init.
Ah, indeed. I was bouncing between ACPI bus notifier and i2c one and
with i2c we indeed need the notifier to stick around.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-01-22 22:23 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-02 10:55 [PATCH v2] Input: silead - Add support for setting resolution based on dmi data Hans de Goede
2017-01-21 19:04 ` Dmitry Torokhov
2017-01-22 11:03 ` Hans de Goede
2017-01-22 22:23 ` Dmitry Torokhov
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).