Lines Matching +full:data +full:- +full:width
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
44 #include "panel-simple.h"
92 * @width: width (in millimeters) of the panel's active display area
96 unsigned int width; member
102 * become ready and start receiving video data
107 * video data
137 int (*spi_write)(struct device *dev, const u8 *data, size_t len, u8 type);
169 const u8 *data, int length, in panel_simple_parse_cmd_seq() argument
178 return -EINVAL; in panel_simple_parse_cmd_seq()
180 buf = devm_kmemdup(dev, data, length, GFP_KERNEL); in panel_simple_parse_cmd_seq()
182 return -ENOMEM; in panel_simple_parse_cmd_seq()
191 len -= sizeof(*header); in panel_simple_parse_cmd_seq()
193 if (header->payload_length > len) in panel_simple_parse_cmd_seq()
194 return -EINVAL; in panel_simple_parse_cmd_seq()
196 d += header->payload_length; in panel_simple_parse_cmd_seq()
197 len -= header->payload_length; in panel_simple_parse_cmd_seq()
202 return -EINVAL; in panel_simple_parse_cmd_seq()
204 seq->cmd_cnt = cnt; in panel_simple_parse_cmd_seq()
205 seq->cmds = devm_kcalloc(dev, cnt, sizeof(*desc), GFP_KERNEL); in panel_simple_parse_cmd_seq()
206 if (!seq->cmds) in panel_simple_parse_cmd_seq()
207 return -ENOMEM; in panel_simple_parse_cmd_seq()
213 len -= sizeof(*header); in panel_simple_parse_cmd_seq()
216 desc = &seq->cmds[i]; in panel_simple_parse_cmd_seq()
217 desc->header = *header; in panel_simple_parse_cmd_seq()
218 desc->payload = d; in panel_simple_parse_cmd_seq()
220 d += header->payload_length; in panel_simple_parse_cmd_seq()
221 len -= header->payload_length; in panel_simple_parse_cmd_seq()
230 struct device *dev = panel->base.dev; in panel_simple_xfer_dsi_cmd_seq()
231 struct mipi_dsi_device *dsi = panel->dsi; in panel_simple_xfer_dsi_cmd_seq()
236 return -EINVAL; in panel_simple_xfer_dsi_cmd_seq()
238 return -EINVAL; in panel_simple_xfer_dsi_cmd_seq()
240 for (i = 0; i < seq->cmd_cnt; i++) { in panel_simple_xfer_dsi_cmd_seq()
241 struct panel_cmd_desc *cmd = &seq->cmds[i]; in panel_simple_xfer_dsi_cmd_seq()
243 switch (cmd->header.data_type) { in panel_simple_xfer_dsi_cmd_seq()
245 err = mipi_dsi_compression_mode(dsi, cmd->payload[0]); in panel_simple_xfer_dsi_cmd_seq()
251 err = mipi_dsi_generic_write(dsi, cmd->payload, in panel_simple_xfer_dsi_cmd_seq()
252 cmd->header.payload_length); in panel_simple_xfer_dsi_cmd_seq()
257 err = mipi_dsi_dcs_write_buffer(dsi, cmd->payload, in panel_simple_xfer_dsi_cmd_seq()
258 cmd->header.payload_length); in panel_simple_xfer_dsi_cmd_seq()
261 if (!panel->pps) { in panel_simple_xfer_dsi_cmd_seq()
262 panel->pps = devm_kzalloc(dev, sizeof(*panel->pps), in panel_simple_xfer_dsi_cmd_seq()
264 if (!panel->pps) in panel_simple_xfer_dsi_cmd_seq()
265 return -ENOMEM; in panel_simple_xfer_dsi_cmd_seq()
267 memcpy(panel->pps, cmd->payload, cmd->header.payload_length); in panel_simple_xfer_dsi_cmd_seq()
270 err = mipi_dsi_picture_parameter_set(dsi, panel->pps); in panel_simple_xfer_dsi_cmd_seq()
273 return -EINVAL; in panel_simple_xfer_dsi_cmd_seq()
279 if (cmd->header.delay) in panel_simple_xfer_dsi_cmd_seq()
280 msleep(cmd->header.delay); in panel_simple_xfer_dsi_cmd_seq()
292 return -EINVAL; in panel_simple_xfer_spi_cmd_seq()
294 for (i = 0; i < cmds->cmd_cnt; i++) { in panel_simple_xfer_spi_cmd_seq()
295 struct panel_cmd_desc *cmd = &cmds->cmds[i]; in panel_simple_xfer_spi_cmd_seq()
297 ret = panel->desc->spi_write(panel->base.dev, cmd->payload, in panel_simple_xfer_spi_cmd_seq()
298 cmd->header.payload_length, cmd->header.data_type); in panel_simple_xfer_spi_cmd_seq()
302 if (cmd->header.delay) in panel_simple_xfer_spi_cmd_seq()
303 usleep_range(cmd->header.delay * 1000, (cmd->header.delay + 1) * 1000); in panel_simple_xfer_spi_cmd_seq()
315 for (i = 0; i < panel->desc->num_timings; i++) { in panel_simple_get_timings_modes()
316 const struct display_timing *dt = &panel->desc->timings[i]; in panel_simple_get_timings_modes()
320 mode = drm_mode_create(connector->dev); in panel_simple_get_timings_modes()
322 dev_err(panel->base.dev, "failed to add mode %ux%u\n", in panel_simple_get_timings_modes()
323 dt->hactive.typ, dt->vactive.typ); in panel_simple_get_timings_modes()
329 mode->type |= DRM_MODE_TYPE_DRIVER; in panel_simple_get_timings_modes()
331 if (panel->desc->num_timings == 1) in panel_simple_get_timings_modes()
332 mode->type |= DRM_MODE_TYPE_PREFERRED; in panel_simple_get_timings_modes()
347 for (i = 0; i < panel->desc->num_modes; i++) { in panel_simple_get_display_modes()
348 const struct drm_display_mode *m = &panel->desc->modes[i]; in panel_simple_get_display_modes()
350 mode = drm_mode_duplicate(connector->dev, m); in panel_simple_get_display_modes()
352 dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n", in panel_simple_get_display_modes()
353 m->hdisplay, m->vdisplay, in panel_simple_get_display_modes()
358 mode->type |= DRM_MODE_TYPE_DRIVER; in panel_simple_get_display_modes()
360 if (panel->desc->num_modes == 1) in panel_simple_get_display_modes()
361 mode->type |= DRM_MODE_TYPE_PREFERRED; in panel_simple_get_display_modes()
376 bool has_override = panel->override_mode.type; in panel_simple_get_non_edid_modes()
379 if (!panel->desc) in panel_simple_get_non_edid_modes()
383 mode = drm_mode_duplicate(connector->dev, in panel_simple_get_non_edid_modes()
384 &panel->override_mode); in panel_simple_get_non_edid_modes()
389 dev_err(panel->base.dev, "failed to add override mode\n"); in panel_simple_get_non_edid_modes()
394 if (num == 0 && panel->desc->num_timings) in panel_simple_get_non_edid_modes()
403 WARN_ON(panel->desc->num_timings && panel->desc->num_modes); in panel_simple_get_non_edid_modes()
407 if (panel->desc->bpc) in panel_simple_get_non_edid_modes()
408 connector->display_info.bpc = panel->desc->bpc; in panel_simple_get_non_edid_modes()
409 if (panel->desc->size.width) in panel_simple_get_non_edid_modes()
410 connector->display_info.width_mm = panel->desc->size.width; in panel_simple_get_non_edid_modes()
411 if (panel->desc->size.height) in panel_simple_get_non_edid_modes()
412 connector->display_info.height_mm = panel->desc->size.height; in panel_simple_get_non_edid_modes()
413 if (panel->desc->bus_format) in panel_simple_get_non_edid_modes()
414 drm_display_info_set_bus_formats(&connector->display_info, in panel_simple_get_non_edid_modes()
415 &panel->desc->bus_format, 1); in panel_simple_get_non_edid_modes()
416 if (panel->desc->bus_flags) in panel_simple_get_non_edid_modes()
417 connector->display_info.bus_flags = panel->desc->bus_flags; in panel_simple_get_non_edid_modes()
426 if (p->power_invert) { in panel_simple_regulator_enable()
427 if (regulator_is_enabled(p->supply) > 0) in panel_simple_regulator_enable()
428 regulator_disable(p->supply); in panel_simple_regulator_enable()
430 err = regulator_enable(p->supply); in panel_simple_regulator_enable()
442 if (p->power_invert) { in panel_simple_regulator_disable()
443 if (!regulator_is_enabled(p->supply)) { in panel_simple_regulator_disable()
444 err = regulator_enable(p->supply); in panel_simple_regulator_disable()
449 regulator_disable(p->supply); in panel_simple_regulator_disable()
462 dev_err(panel->dev, "failed to enable supply: %d\n", err); in panel_simple_loader_protect()
466 p->prepared = true; in panel_simple_loader_protect()
467 p->enabled = true; in panel_simple_loader_protect()
477 if (!p->enabled) in panel_simple_disable()
480 if (p->desc->delay.disable) in panel_simple_disable()
481 msleep(p->desc->delay.disable); in panel_simple_disable()
483 p->enabled = false; in panel_simple_disable()
492 if (!p->prepared) in panel_simple_unprepare()
495 if (p->desc->exit_seq) { in panel_simple_unprepare()
496 if (p->desc->cmd_type == CMD_TYPE_SPI) { in panel_simple_unprepare()
497 if (panel_simple_xfer_spi_cmd_seq(p, p->desc->exit_seq)) { in panel_simple_unprepare()
498 dev_err(panel->dev, "failed to send exit spi cmds seq\n"); in panel_simple_unprepare()
499 return -EINVAL; in panel_simple_unprepare()
502 if (p->dsi) in panel_simple_unprepare()
503 panel_simple_xfer_dsi_cmd_seq(p, p->desc->exit_seq); in panel_simple_unprepare()
507 gpiod_direction_output(p->reset_gpio, 1); in panel_simple_unprepare()
508 gpiod_direction_output(p->enable_gpio, 0); in panel_simple_unprepare()
512 if (p->desc->delay.unprepare) in panel_simple_unprepare()
513 msleep(p->desc->delay.unprepare); in panel_simple_unprepare()
515 p->prepared = false; in panel_simple_unprepare()
525 p->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in panel_simple_get_hpd_gpio()
526 if (IS_ERR(p->hpd_gpio)) { in panel_simple_get_hpd_gpio()
527 err = PTR_ERR(p->hpd_gpio); in panel_simple_get_hpd_gpio()
530 * If we're called from probe we won't consider '-EPROBE_DEFER' in panel_simple_get_hpd_gpio()
531 * to be an error--we'll leave the error code in "hpd_gpio". in panel_simple_get_hpd_gpio()
536 if (err != -EPROBE_DEFER || !from_probe) { in panel_simple_get_hpd_gpio()
552 if (p->prepared) in panel_simple_prepare()
557 dev_err(panel->dev, "failed to enable supply: %d\n", err); in panel_simple_prepare()
561 gpiod_direction_output(p->enable_gpio, 1); in panel_simple_prepare()
563 delay = p->desc->delay.prepare; in panel_simple_prepare()
564 if (p->no_hpd) in panel_simple_prepare()
565 delay += p->desc->delay.hpd_absent_delay; in panel_simple_prepare()
569 if (p->hpd_gpio) { in panel_simple_prepare()
570 if (IS_ERR(p->hpd_gpio)) { in panel_simple_prepare()
571 err = panel_simple_get_hpd_gpio(panel->dev, p, false); in panel_simple_prepare()
576 err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio, in panel_simple_prepare()
583 dev_err(panel->dev, in panel_simple_prepare()
589 gpiod_direction_output(p->reset_gpio, 1); in panel_simple_prepare()
591 if (p->desc->delay.reset) in panel_simple_prepare()
592 msleep(p->desc->delay.reset); in panel_simple_prepare()
594 gpiod_direction_output(p->reset_gpio, 0); in panel_simple_prepare()
596 if (p->desc->delay.init) in panel_simple_prepare()
597 msleep(p->desc->delay.init); in panel_simple_prepare()
599 if (p->desc->init_seq) { in panel_simple_prepare()
600 if (p->desc->cmd_type == CMD_TYPE_SPI) { in panel_simple_prepare()
601 if (panel_simple_xfer_spi_cmd_seq(p, p->desc->init_seq)) { in panel_simple_prepare()
602 dev_err(panel->dev, "failed to send init spi cmds seq\n"); in panel_simple_prepare()
603 return -EINVAL; in panel_simple_prepare()
606 if (p->dsi) in panel_simple_prepare()
607 panel_simple_xfer_dsi_cmd_seq(p, p->desc->init_seq); in panel_simple_prepare()
611 p->prepared = true; in panel_simple_prepare()
620 if (p->enabled) in panel_simple_enable()
623 if (p->desc->delay.enable) in panel_simple_enable()
624 msleep(p->desc->delay.enable); in panel_simple_enable()
626 p->enabled = true; in panel_simple_enable()
638 if (p->ddc) { in panel_simple_get_modes()
639 struct edid *edid = drm_get_edid(connector, p->ddc); in panel_simple_get_modes()
648 /* add hard-coded panel modes */ in panel_simple_get_modes()
652 drm_connector_set_panel_orientation(connector, p->orientation); in panel_simple_get_modes()
664 if (p->desc->num_timings < num_timings) in panel_simple_get_timings()
665 num_timings = p->desc->num_timings; in panel_simple_get_timings()
669 timings[i] = p->desc->timings[i]; in panel_simple_get_timings()
671 return p->desc->num_timings; in panel_simple_get_timings()
695 np = dev->of_node; in panel_dpi_probe()
698 return -ENOMEM; in panel_dpi_probe()
702 return -ENOMEM; in panel_dpi_probe()
704 ret = of_get_display_timing(np, "panel-timing", timing); in panel_dpi_probe()
706 dev_err(dev, "%pOF: no panel-timing node found for \"panel-dpi\" binding\n", in panel_dpi_probe()
711 desc->timings = timing; in panel_dpi_probe()
712 desc->num_timings = 1; in panel_dpi_probe()
714 of_property_read_u32(np, "width-mm", &desc->size.width); in panel_dpi_probe()
715 of_property_read_u32(np, "height-mm", &desc->size.height); in panel_dpi_probe()
719 vm.flags = timing->flags; in panel_dpi_probe()
721 desc->bus_flags = bus_flags; in panel_dpi_probe()
724 desc->connector_type = DRM_MODE_CONNECTOR_DPI; in panel_dpi_probe()
726 panel->desc = desc; in panel_dpi_probe()
732 (to_check->field.typ >= bounds->field.min && \
733 to_check->field.typ <= bounds->field.max)
738 const struct panel_desc *desc = panel->desc; in panel_simple_parse_panel_timing_node()
742 if (WARN_ON(desc->num_modes)) { in panel_simple_parse_panel_timing_node()
746 if (WARN_ON(!desc->num_timings)) { in panel_simple_parse_panel_timing_node()
751 for (i = 0; i < panel->desc->num_timings; i++) { in panel_simple_parse_panel_timing_node()
752 const struct display_timing *dt = &panel->desc->timings[i]; in panel_simple_parse_panel_timing_node()
764 if (ot->flags != dt->flags) in panel_simple_parse_panel_timing_node()
768 drm_display_mode_from_videomode(&vm, &panel->override_mode); in panel_simple_parse_panel_timing_node()
769 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER | in panel_simple_parse_panel_timing_node()
774 if (WARN_ON(!panel->override_mode.type)) in panel_simple_parse_panel_timing_node()
781 struct mipi_dsi_device *dsi = p->dsi; in dcs_bl_update_status()
784 if (!p->prepared) in dcs_bl_update_status()
787 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in dcs_bl_update_status()
789 ret = mipi_dsi_dcs_set_display_brightness(dsi, bl->props.brightness); in dcs_bl_update_status()
793 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in dcs_bl_update_status()
801 struct mipi_dsi_device *dsi = p->dsi; in dcs_bl_get_brightness()
802 u16 brightness = bl->props.brightness; in dcs_bl_get_brightness()
805 if (!p->prepared) in dcs_bl_get_brightness()
808 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in dcs_bl_get_brightness()
814 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in dcs_bl_get_brightness()
835 return -ENOMEM; in panel_simple_probe()
837 panel->enabled = false; in panel_simple_probe()
838 panel->prepared = false; in panel_simple_probe()
839 panel->desc = desc; in panel_simple_probe()
841 panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); in panel_simple_probe()
842 if (!panel->no_hpd) { in panel_simple_probe()
848 panel->supply = devm_regulator_get(dev, "power"); in panel_simple_probe()
849 if (IS_ERR(panel->supply)) { in panel_simple_probe()
850 err = PTR_ERR(panel->supply); in panel_simple_probe()
855 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_ASIS); in panel_simple_probe()
856 if (IS_ERR(panel->enable_gpio)) { in panel_simple_probe()
857 err = PTR_ERR(panel->enable_gpio); in panel_simple_probe()
858 if (err != -EPROBE_DEFER) in panel_simple_probe()
863 panel->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS); in panel_simple_probe()
864 if (IS_ERR(panel->reset_gpio)) { in panel_simple_probe()
865 err = PTR_ERR(panel->reset_gpio); in panel_simple_probe()
866 if (err != -EPROBE_DEFER) in panel_simple_probe()
871 err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation); in panel_simple_probe()
873 dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err); in panel_simple_probe()
877 panel->power_invert = of_property_read_bool(dev->of_node, "power-invert"); in panel_simple_probe()
879 ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); in panel_simple_probe()
881 panel->ddc = of_find_i2c_adapter_by_node(ddc); in panel_simple_probe()
884 if (!panel->ddc) { in panel_simple_probe()
885 err = -EPROBE_DEFER; in panel_simple_probe()
886 dev_err(dev, "failed to find ddc-i2c-bus: %d\n", err); in panel_simple_probe()
892 /* Handle the generic panel-dpi binding */ in panel_simple_probe()
896 desc = panel->desc; in panel_simple_probe()
898 if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) in panel_simple_probe()
902 connector_type = desc->connector_type; in panel_simple_probe()
910 WARN_ON(desc->bus_flags & in panel_simple_probe()
915 WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && in panel_simple_probe()
916 desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG && in panel_simple_probe()
917 desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA); in panel_simple_probe()
918 WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && in panel_simple_probe()
919 desc->bpc != 6); in panel_simple_probe()
920 WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG || in panel_simple_probe()
921 desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) && in panel_simple_probe()
922 desc->bpc != 8); in panel_simple_probe()
925 if (desc->bus_format == 0) in panel_simple_probe()
927 if (desc->bpc != 6 && desc->bpc != 8) in panel_simple_probe()
928 dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); in panel_simple_probe()
931 if (desc->bpc != 6 && desc->bpc != 8) in panel_simple_probe()
932 dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); in panel_simple_probe()
943 if (desc->bus_flags & ~bus_flags) in panel_simple_probe()
944 dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags); in panel_simple_probe()
945 if (!(desc->bus_flags & bus_flags)) in panel_simple_probe()
947 if (desc->bus_format == 0) in panel_simple_probe()
949 if (desc->bpc != 6 && desc->bpc != 8) in panel_simple_probe()
950 dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); in panel_simple_probe()
953 dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type); in panel_simple_probe()
958 drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type); in panel_simple_probe()
960 err = drm_panel_of_backlight(&panel->base); in panel_simple_probe()
966 drm_panel_add(&panel->base); in panel_simple_probe()
973 if (panel->ddc) in panel_simple_probe()
974 put_device(&panel->ddc->dev); in panel_simple_probe()
983 drm_panel_remove(&panel->base); in panel_simple_remove()
984 drm_panel_disable(&panel->base); in panel_simple_remove()
985 drm_panel_unprepare(&panel->base); in panel_simple_remove()
987 if (panel->ddc) in panel_simple_remove()
988 put_device(&panel->ddc->dev); in panel_simple_remove()
997 drm_panel_disable(&panel->base); in panel_simple_shutdown()
998 drm_panel_unprepare(&panel->base); in panel_simple_shutdown()
1019 .width = 217,
1045 .width = 105,
1069 .width = 152,
1094 .width = 154,
1118 .width = 223,
1143 .width = 217,
1166 .width = 223,
1189 .width = 256,
1217 .width = 256,
1245 .width = 293,
1267 .width = 293,
1294 .width = 152,
1322 .width = 216,
1346 .width = 211,
1368 .width = 261,
1392 .width = 293,
1422 .width = 344,
1446 .width = 409,
1476 .width = 376,
1506 .width = 698,
1535 .width = 430,
1561 .width = 154,
1588 .width = 154,
1610 .width = 154,
1648 .width = 217,
1678 .width = 294,
1685 * was until the TCON data download was complete. On
1690 * - If HPD isn't hooked up you still have 200 ms delay.
1691 * - If HPD is hooked up we won't try to look at it for the
1723 .width = 309,
1753 .width = 95,
1759 /* S070PWS19HP-FC21 2017/04/22 */
1778 .width = 154,
1786 /* S070SWV29HG-DC44 2017/09/21 */
1805 .width = 154,
1831 .width = 154,
1854 .width = 217,
1884 .width = 94,
1909 .width = 220,
1934 .width = 223,
1960 .width = 152,
1985 .width = 154,
2015 .width = 216,
2046 .width = 70,
2076 .width = 100,
2101 .width = 95,
2124 .width = 115,
2150 .width = 152,
2162 .width = 152,
2189 .width = 108,
2213 .width = 108,
2251 .width = 77,
2276 .width = 94,
2298 .width = 95,
2322 .width = 60,
2335 * According to the data sheet, the minimum horizontal blanking interval
2352 .width = 151,
2377 .width = 203,
2401 .width = 195,
2428 .width = 95,
2451 .width = 154,
2475 .width = 152,
2507 .width = 217,
2535 .width = 261,
2564 .width = 246,
2576 * - total horizontal time: { 1506, 1592, 1716 }
2577 * - total vertical time: { 788, 800, 868 }
2602 .width = 256,
2624 .width = 344,
2650 .width = 254,
2676 .width = 154,
2699 .width = 294,
2729 .width = 256,
2757 .width = 115,
2779 .width = 217,
2811 .width = 292,
2836 .width = 246,
2859 .width = 70,
2883 .width = 151,
2907 .width = 129,
2928 .width = 208,
2950 .width = 267,
2973 .width = 272,
2998 .width = 154,
3028 .width = 217,
3068 .width = 105,
3088 .width = 152,
3119 .width = 261,
3148 .width = 95,
3171 .width = 154,
3208 .width = 260,
3238 .width = 95,
3264 .width = 344,
3291 .width = 156,
3316 .width = 154,
3344 .width = 95,
3370 * https://www.adafruit.com/images/product-files/2406/c3163.pdf
3377 .width = 154,
3401 .width = 56, /* 56.16mm */
3426 .width = 56,
3452 .width = 152,
3477 .width = 152,
3499 .width = 152,
3526 .width = 95,
3550 .width = 154,
3578 .width = 217,
3606 .width = 263,
3628 .width = 223,
3653 .width = 320,
3675 .width = 108,
3700 .width = 260,
3725 .width = 152, /* 152.4mm */
3750 .width = 54,
3774 .width = 217,
3799 .width = 259,
3841 .width = 42,
3866 .width = 152,
3889 .width = 152,
3914 .width = 263,
3941 .width = 155,
3966 .width = 151,
3978 .width = 150,
4003 .width = 154,
4030 .width = 65,
4058 .width = 71,
4082 .width = 194,
4106 .width = 152,
4128 .width = 223,
4137 .hback_porch = { 216 - 128, 216 - 128, 216 - 128 },
4141 .vback_porch = { 35 - 2, 35 - 2, 35 - 2 },
4152 .width = 152,
4164 .width = 152,
4188 .width = 120,
4213 .width = 70,
4239 .width = 400,
4247 .compatible = "simple-panel",
4248 .data = NULL,
4250 .compatible = "ampire,am-1280800n3tzqw-t00h",
4251 .data = &ire_am_1280800n3tzqw_t00h,
4253 .compatible = "ampire,am-480272h3tmqw-t01h",
4254 .data = &ire_am_480272h3tmqw_t01h,
4257 .data = &ire_am800480r3tmqwa1h,
4259 .compatible = "arm,rtsm-display",
4260 .data = &arm_rtsm,
4262 .compatible = "armadeus,st0700-adapt",
4263 .data = &armadeus_st0700_adapt,
4266 .data = &auo_b101aw03,
4269 .data = &auo_b101ean01,
4272 .data = &auo_b101xtn01,
4275 .data = &auo_b116xak01,
4278 .data = &auo_b116xw03,
4281 .data = &auo_b133htn01,
4284 .data = &auo_b133xtn01,
4287 .data = &auo_g070vvn01,
4290 .data = &auo_g101evn010,
4293 .data = &auo_g104sn02,
4296 .data = &auo_g121ean01,
4299 .data = &auo_g133han01,
4302 .data = &auo_g156xtn01,
4305 .data = &auo_g185han01,
4308 .data = &auo_g190ean01,
4311 .data = &auo_p320hvn03,
4314 .data = &auo_t215hvn01,
4317 .data = &avic_tm070ddh03,
4319 .compatible = "bananapi,s070wv20-ct16",
4320 .data = &bananapi_s070wv20_ct16,
4322 .compatible = "boe,hv070wsa-100",
4323 .data = &boe_hv070wsa
4326 .data = &boe_nv101wxmn51,
4328 .compatible = "boe,nv133fhm-n61",
4329 .data = &boe_nv133fhm_n61,
4331 .compatible = "boe,nv133fhm-n62",
4332 .data = &boe_nv133fhm_n61,
4335 .data = &boe_nv140fhmn49,
4337 .compatible = "cdtech,s043wq26h-ct7",
4338 .data = &cdtech_s043wq26h_ct7,
4340 .compatible = "cdtech,s070pws19hp-fc21",
4341 .data = &cdtech_s070pws19hp_fc21,
4343 .compatible = "cdtech,s070swv29hg-dc44",
4344 .data = &cdtech_s070swv29hg_dc44,
4346 .compatible = "cdtech,s070wv95-ct16",
4347 .data = &cdtech_s070wv95_ct16,
4349 .compatible = "chefree,ch101olhlwh-002",
4350 .data = &chefree_ch101olhlwh_002,
4353 .data = &chunghwa_claa070wp03xg,
4356 .data = &chunghwa_claa101wa01a
4359 .data = &chunghwa_claa101wb01
4362 .data = &dataimage_scf0700c48ggu18,
4364 .compatible = "dlc,dlc0700yzg-1",
4365 .data = &dlc_dlc0700yzg_1,
4368 .data = &dlc_dlc1010gig,
4371 .data = &edt_et035012dm6,
4374 .data = &edt_etm043080dh6gp,
4377 .data = &edt_etm0430g0dh6,
4380 .data = &edt_et057090dhu,
4383 .data = &edt_etm0700g0dh6,
4386 .data = &edt_etm0700g0dh6,
4389 .data = &edt_etm0700g0bdh6,
4392 .data = &edt_etm0700g0bdh6,
4395 .data = &evervision_vgg804821,
4397 .compatible = "foxlink,fl500wvr00-a0t",
4398 .data = &foxlink_fl500wvr00_a0t,
4401 .data = &frida_frd350h54004,
4404 .data = &friendlyarm_hd702e,
4407 .data = &giantplus_gpg482739qs5
4410 .data = &giantplus_gpm940b0,
4413 .data = &hannstar_hsd070pww1,
4416 .data = &hannstar_hsd100pxn1,
4419 .data = &hitachi_tx23d38vm0caa
4422 .data = &innolux_at043tn24,
4425 .data = &innolux_at070tn92,
4427 .compatible = "innolux,g070y2-l01",
4428 .data = &innolux_g070y2_l01,
4430 .compatible = "innolux,g101ice-l01",
4431 .data = &innolux_g101ice_l01
4433 .compatible = "innolux,g121i1-l01",
4434 .data = &innolux_g121i1_l01
4436 .compatible = "innolux,g121x1-l03",
4437 .data = &innolux_g121x1_l03,
4440 .data = &innolux_n116bge,
4442 .compatible = "innolux,n156bge-l21",
4443 .data = &innolux_n156bge_l21,
4445 .compatible = "innolux,p120zdg-bf1",
4446 .data = &innolux_p120zdg_bf1,
4448 .compatible = "innolux,zj070na-01p",
4449 .data = &innolux_zj070na_01p,
4451 .compatible = "ivo,m133nwf4-r0",
4452 .data = &ivo_m133nwf4_r0,
4454 .compatible = "kingdisplay,kd116n21-30nv-a010",
4455 .data = &kingdisplay_kd116n21_30nv_a010,
4458 .data = &koe_tx14d24vm1bpa,
4461 .data = &koe_tx26d202vm0bwa,
4464 .data = &koe_tx31d200vm0baa,
4467 .data = &kyo_tcg121xglp,
4469 .compatible = "lemaker,bl035-rgb-002",
4470 .data = &lemaker_bl035_rgb_002,
4473 .data = &lg_lb070wv8,
4475 .compatible = "lg,lp079qx1-sp0v",
4476 .data = &lg_lp079qx1_sp0v,
4478 .compatible = "lg,lp097qx1-spa1",
4479 .data = &lg_lp097qx1_spa1,
4482 .data = &lg_lp120up1,
4485 .data = &lg_lp129qe,
4488 .data = &logicpd_type_28,
4490 .compatible = "logictechno,lt161010-2nhc",
4491 .data = &logictechno_lt161010_2nh,
4493 .compatible = "logictechno,lt161010-2nhr",
4494 .data = &logictechno_lt161010_2nh,
4496 .compatible = "logictechno,lt170410-2whc",
4497 .data = &logictechno_lt170410_2whc,
4499 .compatible = "mitsubishi,aa070mc01-ca1",
4500 .data = &mitsubishi_aa070mc01,
4502 .compatible = "nec,nl12880bc20-05",
4503 .data = &nec_nl12880bc20_05,
4505 .compatible = "nec,nl4827hc19-05b",
4506 .data = &nec_nl4827hc19_05b,
4508 .compatible = "netron-dy,e231732",
4509 .data = &netron_dy_e231732,
4512 .data = &neweast_wjfh116008a,
4514 .compatible = "newhaven,nhd-4.3-480272ef-atxl",
4515 .data = &newhaven_nhd_43_480272ef_atxl,
4517 .compatible = "nlt,nl192108ac18-02d",
4518 .data = &nlt_nl192108ac18_02d,
4521 .data = &nvd_9128,
4523 .compatible = "okaya,rs800480t-7x0gp",
4524 .data = &okaya_rs800480t_7x0gp,
4526 .compatible = "olimex,lcd-olinuxino-43-ts",
4527 .data = &olimex_lcd_olinuxino_43ts,
4530 .data = &ontat_yx700wv03,
4533 .data = &ortustech_com37h3m,
4536 .data = &ortustech_com37h3m,
4539 .data = &ortustech_com43h4m85ulc,
4541 .compatible = "osddisplays,osd070t1718-19ts",
4542 .data = &osddisplays_osd070t1718_19ts,
4544 .compatible = "pda,91-00156-a0",
4545 .data = &pda_91_00156_a0,
4547 .compatible = "powertip,ph800480t013-idf02",
4548 .data = &powertip_ph800480t013_idf02,
4550 .compatible = "qiaodian,qd43003c0-40",
4551 .data = &qd43003c0_40,
4554 .data = &rocktech_rk070er9427,
4556 .compatible = "rocktech,rk101ii01d-ct",
4557 .data = &rocktech_rk101ii01d_ct,
4559 .compatible = "samsung,lsn122dl01-c01",
4560 .data = &samsung_lsn122dl01_c01,
4563 .data = &samsung_ltn101nt05,
4565 .compatible = "samsung,ltn140at29-301",
4566 .data = &samsung_ltn140at29_301,
4569 .data = &satoz_sat050at40h12r2,
4571 .compatible = "sharp,ld-d5116z01b",
4572 .data = &sharp_ld_d5116z01b,
4575 .data = &sharp_lq035q7db03,
4578 .data = &sharp_lq070y3dg3b,
4581 .data = &sharp_lq101k1ly04,
4584 .data = &sharp_lq123p1jx31,
4587 .data = &sharp_ls020b1dd01d,
4589 .compatible = "shelly,sca07010-bfn-lnn",
4590 .data = &shelly_sca07010_bfn_lnn,
4593 .data = &starry_kr070pe2t,
4596 .data = &starry_kr122ea0sra,
4598 .compatible = "tfc,s9700rtwv43tr-01b",
4599 .data = &tfc_s9700rtwv43tr_01b,
4602 .data = &tianma_tm070jdhg30,
4605 .data = &tianma_tm070jvhg33,
4608 .data = &tianma_tm070rvhg71,
4610 .compatible = "ti,nspire-cx-lcd-panel",
4611 .data = &ti_nspire_cx_lcd_panel,
4613 .compatible = "ti,nspire-classic-lcd-panel",
4614 .data = &ti_nspire_classic_lcd_panel,
4617 .data = &toshiba_lt089ac29000,
4619 .compatible = "tpk,f07a-0102",
4620 .data = &tpk_f07a_0102,
4622 .compatible = "tpk,f10a-0102",
4623 .data = &tpk_f10a_0102,
4625 .compatible = "urt,umsh-8596md-t",
4626 .data = &urt_umsh_8596md_parallel,
4628 .compatible = "urt,umsh-8596md-1t",
4629 .data = &urt_umsh_8596md_parallel,
4631 .compatible = "urt,umsh-8596md-7t",
4632 .data = &urt_umsh_8596md_parallel,
4634 .compatible = "urt,umsh-8596md-11t",
4635 .data = &urt_umsh_8596md_lvds,
4637 .compatible = "urt,umsh-8596md-19t",
4638 .data = &urt_umsh_8596md_lvds,
4640 .compatible = "urt,umsh-8596md-20t",
4641 .data = &urt_umsh_8596md_parallel,
4643 .compatible = "vxt,vl050-8048nt-c01",
4644 .data = &vl050_8048nt_c01,
4647 .data = &winstar_wf35ltiacd,
4650 .compatible = "panel-dpi",
4651 .data = &panel_dpi,
4672 struct device_node *np = dev->of_node; in panel_simple_of_get_desc_data()
4674 const void *data; in panel_simple_of_get_desc_data() local
4678 if (of_child_node_is_present(np, "display-timings")) { in panel_simple_of_get_desc_data()
4683 return -ENOMEM; in panel_simple_of_get_desc_data()
4687 desc->modes = mode; in panel_simple_of_get_desc_data()
4688 desc->num_modes = 1; in panel_simple_of_get_desc_data()
4689 desc->bus_flags = bus_flags; in panel_simple_of_get_desc_data()
4691 } else if (of_child_node_is_present(np, "panel-timing")) { in panel_simple_of_get_desc_data()
4697 return -ENOMEM; in panel_simple_of_get_desc_data()
4699 if (!of_get_display_timing(np, "panel-timing", timing)) { in panel_simple_of_get_desc_data()
4700 desc->timings = timing; in panel_simple_of_get_desc_data()
4701 desc->num_timings = 1; in panel_simple_of_get_desc_data()
4704 vm.flags = timing->flags; in panel_simple_of_get_desc_data()
4706 desc->bus_flags = bus_flags; in panel_simple_of_get_desc_data()
4710 if (desc->num_modes || desc->num_timings) { in panel_simple_of_get_desc_data()
4711 of_property_read_u32(np, "bpc", &desc->bpc); in panel_simple_of_get_desc_data()
4712 of_property_read_u32(np, "bus-format", &desc->bus_format); in panel_simple_of_get_desc_data()
4713 of_property_read_u32(np, "width-mm", &desc->size.width); in panel_simple_of_get_desc_data()
4714 of_property_read_u32(np, "height-mm", &desc->size.height); in panel_simple_of_get_desc_data()
4717 of_property_read_u32(np, "prepare-delay-ms", &desc->delay.prepare); in panel_simple_of_get_desc_data()
4718 of_property_read_u32(np, "enable-delay-ms", &desc->delay.enable); in panel_simple_of_get_desc_data()
4719 of_property_read_u32(np, "disable-delay-ms", &desc->delay.disable); in panel_simple_of_get_desc_data()
4720 of_property_read_u32(np, "unprepare-delay-ms", &desc->delay.unprepare); in panel_simple_of_get_desc_data()
4721 of_property_read_u32(np, "reset-delay-ms", &desc->delay.reset); in panel_simple_of_get_desc_data()
4722 of_property_read_u32(np, "init-delay-ms", &desc->delay.init); in panel_simple_of_get_desc_data()
4724 data = of_get_property(np, "panel-init-sequence", &len); in panel_simple_of_get_desc_data()
4725 if (data) { in panel_simple_of_get_desc_data()
4726 desc->init_seq = devm_kzalloc(dev, sizeof(*desc->init_seq), in panel_simple_of_get_desc_data()
4728 if (!desc->init_seq) in panel_simple_of_get_desc_data()
4729 return -ENOMEM; in panel_simple_of_get_desc_data()
4731 err = panel_simple_parse_cmd_seq(dev, data, len, in panel_simple_of_get_desc_data()
4732 desc->init_seq); in panel_simple_of_get_desc_data()
4739 data = of_get_property(np, "panel-exit-sequence", &len); in panel_simple_of_get_desc_data()
4740 if (data) { in panel_simple_of_get_desc_data()
4741 desc->exit_seq = devm_kzalloc(dev, sizeof(*desc->exit_seq), in panel_simple_of_get_desc_data()
4743 if (!desc->exit_seq) in panel_simple_of_get_desc_data()
4744 return -ENOMEM; in panel_simple_of_get_desc_data()
4746 err = panel_simple_parse_cmd_seq(dev, data, len, in panel_simple_of_get_desc_data()
4747 desc->exit_seq); in panel_simple_of_get_desc_data()
4759 struct device *dev = &pdev->dev; in panel_simple_platform_probe()
4765 id = of_match_node(platform_of_match, pdev->dev.of_node); in panel_simple_platform_probe()
4767 return -ENODEV; in panel_simple_platform_probe()
4769 if (!id->data) { in panel_simple_platform_probe()
4772 return -ENOMEM; in panel_simple_platform_probe()
4776 dev_err(dev, "failed to get desc data: %d\n", err); in panel_simple_platform_probe()
4781 desc = id->data ? id->data : d; in panel_simple_platform_probe()
4783 return panel_simple_probe(&pdev->dev, desc); in panel_simple_platform_probe()
4788 return panel_simple_remove(&pdev->dev); in panel_simple_platform_remove()
4793 panel_simple_shutdown(&pdev->dev); in panel_simple_platform_shutdown()
4798 .name = "panel-simple",
4832 .width = 108,
4860 .width = 107,
4890 .width = 94,
4918 .width = 62,
4946 .width = 217,
4975 .width = 62,
5004 .width = 217,
5018 .compatible = "simple-panel-dsi",
5019 .data = NULL,
5022 .data = &auo_b080uan01
5024 .compatible = "boe,tv080wum-nl0",
5025 .data = &boe_tv080wum_nl0
5027 .compatible = "lg,ld070wx3-sl01",
5028 .data = &lg_ld070wx3_sl01
5030 .compatible = "lg,lh500wx1-sd03",
5031 .data = &lg_lh500wx1_sd03
5034 .data = &panasonic_vvx10f004b00
5036 .compatible = "lg,acx467akm-7",
5037 .data = &lg_acx467akm_7
5039 .compatible = "osddisplays,osd101t2045-53ts",
5040 .data = &osd101t2045_53ts
5050 struct device_node *np = dev->of_node; in panel_simple_dsi_of_get_desc_data()
5054 err = panel_simple_of_get_desc_data(dev, &desc->desc); in panel_simple_dsi_of_get_desc_data()
5059 desc->flags = val; in panel_simple_dsi_of_get_desc_data()
5061 desc->format = val; in panel_simple_dsi_of_get_desc_data()
5063 desc->lanes = val; in panel_simple_dsi_of_get_desc_data()
5071 struct device *dev = &dsi->dev; in panel_simple_dsi_probe()
5077 id = of_match_node(dsi_of_match, dsi->dev.of_node); in panel_simple_dsi_probe()
5079 return -ENODEV; in panel_simple_dsi_probe()
5081 if (!id->data) { in panel_simple_dsi_probe()
5084 return -ENOMEM; in panel_simple_dsi_probe()
5088 dev_err(dev, "failed to get desc data: %d\n", err); in panel_simple_dsi_probe()
5093 desc = id->data ? id->data : d; in panel_simple_dsi_probe()
5095 err = panel_simple_probe(&dsi->dev, &desc->desc); in panel_simple_dsi_probe()
5100 panel->dsi = dsi; in panel_simple_dsi_probe()
5102 if (!panel->base.backlight) { in panel_simple_dsi_probe()
5110 panel->base.backlight = in panel_simple_dsi_probe()
5111 devm_backlight_device_register(dev, "dcs-backlight", in panel_simple_dsi_probe()
5114 if (IS_ERR(panel->base.backlight)) { in panel_simple_dsi_probe()
5115 err = PTR_ERR(panel->base.backlight); in panel_simple_dsi_probe()
5122 dsi->mode_flags = desc->flags; in panel_simple_dsi_probe()
5123 dsi->format = desc->format; in panel_simple_dsi_probe()
5124 dsi->lanes = desc->lanes; in panel_simple_dsi_probe()
5128 struct panel_simple *panel = dev_get_drvdata(&dsi->dev); in panel_simple_dsi_probe()
5130 drm_panel_remove(&panel->base); in panel_simple_dsi_probe()
5142 dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err); in panel_simple_dsi_remove()
5144 return panel_simple_remove(&dsi->dev); in panel_simple_dsi_remove()
5149 panel_simple_shutdown(&dsi->dev); in panel_simple_dsi_shutdown()
5154 .name = "panel-simple-dsi",
5162 static int panel_simple_spi_read(struct device *dev, const u8 cmd, u8 *data) in panel_simple_spi_read() argument
5167 static int panel_simple_spi_write_word(struct device *dev, u16 data) in panel_simple_spi_write_word() argument
5172 .tx_buf = &data, in panel_simple_spi_write_word()
5182 static int panel_simple_spi_write(struct device *dev, const u8 *data, size_t len, u8 type) in panel_simple_spi_write() argument
5189 ret = panel_simple_spi_write_word(dev, *data | mask); in panel_simple_spi_write()
5191 dev_err(dev, "failed to write spi seq: %*ph\n", (int)len, data); in panel_simple_spi_write()
5194 data++; in panel_simple_spi_write()
5201 { .compatible = "simple-panel-spi", .data = NULL },
5208 struct device *dev = &spi->dev; in panel_simple_spi_probe()
5214 id = of_match_node(panel_simple_spi_of_match, dev->of_node); in panel_simple_spi_probe()
5216 return -ENODEV; in panel_simple_spi_probe()
5218 if (!id->data) { in panel_simple_spi_probe()
5221 return -ENOMEM; in panel_simple_spi_probe()
5225 dev_err(dev, "failed to get desc data: %d\n", ret); in panel_simple_spi_probe()
5229 d->spi_write = panel_simple_spi_write; in panel_simple_spi_probe()
5230 d->spi_read = panel_simple_spi_read; in panel_simple_spi_probe()
5231 d->cmd_type = CMD_TYPE_SPI; in panel_simple_spi_probe()
5233 desc = id->data ? id->data : d; in panel_simple_spi_probe()
5238 spi->bits_per_word = 9; in panel_simple_spi_probe()
5239 spi->mode = SPI_MODE_3; in panel_simple_spi_probe()
5251 return panel_simple_remove(&spi->dev); in panel_simple_spi_remove()
5256 panel_simple_shutdown(&spi->dev); in panel_simple_spi_shutdown()
5261 .name = "panel-simple-spi",