| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <console/console.h> |
| #include <delay.h> |
| #include <mipi/panel.h> |
| #include <types.h> |
| |
| enum cb_err mipi_panel_parse_init_commands(const void *buf, mipi_cmd_func_t cmd_func) |
| { |
| const struct panel_init_command *init = buf; |
| enum mipi_dsi_transaction type; |
| |
| /* |
| * The given commands should be in a buffer containing a packed array of |
| * panel_init_command and each element may be in variable size so we have |
| * to parse and scan. |
| */ |
| |
| for (; init->cmd != PANEL_CMD_END; init = (const void *)buf) { |
| /* |
| * For some commands like DELAY, the init->len should not be |
| * counted for buf. |
| */ |
| buf += sizeof(*init); |
| |
| u32 cmd = init->cmd, len = init->len; |
| |
| if (cmd == PANEL_CMD_DELAY) { |
| mdelay(len); |
| continue; |
| } |
| |
| switch (cmd) { |
| case PANEL_CMD_DCS: |
| switch (len) { |
| case 0: |
| printk(BIOS_ERR, "%s: DCS command length 0?\n", __func__); |
| return CB_ERR; |
| case 1: |
| type = MIPI_DSI_DCS_SHORT_WRITE; |
| break; |
| case 2: |
| type = MIPI_DSI_DCS_SHORT_WRITE_PARAM; |
| break; |
| default: |
| type = MIPI_DSI_DCS_LONG_WRITE; |
| break; |
| } |
| break; |
| case PANEL_CMD_GENERIC: |
| switch (len) { |
| case 0: |
| type = MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM; |
| break; |
| case 1: |
| type = MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM; |
| break; |
| case 2: |
| type = MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM; |
| break; |
| default: |
| type = MIPI_DSI_GENERIC_LONG_WRITE; |
| break; |
| } |
| break; |
| default: |
| printk(BIOS_ERR, "%s: Unknown command code: %d, " |
| "abort panel initialization.\n", __func__, cmd); |
| return CB_ERR; |
| } |
| |
| enum cb_err ret = cmd_func(type, init->data, len); |
| if (ret != CB_SUCCESS) |
| return ret; |
| buf += len; |
| } |
| |
| return CB_SUCCESS; |
| } |