Lines Matching +full:panel +full:- +full:dsi
1 // SPDX-License-Identifier: GPL-2.0-only
7 * Based on AUO panel driver by Rob Clark <robdclark@gmail.com>
25 struct mipi_dsi_device *dsi; member
36 static inline struct sharp_nt_panel *to_sharp_nt_panel(struct drm_panel *panel) in to_sharp_nt_panel() argument
38 return container_of(panel, struct sharp_nt_panel, base); in to_sharp_nt_panel()
43 struct mipi_dsi_device *dsi = sharp_nt->dsi; in sharp_nt_panel_init() local
46 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in sharp_nt_panel_init()
48 ret = mipi_dsi_dcs_exit_sleep_mode(dsi); in sharp_nt_panel_init()
54 /* Novatek two-lane operation */ in sharp_nt_panel_init()
55 ret = mipi_dsi_dcs_write(dsi, 0xae, (u8[]){ 0x03 }, 1); in sharp_nt_panel_init()
60 ret = mipi_dsi_dcs_set_pixel_format(dsi, MIPI_DCS_PIXEL_FMT_24BIT | in sharp_nt_panel_init()
70 struct mipi_dsi_device *dsi = sharp_nt->dsi; in sharp_nt_panel_on() local
73 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in sharp_nt_panel_on()
75 ret = mipi_dsi_dcs_set_display_on(dsi); in sharp_nt_panel_on()
84 struct mipi_dsi_device *dsi = sharp_nt->dsi; in sharp_nt_panel_off() local
87 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in sharp_nt_panel_off()
89 ret = mipi_dsi_dcs_set_display_off(dsi); in sharp_nt_panel_off()
93 ret = mipi_dsi_dcs_enter_sleep_mode(dsi); in sharp_nt_panel_off()
101 static int sharp_nt_panel_disable(struct drm_panel *panel) in sharp_nt_panel_disable() argument
103 struct sharp_nt_panel *sharp_nt = to_sharp_nt_panel(panel); in sharp_nt_panel_disable()
105 if (!sharp_nt->enabled) in sharp_nt_panel_disable()
108 sharp_nt->enabled = false; in sharp_nt_panel_disable()
113 static int sharp_nt_panel_unprepare(struct drm_panel *panel) in sharp_nt_panel_unprepare() argument
115 struct sharp_nt_panel *sharp_nt = to_sharp_nt_panel(panel); in sharp_nt_panel_unprepare()
118 if (!sharp_nt->prepared) in sharp_nt_panel_unprepare()
123 dev_err(panel->dev, "failed to set panel off: %d\n", ret); in sharp_nt_panel_unprepare()
127 regulator_disable(sharp_nt->supply); in sharp_nt_panel_unprepare()
128 if (sharp_nt->reset_gpio) in sharp_nt_panel_unprepare()
129 gpiod_set_value(sharp_nt->reset_gpio, 0); in sharp_nt_panel_unprepare()
131 sharp_nt->prepared = false; in sharp_nt_panel_unprepare()
136 static int sharp_nt_panel_prepare(struct drm_panel *panel) in sharp_nt_panel_prepare() argument
138 struct sharp_nt_panel *sharp_nt = to_sharp_nt_panel(panel); in sharp_nt_panel_prepare()
141 if (sharp_nt->prepared) in sharp_nt_panel_prepare()
144 ret = regulator_enable(sharp_nt->supply); in sharp_nt_panel_prepare()
150 if (sharp_nt->reset_gpio) { in sharp_nt_panel_prepare()
151 gpiod_set_value(sharp_nt->reset_gpio, 1); in sharp_nt_panel_prepare()
153 gpiod_set_value(sharp_nt->reset_gpio, 0); in sharp_nt_panel_prepare()
155 gpiod_set_value(sharp_nt->reset_gpio, 1); in sharp_nt_panel_prepare()
161 dev_err(panel->dev, "failed to init panel: %d\n", ret); in sharp_nt_panel_prepare()
167 dev_err(panel->dev, "failed to set panel on: %d\n", ret); in sharp_nt_panel_prepare()
171 sharp_nt->prepared = true; in sharp_nt_panel_prepare()
176 regulator_disable(sharp_nt->supply); in sharp_nt_panel_prepare()
177 if (sharp_nt->reset_gpio) in sharp_nt_panel_prepare()
178 gpiod_set_value(sharp_nt->reset_gpio, 0); in sharp_nt_panel_prepare()
182 static int sharp_nt_panel_enable(struct drm_panel *panel) in sharp_nt_panel_enable() argument
184 struct sharp_nt_panel *sharp_nt = to_sharp_nt_panel(panel); in sharp_nt_panel_enable()
186 if (sharp_nt->enabled) in sharp_nt_panel_enable()
189 sharp_nt->enabled = true; in sharp_nt_panel_enable()
206 static int sharp_nt_panel_get_modes(struct drm_panel *panel, in sharp_nt_panel_get_modes() argument
211 mode = drm_mode_duplicate(connector->dev, &default_mode); in sharp_nt_panel_get_modes()
213 dev_err(panel->dev, "failed to add mode %ux%u@%u\n", in sharp_nt_panel_get_modes()
216 return -ENOMEM; in sharp_nt_panel_get_modes()
223 connector->display_info.width_mm = 54; in sharp_nt_panel_get_modes()
224 connector->display_info.height_mm = 95; in sharp_nt_panel_get_modes()
239 struct device *dev = &sharp_nt->dsi->dev; in sharp_nt_panel_add()
242 sharp_nt->mode = &default_mode; in sharp_nt_panel_add()
244 sharp_nt->supply = devm_regulator_get(dev, "avdd"); in sharp_nt_panel_add()
245 if (IS_ERR(sharp_nt->supply)) in sharp_nt_panel_add()
246 return PTR_ERR(sharp_nt->supply); in sharp_nt_panel_add()
248 sharp_nt->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sharp_nt_panel_add()
249 if (IS_ERR(sharp_nt->reset_gpio)) { in sharp_nt_panel_add()
250 dev_err(dev, "cannot get reset-gpios %ld\n", in sharp_nt_panel_add()
251 PTR_ERR(sharp_nt->reset_gpio)); in sharp_nt_panel_add()
252 sharp_nt->reset_gpio = NULL; in sharp_nt_panel_add()
254 gpiod_set_value(sharp_nt->reset_gpio, 0); in sharp_nt_panel_add()
257 drm_panel_init(&sharp_nt->base, &sharp_nt->dsi->dev, in sharp_nt_panel_add()
260 ret = drm_panel_of_backlight(&sharp_nt->base); in sharp_nt_panel_add()
264 drm_panel_add(&sharp_nt->base); in sharp_nt_panel_add()
271 if (sharp_nt->base.dev) in sharp_nt_panel_del()
272 drm_panel_remove(&sharp_nt->base); in sharp_nt_panel_del()
275 static int sharp_nt_panel_probe(struct mipi_dsi_device *dsi) in sharp_nt_panel_probe() argument
280 dsi->lanes = 2; in sharp_nt_panel_probe()
281 dsi->format = MIPI_DSI_FMT_RGB888; in sharp_nt_panel_probe()
282 dsi->mode_flags = MIPI_DSI_MODE_VIDEO | in sharp_nt_panel_probe()
287 sharp_nt = devm_kzalloc(&dsi->dev, sizeof(*sharp_nt), GFP_KERNEL); in sharp_nt_panel_probe()
289 return -ENOMEM; in sharp_nt_panel_probe()
291 mipi_dsi_set_drvdata(dsi, sharp_nt); in sharp_nt_panel_probe()
293 sharp_nt->dsi = dsi; in sharp_nt_panel_probe()
299 return mipi_dsi_attach(dsi); in sharp_nt_panel_probe()
302 static int sharp_nt_panel_remove(struct mipi_dsi_device *dsi) in sharp_nt_panel_remove() argument
304 struct sharp_nt_panel *sharp_nt = mipi_dsi_get_drvdata(dsi); in sharp_nt_panel_remove()
307 ret = drm_panel_disable(&sharp_nt->base); in sharp_nt_panel_remove()
309 dev_err(&dsi->dev, "failed to disable panel: %d\n", ret); in sharp_nt_panel_remove()
311 ret = mipi_dsi_detach(dsi); in sharp_nt_panel_remove()
313 dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", ret); in sharp_nt_panel_remove()
320 static void sharp_nt_panel_shutdown(struct mipi_dsi_device *dsi) in sharp_nt_panel_shutdown() argument
322 struct sharp_nt_panel *sharp_nt = mipi_dsi_get_drvdata(dsi); in sharp_nt_panel_shutdown()
324 drm_panel_disable(&sharp_nt->base); in sharp_nt_panel_shutdown()
328 { .compatible = "sharp,ls043t1le01-qhd", },
335 .name = "panel-sharp-ls043t1le01-qhd",
345 MODULE_DESCRIPTION("Sharp LS043T1LE01 NT35565-based qHD (540x960) video mode panel driver");