Lines Matching +full:panel +full:- +full:dsi +full:- +full:cm

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Generic DSI Command Mode panel driver
5 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/
31 /* DSI Virtual channel. Hardcoded for now. */
59 /* panel HW configuration from DT or platform data */
106 if (ddata->bldev) in dsicm_bl_power()
107 backlight = ddata->bldev; in dsicm_bl_power()
108 else if (ddata->extbldev) in dsicm_bl_power()
109 backlight = ddata->extbldev; in dsicm_bl_power()
114 backlight->props.fb_blank = FB_BLANK_UNBLANK; in dsicm_bl_power()
115 backlight->props.state = ~(BL_CORE_FBBLANK | BL_CORE_SUSPENDED); in dsicm_bl_power()
116 backlight->props.power = FB_BLANK_UNBLANK; in dsicm_bl_power()
118 backlight->props.fb_blank = FB_BLANK_NORMAL; in dsicm_bl_power()
119 backlight->props.power = FB_BLANK_POWERDOWN; in dsicm_bl_power()
120 backlight->props.state |= BL_CORE_FBBLANK | BL_CORE_SUSPENDED; in dsicm_bl_power()
128 ddata->hw_guard_wait = msecs_to_jiffies(guard_msec); in hw_guard_start()
129 ddata->hw_guard_end = jiffies + ddata->hw_guard_wait; in hw_guard_start()
134 unsigned long wait = ddata->hw_guard_end - jiffies; in hw_guard_wait()
136 if ((long)wait > 0 && wait <= ddata->hw_guard_wait) { in hw_guard_wait()
144 struct omap_dss_device *src = ddata->src; in dsicm_dcs_read_1()
148 r = src->ops->dsi.dcs_read(src, ddata->channel, dcs_cmd, buf, 1); in dsicm_dcs_read_1()
160 struct omap_dss_device *src = ddata->src; in dsicm_dcs_write_0()
162 return src->ops->dsi.dcs_write(src, ddata->channel, &dcs_cmd, 1); in dsicm_dcs_write_0()
167 struct omap_dss_device *src = ddata->src; in dsicm_dcs_write_1()
170 return src->ops->dsi.dcs_write(src, ddata->channel, buf, 2); in dsicm_dcs_write_1()
176 struct omap_dss_device *src = ddata->src; in dsicm_sleep_in()
183 r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, &cmd, 1); in dsicm_sleep_in()
231 struct omap_dss_device *src = ddata->src; in dsicm_set_update_window()
234 u16 x2 = x + w - 1; in dsicm_set_update_window()
236 u16 y2 = y + h - 1; in dsicm_set_update_window()
245 r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, buf, sizeof(buf)); in dsicm_set_update_window()
255 r = src->ops->dsi.dcs_write_nosync(src, ddata->channel, buf, sizeof(buf)); in dsicm_set_update_window()
259 src->ops->dsi.bta_sync(src, ddata->channel); in dsicm_set_update_window()
266 if (ddata->ulps_timeout > 0) in dsicm_queue_ulps_work()
267 queue_delayed_work(ddata->workqueue, &ddata->ulps_work, in dsicm_queue_ulps_work()
268 msecs_to_jiffies(ddata->ulps_timeout)); in dsicm_queue_ulps_work()
273 cancel_delayed_work(&ddata->ulps_work); in dsicm_cancel_ulps_work()
278 struct omap_dss_device *src = ddata->src; in dsicm_enter_ulps()
281 if (ddata->ulps_enabled) in dsicm_enter_ulps()
290 if (ddata->ext_te_gpio) in dsicm_enter_ulps()
291 disable_irq(gpiod_to_irq(ddata->ext_te_gpio)); in dsicm_enter_ulps()
293 src->ops->dsi.disable(src, false, true); in dsicm_enter_ulps()
295 ddata->ulps_enabled = true; in dsicm_enter_ulps()
300 dev_err(&ddata->pdev->dev, "enter ULPS failed"); in dsicm_enter_ulps()
303 ddata->ulps_enabled = false; in dsicm_enter_ulps()
312 struct omap_dss_device *src = ddata->src; in dsicm_exit_ulps()
315 if (!ddata->ulps_enabled) in dsicm_exit_ulps()
318 src->ops->enable(src); in dsicm_exit_ulps()
319 src->ops->dsi.enable_hs(src, ddata->channel, true); in dsicm_exit_ulps()
323 dev_err(&ddata->pdev->dev, "failed to re-enable TE"); in dsicm_exit_ulps()
327 if (ddata->ext_te_gpio) in dsicm_exit_ulps()
328 enable_irq(gpiod_to_irq(ddata->ext_te_gpio)); in dsicm_exit_ulps()
332 ddata->ulps_enabled = false; in dsicm_exit_ulps()
337 dev_err(&ddata->pdev->dev, "failed to exit ULPS"); in dsicm_exit_ulps()
341 if (ddata->ext_te_gpio) in dsicm_exit_ulps()
342 enable_irq(gpiod_to_irq(ddata->ext_te_gpio)); in dsicm_exit_ulps()
343 ddata->ulps_enabled = false; in dsicm_exit_ulps()
353 if (ddata->ulps_enabled) in dsicm_wake_up()
363 struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev); in dsicm_bl_update_status()
364 struct omap_dss_device *src = ddata->src; in dsicm_bl_update_status()
368 if (dev->props.fb_blank == FB_BLANK_UNBLANK && in dsicm_bl_update_status()
369 dev->props.power == FB_BLANK_UNBLANK) in dsicm_bl_update_status()
370 level = dev->props.brightness; in dsicm_bl_update_status()
374 dev_dbg(&ddata->pdev->dev, "update brightness to %d\n", level); in dsicm_bl_update_status()
376 mutex_lock(&ddata->lock); in dsicm_bl_update_status()
378 if (ddata->enabled) { in dsicm_bl_update_status()
379 src->ops->dsi.bus_lock(src); in dsicm_bl_update_status()
385 src->ops->dsi.bus_unlock(src); in dsicm_bl_update_status()
388 mutex_unlock(&ddata->lock); in dsicm_bl_update_status()
395 if (dev->props.fb_blank == FB_BLANK_UNBLANK && in dsicm_bl_get_intensity()
396 dev->props.power == FB_BLANK_UNBLANK) in dsicm_bl_get_intensity()
397 return dev->props.brightness; in dsicm_bl_get_intensity()
411 struct omap_dss_device *src = ddata->src; in dsicm_num_errors_show()
415 mutex_lock(&ddata->lock); in dsicm_num_errors_show()
417 if (ddata->enabled) { in dsicm_num_errors_show()
418 src->ops->dsi.bus_lock(src); in dsicm_num_errors_show()
425 src->ops->dsi.bus_unlock(src); in dsicm_num_errors_show()
427 r = -ENODEV; in dsicm_num_errors_show()
430 mutex_unlock(&ddata->lock); in dsicm_num_errors_show()
442 struct omap_dss_device *src = ddata->src; in dsicm_hw_revision_show()
446 mutex_lock(&ddata->lock); in dsicm_hw_revision_show()
448 if (ddata->enabled) { in dsicm_hw_revision_show()
449 src->ops->dsi.bus_lock(src); in dsicm_hw_revision_show()
455 src->ops->dsi.bus_unlock(src); in dsicm_hw_revision_show()
457 r = -ENODEV; in dsicm_hw_revision_show()
460 mutex_unlock(&ddata->lock); in dsicm_hw_revision_show()
473 struct omap_dss_device *src = ddata->src; in dsicm_store_ulps()
481 mutex_lock(&ddata->lock); in dsicm_store_ulps()
483 if (ddata->enabled) { in dsicm_store_ulps()
484 src->ops->dsi.bus_lock(src); in dsicm_store_ulps()
491 src->ops->dsi.bus_unlock(src); in dsicm_store_ulps()
494 mutex_unlock(&ddata->lock); in dsicm_store_ulps()
509 mutex_lock(&ddata->lock); in dsicm_show_ulps()
510 t = ddata->ulps_enabled; in dsicm_show_ulps()
511 mutex_unlock(&ddata->lock); in dsicm_show_ulps()
521 struct omap_dss_device *src = ddata->src; in dsicm_store_ulps_timeout()
529 mutex_lock(&ddata->lock); in dsicm_store_ulps_timeout()
530 ddata->ulps_timeout = t; in dsicm_store_ulps_timeout()
532 if (ddata->enabled) { in dsicm_store_ulps_timeout()
534 src->ops->dsi.bus_lock(src); in dsicm_store_ulps_timeout()
536 src->ops->dsi.bus_unlock(src); in dsicm_store_ulps_timeout()
539 mutex_unlock(&ddata->lock); in dsicm_store_ulps_timeout()
554 mutex_lock(&ddata->lock); in dsicm_show_ulps_timeout()
555 t = ddata->ulps_timeout; in dsicm_show_ulps_timeout()
556 mutex_unlock(&ddata->lock); in dsicm_show_ulps_timeout()
582 gpiod_set_value(ddata->reset_gpio, 1); in dsicm_hw_reset()
584 /* reset the panel */ in dsicm_hw_reset()
585 gpiod_set_value(ddata->reset_gpio, 0); in dsicm_hw_reset()
588 gpiod_set_value(ddata->reset_gpio, 1); in dsicm_hw_reset()
595 struct omap_dss_device *src = ddata->src; in dsicm_power_on()
601 .vm = &ddata->vm, in dsicm_power_on()
608 if (ddata->vpnl) { in dsicm_power_on()
609 r = regulator_enable(ddata->vpnl); in dsicm_power_on()
611 dev_err(&ddata->pdev->dev, in dsicm_power_on()
617 if (ddata->vddi) { in dsicm_power_on()
618 r = regulator_enable(ddata->vddi); in dsicm_power_on()
620 dev_err(&ddata->pdev->dev, in dsicm_power_on()
626 if (ddata->pin_config.num_pins > 0) { in dsicm_power_on()
627 r = src->ops->dsi.configure_pins(src, &ddata->pin_config); in dsicm_power_on()
629 dev_err(&ddata->pdev->dev, in dsicm_power_on()
630 "failed to configure DSI pins\n"); in dsicm_power_on()
635 r = src->ops->dsi.set_config(src, &dsi_config); in dsicm_power_on()
637 dev_err(&ddata->pdev->dev, "failed to configure DSI\n"); in dsicm_power_on()
641 src->ops->enable(src); in dsicm_power_on()
645 src->ops->dsi.enable_hs(src, ddata->channel, false); in dsicm_power_on()
673 r = _dsicm_enable_te(ddata, ddata->te_enabled); in dsicm_power_on()
677 r = src->ops->dsi.enable_video_output(src, ddata->channel); in dsicm_power_on()
681 ddata->enabled = true; in dsicm_power_on()
683 if (!ddata->intro_printed) { in dsicm_power_on()
684 dev_info(&ddata->pdev->dev, "panel revision %02x.%02x.%02x\n", in dsicm_power_on()
686 ddata->intro_printed = true; in dsicm_power_on()
689 src->ops->dsi.enable_hs(src, ddata->channel, true); in dsicm_power_on()
693 dev_err(&ddata->pdev->dev, "error while enabling panel, issuing HW reset\n"); in dsicm_power_on()
697 src->ops->dsi.disable(src, true, false); in dsicm_power_on()
699 if (ddata->vddi) in dsicm_power_on()
700 regulator_disable(ddata->vddi); in dsicm_power_on()
702 if (ddata->vpnl) in dsicm_power_on()
703 regulator_disable(ddata->vpnl); in dsicm_power_on()
710 struct omap_dss_device *src = ddata->src; in dsicm_power_off()
713 src->ops->dsi.disable_video_output(src, ddata->channel); in dsicm_power_off()
720 dev_err(&ddata->pdev->dev, in dsicm_power_off()
721 "error disabling panel, issuing HW reset\n"); in dsicm_power_off()
725 src->ops->dsi.disable(src, true, false); in dsicm_power_off()
727 if (ddata->vddi) in dsicm_power_off()
728 regulator_disable(ddata->vddi); in dsicm_power_off()
729 if (ddata->vpnl) in dsicm_power_off()
730 regulator_disable(ddata->vpnl); in dsicm_power_off()
732 ddata->enabled = false; in dsicm_power_off()
737 dev_err(&ddata->pdev->dev, "performing LCD reset\n"); in dsicm_panel_reset()
748 struct device *dev = &ddata->pdev->dev; in dsicm_connect()
751 r = src->ops->dsi.request_vc(src, &ddata->channel); in dsicm_connect()
757 r = src->ops->dsi.set_vc_id(src, ddata->channel, TCH); in dsicm_connect()
760 src->ops->dsi.release_vc(src, ddata->channel); in dsicm_connect()
764 ddata->src = src; in dsicm_connect()
773 src->ops->dsi.release_vc(src, ddata->channel); in dsicm_disconnect()
774 ddata->src = NULL; in dsicm_disconnect()
780 struct omap_dss_device *src = ddata->src; in dsicm_enable()
783 mutex_lock(&ddata->lock); in dsicm_enable()
785 src->ops->dsi.bus_lock(src); in dsicm_enable()
789 src->ops->dsi.bus_unlock(src); in dsicm_enable()
794 mutex_unlock(&ddata->lock); in dsicm_enable()
800 dev_dbg(&ddata->pdev->dev, "enable failed (%d)\n", r); in dsicm_enable()
801 mutex_unlock(&ddata->lock); in dsicm_enable()
807 struct omap_dss_device *src = ddata->src; in dsicm_disable()
812 mutex_lock(&ddata->lock); in dsicm_disable()
816 src->ops->dsi.bus_lock(src); in dsicm_disable()
822 src->ops->dsi.bus_unlock(src); in dsicm_disable()
824 mutex_unlock(&ddata->lock); in dsicm_disable()
830 struct omap_dss_device *src = ddata->src; in dsicm_framedone_cb()
832 dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err); in dsicm_framedone_cb()
833 src->ops->dsi.bus_unlock(src); in dsicm_framedone_cb()
839 struct omap_dss_device *src = ddata->src; in dsicm_te_isr()
843 old = atomic_cmpxchg(&ddata->do_update, 1, 0); in dsicm_te_isr()
846 cancel_delayed_work(&ddata->te_timeout_work); in dsicm_te_isr()
848 r = src->ops->dsi.update(src, ddata->channel, dsicm_framedone_cb, in dsicm_te_isr()
856 dev_err(&ddata->pdev->dev, "start update failed\n"); in dsicm_te_isr()
857 src->ops->dsi.bus_unlock(src); in dsicm_te_isr()
865 struct omap_dss_device *src = ddata->src; in dsicm_te_timeout_work_callback()
867 dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n"); in dsicm_te_timeout_work_callback()
869 atomic_set(&ddata->do_update, 0); in dsicm_te_timeout_work_callback()
870 src->ops->dsi.bus_unlock(src); in dsicm_te_timeout_work_callback()
877 struct omap_dss_device *src = ddata->src; in dsicm_update()
880 dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h); in dsicm_update()
882 mutex_lock(&ddata->lock); in dsicm_update()
883 src->ops->dsi.bus_lock(src); in dsicm_update()
889 if (!ddata->enabled) { in dsicm_update()
894 /* XXX no need to send this every frame, but dsi break if not done */ in dsicm_update()
895 r = dsicm_set_update_window(ddata, 0, 0, ddata->vm.hactive, in dsicm_update()
896 ddata->vm.vactive); in dsicm_update()
900 if (ddata->te_enabled && ddata->ext_te_gpio) { in dsicm_update()
901 schedule_delayed_work(&ddata->te_timeout_work, in dsicm_update()
903 atomic_set(&ddata->do_update, 1); in dsicm_update()
905 r = src->ops->dsi.update(src, ddata->channel, dsicm_framedone_cb, in dsicm_update()
912 mutex_unlock(&ddata->lock); in dsicm_update()
915 src->ops->dsi.bus_unlock(src); in dsicm_update()
916 mutex_unlock(&ddata->lock); in dsicm_update()
923 struct omap_dss_device *src = ddata->src; in dsicm_sync()
925 dev_dbg(&ddata->pdev->dev, "sync\n"); in dsicm_sync()
927 mutex_lock(&ddata->lock); in dsicm_sync()
928 src->ops->dsi.bus_lock(src); in dsicm_sync()
929 src->ops->dsi.bus_unlock(src); in dsicm_sync()
930 mutex_unlock(&ddata->lock); in dsicm_sync()
932 dev_dbg(&ddata->pdev->dev, "sync done\n"); in dsicm_sync()
939 struct omap_dss_device *src = ddata->src; in _dsicm_enable_te()
947 if (!ddata->ext_te_gpio) in _dsicm_enable_te()
948 src->ops->dsi.enable_te(src, enable); in _dsicm_enable_te()
950 /* possible panel bug */ in _dsicm_enable_te()
959 struct omap_dss_device *src = ddata->src; in dsicm_enable_te()
962 mutex_lock(&ddata->lock); in dsicm_enable_te()
964 if (ddata->te_enabled == enable) in dsicm_enable_te()
967 src->ops->dsi.bus_lock(src); in dsicm_enable_te()
969 if (ddata->enabled) { in dsicm_enable_te()
979 ddata->te_enabled = enable; in dsicm_enable_te()
981 src->ops->dsi.bus_unlock(src); in dsicm_enable_te()
983 mutex_unlock(&ddata->lock); in dsicm_enable_te()
987 src->ops->dsi.bus_unlock(src); in dsicm_enable_te()
988 mutex_unlock(&ddata->lock); in dsicm_enable_te()
998 mutex_lock(&ddata->lock); in dsicm_get_te()
999 r = ddata->te_enabled; in dsicm_get_te()
1000 mutex_unlock(&ddata->lock); in dsicm_get_te()
1010 struct omap_dss_device *src = ddata->src; in dsicm_memory_read()
1017 return -ENOMEM; in dsicm_memory_read()
1019 mutex_lock(&ddata->lock); in dsicm_memory_read()
1021 if (!ddata->enabled) { in dsicm_memory_read()
1022 r = -ENODEV; in dsicm_memory_read()
1027 ddata->vm.hactive * ddata->vm.vactive * 3); in dsicm_memory_read()
1029 src->ops->dsi.bus_lock(src); in dsicm_memory_read()
1045 r = src->ops->dsi.set_max_rx_packet_size(src, ddata->channel, plen); in dsicm_memory_read()
1053 r = src->ops->dsi.dcs_read(src, ddata->channel, dcs_cmd, in dsicm_memory_read()
1054 buf + buf_used, size - buf_used); in dsicm_memory_read()
1057 dev_err(dssdev->dev, "read error\n"); in dsicm_memory_read()
1064 dev_err(&ddata->pdev->dev, "short read\n"); in dsicm_memory_read()
1069 dev_err(&ddata->pdev->dev, "signal pending, " in dsicm_memory_read()
1071 r = -ERESTARTSYS; in dsicm_memory_read()
1079 src->ops->dsi.set_max_rx_packet_size(src, ddata->channel, 1); in dsicm_memory_read()
1081 src->ops->dsi.bus_unlock(src); in dsicm_memory_read()
1083 mutex_unlock(&ddata->lock); in dsicm_memory_read()
1091 struct omap_dss_device *dssdev = &ddata->dssdev; in dsicm_ulps_work()
1092 struct omap_dss_device *src = ddata->src; in dsicm_ulps_work()
1094 mutex_lock(&ddata->lock); in dsicm_ulps_work()
1096 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || !ddata->enabled) { in dsicm_ulps_work()
1097 mutex_unlock(&ddata->lock); in dsicm_ulps_work()
1101 src->ops->dsi.bus_lock(src); in dsicm_ulps_work()
1105 src->ops->dsi.bus_unlock(src); in dsicm_ulps_work()
1106 mutex_unlock(&ddata->lock); in dsicm_ulps_work()
1114 connector->display_info.width_mm = ddata->width_mm; in dsicm_get_modes()
1115 connector->display_info.height_mm = ddata->height_mm; in dsicm_get_modes()
1117 return omapdss_display_get_modes(connector, &ddata->vm); in dsicm_get_modes()
1126 if (mode->hdisplay != ddata->vm.hactive) in dsicm_check_timings()
1127 ret = -EINVAL; in dsicm_check_timings()
1129 if (mode->vdisplay != ddata->vm.vactive) in dsicm_check_timings()
1130 ret = -EINVAL; in dsicm_check_timings()
1133 dev_warn(dssdev->dev, "wrong resolution: %d x %d", in dsicm_check_timings()
1134 mode->hdisplay, mode->vdisplay); in dsicm_check_timings()
1135 dev_warn(dssdev->dev, "panel resolution: %d x %d", in dsicm_check_timings()
1136 ddata->vm.hactive, ddata->vm.vactive); in dsicm_check_timings()
1165 struct device_node *node = pdev->dev.of_node; in dsicm_probe_of()
1171 ddata->reset_gpio = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW); in dsicm_probe_of()
1172 if (IS_ERR(ddata->reset_gpio)) { in dsicm_probe_of()
1173 err = PTR_ERR(ddata->reset_gpio); in dsicm_probe_of()
1174 dev_err(&pdev->dev, "reset gpio request failed: %d", err); in dsicm_probe_of()
1178 ddata->ext_te_gpio = devm_gpiod_get_optional(&pdev->dev, "te", in dsicm_probe_of()
1180 if (IS_ERR(ddata->ext_te_gpio)) { in dsicm_probe_of()
1181 err = PTR_ERR(ddata->ext_te_gpio); in dsicm_probe_of()
1182 dev_err(&pdev->dev, "TE gpio request failed: %d", err); in dsicm_probe_of()
1186 err = of_get_display_timing(node, "panel-timing", &timing); in dsicm_probe_of()
1188 videomode_from_timing(&timing, &ddata->vm); in dsicm_probe_of()
1189 if (!ddata->vm.pixelclock) in dsicm_probe_of()
1190 ddata->vm.pixelclock = in dsicm_probe_of()
1191 ddata->vm.hactive * ddata->vm.vactive * 60; in dsicm_probe_of()
1193 dev_warn(&pdev->dev, in dsicm_probe_of()
1197 ddata->width_mm = 0; in dsicm_probe_of()
1198 of_property_read_u32(node, "width-mm", &ddata->width_mm); in dsicm_probe_of()
1200 ddata->height_mm = 0; in dsicm_probe_of()
1201 of_property_read_u32(node, "height-mm", &ddata->height_mm); in dsicm_probe_of()
1203 ddata->vpnl = devm_regulator_get_optional(&pdev->dev, "vpnl"); in dsicm_probe_of()
1204 if (IS_ERR(ddata->vpnl)) { in dsicm_probe_of()
1205 err = PTR_ERR(ddata->vpnl); in dsicm_probe_of()
1206 if (err == -EPROBE_DEFER) in dsicm_probe_of()
1208 ddata->vpnl = NULL; in dsicm_probe_of()
1211 ddata->vddi = devm_regulator_get_optional(&pdev->dev, "vddi"); in dsicm_probe_of()
1212 if (IS_ERR(ddata->vddi)) { in dsicm_probe_of()
1213 err = PTR_ERR(ddata->vddi); in dsicm_probe_of()
1214 if (err == -EPROBE_DEFER) in dsicm_probe_of()
1216 ddata->vddi = NULL; in dsicm_probe_of()
1219 backlight = devm_of_find_backlight(&pdev->dev); in dsicm_probe_of()
1225 ddata->extbldev = backlight; in dsicm_probe_of()
1227 ddata->use_dsi_backlight = true; in dsicm_probe_of()
1238 struct device *dev = &pdev->dev; in dsicm_probe()
1246 return -ENOMEM; in dsicm_probe()
1249 ddata->pdev = pdev; in dsicm_probe()
1251 ddata->vm.hactive = 864; in dsicm_probe()
1252 ddata->vm.vactive = 480; in dsicm_probe()
1253 ddata->vm.pixelclock = 864 * 480 * 60; in dsicm_probe()
1259 dssdev = &ddata->dssdev; in dsicm_probe()
1260 dssdev->dev = dev; in dsicm_probe()
1261 dssdev->ops = &dsicm_ops; in dsicm_probe()
1262 dssdev->driver = &dsicm_dss_driver; in dsicm_probe()
1263 dssdev->type = OMAP_DISPLAY_TYPE_DSI; in dsicm_probe()
1264 dssdev->display = true; in dsicm_probe()
1265 dssdev->owner = THIS_MODULE; in dsicm_probe()
1266 dssdev->of_port = 0; in dsicm_probe()
1267 dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES; in dsicm_probe()
1269 dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | in dsicm_probe()
1275 mutex_init(&ddata->lock); in dsicm_probe()
1277 atomic_set(&ddata->do_update, 0); in dsicm_probe()
1279 if (ddata->ext_te_gpio) { in dsicm_probe()
1280 r = devm_request_irq(dev, gpiod_to_irq(ddata->ext_te_gpio), in dsicm_probe()
1290 INIT_DEFERRABLE_WORK(&ddata->te_timeout_work, in dsicm_probe()
1296 ddata->workqueue = create_singlethread_workqueue("dsicm_wq"); in dsicm_probe()
1297 if (!ddata->workqueue) { in dsicm_probe()
1298 r = -ENOMEM; in dsicm_probe()
1301 INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work); in dsicm_probe()
1305 if (ddata->use_dsi_backlight) { in dsicm_probe()
1317 ddata->bldev = bldev; in dsicm_probe()
1320 r = sysfs_create_group(&dev->kobj, &dsicm_attr_group); in dsicm_probe()
1329 destroy_workqueue(ddata->workqueue); in dsicm_probe()
1331 if (ddata->extbldev) in dsicm_probe()
1332 put_device(&ddata->extbldev->dev); in dsicm_probe()
1340 struct omap_dss_device *dssdev = &ddata->dssdev; in dsicm_remove()
1342 dev_dbg(&pdev->dev, "remove\n"); in dsicm_remove()
1348 omapdss_device_disconnect(ddata->src, dssdev); in dsicm_remove()
1350 sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group); in dsicm_remove()
1352 if (ddata->extbldev) in dsicm_remove()
1353 put_device(&ddata->extbldev->dev); in dsicm_remove()
1356 destroy_workqueue(ddata->workqueue); in dsicm_remove()
1358 /* reset, to be sure that the panel is in a valid state */ in dsicm_remove()
1365 { .compatible = "omapdss,panel-dsi-cm", },
1375 .name = "panel-dsi-cm",
1384 MODULE_DESCRIPTION("Generic DSI Command Mode Panel Driver");