From: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
Greg Kroah-Hartman
<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Cc: Maxime Ripard
<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>,
Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
devicetree <devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: [PATCH 3/6] misc: q8-hardwaremgr: Add accelerometer detection
Date: Fri, 14 Oct 2016 09:53:34 +0200 [thread overview]
Message-ID: <20161014075337.10452-4-hdegoede@redhat.com> (raw)
In-Reply-To: <20161014075337.10452-1-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Extend the q8-hardwaremgr with accelerometer detection.
Signed-off-by: Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
drivers/misc/Kconfig | 2 +-
drivers/misc/q8-hardwaremgr.c | 219 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 220 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index d6c1529..11b05b0 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -801,7 +801,7 @@ config Q8_HARDWAREMGR
default n
help
This option enables support for autodetecting the touchscreen
- on Allwinner Q8 tablets.
+ and accelerometer on Allwinner Q8 tablets.
If unsure, say N.
diff --git a/drivers/misc/q8-hardwaremgr.c b/drivers/misc/q8-hardwaremgr.c
index 346102d..8ed71a9 100644
--- a/drivers/misc/q8-hardwaremgr.c
+++ b/drivers/misc/q8-hardwaremgr.c
@@ -83,6 +83,48 @@ enum {
zet6251,
};
+#define DA280_REG_CHIP_ID 0x01
+#define DA280_CHIP_ID 0x13
+#define DA311_REG_CHIP_ID 0x0f
+#define DA311_CHIP_ID 0x13
+
+#define DMARD06_CHIP_ID_REG 0x0f
+#define DMARD05_CHIP_ID 0x05
+#define DMARD06_CHIP_ID 0x06
+#define DMARD07_CHIP_ID 0x07
+#define DMARD09_REG_CHIPID 0x18
+#define DMARD09_CHIPID 0x95
+#define DMARD10_REG_STADR 0x12
+#define DMARD10_REG_STAINT 0x1c
+#define DMARD10_VALUE_STADR 0x55
+#define DMARD10_VALUE_STAINT 0xaa
+
+#define MC3230_REG_CHIP_ID 0x18
+#define MC3230_CHIP_ID 0x01
+#define MMA7660_CHIP_ID 0x00 /* Factory reserved on MMA7660 */
+#define MC3230_REG_PRODUCT_CODE 0x3b
+#define MMA7660_PRODUCT_CODE 0x00 /* Factory reserved on MMA7660 */
+#define MC3210_PRODUCT_CODE 0x90
+#define MC3230_PRODUCT_CODE 0x19
+
+#define MXC6225_REG_CHIP_ID 0x08
+#define MXC6225_CHIP_ID 0x05
+
+enum {
+ accel_unknown,
+ da280,
+ da311,
+ dmard05,
+ dmard06,
+ dmard07,
+ dmard09,
+ dmard10,
+ mc3210,
+ mc3230,
+ mma7660,
+ mxc6225,
+};
+
struct q8_hardwaremgr_device {
int model;
int addr;
@@ -94,6 +136,7 @@ struct q8_hardwaremgr_data {
struct device *dev;
enum soc soc;
struct q8_hardwaremgr_device touchscreen;
+ struct q8_hardwaremgr_device accelerometer;
int touchscreen_variant;
int touchscreen_width;
int touchscreen_height;
@@ -411,6 +454,175 @@ static void q8_hardwaremgr_apply_touchscreen(struct q8_hardwaremgr_data *data)
of_node_put(np);
}
+static int q8_hardwaremgr_probe_mxc6225(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int id;
+
+ id = i2c_smbus_read_byte_data(client, MXC6225_REG_CHIP_ID);
+ /* Bits 7 - 5 of the chip-id register are undefined */
+ if (id >= 0 && (id & 0x1f) == MXC6225_CHIP_ID) {
+ data->accelerometer.compatible = "memsic,mxc6225";
+ data->accelerometer.model = mxc6225;
+ return 0;
+ }
+
+ return id == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_mc3230(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int id, pc = 0;
+
+ /* First check chip-id, then product-id */
+ id = i2c_smbus_read_byte_data(client, MC3230_REG_CHIP_ID);
+ if (id == MC3230_CHIP_ID || id == MMA7660_CHIP_ID) {
+ pc = i2c_smbus_read_byte_data(client, MC3230_REG_PRODUCT_CODE);
+ switch (pc) {
+ case MMA7660_PRODUCT_CODE:
+ data->accelerometer.compatible = "fsl,mma7660";
+ data->accelerometer.model = mma7660;
+ return 0;
+ case MC3210_PRODUCT_CODE:
+ data->accelerometer.compatible = "mcube,mc3210";
+ data->accelerometer.model = mc3210;
+ return 0;
+ case MC3230_PRODUCT_CODE:
+ data->accelerometer.compatible = "mcube,mc3230";
+ data->accelerometer.model = mc3230;
+ return 0;
+ case -ETIMEDOUT:
+ return -ETIMEDOUT; /* Bus stuck bail immediately */
+ }
+ }
+
+ return id == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_dmard06(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int id;
+
+ id = i2c_smbus_read_byte_data(client, DMARD06_CHIP_ID_REG);
+ switch (id) {
+ case DMARD05_CHIP_ID:
+ data->accelerometer.compatible = "domintech,dmard05";
+ data->accelerometer.model = dmard05;
+ return 0;
+ case DMARD06_CHIP_ID:
+ data->accelerometer.compatible = "domintech,dmard06";
+ data->accelerometer.model = dmard06;
+ return 0;
+ case DMARD07_CHIP_ID:
+ data->accelerometer.compatible = "domintech,dmard07";
+ data->accelerometer.model = dmard07;
+ return 0;
+ }
+
+ return id == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_dmard09(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int id;
+
+ id = i2c_smbus_read_byte_data(client, DMARD09_REG_CHIPID);
+ if (id == DMARD09_CHIPID) {
+ data->accelerometer.compatible = "domintech,dmard09";
+ data->accelerometer.model = dmard09;
+ return 0;
+ }
+
+ return id == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_dmard10(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int stadr, staint = 0;
+
+ /* These 2 registers have special POR reset values used for id */
+ stadr = i2c_smbus_read_byte_data(client, DMARD10_REG_STADR);
+ if (stadr == DMARD10_VALUE_STADR) {
+ staint = i2c_smbus_read_byte_data(client, DMARD10_REG_STAINT);
+ switch (staint) {
+ case DMARD10_VALUE_STAINT:
+ data->accelerometer.compatible = "domintech,dmard10";
+ data->accelerometer.model = dmard10;
+ return 0;
+ case -ETIMEDOUT:
+ return -ETIMEDOUT; /* Bus stuck bail immediately */
+ }
+ }
+
+ return stadr == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_da280(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int id;
+
+ id = i2c_smbus_read_byte_data(client, DA280_REG_CHIP_ID);
+ if (id == DA280_CHIP_ID) {
+ data->accelerometer.compatible = "miramems,da280";
+ data->accelerometer.model = da280;
+ return 0;
+ }
+
+ return id == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_da311(struct q8_hardwaremgr_data *data,
+ struct i2c_client *client)
+{
+ int id;
+
+ id = i2c_smbus_read_byte_data(client, DA311_REG_CHIP_ID);
+ if (id == DA311_CHIP_ID) {
+ data->accelerometer.compatible = "miramems,da311";
+ data->accelerometer.model = da311;
+ return 0;
+ }
+
+ return id == -ETIMEDOUT ? -ETIMEDOUT : -ENODEV;
+}
+
+static int q8_hardwaremgr_probe_accelerometer(struct q8_hardwaremgr_data *data,
+ struct i2c_adapter *adap)
+{
+ PROBE_CLIENT(&data->accelerometer, 0x15, q8_hardwaremgr_probe_mxc6225);
+ PROBE_CLIENT(&data->accelerometer, 0x4c, q8_hardwaremgr_probe_mc3230);
+ PROBE_CLIENT(&data->accelerometer, 0x1c, q8_hardwaremgr_probe_dmard06);
+ PROBE_CLIENT(&data->accelerometer, 0x1d, q8_hardwaremgr_probe_dmard09);
+ PROBE_CLIENT(&data->accelerometer, 0x18, q8_hardwaremgr_probe_dmard10);
+ PROBE_CLIENT(&data->accelerometer, 0x26, q8_hardwaremgr_probe_da280);
+ PROBE_CLIENT(&data->accelerometer, 0x27, q8_hardwaremgr_probe_da311);
+
+ return -ENODEV;
+}
+
+static void q8_hardwaremgr_apply_accelerometer(struct q8_hardwaremgr_data *data)
+{
+ struct of_changeset cset;
+ struct device_node *np;
+
+ if (data->accelerometer.model == accel_unknown)
+ return;
+
+ np = q8_hardware_mgr_apply_common(&data->accelerometer, &cset,
+ "accelerometer");
+ if (!np)
+ return;
+
+ of_changeset_apply(&cset);
+
+ of_node_put(np);
+}
+
static int q8_hardwaremgr_do_probe(struct q8_hardwaremgr_data *data,
struct q8_hardwaremgr_device *dev,
const char *prefix, bus_probe_func func)
@@ -531,7 +743,14 @@ static int q8_hardwaremgr_probe(struct platform_device *pdev)
if (ret)
goto error;
+ ret = q8_hardwaremgr_do_probe(data, &data->accelerometer,
+ "accelerometer",
+ q8_hardwaremgr_probe_accelerometer);
+ if (ret)
+ goto error;
+
q8_hardwaremgr_apply_touchscreen(data);
+ q8_hardwaremgr_apply_accelerometer(data);
error:
kfree(data);
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2016-10-14 7:53 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-14 7:53 Add Allwinner Q8 tablets hardware manager Hans de Goede
[not found] ` <20161014075337.10452-1-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-10-14 7:53 ` [PATCH 1/6] dt: bindings: Add Allwinner Q8 tablets hardware manager bindings Hans de Goede
[not found] ` <20161014075337.10452-2-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-10-26 20:39 ` Rob Herring
2016-10-14 7:53 ` [PATCH 2/6] misc: Add Allwinner Q8 tablet hardware manager Hans de Goede
2016-10-14 7:53 ` Hans de Goede [this message]
2016-10-14 7:53 ` [PATCH 4/6] misc: q8-hardwaremgr: Add rda599x wift/bt/fm radio combo detection Hans de Goede
2016-10-14 7:53 ` [PATCH 5/6] misc: q8-hardwaremgr: Better touchscreen defaults based on heuristics Hans de Goede
2016-10-14 7:53 ` [PATCH 6/6] misc: q8-hardwaremgr: Add quirk handling Hans de Goede
2016-10-24 17:39 ` Add Allwinner Q8 tablets hardware manager Mark Rutland
2016-10-26 11:46 ` Hans de Goede
[not found] ` <CAJ-oXjQbOkrkNToEXYmPUZOgYBGbxQREZ4NL4bMcZmG=KP2vQQ@mail.gmail.com>
[not found] ` <CAJ-oXjQbOkrkNToEXYmPUZOgYBGbxQREZ4NL4bMcZmG=KP2vQQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-27 9:14 ` Hans de Goede
2016-10-27 12:57 ` Pierre-Hugues Husson
2016-10-27 14:53 ` Hans de Goede
[not found] ` <4cfdd415-1965-7be9-b204-86a9931683a6-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-10-27 16:27 ` Pantelis Antoniou
2016-10-27 17:31 ` Pierre-Hugues Husson
[not found] ` <CAJ-oXjRJrs77yE-skpZ-V4e=rdhRyfNve9bibf1VOaZYy2=tRA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-27 21:15 ` Hans de Goede
[not found] ` <4cfbedb2-0249-e881-3577-dda0b0d4cabe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-10-27 15:52 ` Pantelis Antoniou
[not found] ` <9B288597-7812-459D-A5C7-B61107751DA6-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
2016-10-27 16:59 ` Pierre-Hugues Husson
[not found] ` <CAJ-oXjT=eVwEk7t5WoZAhjMhiZZkq0NN5tFLidSnUNO97D62zQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-27 17:11 ` Pantelis Antoniou
[not found] ` <D75CB7DE-4165-4D2F-B40B-D2B6875C0172-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
2016-10-27 19:04 ` Pierre-Hugues Husson
[not found] ` <CAJ-oXjS_=k4qE25t2b9eNnuqvVHf-1g7CZr81pPJx==aftF4xw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-27 19:23 ` Pantelis Antoniou
2016-10-27 21:10 ` Hans de Goede
2016-10-26 20:54 ` Rob Herring
2016-10-27 8:10 ` Pierre-Hugues Husson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161014075337.10452-4-hdegoede@redhat.com \
--to=hdegoede-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
--cc=arnd-r2nGTMty4D4@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=wens-jdAy2FN1RRM@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).