Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp688630imu; Fri, 16 Nov 2018 08:42:01 -0800 (PST) X-Google-Smtp-Source: AJdET5dj31ek6NtE/g7+OOMphiu7VguR6NF4gxa4zH+RqOfrxMUx6oITpoa+s+gq8+82aw8pWODE X-Received: by 2002:a63:68c4:: with SMTP id d187mr10480898pgc.11.1542386521426; Fri, 16 Nov 2018 08:42:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542386521; cv=none; d=google.com; s=arc-20160816; b=HI0lPIB3IkuZ+5g3XrtgTflDADoKWwODdslZir3M24t9xApldKQmyIwulpIjzPhkdR cVu/WSZzBQaJ8rm58mpcajx6VN8R2Iqv68PSGz9riByP5jddGmsoigMeEWqd82mePIjv FafF5JOihn+NJtl+6Qd5E6WhcoBOsUX6vzv/E/rpWQpXYAqvxtcJd3z6VfSPN8y9fkXZ MKhKTSlSmf1sCHvE4VmaJDbUwIy/LpG+FA27IYzHvHeZZ42fdQd0swIXrL1/AJGJFajx /A2dyl7s0r2dBqqPHL5r9UPYY0HoJyEAL9Y+W2ZBU9ZcObqHOBrAcFsmC3Bgn1A6J/wg k1GQ== 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 :dkim-signature; bh=gDMHNSRr+JX7iJxWUt7jlD3FaFmi6BRpMEbYYc93LBg=; b=XR2DF068VVVx+8+9Ovy3EMi6dTNvXmNnEztNPT9X6qt0IbjRW3ak23Lncj6VDmxZYp OLxps1jTE86BjmXydLVLtFe/UHeQDssfeSRpIDMPEvfR3rrp8cszwTRfer0KpwqePVDf K+YO38zyC27Z/DeEphYxEU1NWhdB2ipFGQMJSMahh7RCMPmSD2zi1m+Pto5g2FnEre58 UGc6aejb6g2Nl+nOixprVTY87IW/o4yFfDaHULz2t7tTrMlAZIEGti3f/fIl2TR0qkdW YVVaFhG1TtzKHPFJZiXbr8WWZlGiPVWPhWjZIJbDORPE45yOEA/9dDthpsSV5F3e3MjQ khYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=gKNQLXv9; 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 o1si30825538pgq.13.2018.11.16.08.41.46; Fri, 16 Nov 2018 08:42:01 -0800 (PST) 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; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=gKNQLXv9; 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 S2390236AbeKQCxf (ORCPT + 99 others); Fri, 16 Nov 2018 21:53:35 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:39047 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728856AbeKQCxf (ORCPT ); Fri, 16 Nov 2018 21:53:35 -0500 Received: by mail-pf1-f194.google.com with SMTP id c72so6970554pfc.6 for ; Fri, 16 Nov 2018 08:40:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gDMHNSRr+JX7iJxWUt7jlD3FaFmi6BRpMEbYYc93LBg=; b=gKNQLXv9QOzQTre+dpI3KreN6ec7+NLtcWJzapCO/+UfiJDU0TalRJgL39d+dTer+X cr7S9rQJuDksVWoBH7srTmZ1dFh1szYFc8gR7g+lVMfkhL1r3U5qMPaWm9DQF6owiGlP CRPrNMpHDCtxP5FAs9wwRApFX19QuWoQd04Rw= 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=gDMHNSRr+JX7iJxWUt7jlD3FaFmi6BRpMEbYYc93LBg=; b=PKSz0HW389Iy9R+obgHrp+Yk0GD6MIHecFVE2fgeqjFJa2nZp1z+DKY1NYVd7XXQBp ohItAqqAh8XoHxB7V6z9XVk5b3RyozRyOHFD7ckN2pjd5YOhCZDw0+cI2YfrKtPppqAo qNuhgugjjGXzXczqjUS7IbmP+NLfyeG6XOPI83hpN6HufZi7l4s2gVtqok/i3divZVXq S63nNPtG26aBrgm+AHH6UlsltnpZmDp4pxxMyMwsCkOgQ4p7UdLglNqw/B6osWSH7niq 1f/YSkkZ10/SDeyKcChjfR8MqXYVDppdwx23NJF1JUuwjDu5IORsVV2ZVKSZrETNDWja +0pw== X-Gm-Message-State: AGRZ1gLngVHW9HoHmhzEs4OxG4+0HxE5YyU/hfhVEeBd9caRSTwG5K9Y ZfI5PEkbMyPFGyVvppq/Z8QyVw== X-Received: by 2002:a63:a35c:: with SMTP id v28mr10516381pgn.205.1542386429771; Fri, 16 Nov 2018 08:40:29 -0800 (PST) Received: from localhost.localdomain ([115.97.190.86]) by smtp.gmail.com with ESMTPSA id p5-v6sm34622213pfb.109.2018.11.16.08.40.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Nov 2018 08:40:29 -0800 (PST) From: Jagan Teki To: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Rob Herring , Chen-Yu Tsai , Icenowy Zheng , Jernej Skrabec , Vasily Khoruzhick , Thierry Reding , Mark Rutland , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Michael Trimarchi , TL Lim , linux-sunxi@googlegroups.com, linux-amarula@amarulasolutions.com Cc: Jagan Teki Subject: [PATCH v2 07/12] drm/sun4i: sun6i_mipi_dsi: Setup burst mode Date: Fri, 16 Nov 2018 22:09:11 +0530 Message-Id: <20181116163916.29621-8-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.18.0.321.gffc6fa0e3 In-Reply-To: <20181116163916.29621-1-jagan@amarulasolutions.com> References: <20181116163916.29621-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Setting up burst mode display would require to compute - Horizontal timing edge values to fill burst drq register - Line, sync values to fill burst line register Since there is no direct documentation for these computations the edge and line formulas are taken from BSP code (from linux-sunxi/ drivers/video/sunxi/disp2/disp/de/lowlevel_sun50iw1/de_dsi.c) line_num = panel->lcd_ht*dsi_pixel_bits[panel->lcd_dsi_format]/ (8*panel->lcd_dsi_lane); edge1 = sync_point+(panel->lcd_x+panel->lcd_hbp+20)* dsi_pixel_bits[panel->lcd_dsi_format] /(8*panel->lcd_dsi_lane); edge1 = (edge1>line_num)?line_num:edge1; edge0 = edge1+(panel->lcd_x+40)*tcon_div/8; edge0 = (edge0>line_num)?(edge0-line_num):1; Signed-off-by: Jagan Teki --- drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 72 ++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c index 66a01061e51d..0182408f8932 100644 --- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c @@ -364,6 +364,41 @@ static void sun6i_dsi_inst_init(struct sun6i_dsi *dsi, SUN6I_DSI_INST_JUMP_CFG_NUM(1)); }; +static u32 sun6i_dsi_get_edge1(struct sun6i_dsi *dsi, + struct drm_display_mode *mode, u32 sync_point) +{ + struct mipi_dsi_device *device = dsi->device; + unsigned int bpp = mipi_dsi_pixel_format_to_bpp(device->format); + u32 hact_sync_bp; + + /* Horizontal timings duration excluding front porch */ + hact_sync_bp = (mode->hdisplay + mode->htotal - mode->hsync_start); + + return (sync_point + ((hact_sync_bp + 20) * bpp / (8 * device->lanes))); +} + +static u32 sun6i_dsi_get_edge0(struct sun6i_dsi *dsi, + struct drm_display_mode *mode, u32 edge1) +{ + struct sun4i_tcon *tcon = dsi->tcon; + unsigned long dclk_rate, dclk_parent_rate, tcon0_div; + + dclk_rate = clk_get_rate(tcon->dclk); + dclk_parent_rate = clk_get_rate(clk_get_parent(tcon->dclk)); + tcon0_div = dclk_parent_rate / dclk_rate; + + return (edge1 + (mode->hdisplay + 40) * tcon0_div / 8); +} + +static u32 sun6i_dsi_get_line_num(struct sun6i_dsi *dsi, + struct drm_display_mode *mode) +{ + struct mipi_dsi_device *device = dsi->device; + unsigned int bpp = mipi_dsi_pixel_format_to_bpp(device->format); + + return (mode->htotal * bpp / (8 * device->lanes)); +} + static int sun6i_dsi_get_drq(struct sun6i_dsi *dsi, struct drm_display_mode *mode) { @@ -499,9 +534,32 @@ static u16 sun6i_dsi_get_video_start_delay(struct sun6i_dsi *dsi, static void sun6i_dsi_setup_burst(struct sun6i_dsi *dsi, struct drm_display_mode *mode) { - regmap_write(dsi->regs, SUN6I_DSI_TCON_DRQ_REG, - SUN6I_DSI_TCON_DRQ_ENABLE_MODE | - SUN6I_DSI_TCON_DRQ_SET(sun6i_dsi_get_drq(dsi, mode))); + struct mipi_dsi_device *device = dsi->device; + u32 sync_point = 40; + u32 line_num = sun6i_dsi_get_line_num(dsi, mode); + u32 edge1 = sun6i_dsi_get_edge1(dsi, mode, sync_point); + u32 edge0 = sun6i_dsi_get_edge0(dsi, mode, edge1); + u32 val; + + if (edge1 > line_num) + edge1 = line_num; + + if (edge0 > line_num) + edge0 -= line_num; + else + edge0 = 1; + + regmap_write(dsi->regs, SUN6I_DSI_BURST_DRQ_REG, + SUN6I_DSI_BURST_DRQ_EDGE1(edge1) | + SUN6I_DSI_BURST_DRQ_EDGE0(edge0)); + regmap_write(dsi->regs, SUN6I_DSI_BURST_LINE_REG, + SUN6I_DSI_BURST_LINE_NUM(line_num) | + SUN6I_DSI_BURST_LINE_SYNC_POINT(sync_point)); + + /* enable burst mode */ + regmap_read(dsi->regs, SUN6I_DSI_BASIC_CTL_REG, &val); + val |= SUN6I_DSI_BASIC_CTL_VIDEO_BURST; + regmap_write(dsi->regs, SUN6I_DSI_BASIC_CTL_REG, val); } static void sun6i_dsi_setup_inst_loop(struct sun6i_dsi *dsi, @@ -726,7 +784,13 @@ static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder) SUN6I_DSI_BASIC_CTL1_VIDEO_PRECISION | SUN6I_DSI_BASIC_CTL1_VIDEO_MODE); - sun6i_dsi_setup_burst(dsi, mode); + regmap_write(dsi->regs, SUN6I_DSI_TCON_DRQ_REG, + SUN6I_DSI_TCON_DRQ_ENABLE_MODE | + SUN6I_DSI_TCON_DRQ_SET(sun6i_dsi_get_drq(dsi, mode))); + + if (device->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) + sun6i_dsi_setup_burst(dsi, mode); + sun6i_dsi_setup_inst_loop(dsi, mode); sun6i_dsi_setup_format(dsi, mode); sun6i_dsi_setup_timings(dsi, mode); -- 2.18.0.321.gffc6fa0e3