summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/guf-santaro/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/boards/guf-santaro/board.c')
-rw-r--r--arch/arm/boards/guf-santaro/board.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/arch/arm/boards/guf-santaro/board.c b/arch/arm/boards/guf-santaro/board.c
index b9a52ee258..e54110886b 100644
--- a/arch/arm/boards/guf-santaro/board.c
+++ b/arch/arm/boards/guf-santaro/board.c
@@ -11,6 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
+#define pr_fmt(fmt) "Santaro: " fmt
#include <common.h>
#include <init.h>
@@ -25,6 +26,105 @@
#include <bbu.h>
#include <mach/bbu.h>
#include <mach/imx6.h>
+#include <i2c/i2c.h>
+#include <gpio.h>
+
+static int i2c_device_present(struct i2c_adapter *adapter, int addr)
+{
+ struct i2c_client client = {};
+ u8 reg;
+
+ client.adapter = adapter;
+ client.addr = addr;
+
+ return i2c_write_reg(&client, 0x00, &reg, 0) < 0 ? false : true;
+}
+
+#define TOUCH_RESET_GPIO IMX_GPIO_NR(1, 20)
+
+static int edt_present, egalax_present;
+
+static int santaro_touch_fixup(struct device_node *root, void *unused)
+{
+ struct device_node *i2cnp, *np;
+
+ i2cnp = of_find_node_by_alias(root, "i2c2");
+ if (!i2cnp) {
+ pr_err("Cannot find node i2c2\n");
+ return -EINVAL;
+ }
+
+ for_each_child_of_node(i2cnp, np) {
+ int present;
+
+ if (of_device_is_compatible(np, "edt,edt-ft5206"))
+ present = edt_present;
+ else if (of_device_is_compatible(np, "eeti,egalax_ts"))
+ present = egalax_present;
+ else
+ continue;
+
+ if (present)
+ of_device_enable(np);
+ else
+ of_device_disable(np);
+ }
+
+ return 0;
+}
+
+static int santaro_detect_touch(void)
+{
+ struct device_node *np;
+ struct i2c_adapter *adapter;
+ const char *model = NULL;
+
+ if (!of_machine_is_compatible("guf,imx6q-santaro"))
+ return 0;
+
+ /*
+ * The Santaro has two different possible Touchscreen
+ * controllers. Both are on different I2C addresses.
+ * Let's probe both of them and enable in the device tree
+ * the one that's actually found on the hardware.
+ */
+
+ np = of_find_node_by_alias(NULL, "i2c2");
+ if (!np) {
+ pr_err("Cannot find node i2c2\n");
+ return -EINVAL;
+ }
+
+ adapter = of_find_i2c_adapter_by_node(np);
+ if (!adapter) {
+ pr_err("Cannot find i2c2 adapter\n");
+ return -EINVAL;
+ }
+
+ gpio_direction_output(TOUCH_RESET_GPIO, 0);
+ mdelay(10);
+ gpio_set_value(TOUCH_RESET_GPIO, 1);
+ mdelay(10);
+
+ edt_present = i2c_device_present(adapter, 0x38);
+
+ gpio_set_value(TOUCH_RESET_GPIO, 0);
+ mdelay(10);
+
+ egalax_present = i2c_device_present(adapter, 0x4);
+
+ if (edt_present)
+ model = "edt,edt-ft5206";
+ if (egalax_present)
+ model = "eeti,egalax_ts";
+
+ pr_info("Found %s Touchscreen controller\n", model);
+
+ of_register_fixup(santaro_touch_fixup, NULL);
+
+ return 0;
+}
+late_initcall(santaro_detect_touch);
static int santaro_device_init(void)
{