diff options
author | Anders Bauer <anders.bauer@stericsson.com> | 2011-05-17 15:22:59 +0200 |
---|---|---|
committer | said m bagheri <ebgheri@steludxu2848.(none)> | 2011-06-17 13:42:12 +0200 |
commit | 757d98bacef2f7f4c8e32a923c8d6a8baf21f8e6 (patch) | |
tree | d940536843a9f37235b8031c9f284d8f8da17ecd | |
parent | 1817fafcccd5412d61c91bc4f867261e1587058d (diff) |
video: mcde: add support for generic write commands
This patch adds function mcde_dsi_generic_write, used for
sending generic write commands to DSI display.
ST-Ericsson ID: 334291
ST-Ericsson FOSS-OUT ID: Trivial
ST-Ericsson Linux next: Not tested, ER 282779
Change-Id: I9c0bb3135321b7ab27067dc9d85a048bdce90f85
Signed-off-by: Anders Bauer <anders.bauer@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/23218
Reviewed-by: Per PERSSON <per.xb.persson@stericsson.com>
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
-rw-r--r-- | drivers/video/mcde/dsilink_regs.h | 4 | ||||
-rw-r--r-- | drivers/video/mcde/mcde_hw.c | 63 | ||||
-rw-r--r-- | include/video/mcde.h | 3 |
3 files changed, 53 insertions, 17 deletions
diff --git a/drivers/video/mcde/dsilink_regs.h b/drivers/video/mcde/dsilink_regs.h index 102d4fb0a56..2322041ffec 100644 --- a/drivers/video/mcde/dsilink_regs.h +++ b/drivers/video/mcde/dsilink_regs.h @@ -466,6 +466,10 @@ DSI_VAL2REG(DSI_DIRECT_CMD_MAIN_SETTINGS, CMD_LONGNOTSHORT, __x) #define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_SHIFT 8 #define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_MASK 0x00003F00 +#define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_GENERIC_SHORT_WRITE_0 3 +#define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_GENERIC_SHORT_WRITE_1 19 +#define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_GENERIC_SHORT_WRITE_2 35 +#define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_GENERIC_LONG_WRITE 41 #define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_DCS_SHORT_WRITE_0 5 #define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_DCS_SHORT_WRITE_1 21 #define DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_DCS_LONG_WRITE 57 diff --git a/drivers/video/mcde/mcde_hw.c b/drivers/video/mcde/mcde_hw.c index e2551075fe2..93ee5c422d0 100644 --- a/drivers/video/mcde/mcde_hw.c +++ b/drivers/video/mcde/mcde_hw.c @@ -2106,7 +2106,8 @@ static int enable_mcde_hw(void) } /* DSI */ -int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) +static int mcde_dsi_direct_cmd_write(struct mcde_chnl_state *chnl, + bool dcs, u8 cmd, u8 *data, int len) { int i; u32 wrdat[4] = { 0, 0, 0, 0 }; @@ -2116,9 +2117,8 @@ int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) u32 ok; u32 error; - /* REVIEW: One command at a time */ - /* REVIEW: Allow read/write on unreserved ports */ - if (len > MCDE_MAX_DCS_WRITE || chnl->port.type != MCDE_PORTTYPE_DSI) + if (len > MCDE_MAX_DSI_DIRECT_CMD_WRITE || + chnl->port.type != MCDE_PORTTYPE_DSI) return -EINVAL; mutex_lock(&mcde_hw_lock); @@ -2145,24 +2145,45 @@ int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) } } - wrdat[0] = cmd; - for (i = 1; i <= len; i++) - wrdat[i>>2] |= ((u32)data[i-1] << ((i & 3) * 8)); + if (dcs) { + wrdat[0] = cmd; + for (i = 1; i <= len; i++) + wrdat[i>>2] |= ((u32)data[i-1] << ((i & 3) * 8)); + } else { + /* no explicit cmd byte for generic_write, only params */ + for (i = 0; i < len; i++) + wrdat[i>>2] |= ((u32)data[i] << ((i & 3) * 8)); + } settings = DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_NAT_ENUM(WRITE) | DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_LONGNOTSHORT(len > 1) | DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_ID(virt_id) | DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_SIZE(len+1) | DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_LP_EN(true); - if (len == 0) - settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( - DCS_SHORT_WRITE_0); - else if (len == 1) - settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( - DCS_SHORT_WRITE_1); - else - settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( - DCS_LONG_WRITE); + if (dcs) { + if (len == 0) + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + DCS_SHORT_WRITE_0); + else if (len == 1) + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + DCS_SHORT_WRITE_1); + else + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + DCS_LONG_WRITE); + } else { + if (len == 0) + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + GENERIC_SHORT_WRITE_0); + else if (len == 1) + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + GENERIC_SHORT_WRITE_1); + else if (len == 2) + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + GENERIC_SHORT_WRITE_2); + else + settings |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_ENUM( + GENERIC_LONG_WRITE); + } dsi_wreg(link, DSI_DIRECT_CMD_MAIN_SETTINGS, settings); dsi_wreg(link, DSI_DIRECT_CMD_WRDAT0, wrdat[0]); @@ -2190,6 +2211,16 @@ int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) return 0; } +int mcde_dsi_generic_write(struct mcde_chnl_state *chnl, u8* para, int len) +{ + return mcde_dsi_direct_cmd_write(chnl, false, 0, para, len); +} + +int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) +{ + return mcde_dsi_direct_cmd_write(chnl, true, cmd, data, len); +} + int mcde_dsi_dcs_read(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int *len) { int ret = 0; diff --git a/include/video/mcde.h b/include/video/mcde.h index 97eeef01c19..213f33e43fe 100644 --- a/include/video/mcde.h +++ b/include/video/mcde.h @@ -409,8 +409,9 @@ void mcde_ovly_put(struct mcde_ovly_state *ovly); #define DCS_CMD_WRITE_START 0x2C #define MCDE_MAX_DCS_READ 4 -#define MCDE_MAX_DCS_WRITE 15 +#define MCDE_MAX_DSI_DIRECT_CMD_WRITE 15 +int mcde_dsi_generic_write(struct mcde_chnl_state *chnl, u8* para, int len); int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len); int mcde_dsi_dcs_read(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int *len); |