Lines Matching +full:revision +full:- +full:id1

1 // SPDX-License-Identifier: GPL-2.0-only
92 ddata->hw_guard_wait = msecs_to_jiffies(guard_msec); in hw_guard_start()
93 ddata->hw_guard_end = jiffies + ddata->hw_guard_wait; in hw_guard_start()
98 unsigned long wait = ddata->hw_guard_end - jiffies; in hw_guard_wait()
100 if ((long)wait > 0 && time_before_eq(wait, ddata->hw_guard_wait)) { in hw_guard_wait()
108 struct omap_dss_device *in = ddata->in; in dsicm_dcs_read_1()
112 r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd, buf, 1); in dsicm_dcs_read_1()
124 struct omap_dss_device *in = ddata->in; in dsicm_dcs_write_0()
125 return in->ops.dsi->dcs_write(in, ddata->channel, &dcs_cmd, 1); in dsicm_dcs_write_0()
130 struct omap_dss_device *in = ddata->in; in dsicm_dcs_write_1()
133 return in->ops.dsi->dcs_write(in, ddata->channel, buf, 2); in dsicm_dcs_write_1()
139 struct omap_dss_device *in = ddata->in; in dsicm_sleep_in()
146 r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, &cmd, 1); in dsicm_sleep_in()
174 static int dsicm_get_id(struct panel_drv_data *ddata, u8 *id1, u8 *id2, u8 *id3) in dsicm_get_id() argument
178 r = dsicm_dcs_read_1(ddata, DCS_GET_ID1, id1); in dsicm_get_id()
194 struct omap_dss_device *in = ddata->in; in dsicm_set_update_window()
197 u16 x2 = x + w - 1; in dsicm_set_update_window()
199 u16 y2 = y + h - 1; in dsicm_set_update_window()
208 r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf)); in dsicm_set_update_window()
218 r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf)); in dsicm_set_update_window()
222 in->ops.dsi->bta_sync(in, ddata->channel); in dsicm_set_update_window()
229 if (ddata->ulps_timeout > 0) in dsicm_queue_ulps_work()
230 schedule_delayed_work(&ddata->ulps_work, in dsicm_queue_ulps_work()
231 msecs_to_jiffies(ddata->ulps_timeout)); in dsicm_queue_ulps_work()
236 cancel_delayed_work(&ddata->ulps_work); in dsicm_cancel_ulps_work()
241 struct omap_dss_device *in = ddata->in; in dsicm_enter_ulps()
244 if (ddata->ulps_enabled) in dsicm_enter_ulps()
253 if (ddata->ext_te_gpio) in dsicm_enter_ulps()
254 disable_irq(gpiod_to_irq(ddata->ext_te_gpio)); in dsicm_enter_ulps()
256 in->ops.dsi->disable(in, false, true); in dsicm_enter_ulps()
258 ddata->ulps_enabled = true; in dsicm_enter_ulps()
263 dev_err(&ddata->pdev->dev, "enter ULPS failed"); in dsicm_enter_ulps()
266 ddata->ulps_enabled = false; in dsicm_enter_ulps()
275 struct omap_dss_device *in = ddata->in; in dsicm_exit_ulps()
278 if (!ddata->ulps_enabled) in dsicm_exit_ulps()
281 r = in->ops.dsi->enable(in); in dsicm_exit_ulps()
283 dev_err(&ddata->pdev->dev, "failed to enable DSI\n"); in dsicm_exit_ulps()
287 in->ops.dsi->enable_hs(in, ddata->channel, true); in dsicm_exit_ulps()
291 dev_err(&ddata->pdev->dev, "failed to re-enable TE"); in dsicm_exit_ulps()
295 if (ddata->ext_te_gpio) in dsicm_exit_ulps()
296 enable_irq(gpiod_to_irq(ddata->ext_te_gpio)); in dsicm_exit_ulps()
300 ddata->ulps_enabled = false; in dsicm_exit_ulps()
305 dev_err(&ddata->pdev->dev, "failed to exit ULPS"); in dsicm_exit_ulps()
309 if (ddata->ext_te_gpio) in dsicm_exit_ulps()
310 enable_irq(gpiod_to_irq(ddata->ext_te_gpio)); in dsicm_exit_ulps()
311 ddata->ulps_enabled = false; in dsicm_exit_ulps()
321 if (ddata->ulps_enabled) in dsicm_wake_up()
331 struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev); in dsicm_bl_update_status()
332 struct omap_dss_device *in = ddata->in; in dsicm_bl_update_status()
336 dev_dbg(&ddata->pdev->dev, "update brightness to %d\n", level); in dsicm_bl_update_status()
338 mutex_lock(&ddata->lock); in dsicm_bl_update_status()
340 if (ddata->enabled) { in dsicm_bl_update_status()
341 in->ops.dsi->bus_lock(in); in dsicm_bl_update_status()
347 in->ops.dsi->bus_unlock(in); in dsicm_bl_update_status()
352 mutex_unlock(&ddata->lock); in dsicm_bl_update_status()
359 if (dev->props.fb_blank == FB_BLANK_UNBLANK && in dsicm_bl_get_intensity()
360 dev->props.power == FB_BLANK_UNBLANK) in dsicm_bl_get_intensity()
361 return dev->props.brightness; in dsicm_bl_get_intensity()
374 *xres = dssdev->panel.timings.x_res; in dsicm_get_resolution()
375 *yres = dssdev->panel.timings.y_res; in dsicm_get_resolution()
382 struct omap_dss_device *in = ddata->in; in dsicm_num_errors_show()
386 mutex_lock(&ddata->lock); in dsicm_num_errors_show()
388 if (ddata->enabled) { in dsicm_num_errors_show()
389 in->ops.dsi->bus_lock(in); in dsicm_num_errors_show()
396 in->ops.dsi->bus_unlock(in); in dsicm_num_errors_show()
398 r = -ENODEV; in dsicm_num_errors_show()
401 mutex_unlock(&ddata->lock); in dsicm_num_errors_show()
413 struct omap_dss_device *in = ddata->in; in dsicm_hw_revision_show()
414 u8 id1, id2, id3; in dsicm_hw_revision_show() local
417 mutex_lock(&ddata->lock); in dsicm_hw_revision_show()
419 if (ddata->enabled) { in dsicm_hw_revision_show()
420 in->ops.dsi->bus_lock(in); in dsicm_hw_revision_show()
424 r = dsicm_get_id(ddata, &id1, &id2, &id3); in dsicm_hw_revision_show()
426 in->ops.dsi->bus_unlock(in); in dsicm_hw_revision_show()
428 r = -ENODEV; in dsicm_hw_revision_show()
431 mutex_unlock(&ddata->lock); in dsicm_hw_revision_show()
436 return sysfs_emit(buf, "%02x.%02x.%02x\n", id1, id2, id3); in dsicm_hw_revision_show()
444 struct omap_dss_device *in = ddata->in; in dsicm_store_ulps()
452 mutex_lock(&ddata->lock); in dsicm_store_ulps()
454 if (ddata->enabled) { in dsicm_store_ulps()
455 in->ops.dsi->bus_lock(in); in dsicm_store_ulps()
462 in->ops.dsi->bus_unlock(in); in dsicm_store_ulps()
465 mutex_unlock(&ddata->lock); in dsicm_store_ulps()
480 mutex_lock(&ddata->lock); in dsicm_show_ulps()
481 t = ddata->ulps_enabled; in dsicm_show_ulps()
482 mutex_unlock(&ddata->lock); in dsicm_show_ulps()
492 struct omap_dss_device *in = ddata->in; in dsicm_store_ulps_timeout()
500 mutex_lock(&ddata->lock); in dsicm_store_ulps_timeout()
501 ddata->ulps_timeout = t; in dsicm_store_ulps_timeout()
503 if (ddata->enabled) { in dsicm_store_ulps_timeout()
505 in->ops.dsi->bus_lock(in); in dsicm_store_ulps_timeout()
507 in->ops.dsi->bus_unlock(in); in dsicm_store_ulps_timeout()
510 mutex_unlock(&ddata->lock); in dsicm_store_ulps_timeout()
525 mutex_lock(&ddata->lock); in dsicm_show_ulps_timeout()
526 t = ddata->ulps_timeout; in dsicm_show_ulps_timeout()
527 mutex_unlock(&ddata->lock); in dsicm_show_ulps_timeout()
558 gpiod_set_value_cansleep(ddata->reset_gpio, 1); in dsicm_hw_reset()
561 gpiod_set_value_cansleep(ddata->reset_gpio, 0); in dsicm_hw_reset()
565 gpiod_set_value_cansleep(ddata->reset_gpio, 1); in dsicm_hw_reset()
572 struct omap_dss_device *in = ddata->in; in dsicm_power_on()
573 u8 id1, id2, id3; in dsicm_power_on() local
578 .timings = &ddata->timings, in dsicm_power_on()
585 if (ddata->pin_config.num_pins > 0) { in dsicm_power_on()
586 r = in->ops.dsi->configure_pins(in, &ddata->pin_config); in dsicm_power_on()
588 dev_err(&ddata->pdev->dev, in dsicm_power_on()
594 r = in->ops.dsi->set_config(in, &dsi_config); in dsicm_power_on()
596 dev_err(&ddata->pdev->dev, "failed to configure DSI\n"); in dsicm_power_on()
600 r = in->ops.dsi->enable(in); in dsicm_power_on()
602 dev_err(&ddata->pdev->dev, "failed to enable DSI\n"); in dsicm_power_on()
608 in->ops.dsi->enable_hs(in, ddata->channel, false); in dsicm_power_on()
614 r = dsicm_get_id(ddata, &id1, &id2, &id3); in dsicm_power_on()
636 r = _dsicm_enable_te(ddata, ddata->te_enabled); in dsicm_power_on()
640 r = in->ops.dsi->enable_video_output(in, ddata->channel); in dsicm_power_on()
644 ddata->enabled = 1; in dsicm_power_on()
646 if (!ddata->intro_printed) { in dsicm_power_on()
647 dev_info(&ddata->pdev->dev, "panel revision %02x.%02x.%02x\n", in dsicm_power_on()
648 id1, id2, id3); in dsicm_power_on()
649 ddata->intro_printed = true; in dsicm_power_on()
652 in->ops.dsi->enable_hs(in, ddata->channel, true); in dsicm_power_on()
656 dev_err(&ddata->pdev->dev, "error while enabling panel, issuing HW reset\n"); in dsicm_power_on()
660 in->ops.dsi->disable(in, true, false); in dsicm_power_on()
667 struct omap_dss_device *in = ddata->in; in dsicm_power_off()
670 in->ops.dsi->disable_video_output(in, ddata->channel); in dsicm_power_off()
677 dev_err(&ddata->pdev->dev, in dsicm_power_off()
682 in->ops.dsi->disable(in, true, false); in dsicm_power_off()
684 ddata->enabled = 0; in dsicm_power_off()
689 dev_err(&ddata->pdev->dev, "performing LCD reset\n"); in dsicm_panel_reset()
699 struct omap_dss_device *in = ddata->in; in dsicm_connect()
700 struct device *dev = &ddata->pdev->dev; in dsicm_connect()
706 r = in->ops.dsi->connect(in, dssdev); in dsicm_connect()
712 r = in->ops.dsi->request_vc(ddata->in, &ddata->channel); in dsicm_connect()
718 r = in->ops.dsi->set_vc_id(ddata->in, ddata->channel, TCH); in dsicm_connect()
727 in->ops.dsi->release_vc(ddata->in, ddata->channel); in dsicm_connect()
729 in->ops.dsi->disconnect(in, dssdev); in dsicm_connect()
736 struct omap_dss_device *in = ddata->in; in dsicm_disconnect()
741 in->ops.dsi->release_vc(in, ddata->channel); in dsicm_disconnect()
742 in->ops.dsi->disconnect(in, dssdev); in dsicm_disconnect()
748 struct omap_dss_device *in = ddata->in; in dsicm_enable()
751 dev_dbg(&ddata->pdev->dev, "enable\n"); in dsicm_enable()
753 mutex_lock(&ddata->lock); in dsicm_enable()
756 r = -ENODEV; in dsicm_enable()
765 in->ops.dsi->bus_lock(in); in dsicm_enable()
769 in->ops.dsi->bus_unlock(in); in dsicm_enable()
774 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; in dsicm_enable()
776 mutex_unlock(&ddata->lock); in dsicm_enable()
780 dev_dbg(&ddata->pdev->dev, "enable failed\n"); in dsicm_enable()
781 mutex_unlock(&ddata->lock); in dsicm_enable()
788 struct omap_dss_device *in = ddata->in; in dsicm_disable()
791 dev_dbg(&ddata->pdev->dev, "disable\n"); in dsicm_disable()
793 mutex_lock(&ddata->lock); in dsicm_disable()
797 in->ops.dsi->bus_lock(in); in dsicm_disable()
805 in->ops.dsi->bus_unlock(in); in dsicm_disable()
807 dssdev->state = OMAP_DSS_DISPLAY_DISABLED; in dsicm_disable()
809 mutex_unlock(&ddata->lock); in dsicm_disable()
815 struct omap_dss_device *in = ddata->in; in dsicm_framedone_cb()
817 dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err); in dsicm_framedone_cb()
818 in->ops.dsi->bus_unlock(ddata->in); in dsicm_framedone_cb()
824 struct omap_dss_device *in = ddata->in; in dsicm_te_isr()
828 old = atomic_cmpxchg(&ddata->do_update, 1, 0); in dsicm_te_isr()
831 cancel_delayed_work(&ddata->te_timeout_work); in dsicm_te_isr()
833 r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb, in dsicm_te_isr()
841 dev_err(&ddata->pdev->dev, "start update failed\n"); in dsicm_te_isr()
842 in->ops.dsi->bus_unlock(in); in dsicm_te_isr()
850 struct omap_dss_device *in = ddata->in; in dsicm_te_timeout_work_callback()
852 dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n"); in dsicm_te_timeout_work_callback()
854 atomic_set(&ddata->do_update, 0); in dsicm_te_timeout_work_callback()
855 in->ops.dsi->bus_unlock(in); in dsicm_te_timeout_work_callback()
862 struct omap_dss_device *in = ddata->in; in dsicm_update()
865 dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h); in dsicm_update()
867 mutex_lock(&ddata->lock); in dsicm_update()
868 in->ops.dsi->bus_lock(in); in dsicm_update()
874 if (!ddata->enabled) { in dsicm_update()
881 dssdev->panel.timings.x_res, in dsicm_update()
882 dssdev->panel.timings.y_res); in dsicm_update()
886 if (ddata->te_enabled && ddata->ext_te_gpio) { in dsicm_update()
887 schedule_delayed_work(&ddata->te_timeout_work, in dsicm_update()
889 atomic_set(&ddata->do_update, 1); in dsicm_update()
891 r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb, in dsicm_update()
898 mutex_unlock(&ddata->lock); in dsicm_update()
901 in->ops.dsi->bus_unlock(in); in dsicm_update()
902 mutex_unlock(&ddata->lock); in dsicm_update()
909 struct omap_dss_device *in = ddata->in; in dsicm_sync()
911 dev_dbg(&ddata->pdev->dev, "sync\n"); in dsicm_sync()
913 mutex_lock(&ddata->lock); in dsicm_sync()
914 in->ops.dsi->bus_lock(in); in dsicm_sync()
915 in->ops.dsi->bus_unlock(in); in dsicm_sync()
916 mutex_unlock(&ddata->lock); in dsicm_sync()
918 dev_dbg(&ddata->pdev->dev, "sync done\n"); in dsicm_sync()
925 struct omap_dss_device *in = ddata->in; in _dsicm_enable_te()
933 if (!ddata->ext_te_gpio) in _dsicm_enable_te()
934 in->ops.dsi->enable_te(in, enable); in _dsicm_enable_te()
945 struct omap_dss_device *in = ddata->in; in dsicm_enable_te()
948 mutex_lock(&ddata->lock); in dsicm_enable_te()
950 if (ddata->te_enabled == enable) in dsicm_enable_te()
953 in->ops.dsi->bus_lock(in); in dsicm_enable_te()
955 if (ddata->enabled) { in dsicm_enable_te()
965 ddata->te_enabled = enable; in dsicm_enable_te()
967 in->ops.dsi->bus_unlock(in); in dsicm_enable_te()
969 mutex_unlock(&ddata->lock); in dsicm_enable_te()
973 in->ops.dsi->bus_unlock(in); in dsicm_enable_te()
974 mutex_unlock(&ddata->lock); in dsicm_enable_te()
984 mutex_lock(&ddata->lock); in dsicm_get_te()
985 r = ddata->te_enabled; in dsicm_get_te()
986 mutex_unlock(&ddata->lock); in dsicm_get_te()
996 struct omap_dss_device *in = ddata->in; in dsicm_memory_read()
1003 return -ENOMEM; in dsicm_memory_read()
1005 mutex_lock(&ddata->lock); in dsicm_memory_read()
1007 if (!ddata->enabled) { in dsicm_memory_read()
1008 r = -ENODEV; in dsicm_memory_read()
1013 dssdev->panel.timings.x_res * in dsicm_memory_read()
1014 dssdev->panel.timings.y_res * 3); in dsicm_memory_read()
1016 in->ops.dsi->bus_lock(in); in dsicm_memory_read()
1032 r = in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, plen); in dsicm_memory_read()
1040 r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd, in dsicm_memory_read()
1041 buf + buf_used, size - buf_used); in dsicm_memory_read()
1044 dev_err(dssdev->dev, "read error\n"); in dsicm_memory_read()
1051 dev_err(&ddata->pdev->dev, "short read\n"); in dsicm_memory_read()
1056 dev_err(&ddata->pdev->dev, "signal pending, " in dsicm_memory_read()
1058 r = -ERESTARTSYS; in dsicm_memory_read()
1066 in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, 1); in dsicm_memory_read()
1068 in->ops.dsi->bus_unlock(in); in dsicm_memory_read()
1070 mutex_unlock(&ddata->lock); in dsicm_memory_read()
1078 struct omap_dss_device *dssdev = &ddata->dssdev; in dsicm_ulps_work()
1079 struct omap_dss_device *in = ddata->in; in dsicm_ulps_work()
1081 mutex_lock(&ddata->lock); in dsicm_ulps_work()
1083 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || !ddata->enabled) { in dsicm_ulps_work()
1084 mutex_unlock(&ddata->lock); in dsicm_ulps_work()
1088 in->ops.dsi->bus_lock(in); in dsicm_ulps_work()
1092 in->ops.dsi->bus_unlock(in); in dsicm_ulps_work()
1093 mutex_unlock(&ddata->lock); in dsicm_ulps_work()
1120 struct device *dev = &pdev->dev; in dsicm_probe()
1126 if (!pdev->dev.of_node) in dsicm_probe()
1127 return -ENODEV; in dsicm_probe()
1131 return -ENOMEM; in dsicm_probe()
1134 ddata->pdev = pdev; in dsicm_probe()
1136 ddata->in = omapdss_of_find_source_for_first_ep(pdev->dev.of_node); in dsicm_probe()
1137 r = PTR_ERR_OR_ZERO(ddata->in); in dsicm_probe()
1139 dev_err(&pdev->dev, "failed to find video source: %d\n", r); in dsicm_probe()
1143 ddata->timings.x_res = 864; in dsicm_probe()
1144 ddata->timings.y_res = 480; in dsicm_probe()
1145 ddata->timings.pixelclock = 864 * 480 * 60; in dsicm_probe()
1147 dssdev = &ddata->dssdev; in dsicm_probe()
1148 dssdev->dev = dev; in dsicm_probe()
1149 dssdev->driver = &dsicm_ops; in dsicm_probe()
1150 dssdev->panel.timings = ddata->timings; in dsicm_probe()
1151 dssdev->type = OMAP_DISPLAY_TYPE_DSI; in dsicm_probe()
1152 dssdev->owner = THIS_MODULE; in dsicm_probe()
1154 dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888; in dsicm_probe()
1155 dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | in dsicm_probe()
1164 mutex_init(&ddata->lock); in dsicm_probe()
1166 atomic_set(&ddata->do_update, 0); in dsicm_probe()
1168 ddata->reset_gpio = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW); in dsicm_probe()
1169 r = PTR_ERR_OR_ZERO(ddata->reset_gpio); in dsicm_probe()
1171 dev_err(&pdev->dev, "Failed to request reset gpio: %d\n", r); in dsicm_probe()
1175 gpiod_set_consumer_name(ddata->reset_gpio, "taal rst"); in dsicm_probe()
1177 ddata->ext_te_gpio = devm_gpiod_get_optional(&pdev->dev, "te", in dsicm_probe()
1179 r = PTR_ERR_OR_ZERO(ddata->ext_te_gpio); in dsicm_probe()
1181 dev_err(&pdev->dev, "Failed to request TE gpio: %d\n", r); in dsicm_probe()
1185 if (ddata->ext_te_gpio) { in dsicm_probe()
1186 gpiod_set_consumer_name(ddata->ext_te_gpio, "taal irq"); in dsicm_probe()
1188 r = devm_request_irq(dev, gpiod_to_irq(ddata->ext_te_gpio), in dsicm_probe()
1198 INIT_DEFERRABLE_WORK(&ddata->te_timeout_work, in dsicm_probe()
1204 INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work); in dsicm_probe()
1208 if (ddata->use_dsi_backlight) { in dsicm_probe()
1220 ddata->bldev = bldev; in dsicm_probe()
1222 bldev->props.fb_blank = FB_BLANK_UNBLANK; in dsicm_probe()
1223 bldev->props.power = FB_BLANK_UNBLANK; in dsicm_probe()
1224 bldev->props.brightness = 255; in dsicm_probe()
1229 r = sysfs_create_group(&dev->kobj, &dsicm_attr_group); in dsicm_probe()
1247 struct omap_dss_device *dssdev = &ddata->dssdev; in dsicm_remove()
1250 dev_dbg(&pdev->dev, "remove\n"); in dsicm_remove()
1257 sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group); in dsicm_remove()
1259 bldev = ddata->bldev; in dsicm_remove()
1261 bldev->props.power = FB_BLANK_POWERDOWN; in dsicm_remove()
1266 omap_dss_put_device(ddata->in); in dsicm_remove()
1275 { .compatible = "omapdss,panel-dsi-cm", },
1285 .name = "panel-dsi-cm",