diff --git a/arch/arm/include/asm/mach-imx/fbpanel.h b/arch/arm/include/asm/mach-imx/fbpanel.h
index 05267a033c4c60e273d9c70e6e8473efbb992a96..839bde039405a0e9a51c8d51fec24326a93b57c0 100644
--- a/arch/arm/include/asm/mach-imx/fbpanel.h
+++ b/arch/arm/include/asm/mach-imx/fbpanel.h
@@ -8,6 +8,12 @@
 #include <linux/fb.h>
 #include <ipu_pixfmt.h>
 
+#define fbp_bus_gp(bus_num, bus_gp, enable_gp, spare) ((bus_num) | \
+		((bus_gp) << 8) | ((enable_gp) << 16) | ((spare) << 24))
+
+#define fbp_addr_gp(addr_num, spare1, spare2, spare3) ((addr_num) | \
+		((spare1) << 8) | ((spare2) << 16) | ((spare3) << 24))
+
 struct display_info_t {
 	union {
 		int	bus;	/* (bus >> 8) is gpio to enable bus if <>0 */
@@ -18,7 +24,15 @@ struct display_info_t {
 			unsigned char spare;
 		};
 	};
-	int	addr;
+	union {
+		int	addr;
+		struct {
+			unsigned char addr_num;
+			unsigned char spare1;
+			unsigned char spare2;
+			unsigned char spare3;
+		};
+	};
 	int	pixfmt;
 	int	(*detect)(struct display_info_t const *dev);
 	void	(*enable)(struct display_info_t const *dev, int enable);
@@ -42,18 +56,19 @@ struct display_info_t {
 #define FBF_BKLIT_DTB		0x020
 #define FBF_PINCTRL		0x040
 #define FBF_ENABLE_GPIOS_ACTIVE_LOW 0x080
-#define FBF_MODE_SKIP_EOT	0x100
-#define FBF_MODE_VIDEO		0x200
-#define FBF_MODE_VIDEO_BURST	0x400
-#define FBF_MIPI_CMDS		0x800
+#define FBF_ENABLE_GPIOS_DTB	0x100
+#define FBF_MODE_SKIP_EOT	0x200
+#define FBF_MODE_VIDEO		0x400
+#define FBF_MODE_VIDEO_BURST	0x800
+#define FBF_MIPI_CMDS		0x1000
 #define FBF_DSI_LANE_SHIFT	16
 #define FBF_DSI_LANES_1		(0x1 << FBF_DSI_LANE_SHIFT)
 #define FBF_DSI_LANES_2		(0x2 << FBF_DSI_LANE_SHIFT)
 #define FBF_DSI_LANES_3		(0x3 << FBF_DSI_LANE_SHIFT)
 #define FBF_DSI_LANES_4		(0x4 << FBF_DSI_LANE_SHIFT)
 
-#define FBF_LTK080A60A004T	(FBF_MODE_SKIP_EOT | FBF_MODE_VIDEO | FBF_MODE_VIDEO_BURST | FBF_MIPI_CMDS | FBF_DSI_LANES_4 | FBF_PINCTRL)
-#define FBF_M101NWWB		(FBF_MODE_SKIP_EOT | FBF_MODE_VIDEO | FBF_MODE_VIDEO_BURST | FBF_MIPI_CMDS | FBF_DSI_LANES_4)
+#define FBF_LTK080A60A004T	(FBF_ENABLE_GPIOS_DTB | FBF_MODE_SKIP_EOT | FBF_MODE_VIDEO | FBF_MODE_VIDEO_BURST | FBF_MIPI_CMDS | FBF_DSI_LANES_4 | FBF_PINCTRL)
+#define FBF_M101NWWB		(FBF_ENABLE_GPIOS_DTB | FBF_MODE_SKIP_EOT | FBF_MODE_VIDEO | FBF_MODE_VIDEO_BURST | FBF_MIPI_CMDS | FBF_DSI_LANES_4)
 
 	int	fbflags;
 	struct	fb_videomode mode;
diff --git a/arch/arm/mach-imx/fbpanel.c b/arch/arm/mach-imx/fbpanel.c
index 69680756b0e299914fd71234bbaebd6192081b45..96a8cbfe1ce97b3aadf9f892ab357b3e28232765 100644
--- a/arch/arm/mach-imx/fbpanel.c
+++ b/arch/arm/mach-imx/fbpanel.c
@@ -390,7 +390,7 @@ static void setup_cmd_fb(unsigned fb, const struct display_info_t *di, char *buf
 	}
 
 	i = di->enable_gp;
-	if (di && i) {
+	if (di && (di->fbflags & FBF_ENABLE_GPIOS_DTB)) {
 		sz = snprintf(buf, size,
 			"fdt get value gp gpio%u phandle;"
 			"fdt set %s enable-gpios <${gp} %u %u>;",
@@ -440,7 +440,7 @@ static void setup_cmd_fb(unsigned fb, const struct display_info_t *di, char *buf
 				"fdt set mipi_dsi status okay;"
 				"fdt set mipi_dsi_phy status okay;"
 				"fdt set mipi_to_lvds status %s;",
-				(di->addr == 0x2c) ? "okay" : "disabled");
+				(di->addr_num == 0x2c) ? "okay" : "disabled");
 		buf += sz;
 		size -= sz;
 	}
@@ -513,11 +513,11 @@ int fbp_detect_i2c(struct display_info_t const *di)
 	if (ret)
 		return 0;
 
-	ret = dm_i2c_probe(dev, di->addr, 0x0, &chip);
+	ret = dm_i2c_probe(dev, di->addr_num, 0x0, &chip);
 #else
 	ret = i2c_set_bus_num(di->bus_num);
 	if (ret == 0)
-		ret = i2c_probe(di->addr);
+		ret = i2c_probe(di->addr_num);
 #endif
 	if (di->bus_gp)
 		gpio_set_value(di->bus_gp, 0);
@@ -931,6 +931,9 @@ void fbp_enable_fb(struct display_info_t const *di, int enable)
 	u32 reg, cscmr2;
 	u32 tmp;
 #endif
+	if (di->enable_gp && !enable)
+		gpio_direction_output(di->enable_gp, enable ^
+			((di->fbflags & FBF_ENABLE_GPIOS_ACTIVE_LOW) ? 1 : 0));
 	switch (di->fbtype) {
 #ifdef CONFIG_IMX_HDMI
 	case FB_HDMI:
@@ -1011,6 +1014,9 @@ void fbp_enable_fb(struct display_info_t const *di, int enable)
 		board_enable_mipi(di, enable);
 		break;
 	}
+	if (di->enable_gp && enable)
+		gpio_direction_output(di->enable_gp, enable ^
+			((di->fbflags & FBF_ENABLE_GPIOS_ACTIVE_LOW) ? 1 : 0));
 }
 
 static void imx_prepare_display(void)
@@ -1082,6 +1088,7 @@ static struct flags_check fc2[] = {
 	{ 'b', FBF_BKLIT_LOW_ACTIVE},
 	{ 'P', FBF_PINCTRL},
 	{ 'l', FBF_ENABLE_GPIOS_ACTIVE_LOW},
+	{ 'd', FBF_ENABLE_GPIOS_DTB},
 	{ 's', FBF_MODE_SKIP_EOT},
 	{ 'v', FBF_MODE_VIDEO},
 	{ 'B', FBF_MODE_VIDEO_BURST},
@@ -1398,8 +1405,8 @@ static void str_mode(char *p, int size, const struct display_info_t *di, unsigne
 		*p++ = 'e';
 		size--;
 	}
-	if (di->bus_num || di->addr || di->bus_gp) {
-		count = snprintf(p, size, "x%x,%x", di->bus_num, di->addr);
+	if (di->bus_num || di->addr_num || di->bus_gp) {
+		count = snprintf(p, size, "x%x,%x", di->bus_num, di->addr_num);
 		if (size > count) {
 			p += count;
 			size -= count;