]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00264465-3 arm: imx6qdl:Disable Hannstar LVDS panel CABC
authorLiu Ying <Ying.Liu@freescale.com>
Tue, 28 May 2013 05:49:06 +0000 (13:49 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 20 Aug 2014 08:06:12 +0000 (10:06 +0200)
Hannstar LVDS panel CABC function turns backlight density
automatically according to display content. This may introduce
annoying unstable backlight when display content changes.
So, this patch disables the CABC function if a platform's of
device tree provides controlling gpios in lvds_cabc_ctrl node.

Signed-off-by: Liu Ying <Ying.Liu@freescale.com>
(cherry picked from commit 35048e80235a7e337a35d8747b153bdd0afb621a)

arch/arm/mach-imx/mach-imx6q.c

index 85ec12ca55c6a4cd40a2a5059d0a17b4872aca5b..09892acf8e7f87e33010693fbca1d80afb7400b8 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/cpu.h>
 #include <linux/delay.h>
 #include <linux/export.h>
+#include <linux/gpio.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/irq.h>
@@ -22,6 +23,7 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
+#include <linux/of_gpio.h>
 #include <linux/of_platform.h>
 #include <linux/pm_opp.h>
 #include <linux/pci.h>
@@ -282,6 +284,42 @@ static void __init imx6q_axi_init(void)
        }
 }
 
+/*
+ * Disable Hannstar LVDS panel CABC function.
+ * This function turns the panel's backlight density automatically
+ * according to the content shown on the panel which may cause
+ * annoying unstable backlight issue.
+ */
+static void __init imx6q_lvds_cabc_init(void)
+{
+       struct device_node *np = NULL;
+       int ret, lvds0_gpio, lvds1_gpio;
+
+       np = of_find_node_by_name(NULL, "lvds_cabc_ctrl");
+       if (!np)
+               return;
+
+       lvds0_gpio = of_get_named_gpio(np, "lvds0-gpios", 0);
+       if (gpio_is_valid(lvds0_gpio)) {
+               ret = gpio_request_one(lvds0_gpio, GPIOF_OUT_INIT_LOW,
+                               "LVDS0 CABC enable");
+               if (!ret) {
+                       gpio_set_value(lvds0_gpio, 0);
+                       gpio_free(lvds0_gpio);
+               }
+       }
+
+       lvds1_gpio = of_get_named_gpio(np, "lvds1-gpios", 0);
+       if (gpio_is_valid(lvds1_gpio)) {
+               ret = gpio_request_one(lvds1_gpio, GPIOF_OUT_INIT_LOW,
+                               "LVDS1 CABC enable");
+               if (!ret) {
+                       gpio_set_value(lvds1_gpio, 0);
+                       gpio_free(lvds1_gpio);
+               }
+       }
+}
+
 static void __init imx6q_init_machine(void)
 {
        struct device *parent;
@@ -303,6 +341,7 @@ static void __init imx6q_init_machine(void)
        cpu_is_imx6q() ?  imx6q_pm_init() : imx6dl_pm_init();
        imx6q_1588_init();
        imx6q_axi_init();
+       imx6q_lvds_cabc_init();
 }
 
 #define OCOTP_CFG3                     0x440