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

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2017-2018, Bootlin
29 enum ili9881c_op op; member
48 struct drm_panel panel; member
60 .op = ILI9881C_SWITCH_PAGE, \
68 .op = ILI9881C_COMMAND, \
398 ILI9881C_COMMAND_INSTR(0x6F, 0x33), /* pumping ratio VGH=5x VGL=-3x */
399 ILI9881C_COMMAND_INSTR(0x8D, 0x1B), /* VGL clamp -10V */
1030 static inline struct ili9881c *panel_to_ili9881c(struct drm_panel *panel) in panel_to_ili9881c() argument
1032 return container_of(panel, struct ili9881c, panel); in panel_to_ili9881c()
1036 * The panel seems to accept some private DCS commands that map
1051 ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf)); in ili9881c_switch_page()
1063 ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf)); in ili9881c_send_cmd_data()
1070 static int ili9881c_prepare(struct drm_panel *panel) in ili9881c_prepare() argument
1072 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_prepare()
1076 /* Power the panel */ in ili9881c_prepare()
1077 ret = regulator_enable(ctx->power); in ili9881c_prepare()
1083 gpiod_set_value(ctx->reset, 1); in ili9881c_prepare()
1086 gpiod_set_value(ctx->reset, 0); in ili9881c_prepare()
1089 for (i = 0; i < ctx->desc->init_length; i++) { in ili9881c_prepare()
1090 const struct ili9881c_instr *instr = &ctx->desc->init[i]; in ili9881c_prepare()
1092 if (instr->op == ILI9881C_SWITCH_PAGE) in ili9881c_prepare()
1093 ret = ili9881c_switch_page(ctx, instr->arg.page); in ili9881c_prepare()
1094 else if (instr->op == ILI9881C_COMMAND) in ili9881c_prepare()
1095 ret = ili9881c_send_cmd_data(ctx, instr->arg.cmd.cmd, in ili9881c_prepare()
1096 instr->arg.cmd.data); in ili9881c_prepare()
1106 ret = mipi_dsi_dcs_set_tear_on(ctx->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); in ili9881c_prepare()
1110 ret = mipi_dsi_dcs_exit_sleep_mode(ctx->dsi); in ili9881c_prepare()
1117 static int ili9881c_enable(struct drm_panel *panel) in ili9881c_enable() argument
1119 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_enable()
1123 mipi_dsi_dcs_set_display_on(ctx->dsi); in ili9881c_enable()
1128 static int ili9881c_disable(struct drm_panel *panel) in ili9881c_disable() argument
1130 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_disable()
1132 return mipi_dsi_dcs_set_display_off(ctx->dsi); in ili9881c_disable()
1135 static int ili9881c_unprepare(struct drm_panel *panel) in ili9881c_unprepare() argument
1137 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_unprepare()
1139 mipi_dsi_dcs_enter_sleep_mode(ctx->dsi); in ili9881c_unprepare()
1140 regulator_disable(ctx->power); in ili9881c_unprepare()
1141 gpiod_set_value(ctx->reset, 1); in ili9881c_unprepare()
1231 static int ili9881c_get_modes(struct drm_panel *panel, in ili9881c_get_modes() argument
1234 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_get_modes()
1237 mode = drm_mode_duplicate(connector->dev, ctx->desc->mode); in ili9881c_get_modes()
1239 dev_err(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n", in ili9881c_get_modes()
1240 ctx->desc->mode->hdisplay, in ili9881c_get_modes()
1241 ctx->desc->mode->vdisplay, in ili9881c_get_modes()
1242 drm_mode_vrefresh(ctx->desc->mode)); in ili9881c_get_modes()
1243 return -ENOMEM; in ili9881c_get_modes()
1248 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in ili9881c_get_modes()
1251 connector->display_info.width_mm = mode->width_mm; in ili9881c_get_modes()
1252 connector->display_info.height_mm = mode->height_mm; in ili9881c_get_modes()
1258 drm_connector_set_panel_orientation(connector, ctx->orientation); in ili9881c_get_modes()
1263 static enum drm_panel_orientation ili9881c_get_orientation(struct drm_panel *panel) in ili9881c_get_orientation() argument
1265 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_get_orientation()
1267 return ctx->orientation; in ili9881c_get_orientation()
1284 ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL); in ili9881c_dsi_probe()
1286 return -ENOMEM; in ili9881c_dsi_probe()
1288 ctx->dsi = dsi; in ili9881c_dsi_probe()
1289 ctx->desc = of_device_get_match_data(&dsi->dev); in ili9881c_dsi_probe()
1291 drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs, in ili9881c_dsi_probe()
1294 ctx->power = devm_regulator_get(&dsi->dev, "power"); in ili9881c_dsi_probe()
1295 if (IS_ERR(ctx->power)) in ili9881c_dsi_probe()
1296 return dev_err_probe(&dsi->dev, PTR_ERR(ctx->power), in ili9881c_dsi_probe()
1299 ctx->reset = devm_gpiod_get_optional(&dsi->dev, "reset", GPIOD_OUT_LOW); in ili9881c_dsi_probe()
1300 if (IS_ERR(ctx->reset)) in ili9881c_dsi_probe()
1301 return dev_err_probe(&dsi->dev, PTR_ERR(ctx->reset), in ili9881c_dsi_probe()
1304 ret = of_drm_get_panel_orientation(dsi->dev.of_node, &ctx->orientation); in ili9881c_dsi_probe()
1306 dev_err(&dsi->dev, "%pOF: failed to get orientation: %d\n", in ili9881c_dsi_probe()
1307 dsi->dev.of_node, ret); in ili9881c_dsi_probe()
1311 ctx->panel.prepare_prev_first = true; in ili9881c_dsi_probe()
1313 ret = drm_panel_of_backlight(&ctx->panel); in ili9881c_dsi_probe()
1317 drm_panel_add(&ctx->panel); in ili9881c_dsi_probe()
1319 dsi->mode_flags = ctx->desc->mode_flags; in ili9881c_dsi_probe()
1320 dsi->format = MIPI_DSI_FMT_RGB888; in ili9881c_dsi_probe()
1321 dsi->lanes = 4; in ili9881c_dsi_probe()
1331 drm_panel_remove(&ctx->panel); in ili9881c_dsi_remove()
1374 { .compatible = "feixin,k101-im2byl02", .data = &k101_im2byl02_desc },
1386 .name = "ili9881c-dsi",
1392 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");