• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4  * Author: Chris Zhong <zyw@rock-chips.com>
5  */
6 
7 #include <linux/clk.h>
8 #include <linux/component.h>
9 #include <linux/firmware.h>
10 #include <linux/mfd/syscon.h>
11 #include <linux/phy/phy.h>
12 #include <linux/regmap.h>
13 #include <linux/reset.h>
14 
15 #include <sound/hdmi-codec.h>
16 
17 #include <drm/drm_atomic_helper.h>
18 #include <drm/drm_dp_helper.h>
19 #include <drm/drm_edid.h>
20 #include <drm/drm_of.h>
21 #include <drm/drm_probe_helper.h>
22 #include <drm/drm_simple_kms_helper.h>
23 
24 #include "cdn-dp-core.h"
25 #include "cdn-dp-reg.h"
26 #include "rockchip_drm_vop.h"
27 
28 #define connector_to_dp(c) container_of(c, struct cdn_dp_device, connector)
29 
30 #define encoder_to_dp(c) container_of(c, struct cdn_dp_device, encoder)
31 
32 #define GRF_SOC_CON9 0x6224
33 #define DP_SEL_VOP_LIT BIT(12)
34 #define GRF_SOC_CON26 0x6268
35 #define DPTX_HPD_SEL (3 << 12)
36 #define DPTX_HPD_DEL (2 << 12)
37 #define DPTX_HPD_SEL_MASK (3 << 28)
38 
39 #define CDN_FW_TIMEOUT_MS (64 * 1000)
40 #define CDN_DPCD_TIMEOUT_MS 5000
41 #define CDN_DP_FIRMWARE "rockchip/dptx.bin"
42 
43 struct cdn_dp_data {
44     u8 max_phy;
45 };
46 
47 struct cdn_dp_data rk3399_cdn_dp = {
48     .max_phy = 2,
49 };
50 
51 static const struct of_device_id cdn_dp_dt_ids[] = {
52     {.compatible = "rockchip,rk3399-cdn-dp", .data = (void *)&rk3399_cdn_dp}, {}};
53 
54 MODULE_DEVICE_TABLE(of, cdn_dp_dt_ids);
55 
cdn_dp_grf_write(struct cdn_dp_device * dp,unsigned int reg,unsigned int val)56 static int cdn_dp_grf_write(struct cdn_dp_device *dp, unsigned int reg, unsigned int val)
57 {
58     int ret;
59 
60     ret = clk_prepare_enable(dp->grf_clk);
61     if (ret) {
62         DRM_DEV_ERROR(dp->dev, "Failed to prepare_enable grf clock\n");
63         return ret;
64     }
65 
66     ret = regmap_write(dp->grf, reg, val);
67     if (ret) {
68         DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret);
69         clk_disable_unprepare(dp->grf_clk);
70         return ret;
71     }
72 
73     clk_disable_unprepare(dp->grf_clk);
74 
75     return 0;
76 }
77 
cdn_dp_clk_enable(struct cdn_dp_device * dp)78 static int cdn_dp_clk_enable(struct cdn_dp_device *dp)
79 {
80     int ret;
81     unsigned long rate;
82 
83     ret = clk_prepare_enable(dp->pclk);
84     if (ret < 0) {
85         DRM_DEV_ERROR(dp->dev, "cannot enable dp pclk %d\n", ret);
86         goto err_pclk;
87     }
88 
89     ret = clk_prepare_enable(dp->core_clk);
90     if (ret < 0) {
91         DRM_DEV_ERROR(dp->dev, "cannot enable core_clk %d\n", ret);
92         goto err_core_clk;
93     }
94 
95     ret = pm_runtime_get_sync(dp->dev);
96     if (ret < 0) {
97         DRM_DEV_ERROR(dp->dev, "cannot get pm runtime %d\n", ret);
98         goto err_pm_runtime_get;
99     }
100 
101     reset_control_assert(dp->core_rst);
102     reset_control_assert(dp->dptx_rst);
103     reset_control_assert(dp->apb_rst);
104     reset_control_deassert(dp->core_rst);
105     reset_control_deassert(dp->dptx_rst);
106     reset_control_deassert(dp->apb_rst);
107 
108     rate = clk_get_rate(dp->core_clk);
109     if (!rate) {
110         DRM_DEV_ERROR(dp->dev, "get clk rate failed\n");
111         ret = -EINVAL;
112         goto err_set_rate;
113     }
114 
115     cdn_dp_set_fw_clk(dp, rate);
116     cdn_dp_clock_reset(dp);
117 
118     return 0;
119 
120 err_set_rate:
121     pm_runtime_put(dp->dev);
122 err_pm_runtime_get:
123     clk_disable_unprepare(dp->core_clk);
124 err_core_clk:
125     clk_disable_unprepare(dp->pclk);
126 err_pclk:
127     return ret;
128 }
129 
cdn_dp_clk_disable(struct cdn_dp_device * dp)130 static void cdn_dp_clk_disable(struct cdn_dp_device *dp)
131 {
132     pm_runtime_put_sync(dp->dev);
133     clk_disable_unprepare(dp->pclk);
134     clk_disable_unprepare(dp->core_clk);
135 }
136 
cdn_dp_get_port_lanes(struct cdn_dp_port * port)137 static int cdn_dp_get_port_lanes(struct cdn_dp_port *port)
138 {
139     return phy_get_bus_width(port->phy);
140 }
141 
cdn_dp_get_sink_count(struct cdn_dp_device * dp,u8 * sink_count)142 static int cdn_dp_get_sink_count(struct cdn_dp_device *dp, u8 *sink_count)
143 {
144     int ret;
145     u8 value;
146 
147     *sink_count = 0;
148     ret = cdn_dp_dpcd_read(dp, DP_SINK_COUNT, &value, 1);
149     if (ret) {
150         return ret;
151     }
152 
153     *sink_count = DP_GET_SINK_COUNT(value);
154     return 0;
155 }
156 
cdn_dp_connected_port(struct cdn_dp_device * dp)157 static struct cdn_dp_port *cdn_dp_connected_port(struct cdn_dp_device *dp)
158 {
159     struct cdn_dp_port *port;
160     int i, lanes;
161 
162     for (i = 0; i < dp->ports; i++) {
163         port = dp->port[i];
164         lanes = cdn_dp_get_port_lanes(port);
165         if (lanes) {
166             return port;
167         }
168     }
169     return NULL;
170 }
171 
cdn_dp_check_sink_connection(struct cdn_dp_device * dp)172 static bool cdn_dp_check_sink_connection(struct cdn_dp_device *dp)
173 {
174     unsigned long timeout = jiffies + msecs_to_jiffies(CDN_DPCD_TIMEOUT_MS);
175     u8 sink_count = 0;
176 
177     if (dp->active_port < 0 || dp->active_port >= dp->ports) {
178         DRM_DEV_ERROR(dp->dev, "active_port is wrong!\n");
179         return false;
180     }
181 
182     /*
183      * Attempt to read sink count, retry in case the sink may not be ready.
184      *
185      * Sinks are *supposed* to come up within 1ms from an off state, but
186      * some docks need more time to power up.
187      */
188     while (time_before(jiffies, timeout)) {
189         if (!cdn_dp_get_sink_count(dp, &sink_count)) {
190             return sink_count ? true : false;
191         }
192 
193         usleep_range(0x1388, 0x2710);
194     }
195 
196     DRM_DEV_ERROR(dp->dev, "Get sink capability timed out\n");
197     return false;
198 }
199 
cdn_dp_connector_detect(struct drm_connector * connector,bool force)200 static enum drm_connector_status cdn_dp_connector_detect(struct drm_connector *connector, bool force)
201 {
202     struct cdn_dp_device *dp = connector_to_dp(connector);
203     enum drm_connector_status status = connector_status_disconnected;
204 
205     mutex_lock(&dp->lock);
206     if (dp->connected) {
207         status = connector_status_connected;
208     }
209     mutex_unlock(&dp->lock);
210 
211     return status;
212 }
213 
cdn_dp_connector_destroy(struct drm_connector * connector)214 static void cdn_dp_connector_destroy(struct drm_connector *connector)
215 {
216     drm_connector_unregister(connector);
217     drm_connector_cleanup(connector);
218 }
219 
cdn_dp_oob_hotplug_event(struct drm_connector * connector)220 static void cdn_dp_oob_hotplug_event(struct drm_connector *connector)
221 {
222     struct cdn_dp_device *dp = connector_to_dp(connector);
223 
224     schedule_delayed_work(&dp->event_work, msecs_to_jiffies(0x64));
225 }
226 
227 static const struct drm_connector_funcs cdn_dp_atomic_connector_funcs = {
228     .detect = cdn_dp_connector_detect,
229     .destroy = cdn_dp_connector_destroy,
230     .fill_modes = drm_helper_probe_single_connector_modes,
231     .reset = drm_atomic_helper_connector_reset,
232     .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
233     .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
234 };
235 
cdn_dp_connector_get_modes(struct drm_connector * connector)236 static int cdn_dp_connector_get_modes(struct drm_connector *connector)
237 {
238     struct cdn_dp_device *dp = connector_to_dp(connector);
239     struct edid *edid;
240     int ret = 0;
241 
242     mutex_lock(&dp->lock);
243     edid = dp->edid;
244     if (edid) {
245         DRM_DEV_DEBUG_KMS(dp->dev, "got edid: width[%d] x height[%d]\n", edid->width_cm, edid->height_cm);
246 
247         dp->sink_has_audio = drm_detect_monitor_audio(edid);
248         ret = drm_add_edid_modes(connector, edid);
249         if (ret) {
250             drm_connector_update_edid_property(connector, edid);
251         }
252     }
253     mutex_unlock(&dp->lock);
254 
255     return ret;
256 }
257 
cdn_dp_connector_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)258 static int cdn_dp_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode)
259 {
260     struct cdn_dp_device *dp = connector_to_dp(connector);
261     struct drm_display_info *display_info = &dp->connector.display_info;
262     u32 requested, actual, rate, sink_max, source_max = 0;
263     u8 lanes, bpc;
264 
265     /* If DP is disconnected, every mode is invalid */
266     if (!dp->connected) {
267         return MODE_BAD;
268     }
269 
270     switch (display_info->bpc) {
271         case 0xa:
272             bpc = 0xa;
273             break;
274         case 0x6:
275             bpc = 0x6;
276             break;
277         default:
278             bpc = 0x8;
279             break;
280     }
281 
282     requested = mode->clock * bpc * 0x3 / 0x3e8;
283 
284     source_max = dp->lanes;
285     sink_max = drm_dp_max_lane_count(dp->dpcd);
286     lanes = min(source_max, sink_max);
287 
288     source_max = drm_dp_bw_code_to_link_rate(CDN_DP_MAX_LINK_RATE);
289     sink_max = drm_dp_max_link_rate(dp->dpcd);
290     rate = min(source_max, sink_max);
291 
292     actual = rate * lanes / 0x64;
293 
294     /* efficiency is about 0.8 */
295     actual = actual * 0x8 / 0xa;
296 
297     if (requested > actual) {
298         DRM_DEV_DEBUG_KMS(dp->dev, "requested=%d, actual=%d, clock=%d\n", requested, actual, mode->clock);
299         return MODE_CLOCK_HIGH;
300     }
301 
302     return MODE_OK;
303 }
304 
305 static struct drm_connector_helper_funcs cdn_dp_connector_helper_funcs = {
306     .get_modes = cdn_dp_connector_get_modes,
307     .mode_valid = cdn_dp_connector_mode_valid,
308 };
309 
cdn_dp_firmware_init(struct cdn_dp_device * dp)310 static int cdn_dp_firmware_init(struct cdn_dp_device *dp)
311 {
312     int ret;
313     const u32 *iram_data, *dram_data;
314     const struct firmware *fw = dp->fw;
315     const struct cdn_firmware_header *hdr;
316 
317     hdr = (struct cdn_firmware_header *)fw->data;
318     if (fw->size != le32_to_cpu(hdr->size_bytes)) {
319         DRM_DEV_ERROR(dp->dev, "firmware is invalid\n");
320         return -EINVAL;
321     }
322 
323     iram_data = (const u32 *)(fw->data + hdr->header_size);
324     dram_data = (const u32 *)(fw->data + hdr->header_size + hdr->iram_size);
325 
326     ret = cdn_dp_load_firmware(dp, iram_data, hdr->iram_size, dram_data, hdr->dram_size);
327     if (ret) {
328         return ret;
329     }
330 
331     ret = cdn_dp_set_firmware_active(dp, true);
332     if (ret) {
333         DRM_DEV_ERROR(dp->dev, "active ucpu failed: %d\n", ret);
334         return ret;
335     }
336 
337     return cdn_dp_event_config(dp);
338 }
339 
cdn_dp_get_sink_capability(struct cdn_dp_device * dp)340 static int cdn_dp_get_sink_capability(struct cdn_dp_device *dp)
341 {
342     int ret;
343 
344     if (!cdn_dp_check_sink_connection(dp)) {
345         return -ENODEV;
346     }
347 
348     ret = cdn_dp_dpcd_read(dp, DP_DPCD_REV, dp->dpcd, DP_RECEIVER_CAP_SIZE);
349     if (ret) {
350         DRM_DEV_ERROR(dp->dev, "Failed to get caps %d\n", ret);
351         return ret;
352     }
353 
354     kfree(dp->edid);
355     dp->edid = drm_do_get_edid(&dp->connector, cdn_dp_get_edid_block, dp);
356     return 0;
357 }
358 
cdn_dp_enable_phy(struct cdn_dp_device * dp,struct cdn_dp_port * port)359 static int cdn_dp_enable_phy(struct cdn_dp_device *dp, struct cdn_dp_port *port)
360 {
361     int ret;
362 
363     if (!port->phy_enabled) {
364         ret = phy_power_on(port->phy);
365         if (ret) {
366             DRM_DEV_ERROR(dp->dev, "phy power on failed: %d\n", ret);
367             goto err_phy;
368         }
369         port->phy_enabled = true;
370     }
371 
372     ret = cdn_dp_grf_write(dp, GRF_SOC_CON26, DPTX_HPD_SEL_MASK | DPTX_HPD_SEL);
373     if (ret) {
374         DRM_DEV_ERROR(dp->dev, "Failed to write HPD_SEL %d\n", ret);
375         goto err_power_on;
376     }
377 
378     ret = cdn_dp_get_hpd_status(dp);
379     if (ret <= 0) {
380         if (!ret) {
381             DRM_DEV_ERROR(dp->dev, "hpd does not exist\n");
382         }
383         goto err_power_on;
384     }
385 
386     port->lanes = cdn_dp_get_port_lanes(port);
387     ret = cdn_dp_set_host_cap(dp, port->lanes, 0);
388     if (ret) {
389         DRM_DEV_ERROR(dp->dev, "set host capabilities failed: %d\n", ret);
390         goto err_power_on;
391     }
392 
393     dp->active_port = port->id;
394     return 0;
395 
396 err_power_on:
397     if (phy_power_off(port->phy)) {
398         DRM_DEV_ERROR(dp->dev, "phy power off failed: %d", ret);
399     } else {
400         port->phy_enabled = false;
401     }
402 
403 err_phy:
404     cdn_dp_grf_write(dp, GRF_SOC_CON26, DPTX_HPD_SEL_MASK | DPTX_HPD_DEL);
405     return ret;
406 }
407 
cdn_dp_disable_phy(struct cdn_dp_device * dp,struct cdn_dp_port * port)408 static int cdn_dp_disable_phy(struct cdn_dp_device *dp, struct cdn_dp_port *port)
409 {
410     int ret;
411 
412     if (port->phy_enabled) {
413         ret = phy_power_off(port->phy);
414         if (ret) {
415             DRM_DEV_ERROR(dp->dev, "phy power off failed: %d", ret);
416             return ret;
417         }
418     }
419 
420     port->phy_enabled = false;
421     port->lanes = 0;
422     dp->active_port = -1;
423     return 0;
424 }
425 
cdn_dp_disable(struct cdn_dp_device * dp)426 static int cdn_dp_disable(struct cdn_dp_device *dp)
427 {
428     int ret, i;
429 
430     if (!dp->active) {
431         return 0;
432     }
433 
434     for (i = 0; i < dp->ports; i++) {
435         cdn_dp_disable_phy(dp, dp->port[i]);
436     }
437 
438     ret = cdn_dp_grf_write(dp, GRF_SOC_CON26, DPTX_HPD_SEL_MASK | DPTX_HPD_DEL);
439     if (ret) {
440         DRM_DEV_ERROR(dp->dev, "Failed to clear hpd sel %d\n", ret);
441         return ret;
442     }
443 
444     cdn_dp_set_firmware_active(dp, false);
445     cdn_dp_clk_disable(dp);
446     dp->active = false;
447     dp->max_lanes = 0;
448     dp->max_rate = 0;
449     if (!dp->connected) {
450         kfree(dp->edid);
451         dp->edid = NULL;
452     }
453 
454     return 0;
455 }
456 
cdn_dp_enable(struct cdn_dp_device * dp)457 static int cdn_dp_enable(struct cdn_dp_device *dp)
458 {
459     int ret, i, lanes;
460     struct cdn_dp_port *port;
461 
462     port = cdn_dp_connected_port(dp);
463     if (!port) {
464         DRM_DEV_ERROR(dp->dev, "Can't enable without connection\n");
465         return -ENODEV;
466     }
467 
468     if (dp->active) {
469         return 0;
470     }
471 
472     ret = cdn_dp_clk_enable(dp);
473     if (ret) {
474         return ret;
475     }
476 
477     ret = cdn_dp_firmware_init(dp);
478     if (ret) {
479         DRM_DEV_ERROR(dp->dev, "firmware init failed: %d", ret);
480         goto err_clk_disable;
481     }
482 
483     /* only enable the port that connected with downstream device */
484     for (i = port->id; i < dp->ports; i++) {
485         port = dp->port[i];
486         lanes = cdn_dp_get_port_lanes(port);
487         if (lanes) {
488             ret = cdn_dp_enable_phy(dp, port);
489             if (ret) {
490                 continue;
491             }
492 
493             ret = cdn_dp_get_sink_capability(dp);
494             if (ret) {
495                 cdn_dp_disable_phy(dp, port);
496             } else {
497                 dp->active = true;
498                 dp->lanes = port->lanes;
499                 return 0;
500             }
501         }
502     }
503 
504 err_clk_disable:
505     cdn_dp_clk_disable(dp);
506     return ret;
507 }
508 
cdn_dp_encoder_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode,struct drm_display_mode * adjusted)509 static void cdn_dp_encoder_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
510                                     struct drm_display_mode *adjusted)
511 {
512     struct cdn_dp_device *dp = encoder_to_dp(encoder);
513     struct drm_display_info *display_info = &dp->connector.display_info;
514     struct video_info *video = &dp->video_info;
515 
516     switch (display_info->bpc) {
517         case 0xa:
518             video->color_depth = 0xa;
519             break;
520         case 0x6:
521             video->color_depth = 0x6;
522             break;
523         default:
524             video->color_depth = 0x8;
525             break;
526     }
527 
528     video->color_fmt = PXL_RGB;
529     video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
530     video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC);
531 
532     memcpy(&dp->mode, adjusted, sizeof(*mode));
533 }
534 
cdn_dp_check_link_status(struct cdn_dp_device * dp)535 static bool cdn_dp_check_link_status(struct cdn_dp_device *dp)
536 {
537     u8 link_status[DP_LINK_STATUS_SIZE];
538     struct cdn_dp_port *port = cdn_dp_connected_port(dp);
539     u8 sink_lanes = drm_dp_max_lane_count(dp->dpcd);
540 
541     if (!port || !dp->max_rate || !dp->max_lanes) {
542         return false;
543     }
544 
545     if (cdn_dp_dpcd_read(dp, DP_LANE0_1_STATUS, link_status, DP_LINK_STATUS_SIZE)) {
546         DRM_ERROR("Failed to get link status\n");
547         return false;
548     }
549 
550     /* if link training is requested we should perform it always */
551     return drm_dp_channel_eq_ok(link_status, min(port->lanes, sink_lanes));
552 }
553 
cdn_dp_encoder_enable(struct drm_encoder * encoder)554 static void cdn_dp_encoder_enable(struct drm_encoder *encoder)
555 {
556     struct cdn_dp_device *dp = encoder_to_dp(encoder);
557     int ret, val;
558 
559     ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder);
560     if (ret < 0) {
561         DRM_DEV_ERROR(dp->dev, "Could not get vop id, %d", ret);
562         return;
563     }
564 
565     DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n", (ret) ? "LIT" : "BIG");
566     if (ret) {
567         val = DP_SEL_VOP_LIT | (DP_SEL_VOP_LIT << 0x10);
568     } else {
569         val = DP_SEL_VOP_LIT << 0x10;
570     }
571 
572     ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val);
573     if (ret) {
574         return;
575     }
576 
577     mutex_lock(&dp->lock);
578 
579     ret = cdn_dp_enable(dp);
580     if (ret) {
581         DRM_DEV_ERROR(dp->dev, "Failed to enable encoder %d\n", ret);
582         goto out;
583     }
584     if (!cdn_dp_check_link_status(dp)) {
585         ret = cdn_dp_train_link(dp);
586         if (ret) {
587             DRM_DEV_ERROR(dp->dev, "Failed link train %d\n", ret);
588             goto out;
589         }
590     }
591 
592     ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_IDLE);
593     if (ret) {
594         DRM_DEV_ERROR(dp->dev, "Failed to idle video %d\n", ret);
595         goto out;
596     }
597 
598     ret = cdn_dp_config_video(dp);
599     if (ret) {
600         DRM_DEV_ERROR(dp->dev, "Failed to config video %d\n", ret);
601         goto out;
602     }
603 
604     ret = cdn_dp_set_video_status(dp, CONTROL_VIDEO_VALID);
605     if (ret) {
606         DRM_DEV_ERROR(dp->dev, "Failed to valid video %d\n", ret);
607         goto out;
608     }
609 out:
610     mutex_unlock(&dp->lock);
611 }
612 
cdn_dp_encoder_disable(struct drm_encoder * encoder)613 static void cdn_dp_encoder_disable(struct drm_encoder *encoder)
614 {
615     struct cdn_dp_device *dp = encoder_to_dp(encoder);
616     int ret;
617 
618     mutex_lock(&dp->lock);
619     if (dp->active) {
620         ret = cdn_dp_disable(dp);
621         if (ret) {
622             DRM_DEV_ERROR(dp->dev, "Failed to disable encoder %d\n", ret);
623         }
624     }
625     mutex_unlock(&dp->lock);
626 
627     /*
628      * In the following 2 cases, we need to run the event_work to re-enable
629      * the DP:
630      * 1. If there is not just one port device is connected, and remove one
631      *    device from a port, the DP will be disabled here, at this case,
632      *    run the event_work to re-open DP for the other port.
633      * 2. If re-training or re-config failed, the DP will be disabled here.
634      *    run the event_work to re-connect it.
635      */
636     if (!dp->connected && cdn_dp_connected_port(dp)) {
637         schedule_delayed_work(&dp->event_work, 0);
638     }
639 }
640 
cdn_dp_encoder_atomic_check(struct drm_encoder * encoder,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)641 static int cdn_dp_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state,
642                                        struct drm_connector_state *conn_state)
643 {
644     struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
645 
646     s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
647     s->output_type = DRM_MODE_CONNECTOR_DisplayPort;
648     s->tv_state = &conn_state->tv;
649 
650     return 0;
651 }
652 
653 static const struct drm_encoder_helper_funcs cdn_dp_encoder_helper_funcs = {
654     .mode_set = cdn_dp_encoder_mode_set,
655     .enable = cdn_dp_encoder_enable,
656     .disable = cdn_dp_encoder_disable,
657     .atomic_check = cdn_dp_encoder_atomic_check,
658 };
659 
cdn_dp_parse_dt(struct cdn_dp_device * dp)660 static int cdn_dp_parse_dt(struct cdn_dp_device *dp)
661 {
662     struct device *dev = dp->dev;
663     struct device_node *np = dev->of_node;
664     struct platform_device *pdev = to_platform_device(dev);
665     struct resource *res;
666 
667     dp->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
668     if (IS_ERR(dp->grf)) {
669         DRM_DEV_ERROR(dev, "cdn-dp needs rockchip,grf property\n");
670         return PTR_ERR(dp->grf);
671     }
672 
673     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
674     dp->regs = devm_ioremap_resource(dev, res);
675     if (IS_ERR(dp->regs)) {
676         DRM_DEV_ERROR(dev, "ioremap reg failed\n");
677         return PTR_ERR(dp->regs);
678     }
679 
680     dp->core_clk = devm_clk_get(dev, "core-clk");
681     if (IS_ERR(dp->core_clk)) {
682         DRM_DEV_ERROR(dev, "cannot get core_clk_dp\n");
683         return PTR_ERR(dp->core_clk);
684     }
685 
686     dp->pclk = devm_clk_get(dev, "pclk");
687     if (IS_ERR(dp->pclk)) {
688         DRM_DEV_ERROR(dev, "cannot get pclk\n");
689         return PTR_ERR(dp->pclk);
690     }
691 
692     dp->spdif_clk = devm_clk_get(dev, "spdif");
693     if (IS_ERR(dp->spdif_clk)) {
694         DRM_DEV_ERROR(dev, "cannot get spdif_clk\n");
695         return PTR_ERR(dp->spdif_clk);
696     }
697 
698     dp->grf_clk = devm_clk_get(dev, "grf");
699     if (IS_ERR(dp->grf_clk)) {
700         DRM_DEV_ERROR(dev, "cannot get grf clk\n");
701         return PTR_ERR(dp->grf_clk);
702     }
703 
704     dp->spdif_rst = devm_reset_control_get(dev, "spdif");
705     if (IS_ERR(dp->spdif_rst)) {
706         DRM_DEV_ERROR(dev, "no spdif reset control found\n");
707         return PTR_ERR(dp->spdif_rst);
708     }
709 
710     dp->dptx_rst = devm_reset_control_get(dev, "dptx");
711     if (IS_ERR(dp->dptx_rst)) {
712         DRM_DEV_ERROR(dev, "no uphy reset control found\n");
713         return PTR_ERR(dp->dptx_rst);
714     }
715 
716     dp->core_rst = devm_reset_control_get(dev, "core");
717     if (IS_ERR(dp->core_rst)) {
718         DRM_DEV_ERROR(dev, "no core reset control found\n");
719         return PTR_ERR(dp->core_rst);
720     }
721 
722     dp->apb_rst = devm_reset_control_get(dev, "apb");
723     if (IS_ERR(dp->apb_rst)) {
724         DRM_DEV_ERROR(dev, "no apb reset control found\n");
725         return PTR_ERR(dp->apb_rst);
726     }
727 
728     return 0;
729 }
730 
cdn_dp_audio_hw_params(struct device * dev,void * data,struct hdmi_codec_daifmt * daifmt,struct hdmi_codec_params * params)731 static int cdn_dp_audio_hw_params(struct device *dev, void *data, struct hdmi_codec_daifmt *daifmt,
732                                   struct hdmi_codec_params *params)
733 {
734     struct cdn_dp_device *dp = dev_get_drvdata(dev);
735     struct audio_info audio = {
736         .sample_width = params->sample_width,
737         .sample_rate = params->sample_rate,
738         .channels = params->channels,
739     };
740     int ret;
741 
742     mutex_lock(&dp->lock);
743     if (!dp->active) {
744         ret = -ENODEV;
745         goto out;
746     }
747 
748     switch (daifmt->fmt) {
749         case HDMI_I2S:
750             audio.format = AFMT_I2S;
751             break;
752         case HDMI_SPDIF:
753             audio.format = AFMT_SPDIF;
754             break;
755         default:
756             DRM_DEV_ERROR(dev, "Invalid format %d\n", daifmt->fmt);
757             ret = -EINVAL;
758             goto out;
759     }
760 
761     ret = cdn_dp_audio_config(dp, &audio);
762     if (!ret) {
763         dp->audio_info = audio;
764     }
765 
766 out:
767     mutex_unlock(&dp->lock);
768     return ret;
769 }
770 
cdn_dp_audio_shutdown(struct device * dev,void * data)771 static void cdn_dp_audio_shutdown(struct device *dev, void *data)
772 {
773     struct cdn_dp_device *dp = dev_get_drvdata(dev);
774     int ret;
775 
776     mutex_lock(&dp->lock);
777     if (!dp->active) {
778         goto out;
779     }
780 
781     ret = cdn_dp_audio_stop(dp, &dp->audio_info);
782     if (!ret) {
783         dp->audio_info.format = AFMT_UNUSED;
784     }
785 out:
786     mutex_unlock(&dp->lock);
787 }
788 
cdn_dp_audio_mute_stream(struct device * dev,void * data,bool enable,int direction)789 static int cdn_dp_audio_mute_stream(struct device *dev, void *data, bool enable, int direction)
790 {
791     struct cdn_dp_device *dp = dev_get_drvdata(dev);
792     int ret;
793 
794     mutex_lock(&dp->lock);
795     if (!dp->active) {
796         ret = -ENODEV;
797         goto out;
798     }
799 
800     ret = cdn_dp_audio_mute(dp, enable);
801 
802 out:
803     mutex_unlock(&dp->lock);
804     return ret;
805 }
806 
cdn_dp_audio_get_eld(struct device * dev,void * data,u8 * buf,size_t len)807 static int cdn_dp_audio_get_eld(struct device *dev, void *data, u8 *buf, size_t len)
808 {
809     struct cdn_dp_device *dp = dev_get_drvdata(dev);
810 
811     memcpy(buf, dp->connector.eld, min(sizeof(dp->connector.eld), len));
812 
813     return 0;
814 }
815 
816 static const struct hdmi_codec_ops audio_codec_ops = {
817     .hw_params = cdn_dp_audio_hw_params,
818     .audio_shutdown = cdn_dp_audio_shutdown,
819     .mute_stream = cdn_dp_audio_mute_stream,
820     .get_eld = cdn_dp_audio_get_eld,
821     .no_capture_mute = 1,
822 };
823 
cdn_dp_audio_codec_init(struct cdn_dp_device * dp,struct device * dev)824 static int cdn_dp_audio_codec_init(struct cdn_dp_device *dp, struct device *dev)
825 {
826     struct hdmi_codec_pdata codec_data = {
827         .i2s = 1,
828         .spdif = 1,
829         .ops = &audio_codec_ops,
830         .max_i2s_channels = 0x8,
831     };
832 
833     dp->audio_pdev =
834         platform_device_register_data(dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, &codec_data, sizeof(codec_data));
835 
836     return PTR_ERR_OR_ZERO(dp->audio_pdev);
837 }
838 
cdn_dp_request_firmware(struct cdn_dp_device * dp)839 static int cdn_dp_request_firmware(struct cdn_dp_device *dp)
840 {
841     int ret;
842     unsigned long timeout = jiffies + msecs_to_jiffies(CDN_FW_TIMEOUT_MS);
843     unsigned long sleep = 0x3e8;
844 
845     WARN_ON(!mutex_is_locked(&dp->lock));
846 
847     if (dp->fw_loaded) {
848         return 0;
849     }
850 
851     /* Drop the lock before getting the firmware to avoid blocking boot */
852     mutex_unlock(&dp->lock);
853 
854     while (time_before(jiffies, timeout)) {
855         ret = request_firmware(&dp->fw, CDN_DP_FIRMWARE, dp->dev);
856         if (ret == -ENOENT) {
857             msleep(sleep);
858             sleep *= 0x2;
859             continue;
860         } else if (ret) {
861             DRM_DEV_ERROR(dp->dev, "failed to request firmware: %d\n", ret);
862             goto out;
863         }
864 
865         dp->fw_loaded = true;
866         ret = 0;
867         goto out;
868     }
869 
870     DRM_DEV_ERROR(dp->dev, "Timed out trying to load firmware\n");
871     ret = -ETIMEDOUT;
872 out:
873     mutex_lock(&dp->lock);
874     return ret;
875 }
876 
cdn_dp_pd_event_work(struct work_struct * work)877 static void cdn_dp_pd_event_work(struct work_struct *work)
878 {
879     struct cdn_dp_device *dp = container_of(to_delayed_work(work), struct cdn_dp_device, event_work);
880     struct drm_connector *connector = &dp->connector;
881     enum drm_connector_status old_status;
882 
883     int ret;
884 
885     mutex_lock(&dp->lock);
886 
887     if (dp->suspended) {
888         goto out;
889     }
890 
891     ret = cdn_dp_request_firmware(dp);
892     if (ret) {
893         goto out;
894     }
895 
896     dp->connected = true;
897 
898     /* Not connected, notify userspace to disable the block */
899     if (!cdn_dp_connected_port(dp)) {
900         DRM_DEV_INFO(dp->dev, "Not connected. Disabling cdn\n");
901         dp->connected = false;
902 
903         /* Connected but not enabled, enable the block */
904     } else if (!dp->active) {
905         DRM_DEV_INFO(dp->dev, "Connected, not enabled. Enabling cdn\n");
906         ret = cdn_dp_enable(dp);
907         if (ret) {
908             DRM_DEV_ERROR(dp->dev, "Enable dp failed %d\n", ret);
909             dp->connected = false;
910         }
911 
912         /* Enabled and connected to a dongle without a sink, notify userspace */
913     } else if (!cdn_dp_check_sink_connection(dp)) {
914         DRM_DEV_INFO(dp->dev, "Connected without sink. Assert hpd\n");
915         dp->connected = false;
916 
917         /* Enabled and connected with a sink, re-train if requested */
918     } else if (!cdn_dp_check_link_status(dp)) {
919         unsigned int rate = dp->max_rate;
920         unsigned int lanes = dp->max_lanes;
921         struct drm_display_mode *mode = &dp->mode;
922 
923         DRM_DEV_INFO(dp->dev, "Connected with sink. Re-train link\n");
924         ret = cdn_dp_train_link(dp);
925         if (ret) {
926             dp->connected = false;
927             DRM_DEV_ERROR(dp->dev, "Train link failed %d\n", ret);
928             goto out;
929         }
930 
931         /* If training result is changed, update the video config */
932         if (mode->clock && (rate != dp->max_rate || lanes != dp->max_lanes)) {
933             ret = cdn_dp_config_video(dp);
934             if (ret) {
935                 dp->connected = false;
936                 DRM_DEV_ERROR(dp->dev, "Failed to config video %d\n", ret);
937             }
938         }
939     }
940 
941 out:
942     mutex_unlock(&dp->lock);
943 
944     old_status = connector->status;
945     connector->status = connector->funcs->detect(connector, false);
946     if (old_status != connector->status) {
947         drm_kms_helper_hotplug_event(dp->drm_dev);
948     }
949 }
950 
cdn_dp_bind(struct device * dev,struct device * master,void * data)951 static int cdn_dp_bind(struct device *dev, struct device *master, void *data)
952 {
953     struct cdn_dp_device *dp = dev_get_drvdata(dev);
954     struct drm_encoder *encoder;
955     struct drm_connector *connector;
956     struct drm_device *drm_dev = data;
957     int ret;
958 
959     ret = cdn_dp_parse_dt(dp);
960     if (ret < 0) {
961         return ret;
962     }
963 
964     dp->drm_dev = drm_dev;
965     dp->connected = false;
966     dp->active = false;
967     dp->active_port = -1;
968     dp->fw_loaded = false;
969 
970     INIT_DELAYED_WORK(&dp->event_work, cdn_dp_pd_event_work);
971 
972     encoder = &dp->encoder;
973 
974     encoder->possible_crtcs = rockchip_drm_of_find_possible_crtcs(drm_dev, dev->of_node);
975     DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
976 
977     ret = drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
978     if (ret) {
979         DRM_ERROR("failed to initialize encoder with drm\n");
980         return ret;
981     }
982 
983     drm_encoder_helper_add(encoder, &cdn_dp_encoder_helper_funcs);
984 
985     connector = &dp->connector;
986     connector->polled = DRM_CONNECTOR_POLL_HPD;
987     connector->dpms = DRM_MODE_DPMS_OFF;
988 
989     ret = drm_connector_init(drm_dev, connector, &cdn_dp_atomic_connector_funcs, DRM_MODE_CONNECTOR_DisplayPort);
990     if (ret) {
991         DRM_ERROR("failed to initialize connector with drm\n");
992         goto err_free_encoder;
993     }
994 
995     drm_connector_helper_add(connector, &cdn_dp_connector_helper_funcs);
996 
997     ret = drm_connector_attach_encoder(connector, encoder);
998     if (ret) {
999         DRM_ERROR("failed to attach connector and encoder\n");
1000         goto err_free_connector;
1001     }
1002 
1003     dp->sub_dev.connector = &dp->connector;
1004     dp->sub_dev.of_node = dev->of_node;
1005     dp->sub_dev.oob_hotplug_event = cdn_dp_oob_hotplug_event;
1006     rockchip_drm_register_sub_dev(&dp->sub_dev);
1007 
1008     pm_runtime_enable(dev);
1009 
1010     schedule_delayed_work(&dp->event_work, 0);
1011 
1012     return 0;
1013 
1014 err_free_connector:
1015     drm_connector_cleanup(connector);
1016 err_free_encoder:
1017     drm_encoder_cleanup(encoder);
1018     return ret;
1019 }
1020 
cdn_dp_unbind(struct device * dev,struct device * master,void * data)1021 static void cdn_dp_unbind(struct device *dev, struct device *master, void *data)
1022 {
1023     struct cdn_dp_device *dp = dev_get_drvdata(dev);
1024     struct drm_encoder *encoder = &dp->encoder;
1025     struct drm_connector *connector = &dp->connector;
1026 
1027     cancel_delayed_work_sync(&dp->event_work);
1028     cdn_dp_encoder_disable(encoder);
1029     encoder->funcs->destroy(encoder);
1030     connector->funcs->destroy(connector);
1031 
1032     pm_runtime_disable(dev);
1033     if (dp->fw_loaded) {
1034         release_firmware(dp->fw);
1035     }
1036     kfree(dp->edid);
1037     dp->edid = NULL;
1038 }
1039 
1040 static const struct component_ops cdn_dp_component_ops = {
1041     .bind = cdn_dp_bind,
1042     .unbind = cdn_dp_unbind,
1043 };
1044 
cdn_dp_suspend(struct device * dev)1045 static int cdn_dp_suspend(struct device *dev)
1046 {
1047     struct cdn_dp_device *dp = dev_get_drvdata(dev);
1048     int ret = 0;
1049 
1050     mutex_lock(&dp->lock);
1051     if (dp->active) {
1052         ret = cdn_dp_disable(dp);
1053     }
1054     dp->suspended = true;
1055     mutex_unlock(&dp->lock);
1056 
1057     return ret;
1058 }
1059 
cdn_dp_resume(struct device * dev)1060 static int cdn_dp_resume(struct device *dev)
1061 {
1062     struct cdn_dp_device *dp = dev_get_drvdata(dev);
1063 
1064     mutex_lock(&dp->lock);
1065     dp->suspended = false;
1066     if (dp->fw_loaded) {
1067         schedule_delayed_work(&dp->event_work, 0);
1068     }
1069     mutex_unlock(&dp->lock);
1070 
1071     return 0;
1072 }
1073 
cdn_dp_probe(struct platform_device * pdev)1074 static int cdn_dp_probe(struct platform_device *pdev)
1075 {
1076     struct device *dev = &pdev->dev;
1077     const struct of_device_id *match;
1078     struct cdn_dp_data *dp_data;
1079     struct cdn_dp_port *port;
1080     struct cdn_dp_device *dp;
1081     struct phy *phy;
1082     int i;
1083 
1084     dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL);
1085     if (!dp) {
1086         return -ENOMEM;
1087     }
1088     dp->dev = dev;
1089 
1090     match = of_match_node(cdn_dp_dt_ids, pdev->dev.of_node);
1091     dp_data = (struct cdn_dp_data *)match->data;
1092 
1093     for (i = 0; i < dp_data->max_phy; i++) {
1094         phy = devm_of_phy_get_by_index(dev, dev->of_node, i);
1095         if (PTR_ERR(phy) == -EPROBE_DEFER) {
1096             return -EPROBE_DEFER;
1097         }
1098 
1099         if (IS_ERR(phy)) {
1100             continue;
1101         }
1102 
1103         port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
1104         if (!port) {
1105             return -ENOMEM;
1106         }
1107 
1108         port->phy = phy;
1109         port->dp = dp;
1110         port->id = i;
1111         dp->port[dp->ports++] = port;
1112     }
1113 
1114     if (!dp->ports) {
1115         DRM_DEV_ERROR(dev, "missing phy\n");
1116         return -EINVAL;
1117     }
1118 
1119     mutex_init(&dp->lock);
1120     dev_set_drvdata(dev, dp);
1121 
1122     cdn_dp_audio_codec_init(dp, dev);
1123 
1124     return component_add(dev, &cdn_dp_component_ops);
1125 }
1126 
cdn_dp_remove(struct platform_device * pdev)1127 static int cdn_dp_remove(struct platform_device *pdev)
1128 {
1129     struct cdn_dp_device *dp = platform_get_drvdata(pdev);
1130 
1131     platform_device_unregister(dp->audio_pdev);
1132     cdn_dp_suspend(dp->dev);
1133     component_del(&pdev->dev, &cdn_dp_component_ops);
1134 
1135     return 0;
1136 }
1137 
cdn_dp_shutdown(struct platform_device * pdev)1138 static void cdn_dp_shutdown(struct platform_device *pdev)
1139 {
1140     struct cdn_dp_device *dp = platform_get_drvdata(pdev);
1141 
1142     cdn_dp_suspend(dp->dev);
1143 }
1144 
1145 static const struct dev_pm_ops cdn_dp_pm_ops = {SET_SYSTEM_SLEEP_PM_OPS(cdn_dp_suspend, cdn_dp_resume)};
1146 
1147 struct platform_driver cdn_dp_driver = {
1148     .probe = cdn_dp_probe,
1149     .remove = cdn_dp_remove,
1150     .shutdown = cdn_dp_shutdown,
1151     .driver =
1152         {
1153             .name = "cdn-dp",
1154             .owner = THIS_MODULE,
1155             .of_match_table = of_match_ptr(cdn_dp_dt_ids),
1156             .pm = &cdn_dp_pm_ops,
1157         },
1158 };
1159