Lines Matching +full:panel +full:- +full:dpi
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * TPO TD043MTEA1 Panel driver
112 dev_warn(&spi->dev, "failed to write to LCD reg (%d)\n", r); in tpo_td043_write()
152 struct panel_drv_data *ddata = dev_get_drvdata(dssdev->dev); in tpo_td043_set_hmirror()
154 ddata->hmirror = enable; in tpo_td043_set_hmirror()
155 return tpo_td043_write_mirror(ddata->spi, ddata->hmirror, in tpo_td043_set_hmirror()
156 ddata->vmirror); in tpo_td043_set_hmirror()
161 struct panel_drv_data *ddata = dev_get_drvdata(dssdev->dev); in tpo_td043_get_hmirror()
163 return ddata->hmirror; in tpo_td043_get_hmirror()
171 return sysfs_emit(buf, "%d\n", ddata->vmirror); in tpo_td043_vmirror_show()
187 ret = tpo_td043_write_mirror(ddata->spi, ddata->hmirror, val); in tpo_td043_vmirror_store()
191 ddata->vmirror = val; in tpo_td043_vmirror_store()
201 return sysfs_emit(buf, "%d\n", ddata->mode); in tpo_td043_mode_show()
213 return -EINVAL; in tpo_td043_mode_store()
215 ddata->mode = val; in tpo_td043_mode_store()
218 tpo_td043_write(ddata->spi, 2, val); in tpo_td043_mode_store()
231 for (i = 0; i < ARRAY_SIZE(ddata->gamma); i++) { in tpo_td043_gamma_show()
232 ret = snprintf(buf + len, PAGE_SIZE - len, "%u ", in tpo_td043_gamma_show()
233 ddata->gamma[i]); in tpo_td043_gamma_show()
238 buf[len - 1] = '\n'; in tpo_td043_gamma_show()
256 return -EINVAL; in tpo_td043_gamma_store()
259 ddata->gamma[i] = g[i]; in tpo_td043_gamma_store()
261 tpo_td043_write_gamma(ddata->spi, ddata->gamma); in tpo_td043_gamma_store()
288 if (ddata->powered_on) in tpo_td043_power_on()
291 r = regulator_enable(ddata->vcc_reg); in tpo_td043_power_on()
295 /* wait for panel to stabilize */ in tpo_td043_power_on()
298 gpiod_set_value_cansleep(ddata->reset_gpio, 0); in tpo_td043_power_on()
300 tpo_td043_write(ddata->spi, 2, in tpo_td043_power_on()
301 TPO_R02_MODE(ddata->mode) | TPO_R02_NCLK_RISING); in tpo_td043_power_on()
302 tpo_td043_write(ddata->spi, 3, TPO_R03_VAL_NORMAL); in tpo_td043_power_on()
303 tpo_td043_write(ddata->spi, 0x20, 0xf0); in tpo_td043_power_on()
304 tpo_td043_write(ddata->spi, 0x21, 0xf0); in tpo_td043_power_on()
305 tpo_td043_write_mirror(ddata->spi, ddata->hmirror, in tpo_td043_power_on()
306 ddata->vmirror); in tpo_td043_power_on()
307 tpo_td043_write_gamma(ddata->spi, ddata->gamma); in tpo_td043_power_on()
309 ddata->powered_on = 1; in tpo_td043_power_on()
315 if (!ddata->powered_on) in tpo_td043_power_off()
318 tpo_td043_write(ddata->spi, 3, in tpo_td043_power_off()
321 gpiod_set_value_cansleep(ddata->reset_gpio, 1); in tpo_td043_power_off()
326 tpo_td043_write(ddata->spi, 3, TPO_R03_VAL_STANDBY); in tpo_td043_power_off()
328 regulator_disable(ddata->vcc_reg); in tpo_td043_power_off()
330 ddata->powered_on = 0; in tpo_td043_power_off()
336 struct omap_dss_device *in = ddata->in; in tpo_td043_connect()
341 return in->ops.dpi->connect(in, dssdev); in tpo_td043_connect()
347 struct omap_dss_device *in = ddata->in; in tpo_td043_disconnect()
352 in->ops.dpi->disconnect(in, dssdev); in tpo_td043_disconnect()
358 struct omap_dss_device *in = ddata->in; in tpo_td043_enable()
362 return -ENODEV; in tpo_td043_enable()
367 if (ddata->data_lines) in tpo_td043_enable()
368 in->ops.dpi->set_data_lines(in, ddata->data_lines); in tpo_td043_enable()
369 in->ops.dpi->set_timings(in, &ddata->videomode); in tpo_td043_enable()
371 r = in->ops.dpi->enable(in); in tpo_td043_enable()
379 if (!ddata->spi_suspended) { in tpo_td043_enable()
382 in->ops.dpi->disable(in); in tpo_td043_enable()
387 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; in tpo_td043_enable()
395 struct omap_dss_device *in = ddata->in; in tpo_td043_disable()
400 in->ops.dpi->disable(in); in tpo_td043_disable()
402 if (!ddata->spi_suspended) in tpo_td043_disable()
405 dssdev->state = OMAP_DSS_DISPLAY_DISABLED; in tpo_td043_disable()
412 struct omap_dss_device *in = ddata->in; in tpo_td043_set_timings()
414 ddata->videomode = *timings; in tpo_td043_set_timings()
415 dssdev->panel.timings = *timings; in tpo_td043_set_timings()
417 in->ops.dpi->set_timings(in, timings); in tpo_td043_set_timings()
425 *timings = ddata->videomode; in tpo_td043_get_timings()
432 struct omap_dss_device *in = ddata->in; in tpo_td043_check_timings()
434 return in->ops.dpi->check_timings(in, timings); in tpo_td043_check_timings()
460 dev_dbg(&spi->dev, "%s\n", __func__); in tpo_td043_probe()
462 if (!spi->dev.of_node) in tpo_td043_probe()
463 return -ENODEV; in tpo_td043_probe()
465 spi->bits_per_word = 16; in tpo_td043_probe()
466 spi->mode = SPI_MODE_0; in tpo_td043_probe()
470 dev_err(&spi->dev, "spi_setup failed: %d\n", r); in tpo_td043_probe()
474 ddata = devm_kzalloc(&spi->dev, sizeof(*ddata), GFP_KERNEL); in tpo_td043_probe()
476 return -ENOMEM; in tpo_td043_probe()
478 dev_set_drvdata(&spi->dev, ddata); in tpo_td043_probe()
480 ddata->spi = spi; in tpo_td043_probe()
482 ddata->in = omapdss_of_find_source_for_first_ep(spi->dev.of_node); in tpo_td043_probe()
483 r = PTR_ERR_OR_ZERO(ddata->in); in tpo_td043_probe()
485 dev_err(&spi->dev, "failed to find video source: %d\n", r); in tpo_td043_probe()
489 ddata->mode = TPO_R02_MODE_800x480; in tpo_td043_probe()
490 memcpy(ddata->gamma, tpo_td043_def_gamma, sizeof(ddata->gamma)); in tpo_td043_probe()
492 ddata->vcc_reg = devm_regulator_get(&spi->dev, "vcc"); in tpo_td043_probe()
493 if (IS_ERR(ddata->vcc_reg)) { in tpo_td043_probe()
494 r = dev_err_probe(&spi->dev, PTR_ERR(ddata->vcc_reg), in tpo_td043_probe()
499 ddata->reset_gpio = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_HIGH); in tpo_td043_probe()
500 r = PTR_ERR_OR_ZERO(ddata->reset_gpio); in tpo_td043_probe()
502 dev_err(&spi->dev, "couldn't request reset GPIO\n"); in tpo_td043_probe()
506 gpiod_set_consumer_name(ddata->reset_gpio, "lcd reset"); in tpo_td043_probe()
508 r = sysfs_create_group(&spi->dev.kobj, &tpo_td043_attr_group); in tpo_td043_probe()
510 dev_err(&spi->dev, "failed to create sysfs files\n"); in tpo_td043_probe()
514 ddata->videomode = tpo_td043_timings; in tpo_td043_probe()
516 dssdev = &ddata->dssdev; in tpo_td043_probe()
517 dssdev->dev = &spi->dev; in tpo_td043_probe()
518 dssdev->driver = &tpo_td043_ops; in tpo_td043_probe()
519 dssdev->type = OMAP_DISPLAY_TYPE_DPI; in tpo_td043_probe()
520 dssdev->owner = THIS_MODULE; in tpo_td043_probe()
521 dssdev->panel.timings = ddata->videomode; in tpo_td043_probe()
525 dev_err(&spi->dev, "Failed to register panel\n"); in tpo_td043_probe()
532 sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group); in tpo_td043_probe()
536 omap_dss_put_device(ddata->in); in tpo_td043_probe()
542 struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev); in tpo_td043_remove()
543 struct omap_dss_device *dssdev = &ddata->dssdev; in tpo_td043_remove()
544 struct omap_dss_device *in = ddata->in; in tpo_td043_remove()
546 dev_dbg(&ddata->spi->dev, "%s\n", __func__); in tpo_td043_remove()
555 sysfs_remove_group(&spi->dev.kobj, &tpo_td043_attr_group); in tpo_td043_remove()
565 ddata->power_on_resume = ddata->powered_on; in tpo_td043_spi_suspend()
567 ddata->spi_suspended = 1; in tpo_td043_spi_suspend()
579 if (ddata->power_on_resume) { in tpo_td043_spi_resume()
584 ddata->spi_suspended = 0; in tpo_td043_spi_resume()
602 .name = "panel-tpo-td043mtea1",