Merge tag 'omap-for-v5.12/fixes-rc1-signed' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / dp / dp_display.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
4  */
5
6 #include <linux/module.h>
7 #include <linux/slab.h>
8 #include <linux/uaccess.h>
9 #include <linux/debugfs.h>
10 #include <linux/component.h>
11 #include <linux/of_irq.h>
12 #include <linux/delay.h>
13
14 #include "msm_drv.h"
15 #include "msm_kms.h"
16 #include "dp_hpd.h"
17 #include "dp_parser.h"
18 #include "dp_power.h"
19 #include "dp_catalog.h"
20 #include "dp_aux.h"
21 #include "dp_reg.h"
22 #include "dp_link.h"
23 #include "dp_panel.h"
24 #include "dp_ctrl.h"
25 #include "dp_display.h"
26 #include "dp_drm.h"
27 #include "dp_audio.h"
28 #include "dp_debug.h"
29
30 static struct msm_dp *g_dp_display;
31 #define HPD_STRING_SIZE 30
32
33 enum {
34         ISR_DISCONNECTED,
35         ISR_CONNECT_PENDING,
36         ISR_CONNECTED,
37         ISR_HPD_REPLUG_COUNT,
38         ISR_IRQ_HPD_PULSE_COUNT,
39         ISR_HPD_LO_GLITH_COUNT,
40 };
41
42 /* event thread connection state */
43 enum {
44         ST_DISCONNECTED,
45         ST_CONNECT_PENDING,
46         ST_CONNECTED,
47         ST_DISCONNECT_PENDING,
48         ST_DISPLAY_OFF,
49         ST_SUSPENDED,
50 };
51
52 enum {
53         EV_NO_EVENT,
54         /* hpd events */
55         EV_HPD_INIT_SETUP,
56         EV_HPD_PLUG_INT,
57         EV_IRQ_HPD_INT,
58         EV_HPD_REPLUG_INT,
59         EV_HPD_UNPLUG_INT,
60         EV_USER_NOTIFICATION,
61         EV_CONNECT_PENDING_TIMEOUT,
62         EV_DISCONNECT_PENDING_TIMEOUT,
63 };
64
65 #define EVENT_TIMEOUT   (HZ/10) /* 100ms */
66 #define DP_EVENT_Q_MAX  8
67
68 #define DP_TIMEOUT_5_SECOND     (5000/EVENT_TIMEOUT)
69 #define DP_TIMEOUT_NONE         0
70
71 #define WAIT_FOR_RESUME_TIMEOUT_JIFFIES (HZ / 2)
72
73 struct dp_event {
74         u32 event_id;
75         u32 data;
76         u32 delay;
77 };
78
79 struct dp_display_private {
80         char *name;
81         int irq;
82
83         /* state variables */
84         bool core_initialized;
85         bool hpd_irq_on;
86         bool audio_supported;
87
88         struct platform_device *pdev;
89         struct dentry *root;
90
91         struct dp_usbpd   *usbpd;
92         struct dp_parser  *parser;
93         struct dp_power   *power;
94         struct dp_catalog *catalog;
95         struct drm_dp_aux *aux;
96         struct dp_link    *link;
97         struct dp_panel   *panel;
98         struct dp_ctrl    *ctrl;
99         struct dp_debug   *debug;
100
101         struct dp_usbpd_cb usbpd_cb;
102         struct dp_display_mode dp_mode;
103         struct msm_dp dp_display;
104
105         bool encoder_mode_set;
106
107         /* wait for audio signaling */
108         struct completion audio_comp;
109
110         /* event related only access by event thread */
111         struct mutex event_mutex;
112         wait_queue_head_t event_q;
113         u32 hpd_state;
114         u32 event_pndx;
115         u32 event_gndx;
116         struct dp_event event_list[DP_EVENT_Q_MAX];
117         spinlock_t event_lock;
118
119         struct dp_audio *audio;
120 };
121
122 static const struct of_device_id dp_dt_match[] = {
123         {.compatible = "qcom,sc7180-dp"},
124         {}
125 };
126
127 static int dp_add_event(struct dp_display_private *dp_priv, u32 event,
128                                                 u32 data, u32 delay)
129 {
130         unsigned long flag;
131         struct dp_event *todo;
132         int pndx;
133
134         spin_lock_irqsave(&dp_priv->event_lock, flag);
135         pndx = dp_priv->event_pndx + 1;
136         pndx %= DP_EVENT_Q_MAX;
137         if (pndx == dp_priv->event_gndx) {
138                 pr_err("event_q is full: pndx=%d gndx=%d\n",
139                         dp_priv->event_pndx, dp_priv->event_gndx);
140                 spin_unlock_irqrestore(&dp_priv->event_lock, flag);
141                 return -EPERM;
142         }
143         todo = &dp_priv->event_list[dp_priv->event_pndx++];
144         dp_priv->event_pndx %= DP_EVENT_Q_MAX;
145         todo->event_id = event;
146         todo->data = data;
147         todo->delay = delay;
148         wake_up(&dp_priv->event_q);
149         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
150
151         return 0;
152 }
153
154 static int dp_del_event(struct dp_display_private *dp_priv, u32 event)
155 {
156         unsigned long flag;
157         struct dp_event *todo;
158         u32     gndx;
159
160         spin_lock_irqsave(&dp_priv->event_lock, flag);
161         if (dp_priv->event_pndx == dp_priv->event_gndx) {
162                 spin_unlock_irqrestore(&dp_priv->event_lock, flag);
163                 return -ENOENT;
164         }
165
166         gndx = dp_priv->event_gndx;
167         while (dp_priv->event_pndx != gndx) {
168                 todo = &dp_priv->event_list[gndx];
169                 if (todo->event_id == event) {
170                         todo->event_id = EV_NO_EVENT;   /* deleted */
171                         todo->delay = 0;
172                 }
173                 gndx++;
174                 gndx %= DP_EVENT_Q_MAX;
175         }
176         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
177
178         return 0;
179 }
180
181 void dp_display_signal_audio_complete(struct msm_dp *dp_display)
182 {
183         struct dp_display_private *dp;
184
185         dp = container_of(dp_display, struct dp_display_private, dp_display);
186
187         complete_all(&dp->audio_comp);
188 }
189
190 static int dp_display_bind(struct device *dev, struct device *master,
191                            void *data)
192 {
193         int rc = 0;
194         struct dp_display_private *dp;
195         struct drm_device *drm;
196         struct msm_drm_private *priv;
197
198         drm = dev_get_drvdata(master);
199
200         dp = container_of(g_dp_display,
201                         struct dp_display_private, dp_display);
202         if (!dp) {
203                 DRM_ERROR("DP driver bind failed. Invalid driver data\n");
204                 return -EINVAL;
205         }
206
207         dp->dp_display.drm_dev = drm;
208         priv = drm->dev_private;
209         priv->dp = &(dp->dp_display);
210
211         rc = dp->parser->parse(dp->parser);
212         if (rc) {
213                 DRM_ERROR("device tree parsing failed\n");
214                 goto end;
215         }
216
217         rc = dp_aux_register(dp->aux);
218         if (rc) {
219                 DRM_ERROR("DRM DP AUX register failed\n");
220                 goto end;
221         }
222
223         rc = dp_power_client_init(dp->power);
224         if (rc) {
225                 DRM_ERROR("Power client create failed\n");
226                 goto end;
227         }
228
229         rc = dp_register_audio_driver(dev, dp->audio);
230         if (rc)
231                 DRM_ERROR("Audio registration Dp failed\n");
232
233 end:
234         return rc;
235 }
236
237 static void dp_display_unbind(struct device *dev, struct device *master,
238                               void *data)
239 {
240         struct dp_display_private *dp;
241         struct drm_device *drm = dev_get_drvdata(master);
242         struct msm_drm_private *priv = drm->dev_private;
243
244         dp = container_of(g_dp_display,
245                         struct dp_display_private, dp_display);
246         if (!dp) {
247                 DRM_ERROR("Invalid DP driver data\n");
248                 return;
249         }
250
251         dp_power_client_deinit(dp->power);
252         dp_aux_unregister(dp->aux);
253         priv->dp = NULL;
254 }
255
256 static const struct component_ops dp_display_comp_ops = {
257         .bind = dp_display_bind,
258         .unbind = dp_display_unbind,
259 };
260
261 static bool dp_display_is_ds_bridge(struct dp_panel *panel)
262 {
263         return (panel->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
264                 DP_DWN_STRM_PORT_PRESENT);
265 }
266
267 static bool dp_display_is_sink_count_zero(struct dp_display_private *dp)
268 {
269         return dp_display_is_ds_bridge(dp->panel) &&
270                 (dp->link->sink_count == 0);
271 }
272
273 static void dp_display_send_hpd_event(struct msm_dp *dp_display)
274 {
275         struct dp_display_private *dp;
276         struct drm_connector *connector;
277
278         dp = container_of(dp_display, struct dp_display_private, dp_display);
279
280         connector = dp->dp_display.connector;
281         drm_helper_hpd_irq_event(connector->dev);
282 }
283
284
285 static void dp_display_set_encoder_mode(struct dp_display_private *dp)
286 {
287         struct msm_drm_private *priv = dp->dp_display.drm_dev->dev_private;
288         struct msm_kms *kms = priv->kms;
289
290         if (!dp->encoder_mode_set && dp->dp_display.encoder &&
291                                 kms->funcs->set_encoder_mode) {
292                 kms->funcs->set_encoder_mode(kms,
293                                 dp->dp_display.encoder, false);
294
295                 dp->encoder_mode_set = true;
296         }
297 }
298
299 static int dp_display_send_hpd_notification(struct dp_display_private *dp,
300                                             bool hpd)
301 {
302         if ((hpd && dp->dp_display.is_connected) ||
303                         (!hpd && !dp->dp_display.is_connected)) {
304                 DRM_DEBUG_DP("HPD already %s\n", (hpd ? "on" : "off"));
305                 return 0;
306         }
307
308         /* reset video pattern flag on disconnect */
309         if (!hpd)
310                 dp->panel->video_test = false;
311
312         dp->dp_display.is_connected = hpd;
313
314         dp_display_send_hpd_event(&dp->dp_display);
315
316         return 0;
317 }
318
319 static int dp_display_process_hpd_high(struct dp_display_private *dp)
320 {
321         int rc = 0;
322         struct edid *edid;
323
324         dp->panel->max_dp_lanes = dp->parser->max_dp_lanes;
325
326         rc = dp_panel_read_sink_caps(dp->panel, dp->dp_display.connector);
327         if (rc)
328                 goto end;
329
330         dp_link_process_request(dp->link);
331
332         edid = dp->panel->edid;
333
334         dp->audio_supported = drm_detect_monitor_audio(edid);
335         dp_panel_handle_sink_request(dp->panel);
336
337         dp->dp_display.max_pclk_khz = DP_MAX_PIXEL_CLK_KHZ;
338         dp->dp_display.max_dp_lanes = dp->parser->max_dp_lanes;
339
340         dp_link_reset_phy_params_vx_px(dp->link);
341         rc = dp_ctrl_on_link(dp->ctrl);
342         if (rc) {
343                 DRM_ERROR("failed to complete DP link training\n");
344                 goto end;
345         }
346
347         dp_add_event(dp, EV_USER_NOTIFICATION, true, 0);
348
349 end:
350         return rc;
351 }
352
353 static void dp_display_host_init(struct dp_display_private *dp, int reset)
354 {
355         bool flip = false;
356
357         if (dp->core_initialized) {
358                 DRM_DEBUG_DP("DP core already initialized\n");
359                 return;
360         }
361
362         if (dp->usbpd->orientation == ORIENTATION_CC2)
363                 flip = true;
364
365         dp_display_set_encoder_mode(dp);
366
367         dp_power_init(dp->power, flip);
368         dp_ctrl_host_init(dp->ctrl, flip, reset);
369         dp_aux_init(dp->aux);
370         dp->core_initialized = true;
371 }
372
373 static void dp_display_host_deinit(struct dp_display_private *dp)
374 {
375         if (!dp->core_initialized) {
376                 DRM_DEBUG_DP("DP core not initialized\n");
377                 return;
378         }
379
380         dp_ctrl_host_deinit(dp->ctrl);
381         dp_aux_deinit(dp->aux);
382         dp_power_deinit(dp->power);
383
384         dp->core_initialized = false;
385 }
386
387 static int dp_display_usbpd_configure_cb(struct device *dev)
388 {
389         int rc = 0;
390         struct dp_display_private *dp;
391
392         if (!dev) {
393                 DRM_ERROR("invalid dev\n");
394                 rc = -EINVAL;
395                 goto end;
396         }
397
398         dp = container_of(g_dp_display,
399                         struct dp_display_private, dp_display);
400         if (!dp) {
401                 DRM_ERROR("no driver data found\n");
402                 rc = -ENODEV;
403                 goto end;
404         }
405
406         dp_display_host_init(dp, false);
407
408         /*
409          * set sink to normal operation mode -- D0
410          * before dpcd read
411          */
412         dp_link_psm_config(dp->link, &dp->panel->link_info, false);
413         rc = dp_display_process_hpd_high(dp);
414 end:
415         return rc;
416 }
417
418 static int dp_display_usbpd_disconnect_cb(struct device *dev)
419 {
420         int rc = 0;
421         struct dp_display_private *dp;
422
423         if (!dev) {
424                 DRM_ERROR("invalid dev\n");
425                 rc = -EINVAL;
426                 return rc;
427         }
428
429         dp = container_of(g_dp_display,
430                         struct dp_display_private, dp_display);
431         if (!dp) {
432                 DRM_ERROR("no driver data found\n");
433                 rc = -ENODEV;
434                 return rc;
435         }
436
437         dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
438
439         return rc;
440 }
441
442 static void dp_display_handle_video_request(struct dp_display_private *dp)
443 {
444         if (dp->link->sink_request & DP_TEST_LINK_VIDEO_PATTERN) {
445                 dp->panel->video_test = true;
446                 dp_link_send_test_response(dp->link);
447         }
448 }
449
450 static int dp_display_handle_port_ststus_changed(struct dp_display_private *dp)
451 {
452         int rc = 0;
453
454         if (dp_display_is_sink_count_zero(dp)) {
455                 DRM_DEBUG_DP("sink count is zero, nothing to do\n");
456                 if (dp->hpd_state != ST_DISCONNECTED) {
457                         dp->hpd_state = ST_DISCONNECT_PENDING;
458                         dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
459                 }
460         } else {
461                 if (dp->hpd_state == ST_DISCONNECTED) {
462                         dp->hpd_state = ST_CONNECT_PENDING;
463                         rc = dp_display_process_hpd_high(dp);
464                         if (rc)
465                                 dp->hpd_state = ST_DISCONNECTED;
466                 }
467         }
468
469         return rc;
470 }
471
472 static int dp_display_handle_irq_hpd(struct dp_display_private *dp)
473 {
474         u32 sink_request = dp->link->sink_request;
475
476         if (dp->hpd_state == ST_DISCONNECTED) {
477                 if (sink_request & DP_LINK_STATUS_UPDATED) {
478                         DRM_ERROR("Disconnected, no DP_LINK_STATUS_UPDATED\n");
479                         return -EINVAL;
480                 }
481         }
482
483         dp_ctrl_handle_sink_request(dp->ctrl);
484
485         if (sink_request & DP_TEST_LINK_VIDEO_PATTERN)
486                 dp_display_handle_video_request(dp);
487
488         return 0;
489 }
490
491 static int dp_display_usbpd_attention_cb(struct device *dev)
492 {
493         int rc = 0;
494         u32 sink_request;
495         struct dp_display_private *dp;
496         struct dp_usbpd *hpd;
497
498         if (!dev) {
499                 DRM_ERROR("invalid dev\n");
500                 return -EINVAL;
501         }
502
503         dp = container_of(g_dp_display,
504                         struct dp_display_private, dp_display);
505         if (!dp) {
506                 DRM_ERROR("no driver data found\n");
507                 return -ENODEV;
508         }
509
510         hpd = dp->usbpd;
511
512         /* check for any test request issued by sink */
513         rc = dp_link_process_request(dp->link);
514         if (!rc) {
515                 sink_request = dp->link->sink_request;
516                 if (sink_request & DS_PORT_STATUS_CHANGED)
517                         rc = dp_display_handle_port_ststus_changed(dp);
518                 else
519                         rc = dp_display_handle_irq_hpd(dp);
520         }
521
522         return rc;
523 }
524
525 static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
526 {
527         struct dp_usbpd *hpd = dp->usbpd;
528         u32 state;
529         u32 tout = DP_TIMEOUT_5_SECOND;
530         int ret;
531
532         if (!hpd)
533                 return 0;
534
535         mutex_lock(&dp->event_mutex);
536
537         state =  dp->hpd_state;
538         if (state == ST_DISPLAY_OFF || state == ST_SUSPENDED) {
539                 mutex_unlock(&dp->event_mutex);
540                 return 0;
541         }
542
543         if (state == ST_CONNECT_PENDING || state == ST_CONNECTED) {
544                 mutex_unlock(&dp->event_mutex);
545                 return 0;
546         }
547
548         if (state == ST_DISCONNECT_PENDING) {
549                 /* wait until ST_DISCONNECTED */
550                 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */
551                 mutex_unlock(&dp->event_mutex);
552                 return 0;
553         }
554
555         dp->hpd_state = ST_CONNECT_PENDING;
556
557         hpd->hpd_high = 1;
558
559         ret = dp_display_usbpd_configure_cb(&dp->pdev->dev);
560         if (ret) {      /* link train failed */
561                 hpd->hpd_high = 0;
562                 dp->hpd_state = ST_DISCONNECTED;
563
564                 if (ret == -ECONNRESET) { /* cable unplugged */
565                         dp->core_initialized = false;
566                 }
567
568         } else {
569                 /* start sentinel checking in case of missing uevent */
570                 dp_add_event(dp, EV_CONNECT_PENDING_TIMEOUT, 0, tout);
571         }
572
573         mutex_unlock(&dp->event_mutex);
574
575         /* uevent will complete connection part */
576         return 0;
577 };
578
579 static int dp_display_enable(struct dp_display_private *dp, u32 data);
580 static int dp_display_disable(struct dp_display_private *dp, u32 data);
581
582 static int dp_connect_pending_timeout(struct dp_display_private *dp, u32 data)
583 {
584         u32 state;
585
586         mutex_lock(&dp->event_mutex);
587
588         state = dp->hpd_state;
589         if (state == ST_CONNECT_PENDING) {
590                 dp_display_enable(dp, 0);
591                 dp->hpd_state = ST_CONNECTED;
592         }
593
594         mutex_unlock(&dp->event_mutex);
595
596         return 0;
597 }
598
599 static void dp_display_handle_plugged_change(struct msm_dp *dp_display,
600                 bool plugged)
601 {
602         struct dp_display_private *dp;
603
604         dp = container_of(dp_display,
605                         struct dp_display_private, dp_display);
606
607         /* notify audio subsystem only if sink supports audio */
608         if (dp_display->plugged_cb && dp_display->codec_dev &&
609                         dp->audio_supported)
610                 dp_display->plugged_cb(dp_display->codec_dev, plugged);
611 }
612
613 static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
614 {
615         struct dp_usbpd *hpd = dp->usbpd;
616         u32 state;
617
618         if (!hpd)
619                 return 0;
620
621         mutex_lock(&dp->event_mutex);
622
623         state = dp->hpd_state;
624         if (state == ST_DISCONNECT_PENDING || state == ST_DISCONNECTED) {
625                 mutex_unlock(&dp->event_mutex);
626                 return 0;
627         }
628
629         if (state == ST_CONNECT_PENDING) {
630                 /* wait until CONNECTED */
631                 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 1); /* delay = 1 */
632                 mutex_unlock(&dp->event_mutex);
633                 return 0;
634         }
635
636         dp->hpd_state = ST_DISCONNECT_PENDING;
637
638         /* disable HPD plug interrupt until disconnect is done */
639         dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK
640                                 | DP_DP_IRQ_HPD_INT_MASK, false);
641
642         hpd->hpd_high = 0;
643
644         /*
645          * We don't need separate work for disconnect as
646          * connect/attention interrupts are disabled
647          */
648         dp_display_usbpd_disconnect_cb(&dp->pdev->dev);
649
650         /* start sentinel checking in case of missing uevent */
651         dp_add_event(dp, EV_DISCONNECT_PENDING_TIMEOUT, 0, DP_TIMEOUT_5_SECOND);
652
653         /* signal the disconnect event early to ensure proper teardown */
654         reinit_completion(&dp->audio_comp);
655         dp_display_handle_plugged_change(g_dp_display, false);
656
657         dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK |
658                                         DP_DP_IRQ_HPD_INT_MASK, true);
659
660         /* uevent will complete disconnection part */
661         mutex_unlock(&dp->event_mutex);
662         return 0;
663 }
664
665 static int dp_disconnect_pending_timeout(struct dp_display_private *dp, u32 data)
666 {
667         u32 state;
668
669         mutex_lock(&dp->event_mutex);
670
671         state =  dp->hpd_state;
672         if (state == ST_DISCONNECT_PENDING) {
673                 dp_display_disable(dp, 0);
674                 dp->hpd_state = ST_DISCONNECTED;
675         }
676
677         mutex_unlock(&dp->event_mutex);
678
679         return 0;
680 }
681
682 static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
683 {
684         u32 state;
685         int ret;
686
687         mutex_lock(&dp->event_mutex);
688
689         /* irq_hpd can happen at either connected or disconnected state */
690         state =  dp->hpd_state;
691         if (state == ST_DISPLAY_OFF) {
692                 mutex_unlock(&dp->event_mutex);
693                 return 0;
694         }
695
696         if (state == ST_CONNECT_PENDING) {
697                 /* wait until ST_CONNECTED */
698                 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */
699                 mutex_unlock(&dp->event_mutex);
700                 return 0;
701         }
702
703         if (state == ST_CONNECT_PENDING || state == ST_DISCONNECT_PENDING) {
704                 /* wait until ST_CONNECTED */
705                 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */
706                 mutex_unlock(&dp->event_mutex);
707                 return 0;
708         }
709
710         ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
711         if (ret == -ECONNRESET) { /* cable unplugged */
712                 dp->core_initialized = false;
713         }
714
715         mutex_unlock(&dp->event_mutex);
716
717         return 0;
718 }
719
720 static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
721 {
722         dp_debug_put(dp->debug);
723         dp_ctrl_put(dp->ctrl);
724         dp_panel_put(dp->panel);
725         dp_aux_put(dp->aux);
726         dp_audio_put(dp->audio);
727 }
728
729 static int dp_init_sub_modules(struct dp_display_private *dp)
730 {
731         int rc = 0;
732         struct device *dev = &dp->pdev->dev;
733         struct dp_usbpd_cb *cb = &dp->usbpd_cb;
734         struct dp_panel_in panel_in = {
735                 .dev = dev,
736         };
737
738         /* Callback APIs used for cable status change event */
739         cb->configure  = dp_display_usbpd_configure_cb;
740         cb->disconnect = dp_display_usbpd_disconnect_cb;
741         cb->attention  = dp_display_usbpd_attention_cb;
742
743         dp->usbpd = dp_hpd_get(dev, cb);
744         if (IS_ERR(dp->usbpd)) {
745                 rc = PTR_ERR(dp->usbpd);
746                 DRM_ERROR("failed to initialize hpd, rc = %d\n", rc);
747                 dp->usbpd = NULL;
748                 goto error;
749         }
750
751         dp->parser = dp_parser_get(dp->pdev);
752         if (IS_ERR(dp->parser)) {
753                 rc = PTR_ERR(dp->parser);
754                 DRM_ERROR("failed to initialize parser, rc = %d\n", rc);
755                 dp->parser = NULL;
756                 goto error;
757         }
758
759         dp->catalog = dp_catalog_get(dev, &dp->parser->io);
760         if (IS_ERR(dp->catalog)) {
761                 rc = PTR_ERR(dp->catalog);
762                 DRM_ERROR("failed to initialize catalog, rc = %d\n", rc);
763                 dp->catalog = NULL;
764                 goto error;
765         }
766
767         dp->power = dp_power_get(dev, dp->parser);
768         if (IS_ERR(dp->power)) {
769                 rc = PTR_ERR(dp->power);
770                 DRM_ERROR("failed to initialize power, rc = %d\n", rc);
771                 dp->power = NULL;
772                 goto error;
773         }
774
775         dp->aux = dp_aux_get(dev, dp->catalog);
776         if (IS_ERR(dp->aux)) {
777                 rc = PTR_ERR(dp->aux);
778                 DRM_ERROR("failed to initialize aux, rc = %d\n", rc);
779                 dp->aux = NULL;
780                 goto error;
781         }
782
783         dp->link = dp_link_get(dev, dp->aux);
784         if (IS_ERR(dp->link)) {
785                 rc = PTR_ERR(dp->link);
786                 DRM_ERROR("failed to initialize link, rc = %d\n", rc);
787                 dp->link = NULL;
788                 goto error_link;
789         }
790
791         panel_in.aux = dp->aux;
792         panel_in.catalog = dp->catalog;
793         panel_in.link = dp->link;
794
795         dp->panel = dp_panel_get(&panel_in);
796         if (IS_ERR(dp->panel)) {
797                 rc = PTR_ERR(dp->panel);
798                 DRM_ERROR("failed to initialize panel, rc = %d\n", rc);
799                 dp->panel = NULL;
800                 goto error_link;
801         }
802
803         dp->ctrl = dp_ctrl_get(dev, dp->link, dp->panel, dp->aux,
804                                dp->power, dp->catalog, dp->parser);
805         if (IS_ERR(dp->ctrl)) {
806                 rc = PTR_ERR(dp->ctrl);
807                 DRM_ERROR("failed to initialize ctrl, rc = %d\n", rc);
808                 dp->ctrl = NULL;
809                 goto error_ctrl;
810         }
811
812         dp->audio = dp_audio_get(dp->pdev, dp->panel, dp->catalog);
813         if (IS_ERR(dp->audio)) {
814                 rc = PTR_ERR(dp->audio);
815                 pr_err("failed to initialize audio, rc = %d\n", rc);
816                 dp->audio = NULL;
817                 goto error_audio;
818         }
819
820         return rc;
821
822 error_audio:
823         dp_ctrl_put(dp->ctrl);
824 error_ctrl:
825         dp_panel_put(dp->panel);
826 error_link:
827         dp_aux_put(dp->aux);
828 error:
829         return rc;
830 }
831
832 static int dp_display_set_mode(struct msm_dp *dp_display,
833                                struct dp_display_mode *mode)
834 {
835         struct dp_display_private *dp;
836
837         dp = container_of(dp_display, struct dp_display_private, dp_display);
838
839         dp->panel->dp_mode.drm_mode = mode->drm_mode;
840         dp->panel->dp_mode.bpp = mode->bpp;
841         dp->panel->dp_mode.capabilities = mode->capabilities;
842         dp_panel_init_panel_info(dp->panel);
843         return 0;
844 }
845
846 static int dp_display_prepare(struct msm_dp *dp)
847 {
848         return 0;
849 }
850
851 static int dp_display_enable(struct dp_display_private *dp, u32 data)
852 {
853         int rc = 0;
854         struct msm_dp *dp_display;
855
856         dp_display = g_dp_display;
857
858         if (dp_display->power_on) {
859                 DRM_DEBUG_DP("Link already setup, return\n");
860                 return 0;
861         }
862
863         rc = dp_ctrl_on_stream(dp->ctrl);
864         if (!rc)
865                 dp_display->power_on = true;
866
867         return rc;
868 }
869
870 static int dp_display_post_enable(struct msm_dp *dp_display)
871 {
872         struct dp_display_private *dp;
873         u32 rate;
874
875         dp = container_of(dp_display, struct dp_display_private, dp_display);
876
877         rate = dp->link->link_params.rate;
878
879         if (dp->audio_supported) {
880                 dp->audio->bw_code = drm_dp_link_rate_to_bw_code(rate);
881                 dp->audio->lane_count = dp->link->link_params.num_lanes;
882         }
883
884         /* signal the connect event late to synchronize video and display */
885         dp_display_handle_plugged_change(dp_display, true);
886         return 0;
887 }
888
889 static int dp_display_disable(struct dp_display_private *dp, u32 data)
890 {
891         struct msm_dp *dp_display;
892
893         dp_display = g_dp_display;
894
895         if (!dp_display->power_on)
896                 return 0;
897
898         /* wait only if audio was enabled */
899         if (dp_display->audio_enabled) {
900                 /* signal the disconnect event */
901                 reinit_completion(&dp->audio_comp);
902                 dp_display_handle_plugged_change(dp_display, false);
903                 if (!wait_for_completion_timeout(&dp->audio_comp,
904                                 HZ * 5))
905                         DRM_ERROR("audio comp timeout\n");
906         }
907
908         dp_display->audio_enabled = false;
909
910         dp_ctrl_off(dp->ctrl);
911
912         dp->core_initialized = false;
913
914         dp_display->power_on = false;
915
916         return 0;
917 }
918
919 static int dp_display_unprepare(struct msm_dp *dp)
920 {
921         return 0;
922 }
923
924 int dp_display_set_plugged_cb(struct msm_dp *dp_display,
925                 hdmi_codec_plugged_cb fn, struct device *codec_dev)
926 {
927         bool plugged;
928
929         dp_display->plugged_cb = fn;
930         dp_display->codec_dev = codec_dev;
931         plugged = dp_display->is_connected;
932         dp_display_handle_plugged_change(dp_display, plugged);
933
934         return 0;
935 }
936
937 int dp_display_validate_mode(struct msm_dp *dp, u32 mode_pclk_khz)
938 {
939         const u32 num_components = 3, default_bpp = 24;
940         struct dp_display_private *dp_display;
941         struct dp_link_info *link_info;
942         u32 mode_rate_khz = 0, supported_rate_khz = 0, mode_bpp = 0;
943
944         if (!dp || !mode_pclk_khz || !dp->connector) {
945                 DRM_ERROR("invalid params\n");
946                 return -EINVAL;
947         }
948
949         dp_display = container_of(dp, struct dp_display_private, dp_display);
950         link_info = &dp_display->panel->link_info;
951
952         mode_bpp = dp->connector->display_info.bpc * num_components;
953         if (!mode_bpp)
954                 mode_bpp = default_bpp;
955
956         mode_bpp = dp_panel_get_mode_bpp(dp_display->panel,
957                         mode_bpp, mode_pclk_khz);
958
959         mode_rate_khz = mode_pclk_khz * mode_bpp;
960         supported_rate_khz = link_info->num_lanes * link_info->rate * 8;
961
962         if (mode_rate_khz > supported_rate_khz)
963                 return MODE_BAD;
964
965         return MODE_OK;
966 }
967
968 int dp_display_get_modes(struct msm_dp *dp,
969                                 struct dp_display_mode *dp_mode)
970 {
971         struct dp_display_private *dp_display;
972         int ret = 0;
973
974         if (!dp) {
975                 DRM_ERROR("invalid params\n");
976                 return 0;
977         }
978
979         dp_display = container_of(dp, struct dp_display_private, dp_display);
980
981         ret = dp_panel_get_modes(dp_display->panel,
982                 dp->connector, dp_mode);
983         if (dp_mode->drm_mode.clock)
984                 dp->max_pclk_khz = dp_mode->drm_mode.clock;
985         return ret;
986 }
987
988 bool dp_display_check_video_test(struct msm_dp *dp)
989 {
990         struct dp_display_private *dp_display;
991
992         dp_display = container_of(dp, struct dp_display_private, dp_display);
993
994         return dp_display->panel->video_test;
995 }
996
997 int dp_display_get_test_bpp(struct msm_dp *dp)
998 {
999         struct dp_display_private *dp_display;
1000
1001         if (!dp) {
1002                 DRM_ERROR("invalid params\n");
1003                 return 0;
1004         }
1005
1006         dp_display = container_of(dp, struct dp_display_private, dp_display);
1007
1008         return dp_link_bit_depth_to_bpp(
1009                 dp_display->link->test_video.test_bit_depth);
1010 }
1011
1012 static void dp_display_config_hpd(struct dp_display_private *dp)
1013 {
1014
1015         dp_display_host_init(dp, true);
1016         dp_catalog_ctrl_hpd_config(dp->catalog);
1017
1018         /* Enable interrupt first time
1019          * we are leaving dp clocks on during disconnect
1020          * and never disable interrupt
1021          */
1022         enable_irq(dp->irq);
1023 }
1024
1025 static int hpd_event_thread(void *data)
1026 {
1027         struct dp_display_private *dp_priv;
1028         unsigned long flag;
1029         struct dp_event *todo;
1030         int timeout_mode = 0;
1031
1032         dp_priv = (struct dp_display_private *)data;
1033
1034         while (1) {
1035                 if (timeout_mode) {
1036                         wait_event_timeout(dp_priv->event_q,
1037                                 (dp_priv->event_pndx == dp_priv->event_gndx),
1038                                                 EVENT_TIMEOUT);
1039                 } else {
1040                         wait_event_interruptible(dp_priv->event_q,
1041                                 (dp_priv->event_pndx != dp_priv->event_gndx));
1042                 }
1043                 spin_lock_irqsave(&dp_priv->event_lock, flag);
1044                 todo = &dp_priv->event_list[dp_priv->event_gndx];
1045                 if (todo->delay) {
1046                         struct dp_event *todo_next;
1047
1048                         dp_priv->event_gndx++;
1049                         dp_priv->event_gndx %= DP_EVENT_Q_MAX;
1050
1051                         /* re enter delay event into q */
1052                         todo_next = &dp_priv->event_list[dp_priv->event_pndx++];
1053                         dp_priv->event_pndx %= DP_EVENT_Q_MAX;
1054                         todo_next->event_id = todo->event_id;
1055                         todo_next->data = todo->data;
1056                         todo_next->delay = todo->delay - 1;
1057
1058                         /* clean up older event */
1059                         todo->event_id = EV_NO_EVENT;
1060                         todo->delay = 0;
1061
1062                         /* switch to timeout mode */
1063                         timeout_mode = 1;
1064                         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
1065                         continue;
1066                 }
1067
1068                 /* timeout with no events in q */
1069                 if (dp_priv->event_pndx == dp_priv->event_gndx) {
1070                         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
1071                         continue;
1072                 }
1073
1074                 dp_priv->event_gndx++;
1075                 dp_priv->event_gndx %= DP_EVENT_Q_MAX;
1076                 timeout_mode = 0;
1077                 spin_unlock_irqrestore(&dp_priv->event_lock, flag);
1078
1079                 switch (todo->event_id) {
1080                 case EV_HPD_INIT_SETUP:
1081                         dp_display_config_hpd(dp_priv);
1082                         break;
1083                 case EV_HPD_PLUG_INT:
1084                         dp_hpd_plug_handle(dp_priv, todo->data);
1085                         break;
1086                 case EV_HPD_UNPLUG_INT:
1087                         dp_hpd_unplug_handle(dp_priv, todo->data);
1088                         break;
1089                 case EV_IRQ_HPD_INT:
1090                         dp_irq_hpd_handle(dp_priv, todo->data);
1091                         break;
1092                 case EV_HPD_REPLUG_INT:
1093                         /* do nothing */
1094                         break;
1095                 case EV_USER_NOTIFICATION:
1096                         dp_display_send_hpd_notification(dp_priv,
1097                                                 todo->data);
1098                         break;
1099                 case EV_CONNECT_PENDING_TIMEOUT:
1100                         dp_connect_pending_timeout(dp_priv,
1101                                                 todo->data);
1102                         break;
1103                 case EV_DISCONNECT_PENDING_TIMEOUT:
1104                         dp_disconnect_pending_timeout(dp_priv,
1105                                                 todo->data);
1106                         break;
1107                 default:
1108                         break;
1109                 }
1110         }
1111
1112         return 0;
1113 }
1114
1115 static void dp_hpd_event_setup(struct dp_display_private *dp_priv)
1116 {
1117         init_waitqueue_head(&dp_priv->event_q);
1118         spin_lock_init(&dp_priv->event_lock);
1119
1120         kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler");
1121 }
1122
1123 static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)
1124 {
1125         struct dp_display_private *dp = dev_id;
1126         irqreturn_t ret = IRQ_HANDLED;
1127         u32 hpd_isr_status;
1128
1129         if (!dp) {
1130                 DRM_ERROR("invalid data\n");
1131                 return IRQ_NONE;
1132         }
1133
1134         hpd_isr_status = dp_catalog_hpd_get_intr_status(dp->catalog);
1135
1136         if (hpd_isr_status & 0x0F) {
1137                 /* hpd related interrupts */
1138                 if (hpd_isr_status & DP_DP_HPD_PLUG_INT_MASK ||
1139                         hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK) {
1140                         dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
1141                 }
1142
1143                 if (hpd_isr_status & DP_DP_IRQ_HPD_INT_MASK) {
1144                         /* stop sentinel connect pending checking */
1145                         dp_del_event(dp, EV_CONNECT_PENDING_TIMEOUT);
1146                         dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0);
1147                 }
1148
1149                 if (hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK)
1150                         dp_add_event(dp, EV_HPD_REPLUG_INT, 0, 0);
1151
1152                 if (hpd_isr_status & DP_DP_HPD_UNPLUG_INT_MASK)
1153                         dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
1154         }
1155
1156         /* DP controller isr */
1157         dp_ctrl_isr(dp->ctrl);
1158
1159         /* DP aux isr */
1160         dp_aux_isr(dp->aux);
1161
1162         return ret;
1163 }
1164
1165 int dp_display_request_irq(struct msm_dp *dp_display)
1166 {
1167         int rc = 0;
1168         struct dp_display_private *dp;
1169
1170         if (!dp_display) {
1171                 DRM_ERROR("invalid input\n");
1172                 return -EINVAL;
1173         }
1174
1175         dp = container_of(dp_display, struct dp_display_private, dp_display);
1176
1177         dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0);
1178         if (dp->irq < 0) {
1179                 rc = dp->irq;
1180                 DRM_ERROR("failed to get irq: %d\n", rc);
1181                 return rc;
1182         }
1183
1184         rc = devm_request_irq(&dp->pdev->dev, dp->irq,
1185                         dp_display_irq_handler,
1186                         IRQF_TRIGGER_HIGH, "dp_display_isr", dp);
1187         if (rc < 0) {
1188                 DRM_ERROR("failed to request IRQ%u: %d\n",
1189                                 dp->irq, rc);
1190                 return rc;
1191         }
1192         disable_irq(dp->irq);
1193
1194         return 0;
1195 }
1196
1197 static int dp_display_probe(struct platform_device *pdev)
1198 {
1199         int rc = 0;
1200         struct dp_display_private *dp;
1201
1202         if (!pdev || !pdev->dev.of_node) {
1203                 DRM_ERROR("pdev not found\n");
1204                 return -ENODEV;
1205         }
1206
1207         dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL);
1208         if (!dp)
1209                 return -ENOMEM;
1210
1211         dp->pdev = pdev;
1212         dp->name = "drm_dp";
1213
1214         rc = dp_init_sub_modules(dp);
1215         if (rc) {
1216                 DRM_ERROR("init sub module failed\n");
1217                 return -EPROBE_DEFER;
1218         }
1219
1220         mutex_init(&dp->event_mutex);
1221         g_dp_display = &dp->dp_display;
1222
1223         /* Store DP audio handle inside DP display */
1224         g_dp_display->dp_audio = dp->audio;
1225
1226         init_completion(&dp->audio_comp);
1227
1228         platform_set_drvdata(pdev, g_dp_display);
1229
1230         rc = component_add(&pdev->dev, &dp_display_comp_ops);
1231         if (rc) {
1232                 DRM_ERROR("component add failed, rc=%d\n", rc);
1233                 dp_display_deinit_sub_modules(dp);
1234         }
1235
1236         return rc;
1237 }
1238
1239 static int dp_display_remove(struct platform_device *pdev)
1240 {
1241         struct dp_display_private *dp;
1242
1243         dp = container_of(g_dp_display,
1244                         struct dp_display_private, dp_display);
1245
1246         dp_display_deinit_sub_modules(dp);
1247
1248         component_del(&pdev->dev, &dp_display_comp_ops);
1249         platform_set_drvdata(pdev, NULL);
1250
1251         return 0;
1252 }
1253
1254 static int dp_pm_resume(struct device *dev)
1255 {
1256         struct platform_device *pdev = to_platform_device(dev);
1257         struct msm_dp *dp_display = platform_get_drvdata(pdev);
1258         struct dp_display_private *dp;
1259         u32 status;
1260
1261         dp = container_of(dp_display, struct dp_display_private, dp_display);
1262
1263         mutex_lock(&dp->event_mutex);
1264
1265         /* start from disconnected state */
1266         dp->hpd_state = ST_DISCONNECTED;
1267
1268         /* turn on dp ctrl/phy */
1269         dp_display_host_init(dp, true);
1270
1271         dp_catalog_ctrl_hpd_config(dp->catalog);
1272
1273         status = dp_catalog_link_is_connected(dp->catalog);
1274
1275         if (status)
1276                 dp->dp_display.is_connected = true;
1277         else
1278                 dp->dp_display.is_connected = false;
1279
1280         mutex_unlock(&dp->event_mutex);
1281
1282         return 0;
1283 }
1284
1285 static int dp_pm_suspend(struct device *dev)
1286 {
1287         struct platform_device *pdev = to_platform_device(dev);
1288         struct msm_dp *dp_display = platform_get_drvdata(pdev);
1289         struct dp_display_private *dp;
1290
1291         dp = container_of(dp_display, struct dp_display_private, dp_display);
1292
1293         mutex_lock(&dp->event_mutex);
1294
1295         if (dp->core_initialized == true)
1296                 dp_display_host_deinit(dp);
1297
1298         dp->hpd_state = ST_SUSPENDED;
1299
1300         /* host_init will be called at pm_resume */
1301         dp->core_initialized = false;
1302
1303         mutex_unlock(&dp->event_mutex);
1304
1305         return 0;
1306 }
1307
1308 static int dp_pm_prepare(struct device *dev)
1309 {
1310         return 0;
1311 }
1312
1313 static void dp_pm_complete(struct device *dev)
1314 {
1315
1316 }
1317
1318 static const struct dev_pm_ops dp_pm_ops = {
1319         .suspend = dp_pm_suspend,
1320         .resume =  dp_pm_resume,
1321         .prepare = dp_pm_prepare,
1322         .complete = dp_pm_complete,
1323 };
1324
1325 static struct platform_driver dp_display_driver = {
1326         .probe  = dp_display_probe,
1327         .remove = dp_display_remove,
1328         .driver = {
1329                 .name = "msm-dp-display",
1330                 .of_match_table = dp_dt_match,
1331                 .suppress_bind_attrs = true,
1332                 .pm = &dp_pm_ops,
1333         },
1334 };
1335
1336 int __init msm_dp_register(void)
1337 {
1338         int ret;
1339
1340         ret = platform_driver_register(&dp_display_driver);
1341         if (ret)
1342                 DRM_ERROR("Dp display driver register failed");
1343
1344         return ret;
1345 }
1346
1347 void __exit msm_dp_unregister(void)
1348 {
1349         platform_driver_unregister(&dp_display_driver);
1350 }
1351
1352 void msm_dp_irq_postinstall(struct msm_dp *dp_display)
1353 {
1354         struct dp_display_private *dp;
1355
1356         if (!dp_display)
1357                 return;
1358
1359         dp = container_of(dp_display, struct dp_display_private, dp_display);
1360
1361         dp_hpd_event_setup(dp);
1362
1363         dp_add_event(dp, EV_HPD_INIT_SETUP, 0, 100);
1364 }
1365
1366 void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor)
1367 {
1368         struct dp_display_private *dp;
1369         struct device *dev;
1370         int rc;
1371
1372         dp = container_of(dp_display, struct dp_display_private, dp_display);
1373         dev = &dp->pdev->dev;
1374
1375         dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd,
1376                                         dp->link, &dp->dp_display.connector,
1377                                         minor);
1378         if (IS_ERR(dp->debug)) {
1379                 rc = PTR_ERR(dp->debug);
1380                 DRM_ERROR("failed to initialize debug, rc = %d\n", rc);
1381                 dp->debug = NULL;
1382         }
1383 }
1384
1385 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
1386                         struct drm_encoder *encoder)
1387 {
1388         struct msm_drm_private *priv;
1389         int ret;
1390
1391         if (WARN_ON(!encoder) || WARN_ON(!dp_display) || WARN_ON(!dev))
1392                 return -EINVAL;
1393
1394         priv = dev->dev_private;
1395         dp_display->drm_dev = dev;
1396
1397         ret = dp_display_request_irq(dp_display);
1398         if (ret) {
1399                 DRM_ERROR("request_irq failed, ret=%d\n", ret);
1400                 return ret;
1401         }
1402
1403         dp_display->encoder = encoder;
1404
1405         dp_display->connector = dp_drm_connector_init(dp_display);
1406         if (IS_ERR(dp_display->connector)) {
1407                 ret = PTR_ERR(dp_display->connector);
1408                 DRM_DEV_ERROR(dev->dev,
1409                         "failed to create dp connector: %d\n", ret);
1410                 dp_display->connector = NULL;
1411                 return ret;
1412         }
1413
1414         priv->connectors[priv->num_connectors++] = dp_display->connector;
1415         return 0;
1416 }
1417
1418 int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder)
1419 {
1420         int rc = 0;
1421         struct dp_display_private *dp_display;
1422         u32 state;
1423
1424         dp_display = container_of(dp, struct dp_display_private, dp_display);
1425         if (!dp_display->dp_mode.drm_mode.clock) {
1426                 DRM_ERROR("invalid params\n");
1427                 return -EINVAL;
1428         }
1429
1430         mutex_lock(&dp_display->event_mutex);
1431
1432         /* stop sentinel checking */
1433         dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT);
1434
1435         rc = dp_display_set_mode(dp, &dp_display->dp_mode);
1436         if (rc) {
1437                 DRM_ERROR("Failed to perform a mode set, rc=%d\n", rc);
1438                 mutex_unlock(&dp_display->event_mutex);
1439                 return rc;
1440         }
1441
1442         rc = dp_display_prepare(dp);
1443         if (rc) {
1444                 DRM_ERROR("DP display prepare failed, rc=%d\n", rc);
1445                 mutex_unlock(&dp_display->event_mutex);
1446                 return rc;
1447         }
1448
1449         state =  dp_display->hpd_state;
1450
1451         if (state == ST_DISPLAY_OFF)
1452                 dp_display_host_init(dp_display, true);
1453
1454         dp_display_enable(dp_display, 0);
1455
1456         rc = dp_display_post_enable(dp);
1457         if (rc) {
1458                 DRM_ERROR("DP display post enable failed, rc=%d\n", rc);
1459                 dp_display_disable(dp_display, 0);
1460                 dp_display_unprepare(dp);
1461         }
1462
1463         /* manual kick off plug event to train link */
1464         if (state == ST_DISPLAY_OFF)
1465                 dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0);
1466
1467         /* completed connection */
1468         dp_display->hpd_state = ST_CONNECTED;
1469
1470         mutex_unlock(&dp_display->event_mutex);
1471
1472         return rc;
1473 }
1474
1475 int msm_dp_display_pre_disable(struct msm_dp *dp, struct drm_encoder *encoder)
1476 {
1477         struct dp_display_private *dp_display;
1478
1479         dp_display = container_of(dp, struct dp_display_private, dp_display);
1480
1481         dp_ctrl_push_idle(dp_display->ctrl);
1482
1483         return 0;
1484 }
1485
1486 int msm_dp_display_disable(struct msm_dp *dp, struct drm_encoder *encoder)
1487 {
1488         int rc = 0;
1489         u32 state;
1490         struct dp_display_private *dp_display;
1491
1492         dp_display = container_of(dp, struct dp_display_private, dp_display);
1493
1494         mutex_lock(&dp_display->event_mutex);
1495
1496         /* stop sentinel checking */
1497         dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT);
1498
1499         dp_display_disable(dp_display, 0);
1500
1501         rc = dp_display_unprepare(dp);
1502         if (rc)
1503                 DRM_ERROR("DP display unprepare failed, rc=%d\n", rc);
1504
1505         state =  dp_display->hpd_state;
1506         if (state == ST_DISCONNECT_PENDING) {
1507                 /* completed disconnection */
1508                 dp_display->hpd_state = ST_DISCONNECTED;
1509         } else {
1510                 dp_display->hpd_state = ST_DISPLAY_OFF;
1511         }
1512
1513         mutex_unlock(&dp_display->event_mutex);
1514         return rc;
1515 }
1516
1517 void msm_dp_display_mode_set(struct msm_dp *dp, struct drm_encoder *encoder,
1518                                 struct drm_display_mode *mode,
1519                                 struct drm_display_mode *adjusted_mode)
1520 {
1521         struct dp_display_private *dp_display;
1522
1523         dp_display = container_of(dp, struct dp_display_private, dp_display);
1524
1525         memset(&dp_display->dp_mode, 0x0, sizeof(struct dp_display_mode));
1526
1527         if (dp_display_check_video_test(dp))
1528                 dp_display->dp_mode.bpp = dp_display_get_test_bpp(dp);
1529         else /* Default num_components per pixel = 3 */
1530                 dp_display->dp_mode.bpp = dp->connector->display_info.bpc * 3;
1531
1532         if (!dp_display->dp_mode.bpp)
1533                 dp_display->dp_mode.bpp = 24; /* Default bpp */
1534
1535         drm_mode_copy(&dp_display->dp_mode.drm_mode, adjusted_mode);
1536
1537         dp_display->dp_mode.v_active_low =
1538                 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NVSYNC);
1539
1540         dp_display->dp_mode.h_active_low =
1541                 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);
1542 }