| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2014 NVIDIA Corporation |
|---|
| 3 | | - * |
|---|
| 4 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 5 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 6 | | - * published by the Free Software Foundation. |
|---|
| 7 | 4 | */ |
|---|
| 8 | 5 | |
|---|
| 9 | | -#include <linux/backlight.h> |
|---|
| 6 | +#include <linux/delay.h> |
|---|
| 10 | 7 | #include <linux/gpio/consumer.h> |
|---|
| 11 | 8 | #include <linux/module.h> |
|---|
| 12 | 9 | #include <linux/of.h> |
|---|
| 13 | 10 | #include <linux/regulator/consumer.h> |
|---|
| 14 | 11 | |
|---|
| 15 | | -#include <drm/drmP.h> |
|---|
| 12 | +#include <video/mipi_display.h> |
|---|
| 13 | + |
|---|
| 16 | 14 | #include <drm/drm_crtc.h> |
|---|
| 15 | +#include <drm/drm_device.h> |
|---|
| 17 | 16 | #include <drm/drm_mipi_dsi.h> |
|---|
| 18 | 17 | #include <drm/drm_panel.h> |
|---|
| 19 | | - |
|---|
| 20 | | -#include <video/mipi_display.h> |
|---|
| 21 | 18 | |
|---|
| 22 | 19 | struct sharp_panel { |
|---|
| 23 | 20 | struct drm_panel base; |
|---|
| .. | .. |
|---|
| 25 | 22 | struct mipi_dsi_device *link1; |
|---|
| 26 | 23 | struct mipi_dsi_device *link2; |
|---|
| 27 | 24 | |
|---|
| 28 | | - struct backlight_device *backlight; |
|---|
| 29 | 25 | struct regulator *supply; |
|---|
| 30 | 26 | |
|---|
| 31 | 27 | bool prepared; |
|---|
| .. | .. |
|---|
| 95 | 91 | |
|---|
| 96 | 92 | if (!sharp->enabled) |
|---|
| 97 | 93 | return 0; |
|---|
| 98 | | - |
|---|
| 99 | | - backlight_disable(sharp->backlight); |
|---|
| 100 | 94 | |
|---|
| 101 | 95 | sharp->enabled = false; |
|---|
| 102 | 96 | |
|---|
| .. | .. |
|---|
| 260 | 254 | if (sharp->enabled) |
|---|
| 261 | 255 | return 0; |
|---|
| 262 | 256 | |
|---|
| 263 | | - backlight_enable(sharp->backlight); |
|---|
| 264 | | - |
|---|
| 265 | 257 | sharp->enabled = true; |
|---|
| 266 | 258 | |
|---|
| 267 | 259 | return 0; |
|---|
| .. | .. |
|---|
| 277 | 269 | .vsync_start = 1600 + 4, |
|---|
| 278 | 270 | .vsync_end = 1600 + 4 + 8, |
|---|
| 279 | 271 | .vtotal = 1600 + 4 + 8 + 32, |
|---|
| 280 | | - .vrefresh = 60, |
|---|
| 281 | 272 | }; |
|---|
| 282 | 273 | |
|---|
| 283 | | -static int sharp_panel_get_modes(struct drm_panel *panel) |
|---|
| 274 | +static int sharp_panel_get_modes(struct drm_panel *panel, |
|---|
| 275 | + struct drm_connector *connector) |
|---|
| 284 | 276 | { |
|---|
| 285 | 277 | struct drm_display_mode *mode; |
|---|
| 286 | 278 | |
|---|
| 287 | | - mode = drm_mode_duplicate(panel->drm, &default_mode); |
|---|
| 279 | + mode = drm_mode_duplicate(connector->dev, &default_mode); |
|---|
| 288 | 280 | if (!mode) { |
|---|
| 289 | | - dev_err(panel->drm->dev, "failed to add mode %ux%ux@%u\n", |
|---|
| 281 | + dev_err(panel->dev, "failed to add mode %ux%ux@%u\n", |
|---|
| 290 | 282 | default_mode.hdisplay, default_mode.vdisplay, |
|---|
| 291 | | - default_mode.vrefresh); |
|---|
| 283 | + drm_mode_vrefresh(&default_mode)); |
|---|
| 292 | 284 | return -ENOMEM; |
|---|
| 293 | 285 | } |
|---|
| 294 | 286 | |
|---|
| 295 | 287 | drm_mode_set_name(mode); |
|---|
| 296 | 288 | |
|---|
| 297 | | - drm_mode_probed_add(panel->connector, mode); |
|---|
| 289 | + drm_mode_probed_add(connector, mode); |
|---|
| 298 | 290 | |
|---|
| 299 | | - panel->connector->display_info.width_mm = 217; |
|---|
| 300 | | - panel->connector->display_info.height_mm = 136; |
|---|
| 291 | + connector->display_info.width_mm = 217; |
|---|
| 292 | + connector->display_info.height_mm = 136; |
|---|
| 301 | 293 | |
|---|
| 302 | 294 | return 1; |
|---|
| 303 | 295 | } |
|---|
| .. | .. |
|---|
| 318 | 310 | |
|---|
| 319 | 311 | static int sharp_panel_add(struct sharp_panel *sharp) |
|---|
| 320 | 312 | { |
|---|
| 321 | | - struct device *dev = &sharp->link1->dev; |
|---|
| 313 | + int ret; |
|---|
| 322 | 314 | |
|---|
| 323 | 315 | sharp->mode = &default_mode; |
|---|
| 324 | 316 | |
|---|
| .. | .. |
|---|
| 326 | 318 | if (IS_ERR(sharp->supply)) |
|---|
| 327 | 319 | return PTR_ERR(sharp->supply); |
|---|
| 328 | 320 | |
|---|
| 329 | | - sharp->backlight = devm_of_find_backlight(dev); |
|---|
| 321 | + drm_panel_init(&sharp->base, &sharp->link1->dev, &sharp_panel_funcs, |
|---|
| 322 | + DRM_MODE_CONNECTOR_DSI); |
|---|
| 330 | 323 | |
|---|
| 331 | | - if (IS_ERR(sharp->backlight)) |
|---|
| 332 | | - return PTR_ERR(sharp->backlight); |
|---|
| 324 | + ret = drm_panel_of_backlight(&sharp->base); |
|---|
| 325 | + if (ret) |
|---|
| 326 | + return ret; |
|---|
| 333 | 327 | |
|---|
| 334 | | - drm_panel_init(&sharp->base); |
|---|
| 335 | | - sharp->base.funcs = &sharp_panel_funcs; |
|---|
| 336 | | - sharp->base.dev = &sharp->link1->dev; |
|---|
| 328 | + drm_panel_add(&sharp->base); |
|---|
| 337 | 329 | |
|---|
| 338 | | - return drm_panel_add(&sharp->base); |
|---|
| 330 | + return 0; |
|---|
| 339 | 331 | } |
|---|
| 340 | 332 | |
|---|
| 341 | 333 | static void sharp_panel_del(struct sharp_panel *sharp) |
|---|
| .. | .. |
|---|
| 410 | 402 | return 0; |
|---|
| 411 | 403 | } |
|---|
| 412 | 404 | |
|---|
| 413 | | - err = sharp_panel_disable(&sharp->base); |
|---|
| 405 | + err = drm_panel_disable(&sharp->base); |
|---|
| 414 | 406 | if (err < 0) |
|---|
| 415 | 407 | dev_err(&dsi->dev, "failed to disable panel: %d\n", err); |
|---|
| 416 | 408 | |
|---|
| .. | .. |
|---|
| 431 | 423 | if (!sharp) |
|---|
| 432 | 424 | return; |
|---|
| 433 | 425 | |
|---|
| 434 | | - sharp_panel_disable(&sharp->base); |
|---|
| 426 | + drm_panel_disable(&sharp->base); |
|---|
| 435 | 427 | } |
|---|
| 436 | 428 | |
|---|
| 437 | 429 | static struct mipi_dsi_driver sharp_panel_driver = { |
|---|