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
49 struct drm_panel panel; member
62 .op = ILI9881C_SWITCH_PAGE, \
70 .op = ILI9881C_COMMAND, \
400 ILI9881C_COMMAND_INSTR(0x6F, 0x33), /* pumping ratio VGH=5x VGL=-3x */
401 ILI9881C_COMMAND_INSTR(0x8D, 0x1B), /* VGL clamp -10V */
1226 static inline struct ili9881c *panel_to_ili9881c(struct drm_panel *panel) in panel_to_ili9881c() argument
1228 return container_of(panel, struct ili9881c, panel); in panel_to_ili9881c()
1232 * The panel seems to accept some private DCS commands that map
1247 ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf)); in ili9881c_switch_page()
1259 ret = mipi_dsi_dcs_write_buffer(ctx->dsi, buf, sizeof(buf)); in ili9881c_send_cmd_data()
1266 static int ili9881c_prepare(struct drm_panel *panel) in ili9881c_prepare() argument
1268 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_prepare()
1272 /* Power the panel */ in ili9881c_prepare()
1273 ret = regulator_enable(ctx->power); in ili9881c_prepare()
1279 gpiod_set_value_cansleep(ctx->reset, 1); in ili9881c_prepare()
1282 gpiod_set_value_cansleep(ctx->reset, 0); in ili9881c_prepare()
1285 for (i = 0; i < ctx->desc->init_length; i++) { in ili9881c_prepare()
1286 const struct ili9881c_instr *instr = &ctx->desc->init[i]; in ili9881c_prepare()
1288 if (instr->op == ILI9881C_SWITCH_PAGE) in ili9881c_prepare()
1289 ret = ili9881c_switch_page(ctx, instr->arg.page); in ili9881c_prepare()
1290 else if (instr->op == ILI9881C_COMMAND) in ili9881c_prepare()
1291 ret = ili9881c_send_cmd_data(ctx, instr->arg.cmd.cmd, in ili9881c_prepare()
1292 instr->arg.cmd.data); in ili9881c_prepare()
1302 if (ctx->address_mode) { in ili9881c_prepare()
1303 ret = mipi_dsi_dcs_write(ctx->dsi, MIPI_DCS_SET_ADDRESS_MODE, in ili9881c_prepare()
1304 &ctx->address_mode, in ili9881c_prepare()
1305 sizeof(ctx->address_mode)); in ili9881c_prepare()
1310 ret = mipi_dsi_dcs_set_tear_on(ctx->dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); in ili9881c_prepare()
1314 ret = mipi_dsi_dcs_exit_sleep_mode(ctx->dsi); in ili9881c_prepare()
1321 static int ili9881c_enable(struct drm_panel *panel) in ili9881c_enable() argument
1323 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_enable()
1327 mipi_dsi_dcs_set_display_on(ctx->dsi); in ili9881c_enable()
1332 static int ili9881c_disable(struct drm_panel *panel) in ili9881c_disable() argument
1334 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_disable()
1336 return mipi_dsi_dcs_set_display_off(ctx->dsi); in ili9881c_disable()
1339 static int ili9881c_unprepare(struct drm_panel *panel) in ili9881c_unprepare() argument
1341 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_unprepare()
1343 mipi_dsi_dcs_enter_sleep_mode(ctx->dsi); in ili9881c_unprepare()
1344 regulator_disable(ctx->power); in ili9881c_unprepare()
1345 gpiod_set_value_cansleep(ctx->reset, 1); in ili9881c_unprepare()
1452 static int ili9881c_get_modes(struct drm_panel *panel, in ili9881c_get_modes() argument
1455 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_get_modes()
1458 mode = drm_mode_duplicate(connector->dev, ctx->desc->mode); in ili9881c_get_modes()
1460 dev_err(&ctx->dsi->dev, "failed to add mode %ux%ux@%u\n", in ili9881c_get_modes()
1461 ctx->desc->mode->hdisplay, in ili9881c_get_modes()
1462 ctx->desc->mode->vdisplay, in ili9881c_get_modes()
1463 drm_mode_vrefresh(ctx->desc->mode)); in ili9881c_get_modes()
1464 return -ENOMEM; in ili9881c_get_modes()
1469 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in ili9881c_get_modes()
1472 connector->display_info.width_mm = mode->width_mm; in ili9881c_get_modes()
1473 connector->display_info.height_mm = mode->height_mm; in ili9881c_get_modes()
1474 if (ctx->address_mode == 0x3) in ili9881c_get_modes()
1475 connector->display_info.subpixel_order = SubPixelHorizontalBGR; in ili9881c_get_modes()
1477 connector->display_info.subpixel_order = SubPixelHorizontalRGB; in ili9881c_get_modes()
1483 drm_connector_set_panel_orientation(connector, ctx->orientation); in ili9881c_get_modes()
1488 static enum drm_panel_orientation ili9881c_get_orientation(struct drm_panel *panel) in ili9881c_get_orientation() argument
1490 struct ili9881c *ctx = panel_to_ili9881c(panel); in ili9881c_get_orientation()
1492 return ctx->orientation; in ili9881c_get_orientation()
1509 ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL); in ili9881c_dsi_probe()
1511 return -ENOMEM; in ili9881c_dsi_probe()
1513 ctx->dsi = dsi; in ili9881c_dsi_probe()
1514 ctx->desc = of_device_get_match_data(&dsi->dev); in ili9881c_dsi_probe()
1516 drm_panel_init(&ctx->panel, &dsi->dev, &ili9881c_funcs, in ili9881c_dsi_probe()
1519 ctx->power = devm_regulator_get(&dsi->dev, "power"); in ili9881c_dsi_probe()
1520 if (IS_ERR(ctx->power)) in ili9881c_dsi_probe()
1521 return dev_err_probe(&dsi->dev, PTR_ERR(ctx->power), in ili9881c_dsi_probe()
1524 ctx->reset = devm_gpiod_get_optional(&dsi->dev, "reset", GPIOD_OUT_LOW); in ili9881c_dsi_probe()
1525 if (IS_ERR(ctx->reset)) in ili9881c_dsi_probe()
1526 return dev_err_probe(&dsi->dev, PTR_ERR(ctx->reset), in ili9881c_dsi_probe()
1529 ret = of_drm_get_panel_orientation(dsi->dev.of_node, &ctx->orientation); in ili9881c_dsi_probe()
1531 dev_err(&dsi->dev, "%pOF: failed to get orientation: %d\n", in ili9881c_dsi_probe()
1532 dsi->dev.of_node, ret); in ili9881c_dsi_probe()
1536 ctx->address_mode = ctx->desc->default_address_mode; in ili9881c_dsi_probe()
1537 if (ctx->orientation == DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP) { in ili9881c_dsi_probe()
1538 ctx->address_mode ^= 0x03; in ili9881c_dsi_probe()
1539 ctx->orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; in ili9881c_dsi_probe()
1542 ctx->panel.prepare_prev_first = true; in ili9881c_dsi_probe()
1544 ret = drm_panel_of_backlight(&ctx->panel); in ili9881c_dsi_probe()
1548 drm_panel_add(&ctx->panel); in ili9881c_dsi_probe()
1550 dsi->mode_flags = ctx->desc->mode_flags; in ili9881c_dsi_probe()
1551 dsi->format = MIPI_DSI_FMT_RGB888; in ili9881c_dsi_probe()
1552 dsi->lanes = 4; in ili9881c_dsi_probe()
1562 drm_panel_remove(&ctx->panel); in ili9881c_dsi_remove()
1614 { .compatible = "feixin,k101-im2byl02", .data = &k101_im2byl02_desc },
1627 .name = "ili9881c-dsi",
1633 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");