OSDN Git Service

mdss: display-port: add mutex logic and configure data lanes
authorChandan Uddaraju <chandanu@codeaurora.org>
Fri, 15 Jul 2016 19:56:16 +0000 (12:56 -0700)
committerGerrit - the friendly Code Review server <code-review@localhost>
Fri, 29 Jul 2016 07:17:15 +0000 (00:17 -0700)
Add locking mechanism for host init. Remove mainlink_reset
before configuring the link rates.

Depending on the USB plug orientation, configure the
lane mapping register to support display-port over
usb-type-c port.

Change-Id: I7bf3fc6e102df113611b9450c92ecd4e50b26fb4
Signed-off-by: Chandan Uddaraju <chandanu@codeaurora.org>
drivers/video/fbdev/msm/mdss_dp.c
drivers/video/fbdev/msm/mdss_dp.h
drivers/video/fbdev/msm/mdss_dp_util.c
drivers/video/fbdev/msm/mdss_dp_util.h

index a8a0d4e..a99ae97 100644 (file)
@@ -878,6 +878,8 @@ int mdss_dp_on(struct mdss_panel_data *pdata)
 {
        struct mdss_dp_drv_pdata *dp_drv = NULL;
        int ret = 0;
+       enum plug_orientation orientation = ORIENTATION_NONE;
+       struct lane_mapping ln_map;
 
        if (!pdata) {
                pr_err("Invalid input data\n");
@@ -887,7 +889,15 @@ int mdss_dp_on(struct mdss_panel_data *pdata)
        dp_drv = container_of(pdata, struct mdss_dp_drv_pdata,
                        panel_data);
 
-       pr_debug("++ cont_splash=%d\n", dp_drv->cont_splash);
+       /* wait until link training is completed */
+       mutex_lock(&dp_drv->host_mutex);
+
+       pr_debug("Enter++ cont_splash=%d\n", dp_drv->cont_splash);
+       /* Default lane mapping */
+       ln_map.lane0 = 2;
+       ln_map.lane1 = 3;
+       ln_map.lane2 = 1;
+       ln_map.lane3 = 0;
 
        if (!dp_drv->cont_splash) { /* vote for clocks */
                ret = mdss_dp_clk_ctrl(dp_drv, DP_CORE_PM, true);
@@ -897,10 +907,27 @@ int mdss_dp_on(struct mdss_panel_data *pdata)
                }
                mdss_dp_phy_reset(&dp_drv->ctrl_io);
                mdss_dp_aux_reset(&dp_drv->ctrl_io);
-               mdss_dp_mainlink_reset(&dp_drv->ctrl_io);
                mdss_dp_aux_ctrl(&dp_drv->ctrl_io, true);
                mdss_dp_hpd_configure(&dp_drv->ctrl_io, true);
 
+               orientation = usbpd_get_plug_orientation(dp_drv->pd);
+               pr_debug("plug Orientation = %d\n", orientation);
+
+               if (orientation == ORIENTATION_CC2) {
+                       /* update lane mapping */
+                       ln_map.lane0 = 1;
+                       ln_map.lane1 = 0;
+                       ln_map.lane2 = 2;
+                       ln_map.lane3 = 3;
+
+                       if (gpio_is_valid(dp_drv->usbplug_cc_gpio)) {
+                               gpio_set_value(
+                                       dp_drv->usbplug_cc_gpio, 1);
+                               pr_debug("Configured cc gpio for new Orientation\n");
+                       }
+
+               }
+
                mdss_dp_phy_aux_setup(&dp_drv->phy_io);
 
                mdss_dp_irq_enable(dp_drv);
@@ -935,6 +962,7 @@ int mdss_dp_on(struct mdss_panel_data *pdata)
 
                mdss_dp_mainlink_reset(&dp_drv->ctrl_io);
 
+               mdss_dp_ctrl_lane_mapping(&dp_drv->ctrl_io, ln_map);
                reinit_completion(&dp_drv->idle_comp);
                mdss_dp_fill_link_cfg(dp_drv);
                mdss_dp_mainlink_ctrl(&dp_drv->ctrl_io, true);
@@ -956,7 +984,9 @@ int mdss_dp_on(struct mdss_panel_data *pdata)
        if (mdss_dp_mainlink_ready(dp_drv, BIT(0)))
                pr_debug("mainlink ready\n");
 
+       mutex_unlock(&dp_drv->host_mutex);
        pr_debug("End-\n");
+
        return ret;
 }
 
@@ -1533,6 +1563,7 @@ static int mdss_dp_probe(struct platform_device *pdev)
        dp_drv->mask1 = EDP_INTR_MASK1;
        dp_drv->mask2 = EDP_INTR_MASK2;
        mutex_init(&dp_drv->emutex);
+       mutex_init(&dp_drv->host_mutex);
        mutex_init(&dp_drv->pd_msg_mutex);
        spin_lock_init(&dp_drv->lock);
 
index 335047f..008e7d6 100644 (file)
@@ -400,6 +400,7 @@ struct mdss_dp_drv_pdata {
        struct completion video_comp;
        struct mutex aux_mutex;
        struct mutex train_mutex;
+       struct mutex host_mutex;
        struct mutex pd_msg_mutex;
        bool cable_connected;
        u32 aux_cmd_busy;
index 323a281..18f5a35 100644 (file)
@@ -219,9 +219,10 @@ void mdss_dp_ctrl_lane_mapping(struct dss_io_data *ctrl_io,
 {
        u8 bits_per_lane = 2;
        u32 lane_map = ((l_map.lane0 << (bits_per_lane * 0))
-                           || (l_map.lane1 << (bits_per_lane * 1))
-                           || (l_map.lane2 << (bits_per_lane * 2))
-                           || (l_map.lane3 << (bits_per_lane * 3)));
+                           | (l_map.lane1 << (bits_per_lane * 1))
+                           | (l_map.lane2 << (bits_per_lane * 2))
+                           | (l_map.lane3 << (bits_per_lane * 3)));
+       pr_debug("%s: lane mapping reg = 0x%x\n", __func__, lane_map);
        writel_relaxed(lane_map,
                ctrl_io->base + DP_LOGICAL2PHYSCIAL_LANE_MAPPING);
 }
index 5d5fca2..ec835c6 100644 (file)
@@ -117,5 +117,7 @@ void mdss_dp_sw_mvid_nvid(struct dss_io_data *ctrl_io);
 void mdss_dp_usbpd_ext_capabilities(struct usbpd_dp_capabilities *dp_cap);
 void mdss_dp_usbpd_ext_dp_status(struct usbpd_dp_status *dp_status);
 u32 mdss_dp_usbpd_gen_config_pkt(struct mdss_dp_drv_pdata *dp);
+void mdss_dp_ctrl_lane_mapping(struct dss_io_data *ctrl_io,
+                                       struct lane_mapping l_map);
 
 #endif /* __DP_UTIL_H__ */