summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Bauer <anders.bauer@stericsson.com>2011-05-17 15:22:59 +0200
committersaid m bagheri <ebgheri@steludxu2848.(none)>2011-06-17 13:42:12 +0200
commit757d98bacef2f7f4c8e32a923c8d6a8baf21f8e6 (patch)
treed940536843a9f37235b8031c9f284d8f8da17ecd
parent1817fafcccd5412d61c91bc4f867261e1587058d (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.h4
-rw-r--r--drivers/video/mcde/mcde_hw.c63
-rw-r--r--include/video/mcde.h3
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);