board: stm32mp1: gt9147 IRQ before reset on EV1
authorPatrick Delaunay <patrick.delaunay@st.com>
Wed, 22 Apr 2020 12:29:13 +0000 (14:29 +0200)
committerPatrick Delaunay <patrick.delaunay@st.com>
Thu, 14 May 2020 07:02:12 +0000 (09:02 +0200)
Software workaround for I2C issue on EV1 board,
configure the IRQ line for touchscreen before LCD reset
to fix the used I2C address.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
board/st/stm32mp1/stm32mp1.c

index 20823f511a068bb08a508d97dc00f51d10727392..62b648f6e47eb03e3b3e1848911f12798a8b39ce 100644 (file)
@@ -616,6 +616,38 @@ static bool board_is_dk2(void)
 }
 #endif
 
+static bool board_is_ev1(void)
+{
+       if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
+           (of_machine_is_compatible("st,stm32mp157a-ev1") ||
+            of_machine_is_compatible("st,stm32mp157c-ev1") ||
+            of_machine_is_compatible("st,stm32mp157d-ev1") ||
+            of_machine_is_compatible("st,stm32mp157f-ev1")))
+               return true;
+
+       return false;
+}
+
+/* touchscreen driver: only used for pincontrol configuration */
+static const struct udevice_id goodix_ids[] = {
+       { .compatible = "goodix,gt9147", },
+       { }
+};
+
+U_BOOT_DRIVER(goodix) = {
+       .name           = "goodix",
+       .id             = UCLASS_NOP,
+       .of_match       = goodix_ids,
+};
+
+static void board_ev1_init(void)
+{
+       struct udevice *dev;
+
+       /* configure IRQ line on EV1 for touchscreen before LCD reset */
+       uclass_get_device_by_driver(UCLASS_NOP, DM_GET_DRIVER(goodix), &dev);
+}
+
 /* board dependent setup after realloc */
 int board_init(void)
 {
@@ -633,6 +665,9 @@ int board_init(void)
 
        board_key_check();
 
+       if (board_is_ev1())
+               board_ev1_init();
+
 #ifdef CONFIG_DM_REGULATOR
        if (board_is_dk2())
                dk2_i2c1_fix();