diff options
-rw-r--r-- | src/mainboard/google/kukui/panel.h | 27 | ||||
-rw-r--r-- | src/soc/mediatek/common/dsi.c | 23 | ||||
-rw-r--r-- | src/soc/mediatek/common/include/soc/dsi_common.h | 8 |
3 files changed, 36 insertions, 22 deletions
diff --git a/src/mainboard/google/kukui/panel.h b/src/mainboard/google/kukui/panel.h index e68567ddd4..321e3662a3 100644 --- a/src/mainboard/google/kukui/panel.h +++ b/src/mainboard/google/kukui/panel.h @@ -23,27 +23,28 @@ struct panel_description { struct edid edid; /* edid info of this panel */ enum lb_fb_orientation orientation; /* panel orientation */ void (*power_on)(void); /* Callback to turn on panel */ - struct lcm_init_command init[]; /* table of init commands */ + u8 init[]; /* a packed array of lcm_init_command */ }; /* Returns the panel description from given ID. */ extern struct panel_description *get_panel_description(int panel_id); -#define INIT_DCS_CMD(...) { \ - .cmd = LCM_DCS_CMD, \ - .len = sizeof((u8[]){__VA_ARGS__}), \ - .data = {__VA_ARGS__} } +#define INIT_DCS_CMD(...) \ + LCM_DCS_CMD, \ + sizeof((u8[]){__VA_ARGS__}), \ + __VA_ARGS__ -#define INIT_GENERIC_CMD(...) { \ - .cmd = LCM_GENERIC_CMD, \ - .len = sizeof((u8[]){__VA_ARGS__}), \ - .data = {__VA_ARGS__} } +#define INIT_GENERIC_CMD(...) \ + LCM_GENERIC_CMD, \ + sizeof((u8[]){__VA_ARGS__}), \ + __VA_ARGS__ -#define INIT_DELAY_CMD(delay) { \ - .cmd = LCM_DELAY_CMD,\ - .len = delay, } +#define INIT_DELAY_CMD(delay) \ + LCM_DELAY_CMD, \ + delay -#define INIT_END_CMD { .cmd = LCM_END_CMD, } +#define INIT_END_CMD \ + LCM_END_CMD /* GPIO names */ #define GPIO_LCM_RST_1V8 GPIO(LCM_RST) /* 45 */ diff --git a/src/soc/mediatek/common/dsi.c b/src/soc/mediatek/common/dsi.c index 166bc17eee..679bec8d75 100644 --- a/src/soc/mediatek/common/dsi.c +++ b/src/soc/mediatek/common/dsi.c @@ -321,12 +321,25 @@ static void mtk_dsi_cmdq(const u8 *data, u8 len, u32 type) } } -static void mtk_dsi_send_init_commands(const struct lcm_init_command *init) +static void mtk_dsi_send_init_commands(const u8 *buf) { - if (!init) + if (!buf) return; + const struct lcm_init_command *init = (const void *)buf; + + /* + * The given commands should be in a buffer containing a packed array of + * lcm_init_command and each element may be in variable size so we have + * to parse and scan. + */ + + for (; init->cmd != LCM_END_CMD; init = (const void *)buf) { + /* + * For some commands like DELAY, the init->len should not be + * counted for buf. + */ + buf += sizeof(*init); - for (; init->cmd != LCM_END_CMD; init++) { u32 cmd = init->cmd, len = init->len; u32 type; @@ -374,13 +387,13 @@ static void mtk_dsi_send_init_commands(const struct lcm_init_command *init) return; } - assert(len <= sizeof(init->data)); + buf += len; mtk_dsi_cmdq(init->data, len, type); } } int mtk_dsi_init(u32 mode_flags, u32 format, u32 lanes, const struct edid *edid, - const struct lcm_init_command *init_commands) + const u8 *init_commands) { int data_rate; u32 bits_per_pixel = mtk_dsi_get_bits_per_pixel(format); diff --git a/src/soc/mediatek/common/include/soc/dsi_common.h b/src/soc/mediatek/common/include/soc/dsi_common.h index c684aaf940..9a00d1d149 100644 --- a/src/soc/mediatek/common/include/soc/dsi_common.h +++ b/src/soc/mediatek/common/include/soc/dsi_common.h @@ -350,9 +350,9 @@ struct mtk_phy_timing { #define LCM_DCS_CMD 3 struct lcm_init_command { - u16 cmd; - u16 len; - u8 data[8]; + u8 cmd; + u8 len; + u8 data[]; }; /* Functions that each SOC should provide. */ @@ -365,6 +365,6 @@ void mtk_dsi_override_phy_timing(struct mtk_phy_timing *timing); /* Public API provided in common/dsi.c */ int mtk_dsi_bpp_from_format(u32 format); int mtk_dsi_init(u32 mode_flags, u32 format, u32 lanes, const struct edid *edid, - const struct lcm_init_command *init_commands); + const u8 *init_commands); #endif /* SOC_MEDIATEK_DSI_COMMON_H */ |