1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Rockchip SoC DP (Display Port) interface driver.
4 *
5 * Copyright (C) Fuzhou Rockchip Electronics Co., Ltd.
6 * Author: Andy Yan <andy.yan@rock-chips.com>
7 * Yakir Yang <ykk@rock-chips.com>
8 * Jeff Chen <jeff.chen@rock-chips.com>
9 */
10
11 #include <linux/component.h>
12 #include <linux/mfd/syscon.h>
13 #include <linux/of_device.h>
14 #include <linux/of_graph.h>
15 #include <linux/regmap.h>
16 #include <linux/reset.h>
17 #include <linux/clk.h>
18
19 #include <uapi/linux/videodev2.h>
20 #include <video/of_videomode.h>
21 #include <video/videomode.h>
22
23 #include <drm/drm_atomic.h>
24 #include <drm/drm_atomic_helper.h>
25 #include <drm/bridge/analogix_dp.h>
26 #include <drm/drm_dp_helper.h>
27 #include <drm/drm_of.h>
28 #include <drm/drm_panel.h>
29 #include <drm/drm_probe_helper.h>
30 #include <drm/drm_simple_kms_helper.h>
31
32 #include "rockchip_drm_drv.h"
33 #include "rockchip_drm_vop.h"
34
35 #define PSR_WAIT_LINE_FLAG_TIMEOUT_MS 100
36
37 #define to_dp(nm) container_of(nm, struct rockchip_dp_device, nm)
38
39 #define GRF_REG_FIELD(_reg, _lsb, _msb) { \
40 .reg = _reg, \
41 .lsb = _lsb, \
42 .msb = _msb, \
43 .valid = true, \
44 }
45
46 struct rockchip_grf_reg_field {
47 unsigned int reg;
48 unsigned int lsb;
49 unsigned int msb;
50 bool valid;
51 };
52
53 /**
54 * struct rockchip_dp_chip_data - splite the grf setting of kind of chips
55 * @lcdc_sel: grf register field of lcdc_sel
56 * @spdif_sel: grf register field of spdif_sel
57 * @i2s_sel: grf register field of i2s_sel
58 * @edp_mode: grf register field of edp_mode
59 * @chip_type: specific chip type
60 * @ssc: check if SSC is supported by source
61 * @audio: check if audio is supported by source
62 * @split_mode: check if split mode is supported
63 */
64 struct rockchip_dp_chip_data {
65 const struct rockchip_grf_reg_field lcdc_sel;
66 const struct rockchip_grf_reg_field spdif_sel;
67 const struct rockchip_grf_reg_field i2s_sel;
68 const struct rockchip_grf_reg_field edp_mode;
69 u32 chip_type;
70 bool ssc;
71 bool audio;
72 bool split_mode;
73 };
74
75 struct rockchip_dp_device {
76 struct drm_device *drm_dev;
77 struct device *dev;
78 struct drm_encoder encoder;
79 struct drm_display_mode mode;
80
81 struct regmap *grf;
82 struct reset_control *rst;
83 struct reset_control *apb_reset;
84
85 struct platform_device *audio_pdev;
86 const struct rockchip_dp_chip_data *data;
87 int id;
88
89 struct analogix_dp_device *adp;
90 struct analogix_dp_plat_data plat_data;
91 struct rockchip_drm_sub_dev sub_dev;
92
93 unsigned int min_refresh_rate;
94 unsigned int max_refresh_rate;
95 };
96
rockchip_grf_write(struct regmap * grf,unsigned int reg,unsigned int mask,unsigned int val)97 static int rockchip_grf_write(struct regmap *grf, unsigned int reg,
98 unsigned int mask, unsigned int val)
99 {
100 return regmap_write(grf, reg, (mask << 16) | (val & mask));
101 }
102
rockchip_grf_field_write(struct regmap * grf,const struct rockchip_grf_reg_field * field,unsigned int val)103 static int rockchip_grf_field_write(struct regmap *grf,
104 const struct rockchip_grf_reg_field *field,
105 unsigned int val)
106 {
107 unsigned int mask;
108
109 if (!field->valid)
110 return 0;
111
112 mask = GENMASK(field->msb, field->lsb);
113 val <<= field->lsb;
114
115 return rockchip_grf_write(grf, field->reg, mask, val);
116 }
117
rockchip_dp_audio_hw_params(struct device * dev,void * data,struct hdmi_codec_daifmt * daifmt,struct hdmi_codec_params * params)118 static int rockchip_dp_audio_hw_params(struct device *dev, void *data,
119 struct hdmi_codec_daifmt *daifmt,
120 struct hdmi_codec_params *params)
121 {
122 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
123
124 rockchip_grf_field_write(dp->grf, &dp->data->spdif_sel,
125 daifmt->fmt == HDMI_SPDIF);
126 rockchip_grf_field_write(dp->grf, &dp->data->i2s_sel,
127 daifmt->fmt == HDMI_I2S);
128
129 return analogix_dp_audio_hw_params(dp->adp, daifmt, params);
130 }
131
rockchip_dp_audio_shutdown(struct device * dev,void * data)132 static void rockchip_dp_audio_shutdown(struct device *dev, void *data)
133 {
134 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
135
136 analogix_dp_audio_shutdown(dp->adp);
137
138 rockchip_grf_field_write(dp->grf, &dp->data->spdif_sel, 0);
139 rockchip_grf_field_write(dp->grf, &dp->data->i2s_sel, 0);
140 }
141
rockchip_dp_audio_startup(struct device * dev,void * data)142 static int rockchip_dp_audio_startup(struct device *dev, void *data)
143 {
144 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
145
146 return analogix_dp_audio_startup(dp->adp);
147 }
148
rockchip_dp_audio_get_eld(struct device * dev,void * data,u8 * buf,size_t len)149 static int rockchip_dp_audio_get_eld(struct device *dev, void *data,
150 u8 *buf, size_t len)
151 {
152 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
153
154 return analogix_dp_audio_get_eld(dp->adp, buf, len);
155 }
156
157 static const struct hdmi_codec_ops rockchip_dp_audio_codec_ops = {
158 .hw_params = rockchip_dp_audio_hw_params,
159 .audio_startup = rockchip_dp_audio_startup,
160 .audio_shutdown = rockchip_dp_audio_shutdown,
161 .get_eld = rockchip_dp_audio_get_eld,
162 };
163
rockchip_dp_match_by_id(struct device * dev,const void * data)164 static int rockchip_dp_match_by_id(struct device *dev, const void *data)
165 {
166 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
167 const unsigned int *id = data;
168
169 return dp->id == *id;
170 }
171
172 static struct rockchip_dp_device *
rockchip_dp_find_by_id(struct device_driver * drv,unsigned int id)173 rockchip_dp_find_by_id(struct device_driver *drv, unsigned int id)
174 {
175 struct device *dev;
176
177 dev = driver_find_device(drv, NULL, &id, rockchip_dp_match_by_id);
178 if (!dev)
179 return NULL;
180
181 return dev_get_drvdata(dev);
182 }
183
rockchip_dp_pre_init(struct rockchip_dp_device * dp)184 static int rockchip_dp_pre_init(struct rockchip_dp_device *dp)
185 {
186 reset_control_assert(dp->rst);
187 usleep_range(10, 20);
188 reset_control_deassert(dp->rst);
189
190 reset_control_assert(dp->apb_reset);
191 usleep_range(10, 20);
192 reset_control_deassert(dp->apb_reset);
193
194 return 0;
195 }
196
rockchip_dp_poweron_start(struct analogix_dp_plat_data * plat_data)197 static int rockchip_dp_poweron_start(struct analogix_dp_plat_data *plat_data)
198 {
199 struct rockchip_dp_device *dp = to_dp(plat_data);
200 int ret;
201
202 ret = rockchip_dp_pre_init(dp);
203 if (ret < 0) {
204 DRM_DEV_ERROR(dp->dev, "failed to dp pre init %d\n", ret);
205 return ret;
206 }
207
208 return rockchip_grf_field_write(dp->grf, &dp->data->edp_mode, 1);
209 }
210
rockchip_dp_powerdown(struct analogix_dp_plat_data * plat_data)211 static int rockchip_dp_powerdown(struct analogix_dp_plat_data *plat_data)
212 {
213 struct rockchip_dp_device *dp = to_dp(plat_data);
214
215 return rockchip_grf_field_write(dp->grf, &dp->data->edp_mode, 0);
216 }
217
rockchip_dp_get_modes(struct analogix_dp_plat_data * plat_data,struct drm_connector * connector)218 static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data,
219 struct drm_connector *connector)
220 {
221 struct drm_display_info *di = &connector->display_info;
222 /* VOP couldn't output YUV video format for eDP rightly */
223 u32 mask = DRM_COLOR_FORMAT_YCRCB444 | DRM_COLOR_FORMAT_YCRCB422;
224
225 if ((di->color_formats & mask)) {
226 DRM_DEBUG_KMS("Swapping display color format from YUV to RGB\n");
227 di->color_formats &= ~mask;
228 di->color_formats |= DRM_COLOR_FORMAT_RGB444;
229 di->bpc = 8;
230 }
231
232 return 0;
233 }
234
rockchip_dp_loader_protect(struct drm_encoder * encoder,bool on)235 static int rockchip_dp_loader_protect(struct drm_encoder *encoder, bool on)
236 {
237 struct rockchip_dp_device *dp = to_dp(encoder);
238 struct analogix_dp_plat_data *plat_data = &dp->plat_data;
239 struct rockchip_dp_device *secondary = NULL;
240 int ret;
241
242 if (plat_data->right) {
243 secondary = rockchip_dp_find_by_id(dp->dev->driver, !dp->id);
244
245 ret = rockchip_dp_loader_protect(&secondary->encoder, on);
246 if (ret)
247 return ret;
248 }
249
250 if (!on)
251 return 0;
252
253 if (plat_data->panel)
254 panel_simple_loader_protect(plat_data->panel);
255
256 ret = analogix_dp_loader_protect(dp->adp);
257 if (ret) {
258 if (secondary)
259 analogix_dp_disable(secondary->adp);
260 return ret;
261 }
262
263 return 0;
264 }
265
rockchip_dp_skip_connector(struct drm_bridge * bridge)266 static bool rockchip_dp_skip_connector(struct drm_bridge *bridge)
267 {
268 if (!bridge)
269 return false;
270
271 if (of_device_is_compatible(bridge->of_node, "dp-connector"))
272 return false;
273
274 if (bridge->ops & DRM_BRIDGE_OP_MODES)
275 return false;
276
277 return true;
278 }
279
rockchip_dp_bridge_attach(struct analogix_dp_plat_data * plat_data,struct drm_bridge * bridge,struct drm_connector * connector)280 static int rockchip_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
281 struct drm_bridge *bridge,
282 struct drm_connector *connector)
283 {
284 struct rockchip_dp_device *dp = to_dp(plat_data);
285 struct rockchip_drm_sub_dev *sdev = &dp->sub_dev;
286
287 if (!connector) {
288 struct list_head *connector_list =
289 &bridge->dev->mode_config.connector_list;
290
291 list_for_each_entry(connector, connector_list, head)
292 if (drm_connector_has_possible_encoder(connector,
293 bridge->encoder))
294 break;
295 }
296
297 if (connector) {
298 sdev->connector = connector;
299 sdev->of_node = dp->dev->of_node;
300 sdev->loader_protect = rockchip_dp_loader_protect;
301 rockchip_drm_register_sub_dev(sdev);
302 }
303
304 return 0;
305 }
306
rockchip_dp_bridge_detach(struct analogix_dp_plat_data * plat_data,struct drm_bridge * bridge)307 static void rockchip_dp_bridge_detach(struct analogix_dp_plat_data *plat_data,
308 struct drm_bridge *bridge)
309 {
310 struct rockchip_dp_device *dp = to_dp(plat_data);
311 struct rockchip_drm_sub_dev *sdev = &dp->sub_dev;
312
313 if (sdev->connector)
314 rockchip_drm_unregister_sub_dev(sdev);
315 }
316
317 static bool
rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder * encoder,const struct drm_display_mode * mode,struct drm_display_mode * adjusted_mode)318 rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder,
319 const struct drm_display_mode *mode,
320 struct drm_display_mode *adjusted_mode)
321 {
322 /* do nothing */
323 return true;
324 }
325
rockchip_dp_drm_encoder_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode,struct drm_display_mode * adjusted)326 static void rockchip_dp_drm_encoder_mode_set(struct drm_encoder *encoder,
327 struct drm_display_mode *mode,
328 struct drm_display_mode *adjusted)
329 {
330 /* do nothing */
331 }
332
333 static
rockchip_dp_drm_get_new_crtc(struct drm_encoder * encoder,struct drm_atomic_state * state)334 struct drm_crtc *rockchip_dp_drm_get_new_crtc(struct drm_encoder *encoder,
335 struct drm_atomic_state *state)
336 {
337 struct drm_connector *connector;
338 struct drm_connector_state *conn_state;
339
340 connector = drm_atomic_get_new_connector_for_encoder(state, encoder);
341 if (!connector)
342 return NULL;
343
344 conn_state = drm_atomic_get_new_connector_state(state, connector);
345 if (!conn_state)
346 return NULL;
347
348 return conn_state->crtc;
349 }
350
rockchip_dp_drm_encoder_enable(struct drm_encoder * encoder,struct drm_atomic_state * state)351 static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder,
352 struct drm_atomic_state *state)
353 {
354 struct rockchip_dp_device *dp = to_dp(encoder);
355 struct drm_crtc *crtc;
356 struct drm_crtc_state *old_crtc_state;
357 int ret;
358
359 crtc = rockchip_dp_drm_get_new_crtc(encoder, state);
360 if (!crtc)
361 return;
362
363 old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);
364 /* Coming back from self refresh, nothing to do */
365 if (old_crtc_state && old_crtc_state->self_refresh_active)
366 return;
367
368 ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder);
369 if (ret < 0)
370 return;
371
372 DRM_DEV_DEBUG(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG");
373
374 ret = rockchip_grf_field_write(dp->grf, &dp->data->lcdc_sel, ret);
375 if (ret != 0)
376 DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret);
377 }
378
rockchip_dp_drm_encoder_disable(struct drm_encoder * encoder,struct drm_atomic_state * state)379 static void rockchip_dp_drm_encoder_disable(struct drm_encoder *encoder,
380 struct drm_atomic_state *state)
381 {
382 struct rockchip_dp_device *dp = to_dp(encoder);
383 struct drm_crtc *crtc;
384 struct drm_crtc *old_crtc = encoder->crtc;
385 struct drm_crtc_state *new_crtc_state = NULL;
386 struct rockchip_crtc_state *s = to_rockchip_crtc_state(old_crtc->state);
387 int ret;
388
389 if (dp->plat_data.split_mode)
390 s->output_if &= ~(VOP_OUTPUT_IF_eDP1 | VOP_OUTPUT_IF_eDP0);
391 else
392 s->output_if &= ~(dp->id ? VOP_OUTPUT_IF_eDP1 : VOP_OUTPUT_IF_eDP0);
393 crtc = rockchip_dp_drm_get_new_crtc(encoder, state);
394 /* No crtc means we're doing a full shutdown */
395 if (!crtc)
396 return;
397
398 new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
399 /* If we're not entering self-refresh, no need to wait for vact */
400 if (!new_crtc_state || !new_crtc_state->self_refresh_active)
401 return;
402
403 ret = rockchip_drm_wait_vact_end(crtc, PSR_WAIT_LINE_FLAG_TIMEOUT_MS);
404 if (ret)
405 DRM_DEV_ERROR(dp->dev, "line flag irq timed out\n");
406 }
407
408 static int
rockchip_dp_drm_encoder_atomic_check(struct drm_encoder * encoder,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)409 rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
410 struct drm_crtc_state *crtc_state,
411 struct drm_connector_state *conn_state)
412 {
413 struct rockchip_dp_device *dp = to_dp(encoder);
414 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
415 struct drm_display_info *di = &conn_state->connector->display_info;
416 int refresh_rate;
417
418 if (di->num_bus_formats)
419 s->bus_format = di->bus_formats[0];
420 else
421 s->bus_format = MEDIA_BUS_FMT_RGB888_1X24;
422
423 /*
424 * The hardware IC designed that VOP must output the RGB10 video
425 * format to eDP controller, and if eDP panel only support RGB8,
426 * then eDP controller should cut down the video data, not via VOP
427 * controller, that's why we need to hardcode the VOP output mode
428 * to RGA10 here.
429 */
430
431 s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
432 s->output_type = DRM_MODE_CONNECTOR_eDP;
433 if (dp->plat_data.split_mode) {
434 s->output_flags |= ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE;
435 s->output_flags |= dp->id ? ROCKCHIP_OUTPUT_DATA_SWAP : 0;
436 s->output_if |= VOP_OUTPUT_IF_eDP0 | VOP_OUTPUT_IF_eDP1;
437 } else {
438 s->output_if |= dp->id ? VOP_OUTPUT_IF_eDP1 : VOP_OUTPUT_IF_eDP0;
439 }
440
441 if (dp->plat_data.dual_connector_split) {
442 s->output_flags |= ROCKCHIP_OUTPUT_DUAL_CONNECTOR_SPLIT_MODE;
443
444 if (dp->plat_data.left_display)
445 s->output_if_left_panel |= dp->id ?
446 VOP_OUTPUT_IF_eDP1 :
447 VOP_OUTPUT_IF_eDP0;
448 }
449
450 s->output_bpc = di->bpc;
451 s->bus_flags = di->bus_flags;
452 s->tv_state = &conn_state->tv;
453 s->eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
454 s->color_space = V4L2_COLORSPACE_DEFAULT;
455 /**
456 * It's priority to user rate range define in dtsi.
457 */
458 if (dp->max_refresh_rate && dp->min_refresh_rate) {
459 s->max_refresh_rate = dp->max_refresh_rate;
460 s->min_refresh_rate = dp->min_refresh_rate;
461 } else {
462 s->max_refresh_rate = di->monitor_range.max_vfreq;
463 s->min_refresh_rate = di->monitor_range.min_vfreq;
464 }
465
466 /**
467 * Timing exposed in DisplayID or legacy EDID is usually optimized
468 * for bandwidth by using minimum horizontal and vertical blank. If
469 * timing beyond the Adaptive-Sync range, it should not enable the
470 * Ignore MSA option in this timing. If the refresh rate of the
471 * timing is with the Adaptive-Sync range, this timing should support
472 * the Adaptive-Sync from the timing's refresh rate to minimum
473 * support range.
474 */
475 refresh_rate = drm_mode_vrefresh(&crtc_state->adjusted_mode);
476 if (refresh_rate > s->max_refresh_rate || refresh_rate < s->min_refresh_rate) {
477 s->max_refresh_rate = 0;
478 s->min_refresh_rate = 0;
479 } else if (refresh_rate < s->max_refresh_rate) {
480 s->max_refresh_rate = refresh_rate;
481 }
482
483 return 0;
484 }
485
486 static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = {
487 .mode_fixup = rockchip_dp_drm_encoder_mode_fixup,
488 .mode_set = rockchip_dp_drm_encoder_mode_set,
489 .atomic_enable = rockchip_dp_drm_encoder_enable,
490 .atomic_disable = rockchip_dp_drm_encoder_disable,
491 .atomic_check = rockchip_dp_drm_encoder_atomic_check,
492 };
493
rockchip_dp_of_probe(struct rockchip_dp_device * dp)494 static int rockchip_dp_of_probe(struct rockchip_dp_device *dp)
495 {
496 struct device *dev = dp->dev;
497 struct device_node *np = dev->of_node;
498
499 if (of_property_read_bool(np, "rockchip,grf")) {
500 dp->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
501 if (IS_ERR(dp->grf)) {
502 DRM_DEV_ERROR(dev, "failed to get rockchip,grf\n");
503 return PTR_ERR(dp->grf);
504 }
505 }
506
507 dp->rst = devm_reset_control_get(dev, "dp");
508 if (IS_ERR(dp->rst)) {
509 DRM_DEV_ERROR(dev, "failed to get dp reset control\n");
510 return PTR_ERR(dp->rst);
511 }
512
513 dp->apb_reset = devm_reset_control_get_optional(dev, "apb");
514 if (IS_ERR(dp->apb_reset)) {
515 DRM_DEV_ERROR(dev, "failed to get apb reset control\n");
516 return PTR_ERR(dp->apb_reset);
517 }
518
519 return 0;
520 }
521
rockchip_dp_drm_create_encoder(struct rockchip_dp_device * dp)522 static int rockchip_dp_drm_create_encoder(struct rockchip_dp_device *dp)
523 {
524 struct drm_encoder *encoder = &dp->encoder;
525 struct drm_device *drm_dev = dp->drm_dev;
526 struct device *dev = dp->dev;
527 int ret;
528
529 encoder->possible_crtcs = rockchip_drm_of_find_possible_crtcs(drm_dev,
530 dev->of_node);
531 DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
532
533 ret = drm_simple_encoder_init(drm_dev, encoder,
534 DRM_MODE_ENCODER_TMDS);
535 if (ret) {
536 DRM_ERROR("failed to initialize encoder with drm\n");
537 return ret;
538 }
539
540 drm_encoder_helper_add(encoder, &rockchip_dp_encoder_helper_funcs);
541
542 return 0;
543 }
544
rockchip_dp_bind(struct device * dev,struct device * master,void * data)545 static int rockchip_dp_bind(struct device *dev, struct device *master,
546 void *data)
547 {
548 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
549 struct drm_device *drm_dev = data;
550 int ret;
551
552 dp->drm_dev = drm_dev;
553
554 if (!dp->plat_data.left) {
555 ret = rockchip_dp_drm_create_encoder(dp);
556 if (ret) {
557 DRM_ERROR("failed to create drm encoder\n");
558 return ret;
559 }
560
561 dp->plat_data.encoder = &dp->encoder;
562 }
563
564 if (dp->data->audio) {
565 struct hdmi_codec_pdata codec_data = {
566 .ops = &rockchip_dp_audio_codec_ops,
567 .spdif = 1,
568 .i2s = 1,
569 .max_i2s_channels = 2,
570 };
571
572 dp->audio_pdev =
573 platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
574 PLATFORM_DEVID_AUTO,
575 &codec_data,
576 sizeof(codec_data));
577 if (IS_ERR(dp->audio_pdev)) {
578 ret = PTR_ERR(dp->audio_pdev);
579 goto err_cleanup_encoder;
580 }
581 }
582
583 ret = analogix_dp_bind(dp->adp, drm_dev);
584 if (ret)
585 goto err_unregister_audio_pdev;
586
587 return 0;
588
589 err_unregister_audio_pdev:
590 if (dp->audio_pdev)
591 platform_device_unregister(dp->audio_pdev);
592 err_cleanup_encoder:
593 dp->encoder.funcs->destroy(&dp->encoder);
594 return ret;
595 }
596
rockchip_dp_unbind(struct device * dev,struct device * master,void * data)597 static void rockchip_dp_unbind(struct device *dev, struct device *master,
598 void *data)
599 {
600 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
601
602 if (dp->audio_pdev)
603 platform_device_unregister(dp->audio_pdev);
604 analogix_dp_unbind(dp->adp);
605 dp->encoder.funcs->destroy(&dp->encoder);
606 }
607
608 static const struct component_ops rockchip_dp_component_ops = {
609 .bind = rockchip_dp_bind,
610 .unbind = rockchip_dp_unbind,
611 };
612
rockchip_dp_probe(struct platform_device * pdev)613 static int rockchip_dp_probe(struct platform_device *pdev)
614 {
615 struct device *dev = &pdev->dev;
616 const struct rockchip_dp_chip_data *dp_data;
617 struct drm_panel *panel = NULL;
618 struct drm_bridge *bridge = NULL;
619 struct rockchip_dp_device *dp;
620 int id, i, ret;
621
622 dp_data = of_device_get_match_data(dev);
623 if (!dp_data)
624 return -ENODEV;
625
626 ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, &bridge);
627 if (ret < 0 && ret != -ENODEV)
628 return ret;
629
630 dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL);
631 if (!dp)
632 return -ENOMEM;
633
634 id = of_alias_get_id(dev->of_node, "edp");
635 if (id < 0)
636 id = 0;
637
638 i = 0;
639 while (is_rockchip(dp_data[i].chip_type))
640 i++;
641
642 if (id >= i) {
643 dev_err(dev, "invalid id: %d\n", id);
644 return -ENODEV;
645 }
646
647 dp->dev = dev;
648 dp->id = id;
649 dp->adp = ERR_PTR(-ENODEV);
650 dp->data = &dp_data[id];
651 dp->plat_data.ssc = dp->data->ssc;
652 dp->plat_data.panel = panel;
653 dp->plat_data.dev_type = dp->data->chip_type;
654 dp->plat_data.power_on_start = rockchip_dp_poweron_start;
655 dp->plat_data.power_off = rockchip_dp_powerdown;
656 dp->plat_data.get_modes = rockchip_dp_get_modes;
657 dp->plat_data.attach = rockchip_dp_bridge_attach;
658 dp->plat_data.detach = rockchip_dp_bridge_detach;
659 dp->plat_data.convert_to_split_mode = drm_mode_convert_to_split_mode;
660 dp->plat_data.convert_to_origin_mode = drm_mode_convert_to_origin_mode;
661 dp->plat_data.skip_connector = rockchip_dp_skip_connector(bridge);
662 dp->plat_data.bridge = bridge;
663
664 ret = rockchip_dp_of_probe(dp);
665 if (ret < 0)
666 return ret;
667
668 platform_set_drvdata(pdev, dp);
669
670 dp->adp = analogix_dp_probe(dev, &dp->plat_data);
671 if (IS_ERR(dp->adp))
672 return PTR_ERR(dp->adp);
673
674 if (dp->data->split_mode && device_property_read_bool(dev, "split-mode")) {
675 struct rockchip_dp_device *secondary =
676 rockchip_dp_find_by_id(dev->driver, !dp->id);
677 if (!secondary) {
678 ret = -EPROBE_DEFER;
679 goto err_dp_remove;
680 }
681
682 dp->plat_data.right = secondary->adp;
683 dp->plat_data.split_mode = true;
684 secondary->plat_data.left = dp->adp;
685 secondary->plat_data.split_mode = true;
686 }
687
688 device_property_read_u32(dev, "min-refresh-rate", &dp->min_refresh_rate);
689 device_property_read_u32(dev, "max-refresh-rate", &dp->max_refresh_rate);
690
691 if (dp->data->split_mode && device_property_read_bool(dev, "dual-connector-split")) {
692 dp->plat_data.dual_connector_split = true;
693 if (device_property_read_bool(dev, "left-display"))
694 dp->plat_data.left_display = true;
695 }
696
697 ret = component_add(dev, &rockchip_dp_component_ops);
698 if (ret)
699 goto err_dp_remove;
700
701 return 0;
702
703 err_dp_remove:
704 analogix_dp_remove(dp->adp);
705 return ret;
706 }
707
rockchip_dp_remove(struct platform_device * pdev)708 static int rockchip_dp_remove(struct platform_device *pdev)
709 {
710 struct rockchip_dp_device *dp = platform_get_drvdata(pdev);
711
712 component_del(&pdev->dev, &rockchip_dp_component_ops);
713 analogix_dp_remove(dp->adp);
714
715 return 0;
716 }
717
rockchip_dp_suspend(struct device * dev)718 static __maybe_unused int rockchip_dp_suspend(struct device *dev)
719 {
720 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
721
722 if (IS_ERR(dp->adp))
723 return 0;
724
725 return analogix_dp_suspend(dp->adp);
726 }
727
rockchip_dp_resume(struct device * dev)728 static __maybe_unused int rockchip_dp_resume(struct device *dev)
729 {
730 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
731
732 if (IS_ERR(dp->adp))
733 return 0;
734
735 return analogix_dp_resume(dp->adp);
736 }
737
rockchip_dp_runtime_suspend(struct device * dev)738 static __maybe_unused int rockchip_dp_runtime_suspend(struct device *dev)
739 {
740 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
741
742 if (IS_ERR(dp->adp))
743 return 0;
744
745 return analogix_dp_runtime_suspend(dp->adp);
746 }
747
rockchip_dp_runtime_resume(struct device * dev)748 static __maybe_unused int rockchip_dp_runtime_resume(struct device *dev)
749 {
750 struct rockchip_dp_device *dp = dev_get_drvdata(dev);
751
752 if (IS_ERR(dp->adp))
753 return 0;
754
755 return analogix_dp_runtime_resume(dp->adp);
756 }
757
758 static const struct dev_pm_ops rockchip_dp_pm_ops = {
759 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_dp_suspend, rockchip_dp_resume)
760 SET_RUNTIME_PM_OPS(rockchip_dp_runtime_suspend,
761 rockchip_dp_runtime_resume, NULL)
762 };
763
764 static const struct rockchip_dp_chip_data rk3399_edp[] = {
765 {
766 .chip_type = RK3399_EDP,
767 .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5),
768 .ssc = true,
769 },
770 { /* sentinel */ }
771 };
772
773 static const struct rockchip_dp_chip_data rk3288_dp[] = {
774 {
775 .chip_type = RK3288_DP,
776 .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5),
777 .ssc = true,
778 },
779 { /* sentinel */ }
780 };
781
782 static const struct rockchip_dp_chip_data rk3568_edp[] = {
783 {
784 .chip_type = RK3568_EDP,
785 .ssc = true,
786 .audio = true,
787 },
788 { /* sentinel */ }
789 };
790
791 static const struct rockchip_dp_chip_data rk3588_edp[] = {
792 {
793 .chip_type = RK3588_EDP,
794 .spdif_sel = GRF_REG_FIELD(0x0000, 4, 4),
795 .i2s_sel = GRF_REG_FIELD(0x0000, 3, 3),
796 .edp_mode = GRF_REG_FIELD(0x0000, 0, 0),
797 .ssc = true,
798 .audio = true,
799 .split_mode = true,
800 },
801 {
802 .chip_type = RK3588_EDP,
803 .spdif_sel = GRF_REG_FIELD(0x0004, 4, 4),
804 .i2s_sel = GRF_REG_FIELD(0x0004, 3, 3),
805 .edp_mode = GRF_REG_FIELD(0x0004, 0, 0),
806 .ssc = true,
807 .audio = true,
808 .split_mode = true,
809 },
810 { /* sentinel */ }
811 };
812
813 static const struct of_device_id rockchip_dp_dt_ids[] = {
814 {.compatible = "rockchip,rk3288-dp", .data = &rk3288_dp },
815 {.compatible = "rockchip,rk3399-edp", .data = &rk3399_edp },
816 {.compatible = "rockchip,rk3568-edp", .data = &rk3568_edp },
817 {.compatible = "rockchip,rk3588-edp", .data = &rk3588_edp },
818 {}
819 };
820 MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids);
821
822 struct platform_driver rockchip_dp_driver = {
823 .probe = rockchip_dp_probe,
824 .remove = rockchip_dp_remove,
825 .driver = {
826 .name = "rockchip-dp",
827 .pm = &rockchip_dp_pm_ops,
828 .of_match_table = of_match_ptr(rockchip_dp_dt_ids),
829 },
830 };
831