1 // SPDX-License-Identifier: GPL-2.0-only
 
   3  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 
   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>
 
  17 #include "dp_parser.h"
 
  19 #include "dp_catalog.h"
 
  25 #include "dp_display.h"
 
  30 static struct msm_dp *g_dp_display;
 
  31 #define HPD_STRING_SIZE 30
 
  38         ISR_IRQ_HPD_PULSE_COUNT,
 
  39         ISR_HPD_LO_GLITH_COUNT,
 
  42 /* event thread connection state */
 
  47         ST_DISCONNECT_PENDING,
 
  61         EV_CONNECT_PENDING_TIMEOUT,
 
  62         EV_DISCONNECT_PENDING_TIMEOUT,
 
  65 #define EVENT_TIMEOUT   (HZ/10) /* 100ms */
 
  66 #define DP_EVENT_Q_MAX  8
 
  68 #define DP_TIMEOUT_5_SECOND     (5000/EVENT_TIMEOUT)
 
  69 #define DP_TIMEOUT_NONE         0
 
  71 #define WAIT_FOR_RESUME_TIMEOUT_JIFFIES (HZ / 2)
 
  79 struct dp_display_private {
 
  84         bool core_initialized;
 
  88         struct platform_device *pdev;
 
  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;
 
  97         struct dp_panel   *panel;
 
  99         struct dp_debug   *debug;
 
 101         struct dp_usbpd_cb usbpd_cb;
 
 102         struct dp_display_mode dp_mode;
 
 103         struct msm_dp dp_display;
 
 105         /* wait for audio signaling */
 
 106         struct completion audio_comp;
 
 108         /* event related only access by event thread */
 
 109         struct mutex event_mutex;
 
 110         wait_queue_head_t event_q;
 
 114         struct dp_event event_list[DP_EVENT_Q_MAX];
 
 115         spinlock_t event_lock;
 
 117         struct dp_audio *audio;
 
 120 static const struct of_device_id dp_dt_match[] = {
 
 121         {.compatible = "qcom,sc7180-dp"},
 
 125 static int dp_add_event(struct dp_display_private *dp_priv, u32 event,
 
 129         struct dp_event *todo;
 
 132         spin_lock_irqsave(&dp_priv->event_lock, flag);
 
 133         pndx = dp_priv->event_pndx + 1;
 
 134         pndx %= DP_EVENT_Q_MAX;
 
 135         if (pndx == dp_priv->event_gndx) {
 
 136                 pr_err("event_q is full: pndx=%d gndx=%d\n",
 
 137                         dp_priv->event_pndx, dp_priv->event_gndx);
 
 138                 spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
 141         todo = &dp_priv->event_list[dp_priv->event_pndx++];
 
 142         dp_priv->event_pndx %= DP_EVENT_Q_MAX;
 
 143         todo->event_id = event;
 
 146         wake_up(&dp_priv->event_q);
 
 147         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
 152 static int dp_del_event(struct dp_display_private *dp_priv, u32 event)
 
 155         struct dp_event *todo;
 
 158         spin_lock_irqsave(&dp_priv->event_lock, flag);
 
 159         if (dp_priv->event_pndx == dp_priv->event_gndx) {
 
 160                 spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
 164         gndx = dp_priv->event_gndx;
 
 165         while (dp_priv->event_pndx != gndx) {
 
 166                 todo = &dp_priv->event_list[gndx];
 
 167                 if (todo->event_id == event) {
 
 168                         todo->event_id = EV_NO_EVENT;   /* deleted */
 
 172                 gndx %= DP_EVENT_Q_MAX;
 
 174         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
 179 void dp_display_signal_audio_start(struct msm_dp *dp_display)
 
 181         struct dp_display_private *dp;
 
 183         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
 185         reinit_completion(&dp->audio_comp);
 
 188 void dp_display_signal_audio_complete(struct msm_dp *dp_display)
 
 190         struct dp_display_private *dp;
 
 192         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
 194         complete_all(&dp->audio_comp);
 
 197 static int dp_display_bind(struct device *dev, struct device *master,
 
 201         struct dp_display_private *dp;
 
 202         struct drm_device *drm;
 
 203         struct msm_drm_private *priv;
 
 205         drm = dev_get_drvdata(master);
 
 207         dp = container_of(g_dp_display,
 
 208                         struct dp_display_private, dp_display);
 
 210         dp->dp_display.drm_dev = drm;
 
 211         priv = drm->dev_private;
 
 212         priv->dp = &(dp->dp_display);
 
 214         rc = dp->parser->parse(dp->parser);
 
 216                 DRM_ERROR("device tree parsing failed\n");
 
 220         rc = dp_aux_register(dp->aux);
 
 222                 DRM_ERROR("DRM DP AUX register failed\n");
 
 226         rc = dp_power_client_init(dp->power);
 
 228                 DRM_ERROR("Power client create failed\n");
 
 232         rc = dp_register_audio_driver(dev, dp->audio);
 
 234                 DRM_ERROR("Audio registration Dp failed\n");
 
 240 static void dp_display_unbind(struct device *dev, struct device *master,
 
 243         struct dp_display_private *dp;
 
 244         struct drm_device *drm = dev_get_drvdata(master);
 
 245         struct msm_drm_private *priv = drm->dev_private;
 
 247         dp = container_of(g_dp_display,
 
 248                         struct dp_display_private, dp_display);
 
 250         dp_power_client_deinit(dp->power);
 
 251         dp_aux_unregister(dp->aux);
 
 255 static const struct component_ops dp_display_comp_ops = {
 
 256         .bind = dp_display_bind,
 
 257         .unbind = dp_display_unbind,
 
 260 static bool dp_display_is_ds_bridge(struct dp_panel *panel)
 
 262         return (panel->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
 
 263                 DP_DWN_STRM_PORT_PRESENT);
 
 266 static bool dp_display_is_sink_count_zero(struct dp_display_private *dp)
 
 268         return dp_display_is_ds_bridge(dp->panel) &&
 
 269                 (dp->link->sink_count == 0);
 
 272 static void dp_display_send_hpd_event(struct msm_dp *dp_display)
 
 274         struct dp_display_private *dp;
 
 275         struct drm_connector *connector;
 
 277         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
 279         connector = dp->dp_display.connector;
 
 280         drm_helper_hpd_irq_event(connector->dev);
 
 284 static int dp_display_send_hpd_notification(struct dp_display_private *dp,
 
 287         if ((hpd && dp->dp_display.is_connected) ||
 
 288                         (!hpd && !dp->dp_display.is_connected)) {
 
 289                 DRM_DEBUG_DP("HPD already %s\n", (hpd ? "on" : "off"));
 
 293         /* reset video pattern flag on disconnect */
 
 295                 dp->panel->video_test = false;
 
 297         dp->dp_display.is_connected = hpd;
 
 299         dp_display_send_hpd_event(&dp->dp_display);
 
 304 static int dp_display_process_hpd_high(struct dp_display_private *dp)
 
 309         dp->panel->max_dp_lanes = dp->parser->max_dp_lanes;
 
 311         rc = dp_panel_read_sink_caps(dp->panel, dp->dp_display.connector);
 
 315         dp_link_process_request(dp->link);
 
 317         edid = dp->panel->edid;
 
 319         dp->audio_supported = drm_detect_monitor_audio(edid);
 
 320         dp_panel_handle_sink_request(dp->panel);
 
 322         dp->dp_display.max_pclk_khz = DP_MAX_PIXEL_CLK_KHZ;
 
 323         dp->dp_display.max_dp_lanes = dp->parser->max_dp_lanes;
 
 326          * set sink to normal operation mode -- D0
 
 329         dp_link_psm_config(dp->link, &dp->panel->link_info, false);
 
 331         dp_link_reset_phy_params_vx_px(dp->link);
 
 332         rc = dp_ctrl_on_link(dp->ctrl);
 
 334                 DRM_ERROR("failed to complete DP link training\n");
 
 338         dp_add_event(dp, EV_USER_NOTIFICATION, true, 0);
 
 344 static void dp_display_host_init(struct dp_display_private *dp, int reset)
 
 348         if (dp->core_initialized) {
 
 349                 DRM_DEBUG_DP("DP core already initialized\n");
 
 353         if (dp->usbpd->orientation == ORIENTATION_CC2)
 
 356         dp_power_init(dp->power, flip);
 
 357         dp_ctrl_host_init(dp->ctrl, flip, reset);
 
 358         dp_aux_init(dp->aux);
 
 359         dp->core_initialized = true;
 
 362 static void dp_display_host_deinit(struct dp_display_private *dp)
 
 364         if (!dp->core_initialized) {
 
 365                 DRM_DEBUG_DP("DP core not initialized\n");
 
 369         dp_ctrl_host_deinit(dp->ctrl);
 
 370         dp_aux_deinit(dp->aux);
 
 371         dp_power_deinit(dp->power);
 
 373         dp->core_initialized = false;
 
 376 static int dp_display_usbpd_configure_cb(struct device *dev)
 
 379         struct dp_display_private *dp;
 
 382                 DRM_ERROR("invalid dev\n");
 
 387         dp = container_of(g_dp_display,
 
 388                         struct dp_display_private, dp_display);
 
 390         dp_display_host_init(dp, false);
 
 392         rc = dp_display_process_hpd_high(dp);
 
 397 static int dp_display_usbpd_disconnect_cb(struct device *dev)
 
 400         struct dp_display_private *dp;
 
 403                 DRM_ERROR("invalid dev\n");
 
 408         dp = container_of(g_dp_display,
 
 409                         struct dp_display_private, dp_display);
 
 411         dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
 
 416 static void dp_display_handle_video_request(struct dp_display_private *dp)
 
 418         if (dp->link->sink_request & DP_TEST_LINK_VIDEO_PATTERN) {
 
 419                 dp->panel->video_test = true;
 
 420                 dp_link_send_test_response(dp->link);
 
 424 static int dp_display_handle_port_ststus_changed(struct dp_display_private *dp)
 
 428         if (dp_display_is_sink_count_zero(dp)) {
 
 429                 DRM_DEBUG_DP("sink count is zero, nothing to do\n");
 
 430                 if (dp->hpd_state != ST_DISCONNECTED) {
 
 431                         dp->hpd_state = ST_DISCONNECT_PENDING;
 
 432                         dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
 
 435                 if (dp->hpd_state == ST_DISCONNECTED) {
 
 436                         dp->hpd_state = ST_CONNECT_PENDING;
 
 437                         rc = dp_display_process_hpd_high(dp);
 
 439                                 dp->hpd_state = ST_DISCONNECTED;
 
 446 static int dp_display_handle_irq_hpd(struct dp_display_private *dp)
 
 448         u32 sink_request = dp->link->sink_request;
 
 450         if (dp->hpd_state == ST_DISCONNECTED) {
 
 451                 if (sink_request & DP_LINK_STATUS_UPDATED) {
 
 452                         DRM_ERROR("Disconnected, no DP_LINK_STATUS_UPDATED\n");
 
 457         dp_ctrl_handle_sink_request(dp->ctrl);
 
 459         if (sink_request & DP_TEST_LINK_VIDEO_PATTERN)
 
 460                 dp_display_handle_video_request(dp);
 
 465 static int dp_display_usbpd_attention_cb(struct device *dev)
 
 469         struct dp_display_private *dp;
 
 472                 DRM_ERROR("invalid dev\n");
 
 476         dp = container_of(g_dp_display,
 
 477                         struct dp_display_private, dp_display);
 
 479         /* check for any test request issued by sink */
 
 480         rc = dp_link_process_request(dp->link);
 
 482                 sink_request = dp->link->sink_request;
 
 483                 if (sink_request & DS_PORT_STATUS_CHANGED)
 
 484                         rc = dp_display_handle_port_ststus_changed(dp);
 
 486                         rc = dp_display_handle_irq_hpd(dp);
 
 492 static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
 
 494         struct dp_usbpd *hpd = dp->usbpd;
 
 496         u32 tout = DP_TIMEOUT_5_SECOND;
 
 502         mutex_lock(&dp->event_mutex);
 
 504         state =  dp->hpd_state;
 
 505         if (state == ST_DISPLAY_OFF || state == ST_SUSPENDED) {
 
 506                 mutex_unlock(&dp->event_mutex);
 
 510         if (state == ST_CONNECT_PENDING || state == ST_CONNECTED) {
 
 511                 mutex_unlock(&dp->event_mutex);
 
 515         if (state == ST_DISCONNECT_PENDING) {
 
 516                 /* wait until ST_DISCONNECTED */
 
 517                 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */
 
 518                 mutex_unlock(&dp->event_mutex);
 
 522         dp->hpd_state = ST_CONNECT_PENDING;
 
 526         ret = dp_display_usbpd_configure_cb(&dp->pdev->dev);
 
 527         if (ret) {      /* link train failed */
 
 529                 dp->hpd_state = ST_DISCONNECTED;
 
 531                 if (ret == -ECONNRESET) { /* cable unplugged */
 
 532                         dp->core_initialized = false;
 
 536                 /* start sentinel checking in case of missing uevent */
 
 537                 dp_add_event(dp, EV_CONNECT_PENDING_TIMEOUT, 0, tout);
 
 540         /* enable HDP irq_hpd/replug interrupt */
 
 541         dp_catalog_hpd_config_intr(dp->catalog,
 
 542                 DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK, true);
 
 544         mutex_unlock(&dp->event_mutex);
 
 546         /* uevent will complete connection part */
 
 550 static int dp_display_enable(struct dp_display_private *dp, u32 data);
 
 551 static int dp_display_disable(struct dp_display_private *dp, u32 data);
 
 553 static int dp_connect_pending_timeout(struct dp_display_private *dp, u32 data)
 
 557         mutex_lock(&dp->event_mutex);
 
 559         state = dp->hpd_state;
 
 560         if (state == ST_CONNECT_PENDING)
 
 561                 dp->hpd_state = ST_CONNECTED;
 
 563         mutex_unlock(&dp->event_mutex);
 
 568 static void dp_display_handle_plugged_change(struct msm_dp *dp_display,
 
 571         struct dp_display_private *dp;
 
 573         dp = container_of(dp_display,
 
 574                         struct dp_display_private, dp_display);
 
 576         /* notify audio subsystem only if sink supports audio */
 
 577         if (dp_display->plugged_cb && dp_display->codec_dev &&
 
 579                 dp_display->plugged_cb(dp_display->codec_dev, plugged);
 
 582 static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
 
 584         struct dp_usbpd *hpd = dp->usbpd;
 
 590         mutex_lock(&dp->event_mutex);
 
 592         state = dp->hpd_state;
 
 594         /* disable irq_hpd/replug interrupts */
 
 595         dp_catalog_hpd_config_intr(dp->catalog,
 
 596                 DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK, false);
 
 598         /* unplugged, no more irq_hpd handle */
 
 599         dp_del_event(dp, EV_IRQ_HPD_INT);
 
 601         if (state == ST_DISCONNECTED) {
 
 602                 /* triggered by irq_hdp with sink_count = 0 */
 
 603                 if (dp->link->sink_count == 0) {
 
 604                         dp_ctrl_off_phy(dp->ctrl);
 
 606                         dp->core_initialized = false;
 
 608                 mutex_unlock(&dp->event_mutex);
 
 612         if (state == ST_DISCONNECT_PENDING) {
 
 613                 mutex_unlock(&dp->event_mutex);
 
 617         if (state == ST_CONNECT_PENDING) {
 
 618                 /* wait until CONNECTED */
 
 619                 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 1); /* delay = 1 */
 
 620                 mutex_unlock(&dp->event_mutex);
 
 624         dp->hpd_state = ST_DISCONNECT_PENDING;
 
 626         /* disable HPD plug interrupts */
 
 627         dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, false);
 
 632          * We don't need separate work for disconnect as
 
 633          * connect/attention interrupts are disabled
 
 635         dp_display_usbpd_disconnect_cb(&dp->pdev->dev);
 
 637         /* start sentinel checking in case of missing uevent */
 
 638         dp_add_event(dp, EV_DISCONNECT_PENDING_TIMEOUT, 0, DP_TIMEOUT_5_SECOND);
 
 640         /* signal the disconnect event early to ensure proper teardown */
 
 641         dp_display_handle_plugged_change(g_dp_display, false);
 
 643         /* enable HDP plug interrupt to prepare for next plugin */
 
 644         dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, true);
 
 646         /* uevent will complete disconnection part */
 
 647         mutex_unlock(&dp->event_mutex);
 
 651 static int dp_disconnect_pending_timeout(struct dp_display_private *dp, u32 data)
 
 655         mutex_lock(&dp->event_mutex);
 
 657         state =  dp->hpd_state;
 
 658         if (state == ST_DISCONNECT_PENDING)
 
 659                 dp->hpd_state = ST_DISCONNECTED;
 
 661         mutex_unlock(&dp->event_mutex);
 
 666 static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
 
 671         mutex_lock(&dp->event_mutex);
 
 673         /* irq_hpd can happen at either connected or disconnected state */
 
 674         state =  dp->hpd_state;
 
 675         if (state == ST_DISPLAY_OFF || state == ST_SUSPENDED) {
 
 676                 mutex_unlock(&dp->event_mutex);
 
 680         if (state == ST_CONNECT_PENDING) {
 
 681                 /* wait until ST_CONNECTED */
 
 682                 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */
 
 683                 mutex_unlock(&dp->event_mutex);
 
 687         if (state == ST_CONNECT_PENDING || state == ST_DISCONNECT_PENDING) {
 
 688                 /* wait until ST_CONNECTED */
 
 689                 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */
 
 690                 mutex_unlock(&dp->event_mutex);
 
 694         ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
 
 695         if (ret == -ECONNRESET) { /* cable unplugged */
 
 696                 dp->core_initialized = false;
 
 699         mutex_unlock(&dp->event_mutex);
 
 704 static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
 
 706         dp_debug_put(dp->debug);
 
 707         dp_panel_put(dp->panel);
 
 709         dp_audio_put(dp->audio);
 
 712 static int dp_init_sub_modules(struct dp_display_private *dp)
 
 715         struct device *dev = &dp->pdev->dev;
 
 716         struct dp_usbpd_cb *cb = &dp->usbpd_cb;
 
 717         struct dp_panel_in panel_in = {
 
 721         /* Callback APIs used for cable status change event */
 
 722         cb->configure  = dp_display_usbpd_configure_cb;
 
 723         cb->disconnect = dp_display_usbpd_disconnect_cb;
 
 724         cb->attention  = dp_display_usbpd_attention_cb;
 
 726         dp->usbpd = dp_hpd_get(dev, cb);
 
 727         if (IS_ERR(dp->usbpd)) {
 
 728                 rc = PTR_ERR(dp->usbpd);
 
 729                 DRM_ERROR("failed to initialize hpd, rc = %d\n", rc);
 
 734         dp->parser = dp_parser_get(dp->pdev);
 
 735         if (IS_ERR(dp->parser)) {
 
 736                 rc = PTR_ERR(dp->parser);
 
 737                 DRM_ERROR("failed to initialize parser, rc = %d\n", rc);
 
 742         dp->catalog = dp_catalog_get(dev, &dp->parser->io);
 
 743         if (IS_ERR(dp->catalog)) {
 
 744                 rc = PTR_ERR(dp->catalog);
 
 745                 DRM_ERROR("failed to initialize catalog, rc = %d\n", rc);
 
 750         dp->power = dp_power_get(dev, dp->parser);
 
 751         if (IS_ERR(dp->power)) {
 
 752                 rc = PTR_ERR(dp->power);
 
 753                 DRM_ERROR("failed to initialize power, rc = %d\n", rc);
 
 758         dp->aux = dp_aux_get(dev, dp->catalog);
 
 759         if (IS_ERR(dp->aux)) {
 
 760                 rc = PTR_ERR(dp->aux);
 
 761                 DRM_ERROR("failed to initialize aux, rc = %d\n", rc);
 
 766         dp->link = dp_link_get(dev, dp->aux);
 
 767         if (IS_ERR(dp->link)) {
 
 768                 rc = PTR_ERR(dp->link);
 
 769                 DRM_ERROR("failed to initialize link, rc = %d\n", rc);
 
 774         panel_in.aux = dp->aux;
 
 775         panel_in.catalog = dp->catalog;
 
 776         panel_in.link = dp->link;
 
 778         dp->panel = dp_panel_get(&panel_in);
 
 779         if (IS_ERR(dp->panel)) {
 
 780                 rc = PTR_ERR(dp->panel);
 
 781                 DRM_ERROR("failed to initialize panel, rc = %d\n", rc);
 
 786         dp->ctrl = dp_ctrl_get(dev, dp->link, dp->panel, dp->aux,
 
 787                                dp->power, dp->catalog, dp->parser);
 
 788         if (IS_ERR(dp->ctrl)) {
 
 789                 rc = PTR_ERR(dp->ctrl);
 
 790                 DRM_ERROR("failed to initialize ctrl, rc = %d\n", rc);
 
 795         dp->audio = dp_audio_get(dp->pdev, dp->panel, dp->catalog);
 
 796         if (IS_ERR(dp->audio)) {
 
 797                 rc = PTR_ERR(dp->audio);
 
 798                 pr_err("failed to initialize audio, rc = %d\n", rc);
 
 806         dp_panel_put(dp->panel);
 
 813 static int dp_display_set_mode(struct msm_dp *dp_display,
 
 814                                struct dp_display_mode *mode)
 
 816         struct dp_display_private *dp;
 
 818         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
 820         dp->panel->dp_mode.drm_mode = mode->drm_mode;
 
 821         dp->panel->dp_mode.bpp = mode->bpp;
 
 822         dp->panel->dp_mode.capabilities = mode->capabilities;
 
 823         dp_panel_init_panel_info(dp->panel);
 
 827 static int dp_display_prepare(struct msm_dp *dp)
 
 832 static int dp_display_enable(struct dp_display_private *dp, u32 data)
 
 835         struct msm_dp *dp_display;
 
 837         dp_display = g_dp_display;
 
 839         if (dp_display->power_on) {
 
 840                 DRM_DEBUG_DP("Link already setup, return\n");
 
 844         rc = dp_ctrl_on_stream(dp->ctrl);
 
 846                 dp_display->power_on = true;
 
 851 static int dp_display_post_enable(struct msm_dp *dp_display)
 
 853         struct dp_display_private *dp;
 
 856         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
 858         rate = dp->link->link_params.rate;
 
 860         if (dp->audio_supported) {
 
 861                 dp->audio->bw_code = drm_dp_link_rate_to_bw_code(rate);
 
 862                 dp->audio->lane_count = dp->link->link_params.num_lanes;
 
 865         /* signal the connect event late to synchronize video and display */
 
 866         dp_display_handle_plugged_change(dp_display, true);
 
 870 static int dp_display_disable(struct dp_display_private *dp, u32 data)
 
 872         struct msm_dp *dp_display;
 
 874         dp_display = g_dp_display;
 
 876         if (!dp_display->power_on)
 
 879         /* wait only if audio was enabled */
 
 880         if (dp_display->audio_enabled) {
 
 881                 /* signal the disconnect event */
 
 882                 dp_display_handle_plugged_change(dp_display, false);
 
 883                 if (!wait_for_completion_timeout(&dp->audio_comp,
 
 885                         DRM_ERROR("audio comp timeout\n");
 
 888         dp_display->audio_enabled = false;
 
 890         /* triggered by irq_hpd with sink_count = 0 */
 
 891         if (dp->link->sink_count == 0) {
 
 892                 dp_ctrl_off_link_stream(dp->ctrl);
 
 894                 dp_ctrl_off(dp->ctrl);
 
 895                 dp->core_initialized = false;
 
 898         dp_display->power_on = false;
 
 903 static int dp_display_unprepare(struct msm_dp *dp)
 
 908 int dp_display_set_plugged_cb(struct msm_dp *dp_display,
 
 909                 hdmi_codec_plugged_cb fn, struct device *codec_dev)
 
 913         dp_display->plugged_cb = fn;
 
 914         dp_display->codec_dev = codec_dev;
 
 915         plugged = dp_display->is_connected;
 
 916         dp_display_handle_plugged_change(dp_display, plugged);
 
 921 int dp_display_validate_mode(struct msm_dp *dp, u32 mode_pclk_khz)
 
 923         const u32 num_components = 3, default_bpp = 24;
 
 924         struct dp_display_private *dp_display;
 
 925         struct dp_link_info *link_info;
 
 926         u32 mode_rate_khz = 0, supported_rate_khz = 0, mode_bpp = 0;
 
 928         if (!dp || !mode_pclk_khz || !dp->connector) {
 
 929                 DRM_ERROR("invalid params\n");
 
 933         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
 934         link_info = &dp_display->panel->link_info;
 
 936         mode_bpp = dp->connector->display_info.bpc * num_components;
 
 938                 mode_bpp = default_bpp;
 
 940         mode_bpp = dp_panel_get_mode_bpp(dp_display->panel,
 
 941                         mode_bpp, mode_pclk_khz);
 
 943         mode_rate_khz = mode_pclk_khz * mode_bpp;
 
 944         supported_rate_khz = link_info->num_lanes * link_info->rate * 8;
 
 946         if (mode_rate_khz > supported_rate_khz)
 
 952 int dp_display_get_modes(struct msm_dp *dp,
 
 953                                 struct dp_display_mode *dp_mode)
 
 955         struct dp_display_private *dp_display;
 
 959                 DRM_ERROR("invalid params\n");
 
 963         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
 965         ret = dp_panel_get_modes(dp_display->panel,
 
 966                 dp->connector, dp_mode);
 
 967         if (dp_mode->drm_mode.clock)
 
 968                 dp->max_pclk_khz = dp_mode->drm_mode.clock;
 
 972 bool dp_display_check_video_test(struct msm_dp *dp)
 
 974         struct dp_display_private *dp_display;
 
 976         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
 978         return dp_display->panel->video_test;
 
 981 int dp_display_get_test_bpp(struct msm_dp *dp)
 
 983         struct dp_display_private *dp_display;
 
 986                 DRM_ERROR("invalid params\n");
 
 990         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
 992         return dp_link_bit_depth_to_bpp(
 
 993                 dp_display->link->test_video.test_bit_depth);
 
 996 void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp)
 
 998         struct dp_display_private *dp_display;
 
 999         struct drm_device *drm;
 
1001         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
1005          * if we are reading registers we need the link clocks to be on
 
1006          * however till DP cable is connected this will not happen as we
 
1007          * do not know the resolution to power up with. Hence check the
 
1008          * power_on status before dumping DP registers to avoid crash due
 
1009          * to unclocked access
 
1011         mutex_lock(&dp_display->event_mutex);
 
1013         if (!dp->power_on) {
 
1014                 mutex_unlock(&dp_display->event_mutex);
 
1018         dp_catalog_snapshot(dp_display->catalog, disp_state);
 
1020         mutex_unlock(&dp_display->event_mutex);
 
1023 static void dp_display_config_hpd(struct dp_display_private *dp)
 
1026         dp_display_host_init(dp, true);
 
1027         dp_catalog_ctrl_hpd_config(dp->catalog);
 
1029         /* Enable interrupt first time
 
1030          * we are leaving dp clocks on during disconnect
 
1031          * and never disable interrupt
 
1033         enable_irq(dp->irq);
 
1036 static int hpd_event_thread(void *data)
 
1038         struct dp_display_private *dp_priv;
 
1040         struct dp_event *todo;
 
1041         int timeout_mode = 0;
 
1043         dp_priv = (struct dp_display_private *)data;
 
1047                         wait_event_timeout(dp_priv->event_q,
 
1048                                 (dp_priv->event_pndx == dp_priv->event_gndx),
 
1051                         wait_event_interruptible(dp_priv->event_q,
 
1052                                 (dp_priv->event_pndx != dp_priv->event_gndx));
 
1054                 spin_lock_irqsave(&dp_priv->event_lock, flag);
 
1055                 todo = &dp_priv->event_list[dp_priv->event_gndx];
 
1057                         struct dp_event *todo_next;
 
1059                         dp_priv->event_gndx++;
 
1060                         dp_priv->event_gndx %= DP_EVENT_Q_MAX;
 
1062                         /* re enter delay event into q */
 
1063                         todo_next = &dp_priv->event_list[dp_priv->event_pndx++];
 
1064                         dp_priv->event_pndx %= DP_EVENT_Q_MAX;
 
1065                         todo_next->event_id = todo->event_id;
 
1066                         todo_next->data = todo->data;
 
1067                         todo_next->delay = todo->delay - 1;
 
1069                         /* clean up older event */
 
1070                         todo->event_id = EV_NO_EVENT;
 
1073                         /* switch to timeout mode */
 
1075                         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
1079                 /* timeout with no events in q */
 
1080                 if (dp_priv->event_pndx == dp_priv->event_gndx) {
 
1081                         spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
1085                 dp_priv->event_gndx++;
 
1086                 dp_priv->event_gndx %= DP_EVENT_Q_MAX;
 
1088                 spin_unlock_irqrestore(&dp_priv->event_lock, flag);
 
1090                 switch (todo->event_id) {
 
1091                 case EV_HPD_INIT_SETUP:
 
1092                         dp_display_config_hpd(dp_priv);
 
1094                 case EV_HPD_PLUG_INT:
 
1095                         dp_hpd_plug_handle(dp_priv, todo->data);
 
1097                 case EV_HPD_UNPLUG_INT:
 
1098                         dp_hpd_unplug_handle(dp_priv, todo->data);
 
1100                 case EV_IRQ_HPD_INT:
 
1101                         dp_irq_hpd_handle(dp_priv, todo->data);
 
1103                 case EV_HPD_REPLUG_INT:
 
1106                 case EV_USER_NOTIFICATION:
 
1107                         dp_display_send_hpd_notification(dp_priv,
 
1110                 case EV_CONNECT_PENDING_TIMEOUT:
 
1111                         dp_connect_pending_timeout(dp_priv,
 
1114                 case EV_DISCONNECT_PENDING_TIMEOUT:
 
1115                         dp_disconnect_pending_timeout(dp_priv,
 
1126 static void dp_hpd_event_setup(struct dp_display_private *dp_priv)
 
1128         init_waitqueue_head(&dp_priv->event_q);
 
1129         spin_lock_init(&dp_priv->event_lock);
 
1131         kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler");
 
1134 static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)
 
1136         struct dp_display_private *dp = dev_id;
 
1137         irqreturn_t ret = IRQ_HANDLED;
 
1141                 DRM_ERROR("invalid data\n");
 
1145         hpd_isr_status = dp_catalog_hpd_get_intr_status(dp->catalog);
 
1147         if (hpd_isr_status & 0x0F) {
 
1148                 /* hpd related interrupts */
 
1149                 if (hpd_isr_status & DP_DP_HPD_PLUG_INT_MASK ||
 
1150                         hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK) {
 
1151                         dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
 
1154                 if (hpd_isr_status & DP_DP_IRQ_HPD_INT_MASK) {
 
1155                         /* stop sentinel connect pending checking */
 
1156                         dp_del_event(dp, EV_CONNECT_PENDING_TIMEOUT);
 
1157                         dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0);
 
1160                 if (hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK)
 
1161                         dp_add_event(dp, EV_HPD_REPLUG_INT, 0, 0);
 
1163                 if (hpd_isr_status & DP_DP_HPD_UNPLUG_INT_MASK)
 
1164                         dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
 
1167         /* DP controller isr */
 
1168         dp_ctrl_isr(dp->ctrl);
 
1171         dp_aux_isr(dp->aux);
 
1176 int dp_display_request_irq(struct msm_dp *dp_display)
 
1179         struct dp_display_private *dp;
 
1182                 DRM_ERROR("invalid input\n");
 
1186         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
1188         dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0);
 
1191                 DRM_ERROR("failed to get irq: %d\n", rc);
 
1195         rc = devm_request_irq(&dp->pdev->dev, dp->irq,
 
1196                         dp_display_irq_handler,
 
1197                         IRQF_TRIGGER_HIGH, "dp_display_isr", dp);
 
1199                 DRM_ERROR("failed to request IRQ%u: %d\n",
 
1203         disable_irq(dp->irq);
 
1208 static int dp_display_probe(struct platform_device *pdev)
 
1211         struct dp_display_private *dp;
 
1213         if (!pdev || !pdev->dev.of_node) {
 
1214                 DRM_ERROR("pdev not found\n");
 
1218         dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL);
 
1223         dp->name = "drm_dp";
 
1225         rc = dp_init_sub_modules(dp);
 
1227                 DRM_ERROR("init sub module failed\n");
 
1228                 return -EPROBE_DEFER;
 
1231         mutex_init(&dp->event_mutex);
 
1232         g_dp_display = &dp->dp_display;
 
1234         /* Store DP audio handle inside DP display */
 
1235         g_dp_display->dp_audio = dp->audio;
 
1237         init_completion(&dp->audio_comp);
 
1239         platform_set_drvdata(pdev, g_dp_display);
 
1241         rc = component_add(&pdev->dev, &dp_display_comp_ops);
 
1243                 DRM_ERROR("component add failed, rc=%d\n", rc);
 
1244                 dp_display_deinit_sub_modules(dp);
 
1250 static int dp_display_remove(struct platform_device *pdev)
 
1252         struct dp_display_private *dp;
 
1254         dp = container_of(g_dp_display,
 
1255                         struct dp_display_private, dp_display);
 
1257         dp_display_deinit_sub_modules(dp);
 
1259         component_del(&pdev->dev, &dp_display_comp_ops);
 
1260         platform_set_drvdata(pdev, NULL);
 
1265 static int dp_pm_resume(struct device *dev)
 
1267         struct platform_device *pdev = to_platform_device(dev);
 
1268         struct msm_dp *dp_display = platform_get_drvdata(pdev);
 
1269         struct dp_display_private *dp;
 
1272         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
1274         mutex_lock(&dp->event_mutex);
 
1276         /* start from disconnected state */
 
1277         dp->hpd_state = ST_DISCONNECTED;
 
1279         /* turn on dp ctrl/phy */
 
1280         dp_display_host_init(dp, true);
 
1282         dp_catalog_ctrl_hpd_config(dp->catalog);
 
1284         status = dp_catalog_link_is_connected(dp->catalog);
 
1287          * can not declared display is connected unless
 
1288          * HDMI cable is plugged in and sink_count of
 
1291         if (status && dp->link->sink_count)
 
1292                 dp->dp_display.is_connected = true;
 
1294                 dp->dp_display.is_connected = false;
 
1296         mutex_unlock(&dp->event_mutex);
 
1301 static int dp_pm_suspend(struct device *dev)
 
1303         struct platform_device *pdev = to_platform_device(dev);
 
1304         struct msm_dp *dp_display = platform_get_drvdata(pdev);
 
1305         struct dp_display_private *dp;
 
1307         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
1309         mutex_lock(&dp->event_mutex);
 
1311         if (dp->core_initialized == true) {
 
1312                 /* mainlink enabled */
 
1313                 if (dp_power_clk_status(dp->power, DP_CTRL_PM))
 
1314                         dp_ctrl_off_link_stream(dp->ctrl);
 
1316                 dp_display_host_deinit(dp);
 
1319         dp->hpd_state = ST_SUSPENDED;
 
1321         /* host_init will be called at pm_resume */
 
1322         dp->core_initialized = false;
 
1324         mutex_unlock(&dp->event_mutex);
 
1329 static int dp_pm_prepare(struct device *dev)
 
1334 static void dp_pm_complete(struct device *dev)
 
1339 static const struct dev_pm_ops dp_pm_ops = {
 
1340         .suspend = dp_pm_suspend,
 
1341         .resume =  dp_pm_resume,
 
1342         .prepare = dp_pm_prepare,
 
1343         .complete = dp_pm_complete,
 
1346 static struct platform_driver dp_display_driver = {
 
1347         .probe  = dp_display_probe,
 
1348         .remove = dp_display_remove,
 
1350                 .name = "msm-dp-display",
 
1351                 .of_match_table = dp_dt_match,
 
1352                 .suppress_bind_attrs = true,
 
1357 int __init msm_dp_register(void)
 
1361         ret = platform_driver_register(&dp_display_driver);
 
1363                 DRM_ERROR("Dp display driver register failed");
 
1368 void __exit msm_dp_unregister(void)
 
1370         platform_driver_unregister(&dp_display_driver);
 
1373 void msm_dp_irq_postinstall(struct msm_dp *dp_display)
 
1375         struct dp_display_private *dp;
 
1380         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
1382         dp_hpd_event_setup(dp);
 
1384         dp_add_event(dp, EV_HPD_INIT_SETUP, 0, 100);
 
1387 void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor)
 
1389         struct dp_display_private *dp;
 
1393         dp = container_of(dp_display, struct dp_display_private, dp_display);
 
1394         dev = &dp->pdev->dev;
 
1396         dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd,
 
1397                                         dp->link, &dp->dp_display.connector,
 
1399         if (IS_ERR(dp->debug)) {
 
1400                 rc = PTR_ERR(dp->debug);
 
1401                 DRM_ERROR("failed to initialize debug, rc = %d\n", rc);
 
1406 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
 
1407                         struct drm_encoder *encoder)
 
1409         struct msm_drm_private *priv;
 
1412         if (WARN_ON(!encoder) || WARN_ON(!dp_display) || WARN_ON(!dev))
 
1415         priv = dev->dev_private;
 
1416         dp_display->drm_dev = dev;
 
1418         ret = dp_display_request_irq(dp_display);
 
1420                 DRM_ERROR("request_irq failed, ret=%d\n", ret);
 
1424         dp_display->encoder = encoder;
 
1426         dp_display->connector = dp_drm_connector_init(dp_display);
 
1427         if (IS_ERR(dp_display->connector)) {
 
1428                 ret = PTR_ERR(dp_display->connector);
 
1429                 DRM_DEV_ERROR(dev->dev,
 
1430                         "failed to create dp connector: %d\n", ret);
 
1431                 dp_display->connector = NULL;
 
1435         priv->connectors[priv->num_connectors++] = dp_display->connector;
 
1439 int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder)
 
1442         struct dp_display_private *dp_display;
 
1445         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
1446         if (!dp_display->dp_mode.drm_mode.clock) {
 
1447                 DRM_ERROR("invalid params\n");
 
1451         mutex_lock(&dp_display->event_mutex);
 
1453         /* stop sentinel checking */
 
1454         dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT);
 
1456         rc = dp_display_set_mode(dp, &dp_display->dp_mode);
 
1458                 DRM_ERROR("Failed to perform a mode set, rc=%d\n", rc);
 
1459                 mutex_unlock(&dp_display->event_mutex);
 
1463         rc = dp_display_prepare(dp);
 
1465                 DRM_ERROR("DP display prepare failed, rc=%d\n", rc);
 
1466                 mutex_unlock(&dp_display->event_mutex);
 
1470         state =  dp_display->hpd_state;
 
1472         if (state == ST_DISPLAY_OFF)
 
1473                 dp_display_host_init(dp_display, true);
 
1475         dp_display_enable(dp_display, 0);
 
1477         rc = dp_display_post_enable(dp);
 
1479                 DRM_ERROR("DP display post enable failed, rc=%d\n", rc);
 
1480                 dp_display_disable(dp_display, 0);
 
1481                 dp_display_unprepare(dp);
 
1484         /* manual kick off plug event to train link */
 
1485         if (state == ST_DISPLAY_OFF)
 
1486                 dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0);
 
1488         /* completed connection */
 
1489         dp_display->hpd_state = ST_CONNECTED;
 
1491         mutex_unlock(&dp_display->event_mutex);
 
1496 int msm_dp_display_pre_disable(struct msm_dp *dp, struct drm_encoder *encoder)
 
1498         struct dp_display_private *dp_display;
 
1500         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
1502         dp_ctrl_push_idle(dp_display->ctrl);
 
1507 int msm_dp_display_disable(struct msm_dp *dp, struct drm_encoder *encoder)
 
1511         struct dp_display_private *dp_display;
 
1513         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
1515         mutex_lock(&dp_display->event_mutex);
 
1517         /* stop sentinel checking */
 
1518         dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT);
 
1520         dp_display_disable(dp_display, 0);
 
1522         rc = dp_display_unprepare(dp);
 
1524                 DRM_ERROR("DP display unprepare failed, rc=%d\n", rc);
 
1526         state =  dp_display->hpd_state;
 
1527         if (state == ST_DISCONNECT_PENDING) {
 
1528                 /* completed disconnection */
 
1529                 dp_display->hpd_state = ST_DISCONNECTED;
 
1531                 dp_display->hpd_state = ST_DISPLAY_OFF;
 
1534         mutex_unlock(&dp_display->event_mutex);
 
1538 void msm_dp_display_mode_set(struct msm_dp *dp, struct drm_encoder *encoder,
 
1539                                 struct drm_display_mode *mode,
 
1540                                 struct drm_display_mode *adjusted_mode)
 
1542         struct dp_display_private *dp_display;
 
1544         dp_display = container_of(dp, struct dp_display_private, dp_display);
 
1546         memset(&dp_display->dp_mode, 0x0, sizeof(struct dp_display_mode));
 
1548         if (dp_display_check_video_test(dp))
 
1549                 dp_display->dp_mode.bpp = dp_display_get_test_bpp(dp);
 
1550         else /* Default num_components per pixel = 3 */
 
1551                 dp_display->dp_mode.bpp = dp->connector->display_info.bpc * 3;
 
1553         if (!dp_display->dp_mode.bpp)
 
1554                 dp_display->dp_mode.bpp = 24; /* Default bpp */
 
1556         drm_mode_copy(&dp_display->dp_mode.drm_mode, adjusted_mode);
 
1558         dp_display->dp_mode.v_active_low =
 
1559                 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NVSYNC);
 
1561         dp_display->dp_mode.h_active_low =
 
1562                 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC);