Received: by 2002:a05:6a10:2785:0:0:0:0 with SMTP id ia5csp3204830pxb; Tue, 12 Jan 2021 08:48:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJxOvcfCMWbpGhJExD3kC9OC6GQiIKWM3GoZbBVCLEcUnM12f28F7NXOeALIvUT1Y/4Sitiy X-Received: by 2002:aa7:c652:: with SMTP id z18mr62174edr.60.1610470113919; Tue, 12 Jan 2021 08:48:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610470113; cv=none; d=google.com; s=arc-20160816; b=vTlOoUUCzvUnAs1m77EVipWL2mB9paYhBWdl4Tz12Fgskh7PdzBTYoGA9R1SSyAlfD XSoeN+i4bff+OB71tCMj4FxbhN5NRzPf3fUVVdAE+juvnsbXDCk0hYgtXNgqGM/oumbm Bo4sNagC3lTBZwP4buyC8f6y+vGiW7sKdOWaFdBki+uYBysPYIA10vcnu2StG07sG4py 3khyerQK/NW4z5JT7IRX8GrMJgcRJJwW6Zm2EaC6z7d0VxQlYW9I9nqzZYpZVcQmMKne arFeu6Kis3/Prqq6DSPFw8H/FhLuALSZ899USUwRuTWJn3sPaZY/vsjBFJQI9JVykcuK SFng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=GNV1RUFoiz+/s6jQrsk5uQ3qcCkB+j5RZ7DyRJ4fjyc=; b=HyXlkIzxvdY2z95+N2D1ZpyIc3Tn9BgtVHfvzSYpcMpHRy6E0hUhSSByHQgZ7w+SSR 1bZH+kN6wXyZnXgUXMCALfWE49kbUfPHRZbVDDm3t8WRetKersOEkSfyrh91IejqFNbL Sqks0iSnVJHm6wxa0Uj1Gns7hsvqmYNKsuoHltH5yWUMKz0plBw1I93JNdDDOt/i2LdU xwV0TgXqezdNp15MM+4tniPpgYTMSLFOlH4V5pORCzDSUFaZMHTDW9OWL5aMg0BP6CjW 3cz5okWIHRb/gmi0Hp5HpXVc9aqDkjU1eNeIgQc0kRzaaTcSXBO2bXa7HWu063MJL/v0 gZKQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c12si1492366eja.450.2021.01.12.08.48.09; Tue, 12 Jan 2021 08:48:33 -0800 (PST) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733157AbhALQp4 (ORCPT + 99 others); Tue, 12 Jan 2021 11:45:56 -0500 Received: from hostingweb31-40.netsons.net ([89.40.174.40]:44433 "EHLO hostingweb31-40.netsons.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728150AbhALQp4 (ORCPT ); Tue, 12 Jan 2021 11:45:56 -0500 Received: from [185.56.157.72] (port=32796 helo=[192.168.101.73]) by hostingweb31.netsons.net with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1kzMn9-0031SN-97; Tue, 12 Jan 2021 17:45:11 +0100 Subject: Re: [RFC 2/2] clk: vc5: Add support for optional load capacitance To: Adam Ford Cc: linux-clk , Adam Ford-BE , Michael Turquette , Stephen Boyd , Rob Herring , devicetree , Linux Kernel Mailing List References: <20210106173900.388758-1-aford173@gmail.com> <20210106173900.388758-2-aford173@gmail.com> From: Luca Ceresoli Message-ID: Date: Tue, 12 Jan 2021 17:45:10 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - hostingweb31.netsons.net X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lucaceresoli.net X-Get-Message-Sender-Via: hostingweb31.netsons.net: authenticated_id: luca+lucaceresoli.net/only user confirmed/virtual account not confirmed X-Authenticated-Sender: hostingweb31.netsons.net: luca@lucaceresoli.net X-Source: X-Source-Args: X-Source-Dir: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Adam, On 11/01/21 17:40, Adam Ford wrote: > On Sat, Jan 9, 2021 at 12:02 PM Luca Ceresoli wrote: >> >> Hi Adam, >> >> On 09/01/21 04:00, Adam Ford wrote: >>> On Fri, Jan 8, 2021 at 4:49 PM Luca Ceresoli wrote: >>>> >>>> Hi Adam, >>>> >>>> On 06/01/21 18:39, Adam Ford wrote: >>>>> There are two registers which can set the load capacitance for >>>>> XTAL1 and XTAL2. These are optional registers when using an >>>>> external crystal. Parse the device tree and set the >>>>> corresponding registers accordingly. >>>> >>>> No need to repeat the first 2 sentences, they are already in patch 1. >>> >>> The reason I did that was because if someone does a git log on the >>> individual file, they'd see the comment. While it's redundant not, it >>> might not be as obvious in the future when looking back. Not >>> everyone reviews the history of the binding, but the source files' git >>> logs usually have some value. However, if you want me to drop it or >>> rephrase it, I can do that. >> >> Makes sense, I had never considered that before. >> >>>>> +static int vc5_map_cap_value(u32 femtofarads) >>>>> +{ >>>>> + int mapped_value; >>>>> + >>>>> + /* The datasheet explicitly states 9000 - 25000 */ >>>>> + if ((femtofarads < 9000) || (femtofarads > 25000)) >>>>> + return -EINVAL; >>>>> + >>>>> + /* The lowest target we can hit is 9430, so exit if it's less */ >>>>> + if (femtofarads < 9430) >>>>> + return 0; >>>>> + >>>>> + /* >>>>> + * According to VersaClock 6E Programming Guide, there are 6 >>>>> + * bits which translate to 64 entries in XTAL registers 12 and >>>>> + * 13. Because bits 0 and 1 increase the capacitance the >>>>> + * same, some of the values can be repeated. Plugging this >>>>> + * into a spreadsheet and generating a trendline, the output >>>>> + * equation becomes x = (y-9098.29) / 216.44, where 'y' is >>>>> + * the desired capacitance in femtofarads, and x is the value >>>>> + * of XTAL[5:0]. >>>>> + * To help with rounding, do fixed point math >>>>> + */ >>>>> + femtofarads *= 100; >>>>> + mapped_value = (femtofarads - 909829) / 21644; >>>> >>>> Thanks for the extensive comment, but I am confused. Not by your code >>>> which is very clean and readable, but by the chip documentation >>>> (disclaimer: I haven't read it in full depth). >>> >>> I was confused too since the datasheet and programmers manual differ a bit. >>>> >>>> The 5P49V6965 datasheet at page 17 clearly states capacitance can be >>>> increased in 0.5 pF steps. The "VersaClock 6E Family Register >>>> Descriptions and Programming Guide" at page 18 shows a table that allows >>>> 0.43 pF. Can you clarify how the thing works? >>> >>> I used the Versaclock 6E doc which is based on the following: >>> >>> BIT 5 - Add 6.92pF >>> BIT 4 - Add 3.46pF >>> BIT 3 - Add 1.73pF >>> BIT 2 - Add 0.86pF >>> Bit 1 - Add 0.43pF >>> Bit 0 - Add 0.43pF >>> >>> Because the Datasheet starts at 9pF, the math I used, assumes these >>> numbers are added to 9pF. >>> Because the datasheet shows the increments are in .5pF increments, the >>> 430nF seems close. The datasheet shows 9pF - 25pF and based on the >>> programmer table, we could get close to 25pF by enabling all bits and >>> adding 9pF, however the math doesn't quite hit 25pF. >>> >>> For what it's worth I needed around 11.5pF, and with this patch, the >>> hardware engineer said our ppm went from around 70 ppm to around 4ppm. >> >> Did he measure what happens if you set the register according to the 0.5 >> pF interpretation? Does it improve? I understand the difference is >> probably olwer than the noise, but who knows. >> >>>>> + >>>>> + /* >>>>> + * The datasheet states, the maximum capacitance is 25000, >>>>> + * but the programmer guide shows a max value is 22832, >>>>> + * so values higher values could overflow, so cap it. >>>>> + */ >>>> >>>> The 22832 limit is if you assume 0.43 pF steps. Assuming 0.5 pF steps >>>> leads to 25000. Now I am more confused than before. >>> >>> I agree. It would be nice to get some clarification from Renesas. >> >> Definitely. Do you have access to some support from them? > > Luca, > > We reached out to Renesas with the following questions: > > 1) > I'm seeing a discrepancy between the datasheet and programming guide > we have for the Versaclock 6e in regard to the crystal load > programming registers. The datasheet for the 5P49V6965A000NLGI > indicates a 9pF minimum with 0.5pF steps, while the programming guide > says that the lower two register bits both add 0.43pF, which would > make the equation: > > Ci = 9pF + 0.43pF * XTAL[5:1] instead of > Ci = 9pF + 0.5pF * XTAL[5:0] as is published in the datasheet. > > 2) The programming guide shows that the default setting is 01b, but > the note says it's reserved, use D1 D0 = 00. Can you confirm that we > should set switch mode to 00 instead of the default 01? > > And we got the following answers: > > 1) > The first one with 0.43pF steps is the correct one. Ci = 9pF + > 0.43pF * XTAL[5:1] > 0.5pF steps was the design target. When measuring actual > silicon, we found 0.43pF steps. > > There are 6 bits reserved for the CL setting but bits 0 and 1 > have the same 0.43pF step. So it is actually 5 bits with an extra LSB > of 0.43pF. > > 2) > Please use D1 D0 = 01. The “00” is a typo….. Great thing you got all those info from Renesas! > > Based on the above response I think we should always assume XTAL bit 0 > is 0, and only use XTAL[5:1] which should make the math go easier, > because the desired value in femtofarads would just be offset by 9000 > and divided by 430 and that value would be shifted 3 places instead fo > two, and the fixed-point math calculation can go away. > > In addition to that, I would also need to make sure that D0 is set to > 1, so instead of just writing the shifted XTAL value, I would also > have to do a logic OR with 1 to set the low bit. > > I talked with the hardware guys from work who also suggested that we > always write the same value to X1 and X2, so I can remove the X1 and > X2 references from the bindings. > > Does that work for you? Yes. We are only losing the ability to set 9 + (0.43 * 32) pF using all bits. I'm OK with that. Should it be needed in the future we can just add it as a special case, maybe just add a comment saying that, like "XTAL[5:0] = b111111 not supported". -- Luca