Commit ad95dc86 authored by Brian Norris's avatar Brian Norris Committed by Archit Taneja

drm/bridge/synopsys: dsi: use common mipi_dsi_create_packet()

This takes care of 2 TODOs in this driver, by using the common DSI
packet-marshalling code instead of our custom short/long write code.
This both saves us some duplicated code and gets us free support for
command types that weren't already part of our switch block (e.g.,
MIPI_DSI_GENERIC_LONG_WRITE).

The code logic stays mostly intact, except that it becomes unnecessary
to split the short/long write functions, and we have to copy data a bit
more.

Along the way, I noticed that loop bounds were a little odd:

	while (DIV_ROUND_UP(len, pld_data_bytes))

This really was just supposed to be 'len != 0', so I made that more
clear.

Tested on RK3399 with some pending refactoring patches by Nickey Yang,
to make the Rockchip DSI driver wrap this common driver.
Signed-off-by: default avatarBrian Norris <briannorris@chromium.org>
Reviewed-by: default avatarPhilippe Cornu <philippe.cornu@st.com>
Tested-by: default avatarPhilippe Cornu <philippe.cornu@st.com>
Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20180109203248.139249-1-briannorris@chromium.org
parent 552de1bf
...@@ -136,10 +136,6 @@ ...@@ -136,10 +136,6 @@
GEN_SW_0P_TX_LP) GEN_SW_0P_TX_LP)
#define DSI_GEN_HDR 0x6c #define DSI_GEN_HDR 0x6c
/* TODO These 2 defines will be reworked thanks to mipi_dsi_create_packet() */
#define GEN_HDATA(data) (((data) & 0xffff) << 8)
#define GEN_HTYPE(type) (((type) & 0xff) << 0)
#define DSI_GEN_PLD_DATA 0x70 #define DSI_GEN_PLD_DATA 0x70
#define DSI_CMD_PKT_STATUS 0x74 #define DSI_CMD_PKT_STATUS 0x74
...@@ -359,44 +355,15 @@ static int dw_mipi_dsi_gen_pkt_hdr_write(struct dw_mipi_dsi *dsi, u32 hdr_val) ...@@ -359,44 +355,15 @@ static int dw_mipi_dsi_gen_pkt_hdr_write(struct dw_mipi_dsi *dsi, u32 hdr_val)
return 0; return 0;
} }
static int dw_mipi_dsi_dcs_short_write(struct dw_mipi_dsi *dsi, static int dw_mipi_dsi_write(struct dw_mipi_dsi *dsi,
const struct mipi_dsi_msg *msg) const struct mipi_dsi_packet *packet)
{
const u8 *tx_buf = msg->tx_buf;
u16 data = 0;
u32 val;
if (msg->tx_len > 0)
data |= tx_buf[0];
if (msg->tx_len > 1)
data |= tx_buf[1] << 8;
if (msg->tx_len > 2) {
dev_err(dsi->dev, "too long tx buf length %zu for short write\n",
msg->tx_len);
return -EINVAL;
}
val = GEN_HDATA(data) | GEN_HTYPE(msg->type);
return dw_mipi_dsi_gen_pkt_hdr_write(dsi, val);
}
static int dw_mipi_dsi_dcs_long_write(struct dw_mipi_dsi *dsi,
const struct mipi_dsi_msg *msg)
{ {
const u8 *tx_buf = msg->tx_buf; const u8 *tx_buf = packet->payload;
int len = msg->tx_len, pld_data_bytes = sizeof(u32), ret; int len = packet->payload_length, pld_data_bytes = sizeof(u32), ret;
u32 hdr_val = GEN_HDATA(msg->tx_len) | GEN_HTYPE(msg->type);
u32 remainder; u32 remainder;
u32 val; u32 val;
if (msg->tx_len < 3) { while (len) {
dev_err(dsi->dev, "wrong tx buf length %zu for long write\n",
msg->tx_len);
return -EINVAL;
}
while (DIV_ROUND_UP(len, pld_data_bytes)) {
if (len < pld_data_bytes) { if (len < pld_data_bytes) {
remainder = 0; remainder = 0;
memcpy(&remainder, tx_buf, len); memcpy(&remainder, tx_buf, len);
...@@ -419,40 +386,27 @@ static int dw_mipi_dsi_dcs_long_write(struct dw_mipi_dsi *dsi, ...@@ -419,40 +386,27 @@ static int dw_mipi_dsi_dcs_long_write(struct dw_mipi_dsi *dsi,
} }
} }
return dw_mipi_dsi_gen_pkt_hdr_write(dsi, hdr_val); remainder = 0;
memcpy(&remainder, packet->header, sizeof(packet->header));
return dw_mipi_dsi_gen_pkt_hdr_write(dsi, remainder);
} }
static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host, static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host,
const struct mipi_dsi_msg *msg) const struct mipi_dsi_msg *msg)
{ {
struct dw_mipi_dsi *dsi = host_to_dsi(host); struct dw_mipi_dsi *dsi = host_to_dsi(host);
struct mipi_dsi_packet packet;
int ret; int ret;
/* ret = mipi_dsi_create_packet(&packet, msg);
* TODO dw drv improvements if (ret) {
* use mipi_dsi_create_packet() instead of all following dev_err(dsi->dev, "failed to create packet: %d\n", ret);
* functions and code (no switch cases, no return ret;
* dw_mipi_dsi_dcs_short_write(), only the loop in long_write...)
* and use packet.header...
*/
dw_mipi_message_config(dsi, msg);
switch (msg->type) {
case MIPI_DSI_DCS_SHORT_WRITE:
case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
case MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE:
ret = dw_mipi_dsi_dcs_short_write(dsi, msg);
break;
case MIPI_DSI_DCS_LONG_WRITE:
ret = dw_mipi_dsi_dcs_long_write(dsi, msg);
break;
default:
dev_err(dsi->dev, "unsupported message type 0x%02x\n",
msg->type);
ret = -EINVAL;
} }
return ret; dw_mipi_message_config(dsi, msg);
return dw_mipi_dsi_write(dsi, &packet);
} }
static const struct mipi_dsi_host_ops dw_mipi_dsi_host_ops = { static const struct mipi_dsi_host_ops dw_mipi_dsi_host_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment