Hi Sebastian,
Thank you for the patch.
On Tue, Feb 25, 2020 at 12:20:42AM +0100, Sebastian Reichel wrote:
Simplify the read related message handling by using the functionality provided by CONFIG_DRM_MIPI_DSI.
Signed-off-by: Sebastian Reichel sebastian.reichel@collabora.com
drivers/gpu/drm/omapdrm/dss/dsi.c | 109 +++++++++--------------------- 1 file changed, 33 insertions(+), 76 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c index e5589e615808..9b5b078beb6d 100644 --- a/drivers/gpu/drm/omapdrm/dss/dsi.c +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c @@ -2741,60 +2741,6 @@ static int dsi_vc_write_common(struct omap_dss_device *dssdev, return 0; }
-static int dsi_vc_dcs_send_read_request(struct dsi_data *dsi, int channel,
u8 dcs_cmd)
-{
- int r;
- if (dsi->debug_read)
DSSDBG("dsi_vc_dcs_send_read_request(ch%d, dcs_cmd %x)\n",
channel, dcs_cmd);
Do you plan to drop debug_read ? I don't really mind, but it can have its uses. If this wasn't done on purpose, you may want to move those messages to dsi_vc_dcs_read() and dsi_vc_generic_read().
- r = dsi_vc_send_short(dsi, channel, MIPI_DSI_DCS_READ, dcs_cmd, 0);
- if (r) {
DSSERR("dsi_vc_dcs_send_read_request(ch %d, cmd 0x%02x)"
" failed\n", channel, dcs_cmd);
return r;
- }
- return 0;
-}
-static int dsi_vc_generic_send_read_request(struct dsi_data *dsi, int channel,
const u8 *reqdata, int reqlen)
-{
- u16 data;
- u8 data_type;
- int r;
- if (dsi->debug_read)
DSSDBG("dsi_vc_generic_send_read_request(ch %d, reqlen %d)\n",
channel, reqlen);
- if (reqlen == 0) {
data_type = MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM;
data = 0;
- } else if (reqlen == 1) {
data_type = MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM;
data = reqdata[0];
- } else if (reqlen == 2) {
data_type = MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM;
data = reqdata[0] | (reqdata[1] << 8);
- } else {
BUG();
return -EINVAL;
- }
- r = dsi_vc_send_short(dsi, channel, data_type, data, 0);
- if (r) {
DSSERR("dsi_vc_generic_send_read_request(ch %d, reqlen %d)"
" failed\n", channel, reqlen);
return r;
- }
- return 0;
-}
static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, int buflen, enum dss_dsi_content_type type) { @@ -2903,61 +2849,75 @@ static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, return r; }
-static int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
u8 *buf, int buflen)
+static int dsi_vc_dcs_read(struct omap_dss_device *dssdev,
const struct mipi_dsi_msg *msg)
{ struct dsi_data *dsi = to_dsi_data(dssdev); int r;
- u8 dcs_cmd = ((u8*) msg->tx_buf)[0];
Nitpicking, dcs_cmd before r ?
- r = dsi_vc_dcs_send_read_request(dsi, channel, dcs_cmd);
- r = dsi_vc_send_short(dsi, msg->channel, MIPI_DSI_DCS_READ, dcs_cmd, 0); if (r) goto err;
- r = dsi_vc_send_bta_sync(dssdev, channel);
- r = dsi_vc_send_bta_sync(dssdev, msg->channel); if (r) goto err;
- r = dsi_vc_read_rx_fifo(dsi, channel, buf, buflen,
- r = dsi_vc_read_rx_fifo(dsi, msg->channel, msg->rx_buf, msg->rx_len, DSS_DSI_CONTENT_DCS); if (r < 0) goto err;
- if (r != buflen) {
if (r != msg->rx_len) { r = -EIO; goto err; }
return 0;
err:
- DSSERR("dsi_vc_dcs_read(ch %d, cmd 0x%02x) failed\n", channel, dcs_cmd);
- DSSERR("dsi_vc_dcs_read(ch %d, cmd 0x%02x) failed\n",
return r;msg->channel, dcs_cmd);
}
-static int dsi_vc_generic_read(struct omap_dss_device *dssdev, int channel,
const u8 *reqdata, int reqlen, u8 *buf, int buflen)
+static int dsi_vc_generic_read(struct omap_dss_device *dssdev,
const struct mipi_dsi_msg *msg)
{ struct dsi_data *dsi = to_dsi_data(dssdev);
- struct mipi_dsi_packet packet;
- u16 data; int r;
- r = dsi_vc_generic_send_read_request(dsi, channel, reqdata, reqlen);
- r = mipi_dsi_create_packet(&packet, msg);
- if (r < 0)
goto err;
- data = packet.header[1] | (packet.header[2] << 8);
As with the previous patch, I think you can compute data manually if the only use of the packet structure is to get this information.
- r = dsi_vc_send_short(dsi, msg->channel, msg->type, data, 0); if (r)
return r;
goto err;
- r = dsi_vc_send_bta_sync(dssdev, channel);
- r = dsi_vc_send_bta_sync(dssdev, msg->channel); if (r)
return r;
goto err;
- r = dsi_vc_read_rx_fifo(dsi, channel, buf, buflen,
- r = dsi_vc_read_rx_fifo(dsi, msg->channel, msg->rx_buf, msg->rx_len, DSS_DSI_CONTENT_GENERIC); if (r < 0)
return r;
goto err;
- if (r != buflen) {
- if (r != msg->rx_len) { r = -EIO;
return r;
goto err;
}
return 0;
+err:
- DSSERR("dsi_vc_generic_read(ch %d, reqlen %d) failed\n",
msg->channel, msg->tx_len);
- return r;
}
static int dsi_enter_ulps(struct dsi_data *dsi) @@ -4768,12 +4728,9 @@ static ssize_t omap_dsi_transfer(struct omap_dss_device *dssdev, case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM: case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM: case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
return dsi_vc_generic_read(dssdev, msg->channel, msg->tx_buf,
msg->tx_len, msg->rx_buf, msg->rx_len);
case MIPI_DSI_DCS_READ:return dsi_vc_generic_read(dssdev, msg);
return dsi_vc_dcs_read(dssdev, msg->channel,
((u8*) msg->tx_buf)[0],
msg->rx_buf, msg->rx_len);
return dsi_vc_dcs_read(dssdev, msg);
}
return -EINVAL;