• Home
  • Raw
  • Download

Lines Matching +full:op +full:- +full:panel

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2017-2018, Bootlin
30 enum ili9881c_op op; member
48 struct drm_panel panel; member
58 .op = ILI9881C_SWITCH_PAGE, \
66 .op = ILI9881C_COMMAND, \
396 ILI9881C_COMMAND_INSTR(0x6F, 0x33), /* pumping ratio VGH=5x VGL=-3x */
397 ILI9881C_COMMAND_INSTR(0x8D, 0x1B), /* VGL clamp -10V */
456 static inline struct ili9881c *panel_to_ili9881c(struct drm_panel *panel) in panel_to_ili9881c() argument
458 return container_of(panel, struct ili9881c, panel); in panel_to_ili9881c()
462 * The panel seems to accept some private DCS commands that map
477 ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf)); in ili9881c_switch_page()
489 ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf)); in ili9881c_send_cmd_data()
496 static int ili9881c_prepare(struct drm_panel *panel) in ili9881c_prepare() argument
498 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_prepare()
502 /* Power the panel */ in ili9881c_prepare()
503 ret = regulator_enable(ctx->power); in ili9881c_prepare()
509 gpiod_set_value(ctx->reset, 1); in ili9881c_prepare()
512 gpiod_set_value(ctx->reset, 0); in ili9881c_prepare()
515 for (i = 0; i < ctx->desc->init_length; i++) { in ili9881c_prepare()
516 const struct ili9881c_instr *instr = &ctx->desc->init[i]; in ili9881c_prepare()
518 if (instr->op == ILI9881C_SWITCH_PAGE) in ili9881c_prepare()
519 ret = ili9881c_switch_page(ctx, instr->arg.page); in ili9881c_prepare()
520 else if (instr->op == ILI9881C_COMMAND) in ili9881c_prepare()
521 ret = ili9881c_send_cmd_data(ctx, instr->arg.cmd.cmd, in ili9881c_prepare()
522 instr->arg.cmd.data); in ili9881c_prepare()
532 ret = mipi_dsi_dcs_set_tear_on(ctx->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); in ili9881c_prepare()
536 ret = mipi_dsi_dcs_exit_sleep_mode(ctx->dsi); in ili9881c_prepare()
543 static int ili9881c_enable(struct drm_panel *panel) in ili9881c_enable() argument
545 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_enable()
549 mipi_dsi_dcs_set_display_on(ctx->dsi); in ili9881c_enable()
554 static int ili9881c_disable(struct drm_panel *panel) in ili9881c_disable() argument
556 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_disable()
558 return mipi_dsi_dcs_set_display_off(ctx->dsi); in ili9881c_disable()
561 static int ili9881c_unprepare(struct drm_panel *panel) in ili9881c_unprepare() argument
563 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_unprepare()
565 mipi_dsi_dcs_enter_sleep_mode(ctx->dsi); in ili9881c_unprepare()
566 regulator_disable(ctx->power); in ili9881c_unprepare()
567 gpiod_set_value(ctx->reset, 1); in ili9881c_unprepare()
606 static int ili9881c_get_modes(struct drm_panel *panel, in ili9881c_get_modes() argument
609 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_get_modes()
612 mode = drm_mode_duplicate(connector->dev, ctx->desc->mode); in ili9881c_get_modes()
614 dev_err(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n", in ili9881c_get_modes()
615 ctx->desc->mode->hdisplay, in ili9881c_get_modes()
616 ctx->desc->mode->vdisplay, in ili9881c_get_modes()
617 drm_mode_vrefresh(ctx->desc->mode)); in ili9881c_get_modes()
618 return -ENOMEM; in ili9881c_get_modes()
623 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in ili9881c_get_modes()
626 connector->display_info.width_mm = mode->width_mm; in ili9881c_get_modes()
627 connector->display_info.height_mm = mode->height_mm; in ili9881c_get_modes()
645 ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL); in ili9881c_dsi_probe()
647 return -ENOMEM; in ili9881c_dsi_probe()
649 ctx->dsi = dsi; in ili9881c_dsi_probe()
650 ctx->desc = of_device_get_match_data(&dsi->dev); in ili9881c_dsi_probe()
652 drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs, in ili9881c_dsi_probe()
655 ctx->power = devm_regulator_get(&dsi->dev, "power"); in ili9881c_dsi_probe()
656 if (IS_ERR(ctx->power)) { in ili9881c_dsi_probe()
657 dev_err(&dsi->dev, "Couldn't get our power regulator\n"); in ili9881c_dsi_probe()
658 return PTR_ERR(ctx->power); in ili9881c_dsi_probe()
661 ctx->reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW); in ili9881c_dsi_probe()
662 if (IS_ERR(ctx->reset)) { in ili9881c_dsi_probe()
663 dev_err(&dsi->dev, "Couldn't get our reset GPIO\n"); in ili9881c_dsi_probe()
664 return PTR_ERR(ctx->reset); in ili9881c_dsi_probe()
667 ret = drm_panel_of_backlight(&ctx->panel); in ili9881c_dsi_probe()
671 drm_panel_add(&ctx->panel); in ili9881c_dsi_probe()
673 dsi->mode_flags = MIPI_DSI_MODE_VIDEO_SYNC_PULSE; in ili9881c_dsi_probe()
674 dsi->format = MIPI_DSI_FMT_RGB888; in ili9881c_dsi_probe()
675 dsi->lanes = 4; in ili9881c_dsi_probe()
685 drm_panel_remove(&ctx->panel); in ili9881c_dsi_remove()
704 { .compatible = "feixin,k101-im2byl02", .data = &k101_im2byl02_desc },
713 .name = "ili9881c-dsi",
719 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");