Lines Matching defs:lcd

75 static void acx565akm_transfer(struct acx565akm_panel *lcd, int cmd,
118 ret = spi_sync(lcd->spi, &m);
120 dev_dbg(&lcd->spi->dev, "spi_sync %d\n", ret);
123 static inline void acx565akm_cmd(struct acx565akm_panel *lcd, int cmd)
125 acx565akm_transfer(lcd, cmd, NULL, 0, NULL, 0);
128 static inline void acx565akm_write(struct acx565akm_panel *lcd,
131 acx565akm_transfer(lcd, reg, buf, len, NULL, 0);
134 static inline void acx565akm_read(struct acx565akm_panel *lcd,
137 acx565akm_transfer(lcd, reg, NULL, 0, buf, len);
144 static unsigned int acx565akm_get_cabc_mode(struct acx565akm_panel *lcd)
146 return lcd->cabc_mode;
149 static void acx565akm_set_cabc_mode(struct acx565akm_panel *lcd,
154 lcd->cabc_mode = mode;
155 if (!lcd->enabled)
158 acx565akm_read(lcd, MIPID_CMD_READ_CABC, (u8 *)&cabc_ctrl, 1);
161 acx565akm_write(lcd, MIPID_CMD_WRITE_CABC, (u8 *)&cabc_ctrl, 2);
164 static unsigned int acx565akm_get_hw_cabc_mode(struct acx565akm_panel *lcd)
168 acx565akm_read(lcd, MIPID_CMD_READ_CABC, &cabc_ctrl, 1);
183 struct acx565akm_panel *lcd = dev_get_drvdata(dev);
187 if (!lcd->has_cabc)
190 mode = acx565akm_get_cabc_mode(lcd);
203 struct acx565akm_panel *lcd = dev_get_drvdata(dev);
222 if (!lcd->has_cabc && i != 0)
225 mutex_lock(&lcd->mutex);
226 acx565akm_set_cabc_mode(lcd, i);
227 mutex_unlock(&lcd->mutex);
236 struct acx565akm_panel *lcd = dev_get_drvdata(dev);
240 if (!lcd->has_cabc)
269 static int acx565akm_get_actual_brightness(struct acx565akm_panel *lcd)
273 acx565akm_read(lcd, MIPI_DCS_GET_DISPLAY_BRIGHTNESS, &bv, 1);
278 static void acx565akm_set_brightness(struct acx565akm_panel *lcd, int level)
284 acx565akm_write(lcd, MIPI_DCS_SET_DISPLAY_BRIGHTNESS, (u8 *)&bv, 2);
286 acx565akm_read(lcd, MIPI_DCS_GET_CONTROL_DISPLAY, (u8 *)&ctrl, 1);
295 acx565akm_write(lcd, MIPI_DCS_WRITE_CONTROL_DISPLAY, (u8 *)&ctrl, 2);
300 struct acx565akm_panel *lcd = dev_get_drvdata(&dev->dev);
309 acx565akm_set_brightness(lcd, level);
316 struct acx565akm_panel *lcd = dev_get_drvdata(&dev->dev);
319 mutex_lock(&lcd->mutex);
321 mutex_unlock(&lcd->mutex);
328 struct acx565akm_panel *lcd = dev_get_drvdata(&dev->dev);
331 mutex_lock(&lcd->mutex);
335 intensity = acx565akm_get_actual_brightness(lcd);
339 mutex_unlock(&lcd->mutex);
349 static int acx565akm_backlight_init(struct acx565akm_panel *lcd)
358 lcd->backlight = backlight_device_register(lcd->name, &lcd->spi->dev,
359 lcd, &acx565akm_bl_ops,
361 if (IS_ERR(lcd->backlight)) {
362 ret = PTR_ERR(lcd->backlight);
363 lcd->backlight = NULL;
367 if (lcd->has_cabc) {
368 ret = sysfs_create_group(&lcd->backlight->dev.kobj,
371 dev_err(&lcd->spi->dev,
373 backlight_device_unregister(lcd->backlight);
377 lcd->cabc_mode = acx565akm_get_hw_cabc_mode(lcd);
380 lcd->backlight->props.max_brightness = 255;
381 lcd->backlight->props.brightness = acx565akm_get_actual_brightness(lcd);
383 acx565akm_bl_update_status_locked(lcd->backlight);
388 static void acx565akm_backlight_cleanup(struct acx565akm_panel *lcd)
390 if (lcd->has_cabc)
391 sysfs_remove_group(&lcd->backlight->dev.kobj,
394 backlight_device_unregister(lcd->backlight);
401 static void acx565akm_set_sleep_mode(struct acx565akm_panel *lcd, int on)
410 wait = lcd->hw_guard_end - jiffies;
411 if ((long)wait > 0 && wait <= lcd->hw_guard_wait) {
416 acx565akm_cmd(lcd, cmd);
418 lcd->hw_guard_wait = msecs_to_jiffies(120);
419 lcd->hw_guard_end = jiffies + lcd->hw_guard_wait;
422 static void acx565akm_set_display_state(struct acx565akm_panel *lcd,
427 acx565akm_cmd(lcd, cmd);
430 static int acx565akm_power_on(struct acx565akm_panel *lcd)
435 gpiod_set_value(lcd->reset_gpio, 1);
437 if (lcd->enabled) {
438 dev_dbg(&lcd->spi->dev, "panel already enabled\n");
452 acx565akm_set_sleep_mode(lcd, 0);
453 lcd->enabled = true;
457 acx565akm_set_display_state(lcd, 1);
458 acx565akm_set_cabc_mode(lcd, lcd->cabc_mode);
460 return acx565akm_bl_update_status_locked(lcd->backlight);
463 static void acx565akm_power_off(struct acx565akm_panel *lcd)
465 if (!lcd->enabled)
468 acx565akm_set_display_state(lcd, 0);
469 acx565akm_set_sleep_mode(lcd, 1);
470 lcd->enabled = false;
479 gpiod_set_value(lcd->reset_gpio, 0);
487 struct acx565akm_panel *lcd = to_acx565akm_device(panel);
489 mutex_lock(&lcd->mutex);
490 acx565akm_power_off(lcd);
491 mutex_unlock(&lcd->mutex);
498 struct acx565akm_panel *lcd = to_acx565akm_device(panel);
500 mutex_lock(&lcd->mutex);
501 acx565akm_power_on(lcd);
502 mutex_unlock(&lcd->mutex);
554 static int acx565akm_detect(struct acx565akm_panel *lcd)
564 gpiod_set_value(lcd->reset_gpio, 1);
567 acx565akm_read(lcd, MIPI_DCS_GET_DISPLAY_STATUS, (u8 *)&value, 4);
569 lcd->enabled = (status & (1 << 17)) && (status & (1 << 10));
571 dev_dbg(&lcd->spi->dev,
573 lcd->enabled ? "enabled" : "disabled ", status);
575 acx565akm_read(lcd, MIPI_DCS_GET_DISPLAY_ID, lcd->display_id, 3);
576 dev_dbg(&lcd->spi->dev, "MIPI display ID: %02x%02x%02x\n",
577 lcd->display_id[0], lcd->display_id[1], lcd->display_id[2]);
579 switch (lcd->display_id[0]) {
581 lcd->model = MIPID_VER_ACX565AKM;
582 lcd->name = "acx565akm";
583 lcd->has_bc = 1;
584 lcd->has_cabc = 1;
587 lcd->model = MIPID_VER_L4F00311;
588 lcd->name = "l4f00311";
591 lcd->model = MIPID_VER_LPH8923;
592 lcd->name = "lph8923";
595 lcd->model = MIPID_VER_LS041Y3;
596 lcd->name = "ls041y3";
599 lcd->name = "unknown";
600 dev_err(&lcd->spi->dev, "unknown display ID\n");
605 lcd->revision = lcd->display_id[1];
607 dev_info(&lcd->spi->dev, "%s rev %02x panel detected\n",
608 lcd->name, lcd->revision);
611 if (!lcd->enabled)
612 gpiod_set_value(lcd->reset_gpio, 0);
619 struct acx565akm_panel *lcd;
622 lcd = devm_kzalloc(&spi->dev, sizeof(*lcd), GFP_KERNEL);
623 if (!lcd)
626 spi_set_drvdata(spi, lcd);
629 lcd->spi = spi;
630 mutex_init(&lcd->mutex);
632 lcd->reset_gpio = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_HIGH);
633 if (IS_ERR(lcd->reset_gpio)) {
635 return PTR_ERR(lcd->reset_gpio);
638 ret = acx565akm_detect(lcd);
644 if (lcd->has_bc) {
645 ret = acx565akm_backlight_init(lcd);
650 drm_panel_init(&lcd->panel, &lcd->spi->dev, &acx565akm_funcs,
653 drm_panel_add(&lcd->panel);
660 struct acx565akm_panel *lcd = spi_get_drvdata(spi);
662 drm_panel_remove(&lcd->panel);
664 if (lcd->has_bc)
665 acx565akm_backlight_cleanup(lcd);
667 drm_panel_disable(&lcd->panel);
668 drm_panel_unprepare(&lcd->panel);