aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_mipi_dsi.c89
-rw-r--r--include/drm/drm_mipi_dsi.h6
2 files changed, 95 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c
index 60177a3e16be..dcc15e161816 100644
--- a/drivers/gpu/drm/drm_mipi_dsi.c
+++ b/drivers/gpu/drm/drm_mipi_dsi.c
@@ -357,6 +357,95 @@ int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
357EXPORT_SYMBOL(mipi_dsi_set_maximum_return_packet_size); 357EXPORT_SYMBOL(mipi_dsi_set_maximum_return_packet_size);
358 358
359/** 359/**
360 * mipi_dsi_generic_write() - transmit data using a generic write packet
361 * @dsi: DSI peripheral device
362 * @payload: buffer containing the payload
363 * @size: size of payload buffer
364 *
365 * This function will automatically choose the right data type depending on
366 * the payload length.
367 *
368 * Return: The number of bytes transmitted on success or a negative error code
369 * on failure.
370 */
371ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload,
372 size_t size)
373{
374 struct mipi_dsi_msg msg = {
375 .channel = dsi->channel,
376 .tx_buf = payload,
377 .tx_len = size
378 };
379
380 switch (size) {
381 case 0:
382 msg.type = MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM;
383 break;
384
385 case 1:
386 msg.type = MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM;
387 break;
388
389 case 2:
390 msg.type = MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM;
391 break;
392
393 default:
394 msg.type = MIPI_DSI_GENERIC_LONG_WRITE;
395 break;
396 }
397
398 return mipi_dsi_device_transfer(dsi, &msg);
399}
400EXPORT_SYMBOL(mipi_dsi_generic_write);
401
402/**
403 * mipi_dsi_generic_read() - receive data using a generic read packet
404 * @dsi: DSI peripheral device
405 * @params: buffer containing the request parameters
406 * @num_params: number of request parameters
407 * @data: buffer in which to return the received data
408 * @size: size of receive buffer
409 *
410 * This function will automatically choose the right data type depending on
411 * the number of parameters passed in.
412 *
413 * Return: The number of bytes successfully read or a negative error code on
414 * failure.
415 */
416ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params,
417 size_t num_params, void *data, size_t size)
418{
419 struct mipi_dsi_msg msg = {
420 .channel = dsi->channel,
421 .tx_len = num_params,
422 .tx_buf = params,
423 .rx_len = size,
424 .rx_buf = data
425 };
426
427 switch (num_params) {
428 case 0:
429 msg.type = MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM;
430 break;
431
432 case 1:
433 msg.type = MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM;
434 break;
435
436 case 2:
437 msg.type = MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM;
438 break;
439
440 default:
441 return -EINVAL;
442 }
443
444 return mipi_dsi_device_transfer(dsi, &msg);
445}
446EXPORT_SYMBOL(mipi_dsi_generic_read);
447
448/**
360 * mipi_dsi_dcs_write_buffer() - transmit a DCS command with payload 449 * mipi_dsi_dcs_write_buffer() - transmit a DCS command with payload
361 * @dsi: DSI peripheral device 450 * @dsi: DSI peripheral device
362 * @data: buffer containing data to be transmitted 451 * @data: buffer containing data to be transmitted
diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h
index 4a4e9d7ccc16..524655509cf1 100644
--- a/include/drm/drm_mipi_dsi.h
+++ b/include/drm/drm_mipi_dsi.h
@@ -155,6 +155,12 @@ int mipi_dsi_attach(struct mipi_dsi_device *dsi);
155int mipi_dsi_detach(struct mipi_dsi_device *dsi); 155int mipi_dsi_detach(struct mipi_dsi_device *dsi);
156int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi, 156int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
157 u16 value); 157 u16 value);
158
159ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload,
160 size_t size);
161ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params,
162 size_t num_params, void *data, size_t size);
163
158ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi, 164ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
159 const void *data, size_t len); 165 const void *data, size_t len);
160ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd, 166ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,