drm: Add MIPI read_multi func and two write macros
Create mipi_dsi_dcs_read_multi(), which accepts a mipi_dsi_multi_context struct for improved error handling and cleaner panel driver code. Create mipi_dsi_dcs_write_var_seq_multi() and mipi_dsi_generic_write_var_seq_multi() macros which allow MIPI panel drivers to write non-constant data to display controllers. Reviewed-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Brigham Campbell <me@brighamcampbell.com> Signed-off-by: Douglas Anderson <dianders@chromium.org> Link: https://lore.kernel.org/r/20250731032343.1258366-3-me@brighamcampbell.compull/1354/merge
parent
0070851095
commit
ffc23a204a
|
|
@ -1096,6 +1096,43 @@ ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
|
|||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_read);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_read_multi() - mipi_dsi_dcs_read() w/ accum_err
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @cmd: DCS command
|
||||
* @data: buffer in which to receive data
|
||||
* @len: size of receive buffer
|
||||
*
|
||||
* Like mipi_dsi_dcs_read() but deals with errors in a way that makes it
|
||||
* convenient to make several calls in a row.
|
||||
*/
|
||||
void mipi_dsi_dcs_read_multi(struct mipi_dsi_multi_context *ctx, u8 cmd,
|
||||
void *data, size_t len)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = ctx->dsi;
|
||||
struct device *dev = &dsi->dev;
|
||||
struct mipi_dsi_msg msg = {
|
||||
.channel = dsi->channel,
|
||||
.type = MIPI_DSI_DCS_READ,
|
||||
.tx_buf = &cmd,
|
||||
.tx_len = 1,
|
||||
.rx_buf = data,
|
||||
.rx_len = len
|
||||
};
|
||||
ssize_t ret;
|
||||
|
||||
if (ctx->accum_err)
|
||||
return;
|
||||
|
||||
ret = mipi_dsi_device_transfer(dsi, &msg);
|
||||
if (ret < 0) {
|
||||
ctx->accum_err = ret;
|
||||
dev_err(dev, "dcs read with command %#x failed: %d\n", cmd,
|
||||
ctx->accum_err);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_dcs_read_multi);
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_nop() - send DCS nop packet
|
||||
* @dsi: DSI peripheral device
|
||||
|
|
|
|||
|
|
@ -342,6 +342,8 @@ ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
|
|||
const void *data, size_t len);
|
||||
ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
|
||||
size_t len);
|
||||
void mipi_dsi_dcs_read_multi(struct mipi_dsi_multi_context *ctx, u8 cmd,
|
||||
void *data, size_t len);
|
||||
int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi);
|
||||
int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi);
|
||||
int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device *dsi, u8 *mode);
|
||||
|
|
@ -403,6 +405,22 @@ void mipi_dsi_dcs_set_tear_off_multi(struct mipi_dsi_multi_context *ctx);
|
|||
mipi_dsi_generic_write_multi(ctx, d, ARRAY_SIZE(d)); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* mipi_dsi_generic_write_var_seq_multi - transmit non-constant data using a
|
||||
* generic write packet
|
||||
*
|
||||
* This macro will print errors for you and error handling is optimized for
|
||||
* callers that call this multiple times in a row.
|
||||
*
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @seq: buffer containing the payload
|
||||
*/
|
||||
#define mipi_dsi_generic_write_var_seq_multi(ctx, seq...) \
|
||||
do { \
|
||||
const u8 d[] = { seq }; \
|
||||
mipi_dsi_generic_write_multi(ctx, d, ARRAY_SIZE(d)); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_write_seq_multi - transmit a DCS command with payload
|
||||
*
|
||||
|
|
@ -419,6 +437,23 @@ void mipi_dsi_dcs_set_tear_off_multi(struct mipi_dsi_multi_context *ctx);
|
|||
mipi_dsi_dcs_write_buffer_multi(ctx, d, ARRAY_SIZE(d)); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* mipi_dsi_dcs_write_var_seq_multi - transmit a DCS command with non-constant
|
||||
* payload
|
||||
*
|
||||
* This macro will print errors for you and error handling is optimized for
|
||||
* callers that call this multiple times in a row.
|
||||
*
|
||||
* @ctx: Context for multiple DSI transactions
|
||||
* @cmd: Command
|
||||
* @seq: buffer containing data to be transmitted
|
||||
*/
|
||||
#define mipi_dsi_dcs_write_var_seq_multi(ctx, cmd, seq...) \
|
||||
do { \
|
||||
const u8 d[] = { cmd, seq }; \
|
||||
mipi_dsi_dcs_write_buffer_multi(ctx, d, ARRAY_SIZE(d)); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* mipi_dsi_dual - send the same MIPI DSI command to two interfaces
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue