Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2828760pxv; Mon, 12 Jul 2021 02:58:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzUgFVl5b4pICSDLvfB7GPK9lsz3hkJ1SvQgHqkqe2xqJz1HcJ3Cmqj5b8VXXYD15AXUn9k X-Received: by 2002:a05:6e02:1c2c:: with SMTP id m12mr34729479ilh.95.1626083921671; Mon, 12 Jul 2021 02:58:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626083921; cv=none; d=google.com; s=arc-20160816; b=vSqrWqUbyi08WZ7FFSMbQHlGlcoIjPRbHrJ4R7WddnmUWzeGDoE5Q5aoNT8xzH5Oye 2VXxaE1MMXFNtFSzD0PSUbM1IJJWzyGdJJ/DUz+m/w1vjjNnAdCVgQCDOg/eVxevouBr gsveA++1ikx4ngMGg7+thwclnSqs6miToGc0oidZFmgLWQUIYhsVDYw0slHVXIvnGRTy W1FHGkCiLdzODqvJOvlwIkf6Rd2FILkxk7sf01+NCpxxHzIE43vcOO8NEjyiq8hprzt+ ACyGgS2qjkvb9vxwa2OJsiGoMCRx/KptHPqdKPl+qLFLKNeRRABQuu6jZdQC4JnyyB7h 8m/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=r/7dtE7pOIdH+s52LNG4a8jboyYZQq+oj1yodZ+sZg4=; b=zI1Ym7IcxLSRTsqaSMXqqL1vZr7ygm8rITFoP+SLO0wRh76kyZnqZ60wpTnDZDq+kd zZjK3wnb0F+4EN4Wmg4McbcKBRExkdd1iC5WaHfIQ69zSB7UtmERVLbdqJtictlZ9DKv rDCC7NT4G1hdd0VPJKIlYx1TzcqSe54QB475oqX+xNoxzWhU84f9kdrgGJMhgdKIZ8MD Dyj4HEzGVWPhm+pmiVgY+5FKRGnm/gRzAEnCzniGTQUAxT8ot28woKw3skSL4Pi/TpET oPju3TNB8m4qvOKan5tALQ4l2mR8viMZeYigrv8zl9ssp+xfCCmVR7NazQQe9nOy391C KUtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=f+EMXGa6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f16si18603827ilc.93.2021.07.12.02.58.29; Mon, 12 Jul 2021 02:58:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=f+EMXGa6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242538AbhGLHBf (ORCPT + 99 others); Mon, 12 Jul 2021 03:01:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:41908 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234675AbhGLGox (ORCPT ); Mon, 12 Jul 2021 02:44:53 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 18D5E610FB; Mon, 12 Jul 2021 06:41:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626072076; bh=GmWuleWmnEVdyDSjHE84Yt1EExSaQa76bBs9DFd1Ki8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f+EMXGa6dQZLLib8epcXFS9rXgs+idsMwQCU7ubMBILrvrSXY5tQ8dKGiQ9ua3hli 9HAdct1IMU+Lq2dv8q6yuY8bkgxB3hyE13BIUiLrQnqOarzwspzZcRk6B0voQBOIFw KqnXROfPo6iEpS8L+pMM5bhsmZS6+jllZLEeKDao= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Luca Ceresoli , Adam Ford , Stephen Boyd , Sasha Levin Subject: [PATCH 5.10 337/593] clk: vc5: fix output disabling when enabling a FOD Date: Mon, 12 Jul 2021 08:08:17 +0200 Message-Id: <20210712060923.029839423@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060843.180606720@linuxfoundation.org> References: <20210712060843.180606720@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Luca Ceresoli [ Upstream commit fc336ae622df0ec114dbe5551a4d2760c535ecd0 ] On 5P49V6965, when an output is enabled we enable the corresponding FOD. When this happens for the first time, and specifically when writing register VC5_OUT_DIV_CONTROL in vc5_clk_out_prepare(), all other outputs are stopped for a short time and then restarted. According to Renesas support this is intended: "The reason for that is VC6E has synced up all output function". This behaviour can be disabled at least on VersaClock 6E devices, of which only the 5P49V6965 is currently implemented by this driver. This requires writing bit 7 (bypass_sync{1..4}) in register 0x20..0x50. Those registers are named "Unused Factory Reserved Register", and the bits are documented as "Skip VDDO verification", which does not clearly explain the relation to FOD sync. However according to Renesas support as well as my testing setting this bit does prevent disabling of all clock outputs when enabling a FOD. See "VersaClock ® 6E Family Register Descriptions and Programming Guide" (August 30, 2018), Table 116 "Power Up VDD check", page 58: https://www.renesas.com/us/en/document/mau/versaclock-6e-family-register-descriptions-and-programming-guide Signed-off-by: Luca Ceresoli Reviewed-by: Adam Ford Link: https://lore.kernel.org/r/20210527211647.1520720-1-luca@lucaceresoli.net Fixes: 2bda748e6ad8 ("clk: vc5: Add support for IDT VersaClock 5P49V6965") Signed-off-by: Stephen Boyd Signed-off-by: Sasha Levin --- drivers/clk/clk-versaclock5.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/clk/clk-versaclock5.c b/drivers/clk/clk-versaclock5.c index 43db67337bc0..4e741f94baf0 100644 --- a/drivers/clk/clk-versaclock5.c +++ b/drivers/clk/clk-versaclock5.c @@ -69,7 +69,10 @@ #define VC5_FEEDBACK_FRAC_DIV(n) (0x19 + (n)) #define VC5_RC_CONTROL0 0x1e #define VC5_RC_CONTROL1 0x1f -/* Register 0x20 is factory reserved */ + +/* These registers are named "Unused Factory Reserved Registers" */ +#define VC5_RESERVED_X0(idx) (0x20 + ((idx) * 0x10)) +#define VC5_RESERVED_X0_BYPASS_SYNC BIT(7) /* bypass_sync bit */ /* Output divider control for divider 1,2,3,4 */ #define VC5_OUT_DIV_CONTROL(idx) (0x21 + ((idx) * 0x10)) @@ -87,7 +90,6 @@ #define VC5_OUT_DIV_SKEW_INT(idx, n) (0x2b + ((idx) * 0x10) + (n)) #define VC5_OUT_DIV_INT(idx, n) (0x2d + ((idx) * 0x10) + (n)) #define VC5_OUT_DIV_SKEW_FRAC(idx) (0x2f + ((idx) * 0x10)) -/* Registers 0x30, 0x40, 0x50 are factory reserved */ /* Clock control register for clock 1,2 */ #define VC5_CLK_OUTPUT_CFG(idx, n) (0x60 + ((idx) * 0x2) + (n)) @@ -140,6 +142,8 @@ #define VC5_HAS_INTERNAL_XTAL BIT(0) /* chip has PFD requency doubler */ #define VC5_HAS_PFD_FREQ_DBL BIT(1) +/* chip has bits to disable FOD sync */ +#define VC5_HAS_BYPASS_SYNC_BIT BIT(2) /* Supported IDT VC5 models. */ enum vc5_model { @@ -581,6 +585,23 @@ static int vc5_clk_out_prepare(struct clk_hw *hw) unsigned int src; int ret; + /* + * When enabling a FOD, all currently enabled FODs are briefly + * stopped in order to synchronize all of them. This causes a clock + * disruption to any unrelated chips that might be already using + * other clock outputs. Bypass the sync feature to avoid the issue, + * which is possible on the VersaClock 6E family via reserved + * registers. + */ + if (vc5->chip_info->flags & VC5_HAS_BYPASS_SYNC_BIT) { + ret = regmap_update_bits(vc5->regmap, + VC5_RESERVED_X0(hwdata->num), + VC5_RESERVED_X0_BYPASS_SYNC, + VC5_RESERVED_X0_BYPASS_SYNC); + if (ret) + return ret; + } + /* * If the input mux is disabled, enable it first and * select source from matching FOD. @@ -1102,7 +1123,7 @@ static const struct vc5_chip_info idt_5p49v6965_info = { .model = IDT_VC6_5P49V6965, .clk_fod_cnt = 4, .clk_out_cnt = 5, - .flags = 0, + .flags = VC5_HAS_BYPASS_SYNC_BIT, }; static const struct i2c_device_id vc5_id[] = { -- 2.30.2