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;