static int edp_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) { struct edp_connector *edp_connector = to_edp_connector(connector); struct msm_edp *edp = edp_connector->edp; struct msm_drm_private *priv = connector->dev->dev_private; struct msm_kms *kms = priv->kms; long actual, requested; requested = 1000 * mode->clock; actual = kms->funcs->round_pixclk(kms, requested, edp_connector->edp->encoder); DBG("requested=%ld, actual=%ld", requested, actual); if (actual != requested) return MODE_CLOCK_RANGE; if (!msm_edp_ctrl_pixel_clock_valid( edp->ctrl, mode->clock, NULL, NULL)) return MODE_CLOCK_RANGE; /* Invalidate all modes if color format is not supported */ if (connector->display_info.bpc > 8) return MODE_BAD; return MODE_OK; }
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); } }