^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2019, Huaqin Telecom Technology Co., Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Author: Jerry Han <jerry.han.hq@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/regulator/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <drm/drm_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <drm/drm_mipi_dsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <drm/drm_modes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <drm/drm_panel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <video/mipi_display.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct panel_cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) char cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) char data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct panel_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) const struct drm_display_mode *display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) unsigned int bpc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unsigned int width_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) unsigned int height_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) unsigned long mode_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) enum mipi_dsi_pixel_format format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) unsigned int lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) const struct panel_cmd *on_cmds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) unsigned int on_cmds_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct panel_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct drm_panel base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct mipi_dsi_device *link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) const struct panel_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct gpio_desc *enable_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct gpio_desc *pp33_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct gpio_desc *pp18_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) bool prepared;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) bool enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static inline struct panel_info *to_panel_info(struct drm_panel *panel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) return container_of(panel, struct panel_info, base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static void disable_gpios(struct panel_info *pinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) gpiod_set_value(pinfo->enable_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) gpiod_set_value(pinfo->pp33_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) gpiod_set_value(pinfo->pp18_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static int send_mipi_cmds(struct drm_panel *panel, const struct panel_cmd *cmds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct panel_info *pinfo = to_panel_info(panel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) unsigned int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) for (i = 0; i < pinfo->desc->on_cmds_num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) err = mipi_dsi_dcs_write_buffer(pinfo->link, &cmds[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) sizeof(struct panel_cmd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static int boe_panel_disable(struct drm_panel *panel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) struct panel_info *pinfo = to_panel_info(panel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) if (!pinfo->enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) err = mipi_dsi_dcs_set_display_off(pinfo->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) dev_err(panel->dev, "failed to set display off: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) pinfo->enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static int boe_panel_unprepare(struct drm_panel *panel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct panel_info *pinfo = to_panel_info(panel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) if (!pinfo->prepared)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) err = mipi_dsi_dcs_set_display_off(pinfo->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) dev_err(panel->dev, "failed to set display off: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) err = mipi_dsi_dcs_enter_sleep_mode(pinfo->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) dev_err(panel->dev, "failed to enter sleep mode: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* sleep_mode_delay: 1ms - 2ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) disable_gpios(pinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) pinfo->prepared = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) static int boe_panel_prepare(struct drm_panel *panel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) struct panel_info *pinfo = to_panel_info(panel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) if (pinfo->prepared)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) gpiod_set_value(pinfo->pp18_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* T1: 5ms - 6ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) usleep_range(5000, 6000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) gpiod_set_value(pinfo->pp33_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* reset sequence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* T2: 14ms - 15ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) usleep_range(14000, 15000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) gpiod_set_value(pinfo->enable_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* T3: 1ms - 2ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) gpiod_set_value(pinfo->enable_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* T4: 1ms - 2ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) gpiod_set_value(pinfo->enable_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* T5: 5ms - 6ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) usleep_range(5000, 6000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* send init code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) err = send_mipi_cmds(panel, pinfo->desc->on_cmds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) dev_err(panel->dev, "failed to send DCS Init Code: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) goto poweroff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) err = mipi_dsi_dcs_exit_sleep_mode(pinfo->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) dev_err(panel->dev, "failed to exit sleep mode: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) goto poweroff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) /* T6: 120ms - 121ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) usleep_range(120000, 121000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) err = mipi_dsi_dcs_set_display_on(pinfo->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) dev_err(panel->dev, "failed to set display on: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) goto poweroff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* T7: 20ms - 21ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) usleep_range(20000, 21000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) pinfo->prepared = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) poweroff:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) disable_gpios(pinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static int boe_panel_enable(struct drm_panel *panel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct panel_info *pinfo = to_panel_info(panel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if (pinfo->enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) usleep_range(120000, 121000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) ret = mipi_dsi_dcs_set_display_on(pinfo->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) dev_err(panel->dev, "failed to set display on: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) pinfo->enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static int boe_panel_get_modes(struct drm_panel *panel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct drm_connector *connector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct panel_info *pinfo = to_panel_info(panel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) const struct drm_display_mode *m = pinfo->desc->display_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct drm_display_mode *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) mode = drm_mode_duplicate(connector->dev, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) if (!mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) dev_err(pinfo->base.dev, "failed to add mode %ux%u@%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) m->hdisplay, m->vdisplay, drm_mode_vrefresh(m));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) drm_mode_set_name(mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) drm_mode_probed_add(connector, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) connector->display_info.width_mm = pinfo->desc->width_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) connector->display_info.height_mm = pinfo->desc->height_mm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) connector->display_info.bpc = pinfo->desc->bpc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static const struct drm_panel_funcs panel_funcs = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) .disable = boe_panel_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) .unprepare = boe_panel_unprepare,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .prepare = boe_panel_prepare,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .enable = boe_panel_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .get_modes = boe_panel_get_modes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) static const struct drm_display_mode default_display_mode = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .clock = 159420,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .hdisplay = 1200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .hsync_start = 1200 + 80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .hsync_end = 1200 + 80 + 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .htotal = 1200 + 80 + 60 + 24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .vdisplay = 1920,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) .vsync_start = 1920 + 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .vsync_end = 1920 + 10 + 14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .vtotal = 1920 + 10 + 14 + 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /* 8 inch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) static const struct panel_cmd boe_himax8279d8p_on_cmds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) { 0xB0, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) { 0xB1, 0xE5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) { 0xB3, 0x52 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) { 0xC0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { 0xC2, 0x57 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) { 0xD9, 0x85 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) { 0xB0, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) { 0xC8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) { 0xCC, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { 0xCD, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) { 0xDC, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { 0xDD, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { 0xE0, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { 0xE1, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { 0xB0, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { 0xC3, 0x2A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) { 0xE7, 0x2A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) { 0xC5, 0x2A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) { 0xDE, 0x2A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) { 0xBC, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) { 0xCB, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) { 0xB0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) { 0xB6, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) { 0xBA, 0x8B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) { 0xBF, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) { 0xC0, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) { 0xC2, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) { 0xC3, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) { 0xC4, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) { 0xC5, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) { 0xCC, 0x0A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) { 0xB0, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) { 0xC0, 0xA5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) { 0xD5, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) { 0xC0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) { 0xB0, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) { 0xC0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) { 0xC1, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) { 0xC2, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) { 0xC3, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) { 0xC4, 0x0E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) { 0xC5, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { 0xC6, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) { 0xC7, 0x32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) { 0xC8, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) { 0xC9, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) { 0xCA, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) { 0xCB, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) { 0xCC, 0x3D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) { 0xCD, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) { 0xCE, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { 0xCF, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) { 0xD0, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) { 0xD2, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { 0xD3, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) { 0xD4, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) { 0xD5, 0x12 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) { 0xD6, 0x0A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) { 0xD7, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) { 0xD8, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) { 0xD9, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { 0xDA, 0x3D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) { 0xDB, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) { 0xDC, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { 0xDD, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) { 0xDE, 0x3D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) { 0xDF, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) { 0xE0, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { 0xE1, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) { 0xE2, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) { 0xB0, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { 0xB1, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) { 0xB2, 0x19 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) { 0xB3, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) { 0xB4, 0x52 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { 0xB5, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) { 0xB6, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) { 0xB7, 0xBD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) { 0xB8, 0xEB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { 0xB9, 0x47 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) { 0xBA, 0x96 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) { 0xBB, 0x1E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) { 0xBC, 0x90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) { 0xBD, 0x93 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) { 0xBE, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) { 0xBF, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) { 0xC0, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) { 0xC1, 0xB7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) { 0xC2, 0xCC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) { 0xC3, 0xDF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) { 0xC4, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) { 0xC5, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) { 0xC6, 0xF8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) { 0xCB, 0x5A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) { 0xB0, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) { 0xB2, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) { 0xB3, 0x2D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) { 0xB4, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) { 0xB5, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) { 0xB6, 0x8D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) { 0xB7, 0xBE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) { 0xB8, 0xED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) { 0xB9, 0x4A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) { 0xBA, 0x9A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) { 0xBB, 0x23 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) { 0xBC, 0x95 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) { 0xBD, 0x98 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) { 0xBE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) { 0xBF, 0x59 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) { 0xC0, 0x8E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) { 0xC1, 0xB9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) { 0xC2, 0xCD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) { 0xC3, 0xDF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) { 0xC4, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) { 0xC5, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) { 0xC6, 0xF8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) { 0xCB, 0x5A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { 0xB0, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) { 0xB2, 0x2C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) { 0xB3, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) { 0xB4, 0x53 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) { 0xB5, 0x73 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) { 0xB6, 0x8E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) { 0xB7, 0xC0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) { 0xB8, 0xEF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) { 0xB9, 0x4C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) { 0xBA, 0x9D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) { 0xBB, 0x25 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) { 0xBC, 0x96 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) { 0xBD, 0x9A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) { 0xBE, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) { 0xBF, 0x59 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) { 0xC0, 0x8E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) { 0xC1, 0xB9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) { 0xC2, 0xCD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) { 0xC3, 0xDF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) { 0xC4, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) { 0xC5, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) { 0xC6, 0xF8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) { 0xCB, 0x5A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) { 0xCC, 0xBF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) { 0xB0, 0x0A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) { 0xB1, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) { 0xB2, 0x19 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) { 0xB3, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) { 0xB4, 0x52 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) { 0xB5, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) { 0xB6, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) { 0xB7, 0xBD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) { 0xB8, 0xEB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) { 0xB9, 0x47 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) { 0xBA, 0x96 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) { 0xBB, 0x1E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) { 0xBC, 0x90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) { 0xBD, 0x93 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) { 0xBE, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) { 0xBF, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) { 0xC0, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) { 0xC1, 0xB7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) { 0xC2, 0xCC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) { 0xC3, 0xDF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) { 0xC4, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) { 0xC5, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) { 0xC6, 0xF8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) { 0xCB, 0x5A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) { 0xB0, 0x0B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) { 0xB2, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) { 0xB3, 0x2D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) { 0xB4, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) { 0xB5, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) { 0xB6, 0x8D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) { 0xB7, 0xBE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) { 0xB8, 0xED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) { 0xB9, 0x4A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) { 0xBA, 0x9A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) { 0xBB, 0x23 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) { 0xBC, 0x95 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) { 0xBD, 0x98 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) { 0xBE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) { 0xBF, 0x59 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) { 0xC0, 0x8E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) { 0xC1, 0xB9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) { 0xC2, 0xCD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) { 0xC3, 0xDF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) { 0xC4, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) { 0xC5, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) { 0xC6, 0xF8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) { 0xCB, 0x5A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) { 0xB0, 0x0C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) { 0xB2, 0x2C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) { 0xB3, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) { 0xB4, 0x53 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) { 0xB5, 0x73 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) { 0xB6, 0x8E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) { 0xB7, 0xC0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) { 0xB8, 0xEF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) { 0xB9, 0x4C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) { 0xBA, 0x9D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) { 0xBB, 0x25 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) { 0xBC, 0x96 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) { 0xBD, 0x9A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) { 0xBE, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) { 0xBF, 0x59 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) { 0xC0, 0x8E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) { 0xC1, 0xB9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) { 0xC2, 0xCD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) { 0xC3, 0xDF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) { 0xC4, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) { 0xC5, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) { 0xC6, 0xF8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) { 0xCB, 0x5A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) { 0xCC, 0xBF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) { 0xB0, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) { 0xB5, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) { 0xB6, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) static const struct panel_desc boe_himax8279d8p_panel_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .display_mode = &default_display_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .bpc = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) .width_mm = 107,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) .height_mm = 172,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) .format = MIPI_DSI_FMT_RGB888,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) .lanes = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) .on_cmds = boe_himax8279d8p_on_cmds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) .on_cmds_num = 260,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /* 10 inch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) static const struct panel_cmd boe_himax8279d10p_on_cmds[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) { 0xB0, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) { 0xB1, 0xE5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) { 0xB3, 0x52 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) { 0xB0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) { 0xB6, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) { 0xBA, 0x8B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) { 0xBF, 0x1A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) { 0xC0, 0x0F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) { 0xC2, 0x0C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) { 0xC3, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) { 0xC4, 0x0C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) { 0xC5, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) { 0xB0, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) { 0xE0, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) { 0xE1, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) { 0xDC, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) { 0xDD, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) { 0xCC, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) { 0xCD, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) { 0xC8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) { 0xD2, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) { 0xD3, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) { 0xE6, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) { 0xE7, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) { 0xC4, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) { 0xC5, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) { 0xD8, 0x0A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) { 0xD9, 0x0A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) { 0xC2, 0x0B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) { 0xC3, 0x0B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) { 0xD6, 0x0C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) { 0xD7, 0x0C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) { 0xC0, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) { 0xC1, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) { 0xD4, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) { 0xD5, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) { 0xCA, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) { 0xCB, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) { 0xDE, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) { 0xDF, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) { 0xB0, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) { 0xC0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) { 0xC1, 0x0D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) { 0xC2, 0x17 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) { 0xC3, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) { 0xC4, 0x31 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) { 0xC5, 0x1C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) { 0xC6, 0x2C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) { 0xC7, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) { 0xC8, 0x31 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) { 0xC9, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) { 0xCA, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) { 0xCB, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) { 0xCC, 0x39 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) { 0xCD, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) { 0xCE, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) { 0xCF, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) { 0xD0, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) { 0xD2, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) { 0xD3, 0x0D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) { 0xD4, 0x17 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) { 0xD5, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) { 0xD6, 0x31 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) { 0xD7, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) { 0xD8, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) { 0xD9, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) { 0xDA, 0x3F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) { 0xDB, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) { 0xDC, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) { 0xDD, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) { 0xDE, 0x39 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) { 0xDF, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) { 0xE0, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) { 0xE1, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) { 0xE2, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) { 0xB0, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) { 0xC8, 0x0B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) { 0xC9, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) { 0xC3, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) { 0xE7, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) { 0xC5, 0x2A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) { 0xDE, 0x2A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) { 0xCA, 0x43 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) { 0xC9, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) { 0xE4, 0xC0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) { 0xE5, 0x0D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) { 0xCB, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) { 0xBC, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) { 0xB0, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) { 0xB8, 0xA5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) { 0xC0, 0xA5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) { 0xC7, 0x0F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) { 0xD5, 0x32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) { 0xB8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) { 0xC0, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) { 0xBC, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) { 0xB0, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) { 0xB1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) { 0xB2, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) { 0xB3, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) { 0xB4, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) { 0xB5, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) { 0xB6, 0x4A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) { 0xB7, 0x6C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) { 0xB8, 0x9A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) { 0xB9, 0xD7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) { 0xBA, 0x17 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) { 0xBB, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) { 0xBC, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) { 0xBD, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) { 0xBE, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) { 0xBF, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) { 0xC0, 0x3A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) { 0xC1, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) { 0xC2, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) { 0xC3, 0xA5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) { 0xC4, 0xB1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) { 0xC5, 0xBE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) { 0xC6, 0xCA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) { 0xC7, 0xD1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) { 0xC8, 0xD4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) { 0xCB, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) { 0xB0, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) { 0xB2, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) { 0xB3, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) { 0xB4, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) { 0xB5, 0x39 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) { 0xB6, 0x4E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) { 0xB7, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) { 0xB8, 0xA3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) { 0xB9, 0xE1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) { 0xBA, 0x25 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) { 0xBB, 0xA8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) { 0xBC, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) { 0xBD, 0x32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) { 0xBE, 0xAD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) { 0xBF, 0x28 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) { 0xC0, 0x63 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) { 0xC1, 0x9B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) { 0xC2, 0xB5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) { 0xC3, 0xCF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) { 0xC4, 0xDB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) { 0xC5, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) { 0xC6, 0xF5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) { 0xCB, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) { 0xB0, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) { 0xB2, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) { 0xB3, 0x0F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) { 0xB4, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) { 0xB5, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) { 0xB6, 0x4D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) { 0xB7, 0x71 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) { 0xB8, 0xA2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) { 0xB9, 0xE1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) { 0xBA, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) { 0xBB, 0xA9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) { 0xBC, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) { 0xBD, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) { 0xBE, 0xAC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) { 0xBF, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) { 0xC0, 0x5D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) { 0xC1, 0x94 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) { 0xC2, 0xAC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) { 0xC3, 0xC5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) { 0xC4, 0xD1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) { 0xC5, 0xDC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) { 0xC6, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) { 0xC7, 0xED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) { 0xC8, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) { 0xCB, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) { 0xB0, 0x0A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) { 0xB1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) { 0xB2, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) { 0xB3, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) { 0xB4, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) { 0xB5, 0x36 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) { 0xB6, 0x4A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) { 0xB7, 0x6C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) { 0xB8, 0x9A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) { 0xB9, 0xD7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) { 0xBA, 0x17 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) { 0xBB, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) { 0xBC, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) { 0xBD, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) { 0xBE, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) { 0xBF, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) { 0xC0, 0x3A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) { 0xC1, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) { 0xC2, 0x8C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) { 0xC3, 0xA5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) { 0xC4, 0xB1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) { 0xC5, 0xBE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) { 0xC6, 0xCA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) { 0xC7, 0xD1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) { 0xC8, 0xD4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) { 0xCB, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) { 0xB0, 0x0B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) { 0xB2, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) { 0xB3, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) { 0xB4, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) { 0xB5, 0x39 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) { 0xB6, 0x4E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) { 0xB7, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) { 0xB8, 0xA3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) { 0xB9, 0xE1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) { 0xBA, 0x25 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) { 0xBB, 0xA8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) { 0xBC, 0x2E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) { 0xBD, 0x32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) { 0xBE, 0xAD },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) { 0xBF, 0x28 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) { 0xC0, 0x63 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) { 0xC1, 0x9B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) { 0xC2, 0xB5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) { 0xC3, 0xCF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) { 0xC4, 0xDB },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) { 0xC5, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) { 0xC6, 0xF5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) { 0xC7, 0xFA },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) { 0xC8, 0xFC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) { 0xCB, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) { 0xB0, 0x0C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) { 0xB1, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) { 0xB2, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) { 0xB3, 0x0F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) { 0xB4, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) { 0xB5, 0x37 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) { 0xB6, 0x4D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) { 0xB7, 0x71 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) { 0xB8, 0xA2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) { 0xB9, 0xE1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) { 0xBA, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) { 0xBB, 0xA9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) { 0xBC, 0x2F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) { 0xBD, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) { 0xBE, 0xAC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) { 0xBF, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) { 0xC0, 0x5D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) { 0xC1, 0x94 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) { 0xC2, 0xAC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) { 0xC3, 0xC5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) { 0xC4, 0xD1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) { 0xC5, 0xDC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) { 0xC6, 0xE8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) { 0xC7, 0xED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) { 0xC8, 0xF0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) { 0xC9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) { 0xCA, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) { 0xCB, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) { 0xCC, 0xAF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) { 0xCD, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) { 0xCE, 0xFF },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) static const struct panel_desc boe_himax8279d10p_panel_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) .display_mode = &default_display_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) .bpc = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) .width_mm = 135,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) .height_mm = 216,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_LPM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) .format = MIPI_DSI_FMT_RGB888,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) .lanes = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) .on_cmds = boe_himax8279d10p_on_cmds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) .on_cmds_num = 283,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) static const struct of_device_id panel_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) .compatible = "boe,himax8279d8p",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) .data = &boe_himax8279d8p_panel_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) .compatible = "boe,himax8279d10p",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) .data = &boe_himax8279d10p_panel_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) /* sentinel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) MODULE_DEVICE_TABLE(of, panel_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) static int panel_add(struct panel_info *pinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) struct device *dev = &pinfo->link->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) pinfo->pp18_gpio = devm_gpiod_get(dev, "pp18", GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (IS_ERR(pinfo->pp18_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) ret = PTR_ERR(pinfo->pp18_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if (ret != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) dev_err(dev, "failed to get pp18 gpio: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) pinfo->pp33_gpio = devm_gpiod_get(dev, "pp33", GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) if (IS_ERR(pinfo->pp33_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) ret = PTR_ERR(pinfo->pp33_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (ret != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) dev_err(dev, "failed to get pp33 gpio: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) pinfo->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (IS_ERR(pinfo->enable_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) ret = PTR_ERR(pinfo->enable_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) if (ret != -EPROBE_DEFER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) dev_err(dev, "failed to get enable gpio: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) drm_panel_init(&pinfo->base, dev, &panel_funcs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) DRM_MODE_CONNECTOR_DSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) ret = drm_panel_of_backlight(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) drm_panel_add(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) static int panel_probe(struct mipi_dsi_device *dsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) struct panel_info *pinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) const struct panel_desc *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) pinfo = devm_kzalloc(&dsi->dev, sizeof(*pinfo), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (!pinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) desc = of_device_get_match_data(&dsi->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) dsi->mode_flags = desc->mode_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) dsi->format = desc->format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) dsi->lanes = desc->lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) pinfo->desc = desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) pinfo->link = dsi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) mipi_dsi_set_drvdata(dsi, pinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) err = panel_add(pinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) err = mipi_dsi_attach(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) drm_panel_remove(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) static int panel_remove(struct mipi_dsi_device *dsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) struct panel_info *pinfo = mipi_dsi_get_drvdata(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) err = boe_panel_disable(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) dev_err(&dsi->dev, "failed to disable panel: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) err = boe_panel_unprepare(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) dev_err(&dsi->dev, "failed to unprepare panel: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) err = mipi_dsi_detach(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) drm_panel_remove(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) static void panel_shutdown(struct mipi_dsi_device *dsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) struct panel_info *pinfo = mipi_dsi_get_drvdata(dsi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) boe_panel_disable(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) boe_panel_unprepare(&pinfo->base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) static struct mipi_dsi_driver panel_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) .name = "panel-boe-himax8279d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) .of_match_table = panel_of_match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) .probe = panel_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) .remove = panel_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) .shutdown = panel_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) module_mipi_dsi_driver(panel_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) MODULE_AUTHOR("Jerry Han <jerry.han.hq@gmail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) MODULE_DESCRIPTION("Boe Himax8279d driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) MODULE_LICENSE("GPL v2");