Lines Matching +full:panel +full:- +full:dsi

1 // SPDX-License-Identifier: GPL-2.0
3 * Raydium RM67191 MIPI-DSI panel driver
23 /* Panel specific color-format bits */
197 struct drm_panel panel; member
198 struct mipi_dsi_device *dsi; member
226 static inline struct rad_panel *to_rad_panel(struct drm_panel *panel) in to_rad_panel() argument
228 return container_of(panel, struct rad_panel, panel); in to_rad_panel()
231 static int rad_panel_push_cmd_list(struct mipi_dsi_device *dsi) in rad_panel_push_cmd_list() argument
239 u8 buffer[2] = { entry->cmd, entry->param }; in rad_panel_push_cmd_list()
241 ret = mipi_dsi_generic_write(dsi, &buffer, sizeof(buffer)); in rad_panel_push_cmd_list()
264 static int rad_panel_prepare(struct drm_panel *panel) in rad_panel_prepare() argument
266 struct rad_panel *rad = to_rad_panel(panel); in rad_panel_prepare()
269 if (rad->prepared) in rad_panel_prepare()
272 ret = regulator_bulk_enable(rad->num_supplies, rad->supplies); in rad_panel_prepare()
276 if (rad->reset) { in rad_panel_prepare()
277 gpiod_set_value_cansleep(rad->reset, 1); in rad_panel_prepare()
279 gpiod_set_value_cansleep(rad->reset, 0); in rad_panel_prepare()
283 rad->prepared = true; in rad_panel_prepare()
288 static int rad_panel_unprepare(struct drm_panel *panel) in rad_panel_unprepare() argument
290 struct rad_panel *rad = to_rad_panel(panel); in rad_panel_unprepare()
293 if (!rad->prepared) in rad_panel_unprepare()
301 if (rad->reset) { in rad_panel_unprepare()
302 gpiod_set_value_cansleep(rad->reset, 1); in rad_panel_unprepare()
304 gpiod_set_value_cansleep(rad->reset, 0); in rad_panel_unprepare()
307 ret = regulator_bulk_disable(rad->num_supplies, rad->supplies); in rad_panel_unprepare()
311 rad->prepared = false; in rad_panel_unprepare()
316 static int rad_panel_enable(struct drm_panel *panel) in rad_panel_enable() argument
318 struct rad_panel *rad = to_rad_panel(panel); in rad_panel_enable()
319 struct mipi_dsi_device *dsi = rad->dsi; in rad_panel_enable() local
320 struct device *dev = &dsi->dev; in rad_panel_enable()
321 int color_format = color_format_from_dsi_format(dsi->format); in rad_panel_enable()
324 if (rad->enabled) in rad_panel_enable()
327 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in rad_panel_enable()
329 ret = rad_panel_push_cmd_list(dsi); in rad_panel_enable()
336 ret = mipi_dsi_generic_write(dsi, (u8[]){ WRMAUCCTR, 0x00 }, 2); in rad_panel_enable()
341 ret = mipi_dsi_dcs_soft_reset(dsi); in rad_panel_enable()
349 /* Set DSI mode */ in rad_panel_enable()
350 ret = mipi_dsi_generic_write(dsi, (u8[]){ 0xC2, 0x0B }, 2); in rad_panel_enable()
352 dev_err(dev, "Failed to set DSI mode (%d)\n", ret); in rad_panel_enable()
356 ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); in rad_panel_enable()
362 ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0x380); in rad_panel_enable()
368 ret = mipi_dsi_dcs_set_pixel_format(dsi, color_format); in rad_panel_enable()
375 ret = mipi_dsi_dcs_exit_sleep_mode(dsi); in rad_panel_enable()
383 ret = mipi_dsi_dcs_set_display_on(dsi); in rad_panel_enable()
389 backlight_enable(rad->backlight); in rad_panel_enable()
391 rad->enabled = true; in rad_panel_enable()
396 gpiod_set_value_cansleep(rad->reset, 1); in rad_panel_enable()
401 static int rad_panel_disable(struct drm_panel *panel) in rad_panel_disable() argument
403 struct rad_panel *rad = to_rad_panel(panel); in rad_panel_disable()
404 struct mipi_dsi_device *dsi = rad->dsi; in rad_panel_disable() local
405 struct device *dev = &dsi->dev; in rad_panel_disable()
408 if (!rad->enabled) in rad_panel_disable()
411 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in rad_panel_disable()
413 backlight_disable(rad->backlight); in rad_panel_disable()
417 ret = mipi_dsi_dcs_set_display_off(dsi); in rad_panel_disable()
425 ret = mipi_dsi_dcs_enter_sleep_mode(dsi); in rad_panel_disable()
431 rad->enabled = false; in rad_panel_disable()
436 static int rad_panel_get_modes(struct drm_panel *panel, in rad_panel_get_modes() argument
441 mode = drm_mode_duplicate(connector->dev, &default_mode); in rad_panel_get_modes()
443 dev_err(panel->dev, "failed to add mode %ux%u@%u\n", in rad_panel_get_modes()
446 return -ENOMEM; in rad_panel_get_modes()
450 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in rad_panel_get_modes()
453 connector->display_info.width_mm = mode->width_mm; in rad_panel_get_modes()
454 connector->display_info.height_mm = mode->height_mm; in rad_panel_get_modes()
455 connector->display_info.bus_flags = rad_bus_flags; in rad_panel_get_modes()
457 drm_display_info_set_bus_formats(&connector->display_info, in rad_panel_get_modes()
465 struct mipi_dsi_device *dsi = bl_get_data(bl); in rad_bl_get_brightness() local
466 struct rad_panel *rad = mipi_dsi_get_drvdata(dsi); in rad_bl_get_brightness()
470 if (!rad->prepared) in rad_bl_get_brightness()
473 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in rad_bl_get_brightness()
475 ret = mipi_dsi_dcs_get_display_brightness(dsi, &brightness); in rad_bl_get_brightness()
479 bl->props.brightness = brightness; in rad_bl_get_brightness()
486 struct mipi_dsi_device *dsi = bl_get_data(bl); in rad_bl_update_status() local
487 struct rad_panel *rad = mipi_dsi_get_drvdata(dsi); in rad_bl_update_status()
490 if (!rad->prepared) in rad_bl_update_status()
493 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in rad_bl_update_status()
495 ret = mipi_dsi_dcs_set_display_brightness(dsi, bl->props.brightness); in rad_bl_update_status()
522 struct device *dev = &rad->dsi->dev; in rad_init_regulators()
525 rad->num_supplies = ARRAY_SIZE(rad_supply_names); in rad_init_regulators()
526 rad->supplies = devm_kcalloc(dev, rad->num_supplies, in rad_init_regulators()
527 sizeof(*rad->supplies), GFP_KERNEL); in rad_init_regulators()
528 if (!rad->supplies) in rad_init_regulators()
529 return -ENOMEM; in rad_init_regulators()
531 for (i = 0; i < rad->num_supplies; i++) in rad_init_regulators()
532 rad->supplies[i].supply = rad_supply_names[i]; in rad_init_regulators()
534 return devm_regulator_bulk_get(dev, rad->num_supplies, rad->supplies); in rad_init_regulators()
537 static int rad_panel_probe(struct mipi_dsi_device *dsi) in rad_panel_probe() argument
539 struct device *dev = &dsi->dev; in rad_panel_probe()
540 struct device_node *np = dev->of_node; in rad_panel_probe()
541 struct rad_panel *panel; in rad_panel_probe() local
546 panel = devm_kzalloc(&dsi->dev, sizeof(*panel), GFP_KERNEL); in rad_panel_probe()
547 if (!panel) in rad_panel_probe()
548 return -ENOMEM; in rad_panel_probe()
550 mipi_dsi_set_drvdata(dsi, panel); in rad_panel_probe()
552 panel->dsi = dsi; in rad_panel_probe()
554 dsi->format = MIPI_DSI_FMT_RGB888; in rad_panel_probe()
555 dsi->mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO; in rad_panel_probe()
557 ret = of_property_read_u32(np, "video-mode", &video_mode); in rad_panel_probe()
562 dsi->mode_flags |= MIPI_DSI_MODE_VIDEO_BURST; in rad_panel_probe()
565 /* non-burst mode with sync event */ in rad_panel_probe()
568 /* non-burst mode with sync pulse */ in rad_panel_probe()
569 dsi->mode_flags |= MIPI_DSI_MODE_VIDEO_SYNC_PULSE; in rad_panel_probe()
577 ret = of_property_read_u32(np, "dsi-lanes", &dsi->lanes); in rad_panel_probe()
579 dev_err(dev, "Failed to get dsi-lanes property (%d)\n", ret); in rad_panel_probe()
583 panel->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in rad_panel_probe()
584 if (IS_ERR(panel->reset)) in rad_panel_probe()
585 return PTR_ERR(panel->reset); in rad_panel_probe()
592 panel->backlight = devm_backlight_device_register(dev, dev_name(dev), in rad_panel_probe()
593 dev, dsi, &rad_bl_ops, in rad_panel_probe()
595 if (IS_ERR(panel->backlight)) { in rad_panel_probe()
596 ret = PTR_ERR(panel->backlight); in rad_panel_probe()
601 ret = rad_init_regulators(panel); in rad_panel_probe()
605 drm_panel_init(&panel->panel, dev, &rad_panel_funcs, in rad_panel_probe()
607 dev_set_drvdata(dev, panel); in rad_panel_probe()
609 drm_panel_add(&panel->panel); in rad_panel_probe()
611 ret = mipi_dsi_attach(dsi); in rad_panel_probe()
613 drm_panel_remove(&panel->panel); in rad_panel_probe()
618 static int rad_panel_remove(struct mipi_dsi_device *dsi) in rad_panel_remove() argument
620 struct rad_panel *rad = mipi_dsi_get_drvdata(dsi); in rad_panel_remove()
621 struct device *dev = &dsi->dev; in rad_panel_remove()
624 ret = mipi_dsi_detach(dsi); in rad_panel_remove()
628 drm_panel_remove(&rad->panel); in rad_panel_remove()
633 static void rad_panel_shutdown(struct mipi_dsi_device *dsi) in rad_panel_shutdown() argument
635 struct rad_panel *rad = mipi_dsi_get_drvdata(dsi); in rad_panel_shutdown()
637 rad_panel_disable(&rad->panel); in rad_panel_shutdown()
638 rad_panel_unprepare(&rad->panel); in rad_panel_shutdown()
649 .name = "panel-raydium-rm67191",
659 MODULE_DESCRIPTION("DRM Driver for Raydium RM67191 MIPI DSI panel");