xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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