Received: by 10.223.164.221 with SMTP id h29csp1320018wrb; Tue, 24 Oct 2017 20:52:21 -0700 (PDT) X-Google-Smtp-Source: ABhQp+RPFzzYYfQmsqcZC2cRwwpJfdJi+v4X5+Eu9F+5j4E6vyMTKcqQ7y0Z4wd7ZRMDQjsBCfik X-Received: by 10.98.214.17 with SMTP id r17mr876334pfg.246.1508903541503; Tue, 24 Oct 2017 20:52:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508903541; cv=none; d=google.com; s=arc-20160816; b=QzbqDE/CzbXey6GwPbNy3rIvqSymyg5JJXRML1wdE7bQStG2gVUzwFS0RxFSKOe1Xw njh80ffnSY8OXQUewY9NcsL/p8oL5gIrYmH6nbKhr2AKUyJaAMzRW5sIiHjwc0wJAWt4 z7s+Ib55eZ0CjhRb2we/VhMuj1OL192gN+X57IH7/U4hgv/0mg5aFxA6HeH4d3Qo9tVG djoS4FM5n4GmQffX4VxdtzgyWzLZlr6+e8mcRAhnHbn8+2xm03EmslvWtScLwCr7pvSl AFIbBza+jkjsu/vVGmc3NpIt+c8E6n8W1laxQr4ESWmkp5fw3WSwtruz1lvacWOzn+qR dM3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=IpKYnVDhn3evfs+0i0mwqyyfqloPGLKVxpnMVypfk/Y=; b=abIRqXdkksiXAO/DbAqfZ5mF8x/P7DFXWq9CUu+srqESa2xa6OBT7idEk3ZFIufTqn 70CDiX34XCHO/e3SwHCoUy59s7+Gyg2Fb3ZYsh6BlLs8NiuWXjWjPcB2n/wwmI+GY68x 6g4QID/83GxKpomFBo6tpn9X/9G+6ydPCdo//vN4Ypp4BW+30qLvucvPFZLwaoVhYMAW wOiberYwx+mGSefM19Ur2rGtoYQocqbiLblwTYk4o1SMQYqSIkpi1zUaf56nBfDZCmam /CXkxz5xgTYpJKsNJCgsrERDzzWPFlVP+GpB2b9Q2pxmNE6xKBdUOnawYBw0OgXtzv7b 8pDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 37si88656plq.813.2017.10.24.20.52.07; Tue, 24 Oct 2017 20:52:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752026AbdJYDva (ORCPT + 99 others); Tue, 24 Oct 2017 23:51:30 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:47726 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751883AbdJYDvZ (ORCPT ); Tue, 24 Oct 2017 23:51:25 -0400 Received: by mail-pf0-f193.google.com with SMTP id z11so21234310pfk.4 for ; Tue, 24 Oct 2017 20:51:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IpKYnVDhn3evfs+0i0mwqyyfqloPGLKVxpnMVypfk/Y=; b=ovugDiHyPIg1Oz/mJ7T/sbHqgt7BTIfR26CtBXW7b50phd1SlCvpILfdZtqjtdG2PD u8Iu2IO7PIiBRVigGS4L8+jaJ/eVJDS5hRH2fll+h5kH0T+2lBjI7jbgNVvXDjNfL5dM K/Zqwhy4K4EWmAXc4s8/e134nzDmdMFxfQRYnn/pp0zJ8bMt+e8OCKX+OtNcfb9rlVqc 9GdF3tjjjcHBMbPOj+Ov7DPKd7wpyijS4gHNoeDiTEaUBqykrSIjtWR9B6c+aXgb2LVe iG5UmXhVoTmLddtQtK/fYq3K90vJUULjfP94IFXHS9zAVEK9DvpyldhH40xQg8WzL5aS Vwzw== X-Gm-Message-State: AMCzsaVX0yCQwttOy+qZnJGf/FMZCsqpNNc5ZcZS8uDIVqGqEVM2SuZa hpCjbnpVVmo7KMLYfqJOzcA= X-Received: by 10.99.116.25 with SMTP id p25mr776011pgc.26.1508903485070; Tue, 24 Oct 2017 20:51:25 -0700 (PDT) Received: from localhost.localdomain ([103.29.142.67]) by smtp.gmail.com with ESMTPSA id q2sm2063254pgp.81.2017.10.24.20.51.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 24 Oct 2017 20:51:24 -0700 (PDT) From: Nickey Yang To: mark.yao@rock-chips.com, robh+dt@kernel.org, heiko@sntech.de, mark.rutland@arm.com, airlied@linux.ie Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, seanpaul@chromium.org, briannorris@chromium.org, hl@rock-chips.com, zyw@rock-chips.comg, xbl@rock-chips.com, nickey.yang@rock-chips.com Subject: [PATCH v3 3/6] drm/rockchip/dsi: correct Feedback divider setting Date: Wed, 25 Oct 2017 11:51:00 +0800 Message-Id: <1508903463-7254-3-git-send-email-nickey.yang@rock-chips.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1508903463-7254-1-git-send-email-nickey.yang@rock-chips.com> References: <1508903463-7254-1-git-send-email-nickey.yang@rock-chips.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch correct Feedback divider setting: 1、Set Feedback divider [8:5] when HIGH_PROGRAM_EN 2、Due to the use of a "by 2 pre-scaler," the range of the feedback multiplication Feedback divider is limited to even division numbers, and Feedback divider must be greater than 12, less than 1000. 3、Make the previously configured Feedback divider(LSB) factors effective Signed-off-by: Nickey Yang --- drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 93 ++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index 09e7bfe..589b420 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -239,7 +239,7 @@ #define LOW_PROGRAM_EN 0 #define HIGH_PROGRAM_EN BIT(7) #define LOOP_DIV_LOW_SEL(val) (((val) - 1) & 0x1f) -#define LOOP_DIV_HIGH_SEL(val) ((((val) - 1) >> 5) & 0x1f) +#define LOOP_DIV_HIGH_SEL(val) ((((val) - 1) >> 5) & 0xf) #define PLL_LOOP_DIV_EN BIT(5) #define PLL_INPUT_DIV_EN BIT(4) @@ -531,6 +531,14 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO, LOOP_DIV_LOW_SEL(dsi->feedback_div) | LOW_PROGRAM_EN); + /* + * we need set PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL immediately + * to make the configrued LSB effective according to IP simulation + * and lab test results. + * Only in this way can we get correct mipi phy pll frequency. + */ + dw_mipi_dsi_phy_write(dsi, PLL_INPUT_AND_LOOP_DIVIDER_RATIOS_CONTROL, + PLL_LOOP_DIV_EN | PLL_INPUT_DIV_EN); dw_mipi_dsi_phy_write(dsi, PLL_LOOP_DIVIDER_RATIO, LOOP_DIV_HIGH_SEL(dsi->feedback_div) | HIGH_PROGRAM_EN); @@ -604,11 +612,16 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) static int dw_mipi_dsi_get_lane_bps(struct dw_mipi_dsi *dsi, struct drm_display_mode *mode) { - unsigned int i, pre; - unsigned long mpclk, pllref, tmp; - unsigned int m = 1, n = 1, target_mbps = 1000; + unsigned long mpclk, tmp; + unsigned int target_mbps = 1000; unsigned int max_mbps = dppa_map[ARRAY_SIZE(dppa_map) - 1].max_mbps; int bpp; + unsigned long best_freq = 0; + unsigned long fvco_min, fvco_max, fin, fout; + unsigned int min_prediv, max_prediv; + unsigned int _prediv, uninitialized_var(best_prediv); + unsigned long _fbdiv, uninitialized_var(best_fbdiv); + unsigned long min_delta = ULONG_MAX; bpp = mipi_dsi_pixel_format_to_bpp(dsi->format); if (bpp < 0) { @@ -629,35 +642,53 @@ static int dw_mipi_dsi_get_lane_bps(struct dw_mipi_dsi *dsi, "DPHY clock frequency is out of range\n"); } - pllref = DIV_ROUND_UP(clk_get_rate(dsi->pllref_clk), USEC_PER_SEC); - tmp = pllref; - - /* - * The limits on the PLL divisor are: - * - * 5MHz <= (pllref / n) <= 40MHz - * - * we walk over these values in descreasing order so that if we hit - * an exact match for target_mbps it is more likely that "m" will be - * even. - * - * TODO: ensure that "m" is even after this loop. - */ - for (i = pllref / 5; i > (pllref / 40); i--) { - pre = pllref / i; - if ((tmp > (target_mbps % pre)) && (target_mbps / pre < 512)) { - tmp = target_mbps % pre; - n = i; - m = target_mbps / pre; + fin = clk_get_rate(dsi->pllref_clk); + fout = target_mbps * USEC_PER_SEC; + + /* constraint: 5Mhz <= Fref / N <= 40MHz */ + min_prediv = DIV_ROUND_UP(fin, 40 * USEC_PER_SEC); + max_prediv = fin / (5 * USEC_PER_SEC); + + /* constraint: 80MHz <= Fvco <= 1500Mhz */ + fvco_min = 80 * USEC_PER_SEC; + fvco_max = 1500 * USEC_PER_SEC; + + for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) { + u64 tmp; + u32 delta; + /* Fvco = Fref * M / N */ + tmp = (u64)fout * _prediv; + do_div(tmp, fin); + _fbdiv = tmp; + /* + * Due to the use of a "by 2 pre-scaler," the range of the + * feedback multiplication value M is limited to even division + * numbers, and m must be greater than 12, less than 1000. + */ + if (_fbdiv <= 12 || _fbdiv >= 1000) + continue; + + _fbdiv += _fbdiv % 2; + + tmp = (u64)_fbdiv * fin; + do_div(tmp, _prediv); + if (tmp < fvco_min || tmp > fvco_max) + continue; + + delta = abs(fout - tmp); + if (delta < min_delta) { + best_prediv = _prediv; + best_fbdiv = _fbdiv; + min_delta = delta; + best_freq = tmp; } - if (tmp == 0) - break; } - - dsi->lane_mbps = pllref / n * m; - dsi->input_div = n; - dsi->feedback_div = m; - + if (best_freq) { + dsi->lane_mbps = DIV_ROUND_UP(best_freq, USEC_PER_SEC); + dsi->input_div = best_prediv; + dsi->feedback_div = best_fbdiv; + } else + DRM_DEV_ERROR(dsi->dev, "Can not find best_freq for DPHY\n"); return 0; } -- 1.9.1 From 1584506852627721616@xxx Sun Nov 19 14:58:09 +0000 2017 X-GM-THRID: 1584506852627721616 X-Gmail-Labels: Inbox,Category Promotions,HistoricalUnread