• Home
  • Raw
  • Download

Lines Matching full:mipi

2  * MIPI Display Bus Interface (DBI) LCD controller support
13 #include <drm/tinydrm/mipi-dbi.h>
35 * This library provides helpers for MIPI Display Bus Interface (DBI)
38 * Many controllers for tiny lcd displays are MIPI compliant and can use this
41 * MIPI compliant.
43 * Only MIPI Type 1 displays are supported since a full frame memory is needed.
45 * There are 3 MIPI DBI implementation types:
95 static bool mipi_dbi_command_is_read(struct mipi_dbi *mipi, u8 cmd) in mipi_dbi_command_is_read() argument
99 if (!mipi->read_commands) in mipi_dbi_command_is_read()
103 if (!mipi->read_commands[i]) in mipi_dbi_command_is_read()
105 if (cmd == mipi->read_commands[i]) in mipi_dbi_command_is_read()
113 * mipi_dbi_command_read - MIPI DCS read command
114 * @mipi: MIPI structure
118 * Send MIPI DCS read command to the controller.
123 int mipi_dbi_command_read(struct mipi_dbi *mipi, u8 cmd, u8 *val) in mipi_dbi_command_read() argument
125 if (!mipi->read_commands) in mipi_dbi_command_read()
128 if (!mipi_dbi_command_is_read(mipi, cmd)) in mipi_dbi_command_read()
131 return mipi_dbi_command_buf(mipi, cmd, val, 1); in mipi_dbi_command_read()
136 * mipi_dbi_command_buf - MIPI DCS command with parameter(s) in an array
137 * @mipi: MIPI structure
145 int mipi_dbi_command_buf(struct mipi_dbi *mipi, u8 cmd, u8 *data, size_t len) in mipi_dbi_command_buf() argument
155 mutex_lock(&mipi->cmdlock); in mipi_dbi_command_buf()
156 ret = mipi->command(mipi, cmdbuf, data, len); in mipi_dbi_command_buf()
157 mutex_unlock(&mipi->cmdlock); in mipi_dbi_command_buf()
166 int mipi_dbi_command_stackbuf(struct mipi_dbi *mipi, u8 cmd, u8 *data, size_t len) in mipi_dbi_command_stackbuf() argument
175 ret = mipi_dbi_command_buf(mipi, cmd, buf, len); in mipi_dbi_command_stackbuf()
241 struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev); in mipi_dbi_fb_dirty() local
242 bool swap = mipi->swap_bytes; in mipi_dbi_fb_dirty()
248 if (!mipi->enabled) in mipi_dbi_fb_dirty()
257 if (!mipi->dc || !full || swap || in mipi_dbi_fb_dirty()
259 tr = mipi->tx_buf; in mipi_dbi_fb_dirty()
260 ret = mipi_dbi_buf_copy(mipi->tx_buf, fb, &clip, swap); in mipi_dbi_fb_dirty()
267 mipi_dbi_command(mipi, MIPI_DCS_SET_COLUMN_ADDRESS, in mipi_dbi_fb_dirty()
270 mipi_dbi_command(mipi, MIPI_DCS_SET_PAGE_ADDRESS, in mipi_dbi_fb_dirty()
274 ret = mipi_dbi_command_buf(mipi, MIPI_DCS_WRITE_MEMORY_START, tr, in mipi_dbi_fb_dirty()
287 * mipi_dbi_enable_flush - MIPI DBI enable helper
288 * @mipi: MIPI DBI structure
296 void mipi_dbi_enable_flush(struct mipi_dbi *mipi, in mipi_dbi_enable_flush() argument
300 struct tinydrm_device *tdev = &mipi->tinydrm; in mipi_dbi_enable_flush()
303 mipi->enabled = true; in mipi_dbi_enable_flush()
307 backlight_enable(mipi->backlight); in mipi_dbi_enable_flush()
311 static void mipi_dbi_blank(struct mipi_dbi *mipi) in mipi_dbi_blank() argument
313 struct drm_device *drm = mipi->tinydrm.drm; in mipi_dbi_blank()
318 memset(mipi->tx_buf, 0, len); in mipi_dbi_blank()
320 mipi_dbi_command(mipi, MIPI_DCS_SET_COLUMN_ADDRESS, 0, 0, in mipi_dbi_blank()
322 mipi_dbi_command(mipi, MIPI_DCS_SET_PAGE_ADDRESS, 0, 0, in mipi_dbi_blank()
324 mipi_dbi_command_buf(mipi, MIPI_DCS_WRITE_MEMORY_START, in mipi_dbi_blank()
325 (u8 *)mipi->tx_buf, len); in mipi_dbi_blank()
329 * mipi_dbi_pipe_disable - MIPI DBI pipe disable helper
339 struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev); in mipi_dbi_pipe_disable() local
343 mipi->enabled = false; in mipi_dbi_pipe_disable()
345 if (mipi->backlight) in mipi_dbi_pipe_disable()
346 backlight_disable(mipi->backlight); in mipi_dbi_pipe_disable()
348 mipi_dbi_blank(mipi); in mipi_dbi_pipe_disable()
350 if (mipi->regulator) in mipi_dbi_pipe_disable()
351 regulator_disable(mipi->regulator); in mipi_dbi_pipe_disable()
361 * mipi_dbi_init - MIPI DBI initialization
363 * @mipi: &mipi_dbi structure to initialize
380 int mipi_dbi_init(struct device *dev, struct mipi_dbi *mipi, in mipi_dbi_init() argument
386 struct tinydrm_device *tdev = &mipi->tinydrm; in mipi_dbi_init()
389 if (!mipi->command) in mipi_dbi_init()
392 mutex_init(&mipi->cmdlock); in mipi_dbi_init()
394 mipi->tx_buf = devm_kmalloc(dev, bufsize, GFP_KERNEL); in mipi_dbi_init()
395 if (!mipi->tx_buf) in mipi_dbi_init()
414 mipi->rotation = rotation; in mipi_dbi_init()
427 * @mipi: MIPI DBI structure
431 void mipi_dbi_hw_reset(struct mipi_dbi *mipi) in mipi_dbi_hw_reset() argument
433 if (!mipi->reset) in mipi_dbi_hw_reset()
436 gpiod_set_value_cansleep(mipi->reset, 0); in mipi_dbi_hw_reset()
438 gpiod_set_value_cansleep(mipi->reset, 1); in mipi_dbi_hw_reset()
445 * @mipi: MIPI DBI structure
455 bool mipi_dbi_display_is_on(struct mipi_dbi *mipi) in mipi_dbi_display_is_on() argument
459 if (mipi_dbi_command_read(mipi, MIPI_DCS_GET_POWER_MODE, &val)) in mipi_dbi_display_is_on()
475 static int mipi_dbi_poweron_reset_conditional(struct mipi_dbi *mipi, bool cond) in mipi_dbi_poweron_reset_conditional() argument
477 struct device *dev = mipi->tinydrm.drm->dev; in mipi_dbi_poweron_reset_conditional()
480 if (mipi->regulator) { in mipi_dbi_poweron_reset_conditional()
481 ret = regulator_enable(mipi->regulator); in mipi_dbi_poweron_reset_conditional()
488 if (cond && mipi_dbi_display_is_on(mipi)) in mipi_dbi_poweron_reset_conditional()
491 mipi_dbi_hw_reset(mipi); in mipi_dbi_poweron_reset_conditional()
492 ret = mipi_dbi_command(mipi, MIPI_DCS_SOFT_RESET); in mipi_dbi_poweron_reset_conditional()
495 if (mipi->regulator) in mipi_dbi_poweron_reset_conditional()
496 regulator_disable(mipi->regulator); in mipi_dbi_poweron_reset_conditional()
502 * per MIPI DSC spec should wait 5ms after soft reset. If we didn't, in mipi_dbi_poweron_reset_conditional()
505 if (mipi->reset) in mipi_dbi_poweron_reset_conditional()
514 * mipi_dbi_poweron_reset - MIPI DBI poweron and reset
515 * @mipi: MIPI DBI structure
523 int mipi_dbi_poweron_reset(struct mipi_dbi *mipi) in mipi_dbi_poweron_reset() argument
525 return mipi_dbi_poweron_reset_conditional(mipi, false); in mipi_dbi_poweron_reset()
530 * mipi_dbi_poweron_conditional_reset - MIPI DBI poweron and conditional reset
531 * @mipi: MIPI DBI structure
541 int mipi_dbi_poweron_conditional_reset(struct mipi_dbi *mipi) in mipi_dbi_poweron_conditional_reset() argument
543 return mipi_dbi_poweron_reset_conditional(mipi, true); in mipi_dbi_poweron_conditional_reset()
568 * MIPI DBI Type C Option 1
585 static int mipi_dbi_spi1e_transfer(struct mipi_dbi *mipi, int dc, in mipi_dbi_spi1e_transfer() argument
590 size_t chunk, max_chunk = mipi->tx_buf9_len; in mipi_dbi_spi1e_transfer()
591 struct spi_device *spi = mipi->spi; in mipi_dbi_spi1e_transfer()
593 .tx_buf = mipi->tx_buf9, in mipi_dbi_spi1e_transfer()
613 dst = mipi->tx_buf9; in mipi_dbi_spi1e_transfer()
635 dst = mipi->tx_buf9; in mipi_dbi_spi1e_transfer()
706 static int mipi_dbi_spi1_transfer(struct mipi_dbi *mipi, int dc, in mipi_dbi_spi1_transfer() argument
710 struct spi_device *spi = mipi->spi; in mipi_dbi_spi1_transfer()
722 return mipi_dbi_spi1e_transfer(mipi, dc, buf, len, bpw); in mipi_dbi_spi1_transfer()
725 max_chunk = mipi->tx_buf9_len; in mipi_dbi_spi1_transfer()
726 dst16 = mipi->tx_buf9; in mipi_dbi_spi1_transfer()
770 static int mipi_dbi_typec1_command(struct mipi_dbi *mipi, u8 *cmd, in mipi_dbi_typec1_command() argument
776 if (mipi_dbi_command_is_read(mipi, *cmd)) in mipi_dbi_typec1_command()
781 ret = mipi_dbi_spi1_transfer(mipi, 0, cmd, 1, 8); in mipi_dbi_typec1_command()
785 return mipi_dbi_spi1_transfer(mipi, 1, parameters, num, bpw); in mipi_dbi_typec1_command()
788 /* MIPI DBI Type C Option 3 */
790 static int mipi_dbi_typec3_command_read(struct mipi_dbi *mipi, u8 *cmd, in mipi_dbi_typec3_command_read() argument
793 struct spi_device *spi = mipi->spi; in mipi_dbi_typec3_command_read()
830 gpiod_set_value_cansleep(mipi->dc, 0); in mipi_dbi_typec3_command_read()
856 static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 *cmd, in mipi_dbi_typec3_command() argument
859 struct spi_device *spi = mipi->spi; in mipi_dbi_typec3_command()
864 if (mipi_dbi_command_is_read(mipi, *cmd)) in mipi_dbi_typec3_command()
865 return mipi_dbi_typec3_command_read(mipi, cmd, par, num); in mipi_dbi_typec3_command()
869 gpiod_set_value_cansleep(mipi->dc, 0); in mipi_dbi_typec3_command()
875 if (*cmd == MIPI_DCS_WRITE_MEMORY_START && !mipi->swap_bytes) in mipi_dbi_typec3_command()
878 gpiod_set_value_cansleep(mipi->dc, 1); in mipi_dbi_typec3_command()
885 * mipi_dbi_spi_init - Initialize MIPI DBI SPI interfaced controller
887 * @mipi: &mipi_dbi structure to initialize
890 * This function sets &mipi_dbi->command, enables &mipi->read_commands for the
906 int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi, in mipi_dbi_spi_init() argument
936 mipi->spi = spi; in mipi_dbi_spi_init()
937 mipi->read_commands = mipi_dbi_dcs_read_commands; in mipi_dbi_spi_init()
940 mipi->command = mipi_dbi_typec3_command; in mipi_dbi_spi_init()
941 mipi->dc = dc; in mipi_dbi_spi_init()
944 mipi->swap_bytes = true; in mipi_dbi_spi_init()
946 mipi->command = mipi_dbi_typec1_command; in mipi_dbi_spi_init()
947 mipi->tx_buf9_len = tx_size; in mipi_dbi_spi_init()
948 mipi->tx_buf9 = devm_kmalloc(dev, tx_size, GFP_KERNEL); in mipi_dbi_spi_init()
949 if (!mipi->tx_buf9) in mipi_dbi_spi_init()
968 struct mipi_dbi *mipi = m->private; in mipi_dbi_debugfs_command_write() local
1008 ret = mipi_dbi_command_buf(mipi, cmd, parameters, i); in mipi_dbi_debugfs_command_write()
1018 struct mipi_dbi *mipi = m->private; in mipi_dbi_debugfs_command_show() local
1024 if (!mipi_dbi_command_is_read(mipi, cmd)) in mipi_dbi_debugfs_command_show()
1044 ret = mipi_dbi_command_buf(mipi, cmd, val, len); in mipi_dbi_debugfs_command_show()
1085 struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev); in mipi_dbi_debugfs_init() local
1088 if (mipi->read_commands) in mipi_dbi_debugfs_init()
1090 debugfs_create_file("command", mode, minor->debugfs_root, mipi, in mipi_dbi_debugfs_init()