static void edp_ctrl_link_enable(struct edp_ctrl *ctrl, int enable) { u32 m, n; if (enable) { /* Enable link channel clocks */ edp_clk_enable(ctrl, EDP_CLK_MASK_LINK_CHAN); msm_edp_phy_lane_power_ctrl(ctrl->phy, true, ctrl->lane_cnt); msm_edp_phy_vm_pe_init(ctrl->phy); /* Make sure phy is programed */ wmb(); msm_edp_phy_ready(ctrl->phy); edp_config_ctrl(ctrl); msm_edp_ctrl_pixel_clock_valid(ctrl, ctrl->pixel_rate, &m, &n); edp_sw_mvid_nvid(ctrl, m, n); edp_mainlink_ctrl(ctrl, 1); } else { edp_mainlink_ctrl(ctrl, 0); msm_edp_phy_lane_power_ctrl(ctrl->phy, false, 0); edp_clk_disable(ctrl, EDP_CLK_MASK_LINK_CHAN); } }
int target_edp_panel_clock(uint8_t enable, struct msm_panel_info *pinfo) { uint32_t ret; dprintf(SPEW, "%s: target_panel_clock\n", __func__); if (enable) { mdp_gdsc_ctrl(enable); mmss_bus_clock_enable(); mdp_clock_enable(); ret = restore_secure_cfg(SECURE_DEVICE_MDSS); if (ret) { dprintf(CRITICAL, "%s: Failed to restore MDP security configs", __func__); mdp_clock_disable(); mmss_bus_clock_disable(); mdp_gdsc_ctrl(0); return ret; } edp_clk_enable(); } else if(!target_cont_splash_screen()) { /* Disable clocks if continuous splash off */ edp_clk_disable(); mdp_clock_disable(); mmss_bus_clock_disable(); mdp_gdsc_ctrl(enable); } return NO_ERROR; }
int msm_edp_ctrl_timing_cfg(struct edp_ctrl *ctrl, const struct drm_display_mode *mode, const struct drm_display_info *info) { u32 hstart_from_sync, vstart_from_sync; u32 data; int ret = 0; mutex_lock(&ctrl->dev_mutex); /* * Need to keep color depth, pixel rate and * interlaced information in ctrl context */ ctrl->color_depth = info->bpc; ctrl->pixel_rate = mode->clock; ctrl->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); /* Fill initial link config based on passed in timing */ edp_fill_link_cfg(ctrl); if (edp_clk_enable(ctrl, EDP_CLK_MASK_AHB)) { pr_err("%s, fail to prepare enable ahb clk\n", __func__); ret = -EINVAL; goto unlock_ret; } edp_clock_synchrous(ctrl, 1); /* Configure eDP timing to HW */ edp_write(ctrl->base + REG_EDP_TOTAL_HOR_VER, EDP_TOTAL_HOR_VER_HORIZ(mode->htotal) | EDP_TOTAL_HOR_VER_VERT(mode->vtotal)); vstart_from_sync = mode->vtotal - mode->vsync_start; hstart_from_sync = mode->htotal - mode->hsync_start; edp_write(ctrl->base + REG_EDP_START_HOR_VER_FROM_SYNC, EDP_START_HOR_VER_FROM_SYNC_HORIZ(hstart_from_sync) | EDP_START_HOR_VER_FROM_SYNC_VERT(vstart_from_sync)); data = EDP_HSYNC_VSYNC_WIDTH_POLARITY_VERT( mode->vsync_end - mode->vsync_start); data |= EDP_HSYNC_VSYNC_WIDTH_POLARITY_HORIZ( mode->hsync_end - mode->hsync_start); if (mode->flags & DRM_MODE_FLAG_NVSYNC) data |= EDP_HSYNC_VSYNC_WIDTH_POLARITY_NVSYNC; if (mode->flags & DRM_MODE_FLAG_NHSYNC) data |= EDP_HSYNC_VSYNC_WIDTH_POLARITY_NHSYNC; edp_write(ctrl->base + REG_EDP_HSYNC_VSYNC_WIDTH_POLARITY, data); edp_write(ctrl->base + REG_EDP_ACTIVE_HOR_VER, EDP_ACTIVE_HOR_VER_HORIZ(mode->hdisplay) | EDP_ACTIVE_HOR_VER_VERT(mode->vdisplay)); edp_clk_disable(ctrl, EDP_CLK_MASK_AHB); unlock_ret: mutex_unlock(&ctrl->dev_mutex); return ret; }
static int msm8974_mdss_edp_panel_clock(int enable) { if (enable) { mdp_gdsc_ctrl(enable); mdp_clock_init(); edp_clk_enable(); } else if (!target_cont_splash_screen()) { /* Add here for continuous splash */ edp_clk_disable(); mdp_clock_disable(); mdp_gdsc_ctrl(enable); } return 0; }
static void edp_ctrl_phy_aux_enable(struct edp_ctrl *ctrl, int enable) { if (enable) { edp_regulator_enable(ctrl); edp_clk_enable(ctrl, EDP_CLK_MASK_AUX_CHAN); msm_edp_phy_ctrl(ctrl->phy, 1); msm_edp_aux_ctrl(ctrl->aux, 1); gpiod_set_value(ctrl->panel_en_gpio, 1); } else { gpiod_set_value(ctrl->panel_en_gpio, 0); msm_edp_aux_ctrl(ctrl->aux, 0); msm_edp_phy_ctrl(ctrl->phy, 0); edp_clk_disable(ctrl, EDP_CLK_MASK_AUX_CHAN); edp_regulator_disable(ctrl); } }