All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: Re: [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver
@ 2017-03-02  5:54 ` Icenowy Zheng
  0 siblings, 0 replies; 5+ messages in thread
From: Icenowy Zheng @ 2017-03-02  5:54 UTC (permalink / raw)
  To: Priit Laes
  Cc: Michael Turquette, Rob Herring,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-clk-u79uwXL29TY76Z2rM5mHXA, Stephen Boyd,
	devicetree-u79uwXL29TY76Z2rM5mHXA, Russell King, Mark Rutland,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Chen-Yu Tsai,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8


2017年3月2日 上午5:38于 Priit Laes <plaes-q/aMd4JkU83YtjvyW6yDsg@public.gmane.org>写道:
>
> On Tue, 2017-02-28 at 09:21 +0100, Maxime Ripard wrote: 
> > Hi, 
> > 
> > On Mon, Feb 27, 2017 at 11:09:12PM +0200, Priit Laes wrote: 
> > > Introduce a clock controller driver for sun7i A20 SoC. 
> > > 
> > > > > Signed-off-by: Priit Laes <plaes-q/aMd4JkU83YtjvyW6yDsg@public.gmane.org> 
> > > --- 
> > >  drivers/clk/sunxi-ng/Kconfig         |   11 + 
> > >  drivers/clk/sunxi-ng/Makefile        |    1 + 
> > >  drivers/clk/sunxi-ng/ccu-sun7i-a20.c | 1068 ++++++++++++++++++++++++++++++++++ 
> > >  drivers/clk/sunxi-ng/ccu-sun7i-a20.h |  121 ++++ 
> > >  4 files changed, 1201 insertions(+) 
> > >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun7i-a20.c 
> > >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun7i-a20.h 
> > > 
> > > diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig 
> > > index 695bbf9..4f436ab 100644 
> > > --- a/drivers/clk/sunxi-ng/Kconfig 
> > > +++ b/drivers/clk/sunxi-ng/Kconfig 
> > > @@ -85,6 +85,17 @@ config SUN6I_A31_CCU 
> > > > >   select SUNXI_CCU_PHASE 
> > > > >   default MACH_SUN6I 
> > >   
> > > +config SUN7I_A20_CCU 
> > > > > + bool "Support for the Allwinner A20 CCU" 
> > > > > + select SUNXI_CCU_DIV 
> > > > > + select SUNXI_CCU_MULT 
> > > > > + select SUNXI_CCU_NK 
> > > > > + select SUNXI_CCU_NKM 
> > > > > + select SUNXI_CCU_NM 
> > > > > + select SUNXI_CCU_MP 
> > > > > + select SUNXI_CCU_PHASE 
> > > > > + default MACH_SUN7I 
> > > + 
> > >  config SUN8I_A23_CCU 
> > > > >   bool "Support for the Allwinner A23 CCU" 
> > > > >   select SUNXI_CCU_DIV 
> > > diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi-ng/Makefile 
> > > index 6feaac0..bedda5b 100644 
> > > --- a/drivers/clk/sunxi-ng/Makefile 
> > > +++ b/drivers/clk/sunxi-ng/Makefile 
> > > > > @@ -21,6 +21,7 @@ obj-$(CONFIG_SUNXI_CCU_MP) += ccu_mp.o 
> > > > >  obj-$(CONFIG_SUN50I_A64_CCU) += ccu-sun50i-a64.o 
> > > > >  obj-$(CONFIG_SUN5I_CCU) += ccu-sun5i.o 
> > > > >  obj-$(CONFIG_SUN6I_A31_CCU) += ccu-sun6i-a31.o 
> > > > > +obj-$(CONFIG_SUN7I_A20_CCU) += ccu-sun7i-a20.o 
> > > > >  obj-$(CONFIG_SUN8I_A23_CCU) += ccu-sun8i-a23.o 
> > > > >  obj-$(CONFIG_SUN8I_A33_CCU) += ccu-sun8i-a33.o 
> > > > >  obj-$(CONFIG_SUN8I_H3_CCU) += ccu-sun8i-h3.o 
> > > diff --git a/drivers/clk/sunxi-ng/ccu-sun7i-a20.c b/drivers/clk/sunxi-ng/ccu-sun7i-a20.c 
> > > new file mode 100644 
> > > index 0000000..90d2f13 
> > > --- /dev/null 
> > > +++ b/drivers/clk/sunxi-ng/ccu-sun7i-a20.c 
> > > @@ -0,0 +1,1068 @@ 
> > > +/* 
> > > + * Copyright (c) 2017 Priit Laes. All rights reserved. 
> > > + * 
> > > + * This software is licensed under the terms of the GNU General Public 
> > > + * License version 2, as published by the Free Software Foundation, and 
> > > + * may be copied, distributed, and modified under those terms. 
> > > + * 
> > > + * This program is distributed in the hope that it will be useful, 
> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of 
> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
> > > + * GNU General Public License for more details. 
> > > + */ 
> > > + 
> > > +#include <linux/clk-provider.h> 
> > > +#include <linux/of_address.h> 
> > > + 
> > > +#include "ccu_common.h" 
> > > +#include "ccu_reset.h" 
> > > + 
> > > +#include "ccu_div.h" 
> > > +#include "ccu_gate.h" 
> > > +#include "ccu_mp.h" 
> > > +#include "ccu_mult.h" 
> > > +#include "ccu_nk.h" 
> > > +#include "ccu_nkm.h" 
> > > +#include "ccu_nkmp.h" 
> > > +#include "ccu_nm.h" 
> > > +#include "ccu_phase.h" 
> > > + 
> > > +#include "ccu-sun7i-a20.h" 
> > > + 
> > > +/* 
> > > + * PLL1 - Core clock 
> > > + * 
> > > + * TODO: sigma-delta pattern bits 2 & 3 
> > > + * TODO: PLL1 tuning register 
> > 
> > I don't think we need those TODO's at all, and these comments too. If 
> > the clock name is good enough (and it is), it's redundant. 
>
> Ok, will clean them up. 
>
> > 
> > > + */ 
> > > 
> [...] 
> > > +}; 
> > > + 
> > > +/* PLL2 - Audio clock */ 
> > > +static struct ccu_nm pll_audio_base_clk = { 
> > > > > > > + .enable = BIT(31), 
> > > > > > > + .n = _SUNXI_CCU_MULT_OFFSET(8, 7, 0), 
> > > > > > > + .m = _SUNXI_CCU_DIV_OFFSET(0, 5, 0), 
> > > > > > > + .common = { 
> > > > > > > + .reg = 0x008, 
> > > > > > > + .hw.init = CLK_HW_INIT("pll-audio-base", 
> > > > > +       "hosc", 
> > > > > +       &ccu_nm_ops, 
> > > > > +       0), 
> > > > > + }, 
> > > + 
> > > +}; 
> > 
> > You're forgetting the post-divider here 
>
> It's hardcoded to 4 during ccu initialization, similar to what is done 
> on the other SoCs (A13, A31..). 
>
> > 
> > > +/* TODO: pll8 gpu 0x040 */ 
> > 
> > Please add all the clocks. 
>
> I'm not really comfortable adding clocks for blocks that currently lack 
> drivers. 
>

1. CCU driver should implement all clocks in a CCU, as it may be needed some day.
2. We really have driver for mali, at least kernel part :-)

> > > +/* BIT(21 .. 31) - reserved */ 
> > 
> > I'm not sure we need those comments either. 
> > 
> > > +/* 
> > > + * TODO: SATA clock also supports external clock as parent. 
> > > + * Currently we default to using PLL6 SATA gate. 
> > > + */ 
> > 
> > Which external clock? It should be modelled anyway. If we have a 
> > dependency on some other clock, it should be in our DT binding, and 
> > listed in the mux there. 
> > 
> > Otherwise, the clock framework will not be able to deal with that mux 
> > being already set by the bootloader, and if we need to support that 
> > clock in the future, our binding will be ready for it. 
>
> I wish I knew which clock they're talking about.. 
>
> User manuals (A10/A20) only specify following in the clock register 
> description: 
>
> BIT(24) - CLK_SRC_GATING, default 0x0 
> Clock Source Select: 
> 0: PLL6 for SATA(100MHz) 
> 1: External Clock 
>
> There's no section for SATA (called NC) in A10 manual, and in A20 
> manual only contains list of SATA/AHCI features. 
>
>
> > 
> > > +static CLK_FIXED_FACTOR(pll_periph_2x_clk, "pll-periph-2x", 
> > > > > + "pll-periph", 1, 2, CLK_SET_RATE_PARENT); 
> > > +/* We hardcode the divider to 4 for now */ 
> > > +static CLK_FIXED_FACTOR(pll_audio_clk, "pll-audio", 
> > > > > + "pll-audio-base", 4, 1, CLK_SET_RATE_PARENT); 
> > > +static CLK_FIXED_FACTOR(pll_audio_2x_clk, "pll-audio-2x", 
> > > > > + "pll-audio-base", 2, 1, CLK_SET_RATE_PARENT); 
> > > +static CLK_FIXED_FACTOR(pll_audio_4x_clk, "pll-audio-4x", 
> > > > > + "pll-audio-base", 1, 1, CLK_SET_RATE_PARENT); 
> > > +static CLK_FIXED_FACTOR(pll_audio_8x_clk, "pll-audio-8x", 
> > > > > + "pll-audio-base", 1, 2, CLK_SET_RATE_PARENT); 
> > > +static CLK_FIXED_FACTOR(pll_video0_2x_clk, "pll-video0-2x", 
> > > > > + "pll-video0", 1, 2, CLK_SET_RATE_PARENT); 
> > > +static CLK_FIXED_FACTOR(pll_video1_2x_clk, "pll-video1-2x", 
> > > + "pll-video1", 1, 2, CLK_SET_RATE_PARENT); 
> > 
> > It feels more natural to just have the clocks defined in the same 
> > order than their parents. So periph shouldn't be first 
>
> Ok, will move the periph clock after the video. 
>
> > > +static struct ccu_reset_map sun7i_a20_ccu_resets[] = { 
> > > + 
> > > > > > > + [RST_USB_PHY0] = { 0x0cc, BIT(0) }, 
> > > > > > > + [RST_USB_PHY1] = { 0x0cc, BIT(1) }, 
> > > > > > > + [RST_USB_PHY2] = { 0x0cc, BIT(2) }, 
> > > > > > > + [RST_DE_BE0] = { 0x104, BIT(30) }, 
> > > > > > > + [RST_DE_BE1] = { 0x108, BIT(30) }, 
> > > > > > > + [RST_DE_FE0] = { 0x10c, BIT(30) }, 
> > > > > > > + [RST_DE_FE1] = { 0x110, BIT(30) }, 
> > > > > > > + [RST_DE_MP] = { 0x114, BIT(30) }, 
> > > > > > > + [RST_TCON0] = { 0x118, BIT(30) }, 
> > > > > > > + [RST_TCON1] = { 0x11c, BIT(30) }, 
> > > > > > > + [RST_CSI0] = { 0x134, BIT(30) }, 
> > > > > > > + [RST_CSI1] = { 0x138, BIT(30) }, 
> > > > > > > + [RST_VE] = { 0x13c, BIT(0) }, 
> > > > > > > + [RST_ACE] = { 0x148, BIT(16) }, 
> > > > > > > + [RST_LVDS] = { 0x14c, BIT(0) }, 
> > > > > > > + [RST_GPU] = { 0x154, BIT(30) }, 
> > > > > > > + [RST_HDMI_H] = { 0x170, BIT(0) }, 
> > > > > > > + [RST_HDMI_SYS] = { 0x170, BIT(1) }, 
> > > > > > > + [RST_HDMI_AUDIO_DMA] = { 0x170, BIT(2) }, 
> > > +}; 
> > > + 
> > > +static const struct sunxi_ccu_desc sun7i_a20_ccu_desc = { 
> > > > > > > + .ccu_clks = sun7i_a20_ccu_clks, 
> > > > > > > + .num_ccu_clks = ARRAY_SIZE(sun7i_a20_ccu_clks), 
> > > + 
> > > > > > > + .hw_clks = &sun7i_a20_hw_clks, 
> > > + 
> > > > > > > + .resets = sun7i_a20_ccu_resets, 
> > > > > > > + .num_resets = ARRAY_SIZE(sun7i_a20_ccu_resets), 
> > > +}; 
> > > + 
> > > +static void __init sun7i_a20_ccu_setup(struct device_node *node) 
> > > +{ 
> > > > > + void __iomem *reg; 
> > > > > + u32 val; 
> > > + 
> > > > > + reg = of_io_request_and_map(node, 0, of_node_full_name(node)); 
> > > > > + if (IS_ERR(reg)) { 
> > > > > + pr_err("%s: Could not map the clock registers\n", 
> > > > > +        of_node_full_name(node)); 
> > > > > + return; 
> > > > > + } 
> > > + 
> > > + #define SUN7I_PLL_AUDIO_REG 0x008 
> > 
> > This should be defined above 
>
> Will do.. 
> > 
> > > + 
> > > > > + /* Force the PLL-Audio-1x divider to 4 */ 
> > > > > + val = readl(reg + SUN7I_PLL_AUDIO_REG); 
> > > > > + val &= ~GENMASK(19, 16); 
> > > > > + writel(val | (3 << 16), reg + SUN7I_PLL_AUDIO_REG); 
> > > + 
> > > > > + /* 
> > > > > +  * Use PLL6 as parent for AHB 
> > > +  * CPU/AXI clock changes rate when cpufreq is enabled 
> > 
> > I'm not sure why that last sentence is needed too. A lot of clock 
> > listed there change rate when <some-feature> is enabled. 
>
> Will remove. 
>
> > 
> > > +/* Some AHB gates are exported */ 
> > > > > +#define CLK_AHB_BIST 31 
> > > > > +#define CLK_AHB_MS 36 
> > > > > +#define CLK_AHB_SDRAM 38 
> > > > > +#define CLK_AHB_ACE 39 
> > > > > +#define CLK_AHB_TS 41 
> > > > > +#define CLK_AHB_VE 48 
> > > > > +#define CLK_AHB_TVD 49 
> > > > > +#define CLK_AHB_TVE1 51 
> > > > > +#define CLK_AHB_LCD1 53 
> > > > > +#define CLK_AHB_CSI0 54 
> > > > > +#define CLK_AHB_CSI1 55 
> > > > > +#define CLK_AHB_HDMI0 56 
> > > > > +#define CLK_AHB_DE_BE1 59 
> > > > > +#define CLK_AHB_DE_FE0 60 
> > > > > +#define CLK_AHB_DE_FE1 61 
> > > > > +#define CLK_AHB_MP 63 
> > > > > +#define CLK_AHB_GPU 64 
> > > + 
> > > +/* Some APB0 gates are exported */ 
> > > > > +#define CLK_APB0_AC97 67 
> > > > > +#define CLK_APB0_KEYPAD 74 
> > > + 
> > > +/* Some APB1 gates are exported */ 
> > > > > +#define CLK_APB1_CAN 79 
> > > > > +#define CLK_APB1_SCR 80 
> > > + 
> > > +/* Some IP module clocks are exported */ 
> > > > > +#define CLK_MS 93 
> > > > > +#define CLK_TS 106 
> > > > > +#define CLK_PATA 111 
> > > > > +#define CLK_AC97 115 
> > > > > +#define CLK_KEYPAD 117 
> > > > > +#define CLK_SATA 118 
> > > + 
> > > +/* Some DRAM gates are exported */ 
> > > > > +#define CLK_DRAM_VE 125 
> > > > > +#define CLK_DRAM_CSI0 126 
> > > > > +#define CLK_DRAM_CSI1 127 
> > > > > +#define CLK_DRAM_TS 128 
> > > > > +#define CLK_DRAM_TVD 129 
> > > > > +#define CLK_DRAM_TVE1 131 
> > > > > +#define CLK_DRAM_OUT 132 
> > > > > +#define CLK_DRAM_DE_FE1 133 
> > > > > +#define CLK_DRAM_DE_FE0 134 
> > > > > +#define CLK_DRAM_DE_BE1 136 
> > > > > +#define CLK_DRAM_MP 137 
> > > > > +#define CLK_DRAM_ACE 138 
> > > + 
> > > > > +#define CLK_DE_BE1 140 
> > > > > +#define CLK_DE_FE0 141 
> > > > > +#define CLK_DE_FE1 142 
> > > > > +#define CLK_DE_MP 143 
> > > > > +#define CLK_TCON1_CH0 145 
> > > > > +#define CLK_CSI_SPECIAL 146 
> > > > > +#define CLK_TVD 147 
> > > > > +#define CLK_TCON0_CH1_SCLK2 148 
> > > > > +#define CLK_TCON1_CH1_SCLK2 150 
> > > > > +#define CLK_TCON1_CH1 151 
> > > > > +#define CLK_CSI0 152 
> > > > > +#define CLK_CSI1 153 
> > > > > +#define CLK_VE 154 
> > > > > +#define CLK_AVS 156 
> > > > > +#define CLK_ACE 157 
> > > > > +#define CLK_HDMI 158 
> > > > > +#define CLK_GPU 159 
> > > > > +#define CLK_MBUS 160 
> > > > > +#define CLK_HDMI1_SLOW 161 
> > > > > +#define CLK_HDMI1_REPEAT 162 
> > > > > +#define CLK_OUT_A 163 
> > > +#define CLK_OUT_B 164 
> > 
> > Is there a reason not to expose these clocks? 
>
> I exposed them on need to have basis. And basically did one-to-one 
> conversion from devicetree. 
>
> Päikest, 
> Priit 

-- 
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [linux-sunxi] Re: [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver
@ 2017-03-02  5:54 ` Icenowy Zheng
  0 siblings, 0 replies; 5+ messages in thread
From: Icenowy Zheng @ 2017-03-02  5:54 UTC (permalink / raw)
  To: Priit Laes
  Cc: Michael Turquette, Rob Herring, linux-kernel, linux-clk,
	Stephen Boyd, devicetree, Russell King, Mark Rutland,
	linux-arm-kernel, linux-sunxi, Chen-Yu Tsai, maxime.ripard

CjIwMTflubQz5pyIMuaXpSDkuIrljYg1OjM45LqOIFByaWl0IExhZXMgPHBsYWVzQHBsYWVzLm9y
Zz7lhpnpgZPvvJoKPgo+IE9uIFR1ZSwgMjAxNy0wMi0yOCBhdCAwOToyMSArMDEwMCwgTWF4aW1l
IFJpcGFyZCB3cm90ZTogCj4gPiBIaSwgCj4gPiAKPiA+IE9uIE1vbiwgRmViIDI3LCAyMDE3IGF0
IDExOjA5OjEyUE0gKzAyMDAsIFByaWl0IExhZXMgd3JvdGU6IAo+ID4gPiBJbnRyb2R1Y2UgYSBj
bG9jayBjb250cm9sbGVyIGRyaXZlciBmb3Igc3VuN2kgQTIwIFNvQy4gCj4gPiA+IAo+ID4gPiA+
ID4gU2lnbmVkLW9mZi1ieTogUHJpaXQgTGFlcyA8cGxhZXNAcGxhZXMub3JnPiAKPiA+ID4gLS0t
IAo+ID4gPiDCoGRyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWfCoMKgwqDCoMKgwqDCoMKgwqB8
wqDCoMKgMTEgKyAKPiA+ID4gwqBkcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZcKgwqDCoMKg
wqDCoMKgwqB8wqDCoMKgwqAxICsgCj4gPiA+IMKgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1
bjdpLWEyMC5jIHwgMTA2OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIAo+ID4g
PiDCoGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW43aS1hMjAuaCB8wqDCoDEyMSArKysrIAo+
ID4gPiDCoDQgZmlsZXMgY2hhbmdlZCwgMTIwMSBpbnNlcnRpb25zKCspIAo+ID4gPiDCoGNyZWF0
ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuN2ktYTIwLmMgCj4gPiA+
IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW43aS1hMjAu
aCAKPiA+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmln
IGIvZHJpdmVycy9jbGsvc3VueGktbmcvS2NvbmZpZyAKPiA+ID4gaW5kZXggNjk1YmJmOS4uNGY0
MzZhYiAxMDA2NDQgCj4gPiA+IC0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcgCj4g
PiA+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcgCj4gPiA+IEBAIC04NSw2ICs4
NSwxNyBAQCBjb25maWcgU1VONklfQTMxX0NDVSAKPiA+ID4gPiA+IMKgIHNlbGVjdCBTVU5YSV9D
Q1VfUEhBU0UgCj4gPiA+ID4gPiDCoCBkZWZhdWx0IE1BQ0hfU1VONkkgCj4gPiA+IMKgIAo+ID4g
PiArY29uZmlnIFNVTjdJX0EyMF9DQ1UgCj4gPiA+ID4gPiArIGJvb2wgIlN1cHBvcnQgZm9yIHRo
ZSBBbGx3aW5uZXIgQTIwIENDVSIgCj4gPiA+ID4gPiArIHNlbGVjdCBTVU5YSV9DQ1VfRElWIAo+
ID4gPiA+ID4gKyBzZWxlY3QgU1VOWElfQ0NVX01VTFQgCj4gPiA+ID4gPiArIHNlbGVjdCBTVU5Y
SV9DQ1VfTksgCj4gPiA+ID4gPiArIHNlbGVjdCBTVU5YSV9DQ1VfTktNIAo+ID4gPiA+ID4gKyBz
ZWxlY3QgU1VOWElfQ0NVX05NIAo+ID4gPiA+ID4gKyBzZWxlY3QgU1VOWElfQ0NVX01QIAo+ID4g
PiA+ID4gKyBzZWxlY3QgU1VOWElfQ0NVX1BIQVNFIAo+ID4gPiA+ID4gKyBkZWZhdWx0IE1BQ0hf
U1VON0kgCj4gPiA+ICsgCj4gPiA+IMKgY29uZmlnIFNVTjhJX0EyM19DQ1UgCj4gPiA+ID4gPiDC
oCBib29sICJTdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIEEyMyBDQ1UiIAo+ID4gPiA+ID4gwqAg
c2VsZWN0IFNVTlhJX0NDVV9ESVYgCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54
aS1uZy9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlIAo+ID4gPiBpbmRl
eCA2ZmVhYWMwLi5iZWRkYTViIDEwMDY0NCAKPiA+ID4gLS0tIGEvZHJpdmVycy9jbGsvc3VueGkt
bmcvTWFrZWZpbGUgCj4gPiA+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlIAo+
ID4gPiA+ID4gQEAgLTIxLDYgKzIxLDcgQEAgb2JqLSQoQ09ORklHX1NVTlhJX0NDVV9NUCkgKz0g
Y2N1X21wLm8gCj4gPiA+ID4gPiDCoG9iai0kKENPTkZJR19TVU41MElfQTY0X0NDVSkgKz0gY2N1
LXN1bjUwaS1hNjQubyAKPiA+ID4gPiA+IMKgb2JqLSQoQ09ORklHX1NVTjVJX0NDVSkgKz0gY2N1
LXN1bjVpLm8gCj4gPiA+ID4gPiDCoG9iai0kKENPTkZJR19TVU42SV9BMzFfQ0NVKSArPSBjY3Ut
c3VuNmktYTMxLm8gCj4gPiA+ID4gPiArb2JqLSQoQ09ORklHX1NVTjdJX0EyMF9DQ1UpICs9IGNj
dS1zdW43aS1hMjAubyAKPiA+ID4gPiA+IMKgb2JqLSQoQ09ORklHX1NVTjhJX0EyM19DQ1UpICs9
IGNjdS1zdW44aS1hMjMubyAKPiA+ID4gPiA+IMKgb2JqLSQoQ09ORklHX1NVTjhJX0EzM19DQ1Up
ICs9IGNjdS1zdW44aS1hMzMubyAKPiA+ID4gPiA+IMKgb2JqLSQoQ09ORklHX1NVTjhJX0gzX0ND
VSkgKz0gY2N1LXN1bjhpLWgzLm8gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54
aS1uZy9jY3Utc3VuN2ktYTIwLmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuN2ktYTIw
LmMgCj4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0IAo+ID4gPiBpbmRleCAwMDAwMDAwLi45MGQy
ZjEzIAo+ID4gPiAtLS0gL2Rldi9udWxsIAo+ID4gPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1u
Zy9jY3Utc3VuN2ktYTIwLmMgCj4gPiA+IEBAIC0wLDAgKzEsMTA2OCBAQCAKPiA+ID4gKy8qIAo+
ID4gPiArICogQ29weXJpZ2h0IChjKSAyMDE3IFByaWl0IExhZXMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuIAo+ID4gPiArICogCj4gPiA+ICsgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAo+ID4gPiArICogTGljZW5zZSB2
ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBh
bmQgCj4gPiA+ICsgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVu
ZGVyIHRob3NlIHRlcm1zLiAKPiA+ID4gKyAqIAo+ID4gPiArICogVGhpcyBwcm9ncmFtIGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAo+ID4gPiArICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YgCj4gPiA+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuwqDCoFNlZSB0aGUgCj4gPiA+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKPiA+ID4gKyAqLyAKPiA+ID4gKyAKPiA+ID4gKyNpbmNs
dWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4gCj4gPiA+ICsjaW5jbHVkZSA8bGludXgvb2ZfYWRk
cmVzcy5oPiAKPiA+ID4gKyAKPiA+ID4gKyNpbmNsdWRlICJjY3VfY29tbW9uLmgiIAo+ID4gPiAr
I2luY2x1ZGUgImNjdV9yZXNldC5oIiAKPiA+ID4gKyAKPiA+ID4gKyNpbmNsdWRlICJjY3VfZGl2
LmgiIAo+ID4gPiArI2luY2x1ZGUgImNjdV9nYXRlLmgiIAo+ID4gPiArI2luY2x1ZGUgImNjdV9t
cC5oIiAKPiA+ID4gKyNpbmNsdWRlICJjY3VfbXVsdC5oIiAKPiA+ID4gKyNpbmNsdWRlICJjY3Vf
bmsuaCIgCj4gPiA+ICsjaW5jbHVkZSAiY2N1X25rbS5oIiAKPiA+ID4gKyNpbmNsdWRlICJjY3Vf
bmttcC5oIiAKPiA+ID4gKyNpbmNsdWRlICJjY3Vfbm0uaCIgCj4gPiA+ICsjaW5jbHVkZSAiY2N1
X3BoYXNlLmgiIAo+ID4gPiArIAo+ID4gPiArI2luY2x1ZGUgImNjdS1zdW43aS1hMjAuaCIgCj4g
PiA+ICsgCj4gPiA+ICsvKiAKPiA+ID4gKyAqIFBMTDEgLSBDb3JlIGNsb2NrIAo+ID4gPiArICog
Cj4gPiA+ICsgKiBUT0RPOiBzaWdtYS1kZWx0YSBwYXR0ZXJuIGJpdHMgMiAmIDMgCj4gPiA+ICsg
KiBUT0RPOiBQTEwxIHR1bmluZyByZWdpc3RlciAKPiA+IAo+ID4gSSBkb24ndCB0aGluayB3ZSBu
ZWVkIHRob3NlIFRPRE8ncyBhdCBhbGwsIGFuZCB0aGVzZSBjb21tZW50cyB0b28uIElmIAo+ID4g
dGhlIGNsb2NrIG5hbWUgaXMgZ29vZCBlbm91Z2ggKGFuZCBpdCBpcyksIGl0J3MgcmVkdW5kYW50
LiAKPgo+IE9rLCB3aWxsIGNsZWFuIHRoZW0gdXAuIAo+Cj4gPiAKPiA+ID4gKyAqLyAKPiA+ID4g
Cj4gWy4uLl0gCj4gPiA+ICt9OyAKPiA+ID4gKyAKPiA+ID4gKy8qIFBMTDIgLSBBdWRpbyBjbG9j
ayAqLyAKPiA+ID4gK3N0YXRpYyBzdHJ1Y3QgY2N1X25tIHBsbF9hdWRpb19iYXNlX2NsayA9IHsg
Cj4gPiA+ID4gPiA+ID4gKyAuZW5hYmxlID0gQklUKDMxKSwgCj4gPiA+ID4gPiA+ID4gKyAubiA9
IF9TVU5YSV9DQ1VfTVVMVF9PRkZTRVQoOCwgNywgMCksIAo+ID4gPiA+ID4gPiA+ICsgLm0gPSBf
U1VOWElfQ0NVX0RJVl9PRkZTRVQoMCwgNSwgMCksIAo+ID4gPiA+ID4gPiA+ICsgLmNvbW1vbiA9
IHsgCj4gPiA+ID4gPiA+ID4gKyAucmVnID0gMHgwMDgsIAo+ID4gPiA+ID4gPiA+ICsgLmh3Lmlu
aXQgPSBDTEtfSFdfSU5JVCgicGxsLWF1ZGlvLWJhc2UiLCAKPiA+ID4gPiA+ICsgwqDCoMKgwqDC
oMKgImhvc2MiLCAKPiA+ID4gPiA+ICsgwqDCoMKgwqDCoMKgJmNjdV9ubV9vcHMsIAo+ID4gPiA+
ID4gKyDCoMKgwqDCoMKgwqAwKSwgCj4gPiA+ID4gPiArIH0sIAo+ID4gPiArIAo+ID4gPiArfTsg
Cj4gPiAKPiA+IFlvdSdyZSBmb3JnZXR0aW5nIHRoZSBwb3N0LWRpdmlkZXIgaGVyZSAKPgo+IEl0
J3MgaGFyZGNvZGVkIHRvIDQgZHVyaW5nIGNjdSBpbml0aWFsaXphdGlvbiwgc2ltaWxhciB0byB3
aGF0IGlzIGRvbmUgCj4gb24gdGhlIG90aGVyIFNvQ3MgKEExMywgQTMxLi4pLiAKPgo+ID4gCj4g
PiA+ICsvKiBUT0RPOiBwbGw4IGdwdSAweDA0MCAqLyAKPiA+IAo+ID4gUGxlYXNlIGFkZCBhbGwg
dGhlIGNsb2Nrcy4gCj4KPiBJJ20gbm90IHJlYWxseSBjb21mb3J0YWJsZSBhZGRpbmcgY2xvY2tz
IGZvciBibG9ja3MgdGhhdCBjdXJyZW50bHkgbGFjayAKPiBkcml2ZXJzLiAKPgoKMS4gQ0NVIGRy
aXZlciBzaG91bGQgaW1wbGVtZW50IGFsbCBjbG9ja3MgaW4gYSBDQ1UsIGFzIGl0IG1heSBiZSBu
ZWVkZWQgc29tZSBkYXkuCjIuIFdlIHJlYWxseSBoYXZlIGRyaXZlciBmb3IgbWFsaSwgYXQgbGVh
c3Qga2VybmVsIHBhcnQgOi0pCgo+ID4gPiArLyogQklUKDIxIC4uIDMxKSAtIHJlc2VydmVkICov
IAo+ID4gCj4gPiBJJ20gbm90IHN1cmUgd2UgbmVlZCB0aG9zZSBjb21tZW50cyBlaXRoZXIuIAo+
ID4gCj4gPiA+ICsvKiAKPiA+ID4gKyAqIFRPRE86IFNBVEEgY2xvY2sgYWxzbyBzdXBwb3J0cyBl
eHRlcm5hbCBjbG9jayBhcyBwYXJlbnQuIAo+ID4gPiArICogQ3VycmVudGx5IHdlIGRlZmF1bHQg
dG8gdXNpbmcgUExMNiBTQVRBIGdhdGUuIAo+ID4gPiArICovIAo+ID4gCj4gPiBXaGljaCBleHRl
cm5hbCBjbG9jaz8gSXQgc2hvdWxkIGJlIG1vZGVsbGVkIGFueXdheS4gSWYgd2UgaGF2ZSBhIAo+
ID4gZGVwZW5kZW5jeSBvbiBzb21lIG90aGVyIGNsb2NrLCBpdCBzaG91bGQgYmUgaW4gb3VyIERU
IGJpbmRpbmcsIGFuZCAKPiA+IGxpc3RlZCBpbiB0aGUgbXV4IHRoZXJlLiAKPiA+IAo+ID4gT3Ro
ZXJ3aXNlLCB0aGUgY2xvY2sgZnJhbWV3b3JrIHdpbGwgbm90IGJlIGFibGUgdG8gZGVhbCB3aXRo
IHRoYXQgbXV4IAo+ID4gYmVpbmcgYWxyZWFkeSBzZXQgYnkgdGhlIGJvb3Rsb2FkZXIsIGFuZCBp
ZiB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhhdCAKPiA+IGNsb2NrIGluIHRoZSBmdXR1cmUsIG91ciBi
aW5kaW5nIHdpbGwgYmUgcmVhZHkgZm9yIGl0LiAKPgo+IEkgd2lzaCBJIGtuZXcgd2hpY2ggY2xv
Y2sgdGhleSdyZSB0YWxraW5nIGFib3V0Li4gCj4KPiBVc2VyIG1hbnVhbHMgKEExMC9BMjApIG9u
bHkgc3BlY2lmeSBmb2xsb3dpbmcgaW4gdGhlIGNsb2NrIHJlZ2lzdGVyIAo+IGRlc2NyaXB0aW9u
OiAKPgo+IEJJVCgyNCkgLSBDTEtfU1JDX0dBVElORywgZGVmYXVsdCAweDAgCj4gQ2xvY2sgU291
cmNlIFNlbGVjdDogCj4gMDogUExMNiBmb3IgU0FUQSgxMDBNSHopIAo+IDE6IEV4dGVybmFsIENs
b2NrIAo+Cj4gVGhlcmUncyBubyBzZWN0aW9uIGZvciBTQVRBwqAoY2FsbGVkIE5DKSBpbiBBMTAg
bWFudWFsLCBhbmQgaW4gQTIwIAo+IG1hbnVhbCBvbmx5IGNvbnRhaW5zIGxpc3Qgb2YgU0FUQS9B
SENJIGZlYXR1cmVzLiAKPgo+Cj4gPiAKPiA+ID4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBs
bF9wZXJpcGhfMnhfY2xrLCAicGxsLXBlcmlwaC0yeCIsIAo+ID4gPiA+ID4gKyAicGxsLXBlcmlw
aCIsIDEsIDIsIENMS19TRVRfUkFURV9QQVJFTlQpOyAKPiA+ID4gKy8qIFdlIGhhcmRjb2RlIHRo
ZSBkaXZpZGVyIHRvIDQgZm9yIG5vdyAqLyAKPiA+ID4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9S
KHBsbF9hdWRpb19jbGssICJwbGwtYXVkaW8iLCAKPiA+ID4gPiA+ICsgInBsbC1hdWRpby1iYXNl
IiwgNCwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7IAo+ID4gPiArc3RhdGljIENMS19GSVhFRF9G
QUNUT1IocGxsX2F1ZGlvXzJ4X2NsaywgInBsbC1hdWRpby0yeCIsIAo+ID4gPiA+ID4gKyAicGxs
LWF1ZGlvLWJhc2UiLCAyLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsgCj4gPiA+ICtzdGF0aWMg
Q0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fNHhfY2xrLCAicGxsLWF1ZGlvLTR4IiwgCj4gPiA+
ID4gPiArICJwbGwtYXVkaW8tYmFzZSIsIDEsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOyAKPiA+
ID4gK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb184eF9jbGssICJwbGwtYXVkaW8t
OHgiLCAKPiA+ID4gPiA+ICsgInBsbC1hdWRpby1iYXNlIiwgMSwgMiwgQ0xLX1NFVF9SQVRFX1BB
UkVOVCk7IAo+ID4gPiArc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX3ZpZGVvMF8yeF9jbGss
ICJwbGwtdmlkZW8wLTJ4IiwgCj4gPiA+ID4gPiArICJwbGwtdmlkZW8wIiwgMSwgMiwgQ0xLX1NF
VF9SQVRFX1BBUkVOVCk7IAo+ID4gPiArc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX3ZpZGVv
MV8yeF9jbGssICJwbGwtdmlkZW8xLTJ4IiwgCj4gPiA+ICsgInBsbC12aWRlbzEiLCAxLCAyLCBD
TEtfU0VUX1JBVEVfUEFSRU5UKTsgCj4gPiAKPiA+IEl0IGZlZWxzIG1vcmUgbmF0dXJhbCB0byBq
dXN0IGhhdmUgdGhlIGNsb2NrcyBkZWZpbmVkIGluIHRoZSBzYW1lIAo+ID4gb3JkZXIgdGhhbiB0
aGVpciBwYXJlbnRzLiBTbyBwZXJpcGggc2hvdWxkbid0IGJlIGZpcnN0IAo+Cj4gT2ssIHdpbGwg
bW92ZSB0aGUgcGVyaXBoIGNsb2NrIGFmdGVyIHRoZSB2aWRlby4gCj4KPiA+ID4gK3N0YXRpYyBz
dHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW43aV9hMjBfY2N1X3Jlc2V0c1tdID0geyAKPiA+ID4gKyAK
PiA+ID4gPiA+ID4gPiArIFtSU1RfVVNCX1BIWTBdID0geyAweDBjYywgQklUKDApIH0sIAo+ID4g
PiA+ID4gPiA+ICsgW1JTVF9VU0JfUEhZMV0gPSB7IDB4MGNjLCBCSVQoMSkgfSwgCj4gPiA+ID4g
PiA+ID4gKyBbUlNUX1VTQl9QSFkyXSA9IHsgMHgwY2MsIEJJVCgyKSB9LCAKPiA+ID4gPiA+ID4g
PiArIFtSU1RfREVfQkUwXSA9IHsgMHgxMDQsIEJJVCgzMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBb
UlNUX0RFX0JFMV0gPSB7IDB4MTA4LCBCSVQoMzApIH0sIAo+ID4gPiA+ID4gPiA+ICsgW1JTVF9E
RV9GRTBdID0geyAweDEwYywgQklUKDMwKSB9LCAKPiA+ID4gPiA+ID4gPiArIFtSU1RfREVfRkUx
XSA9IHsgMHgxMTAsIEJJVCgzMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBbUlNUX0RFX01QXSA9IHsg
MHgxMTQsIEJJVCgzMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBbUlNUX1RDT04wXSA9IHsgMHgxMTgs
IEJJVCgzMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBbUlNUX1RDT04xXSA9IHsgMHgxMWMsIEJJVCgz
MCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBbUlNUX0NTSTBdID0geyAweDEzNCwgQklUKDMwKSB9LCAK
PiA+ID4gPiA+ID4gPiArIFtSU1RfQ1NJMV0gPSB7IDB4MTM4LCBCSVQoMzApIH0sIAo+ID4gPiA+
ID4gPiA+ICsgW1JTVF9WRV0gPSB7IDB4MTNjLCBCSVQoMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBb
UlNUX0FDRV0gPSB7IDB4MTQ4LCBCSVQoMTYpIH0sIAo+ID4gPiA+ID4gPiA+ICsgW1JTVF9MVkRT
XSA9IHsgMHgxNGMsIEJJVCgwKSB9LCAKPiA+ID4gPiA+ID4gPiArIFtSU1RfR1BVXSA9IHsgMHgx
NTQsIEJJVCgzMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBbUlNUX0hETUlfSF0gPSB7IDB4MTcwLCBC
SVQoMCkgfSwgCj4gPiA+ID4gPiA+ID4gKyBbUlNUX0hETUlfU1lTXSA9IHsgMHgxNzAsIEJJVCgx
KSB9LCAKPiA+ID4gPiA+ID4gPiArIFtSU1RfSERNSV9BVURJT19ETUFdID0geyAweDE3MCwgQklU
KDIpIH0sIAo+ID4gPiArfTsgCj4gPiA+ICsgCj4gPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHN1
bnhpX2NjdV9kZXNjIHN1bjdpX2EyMF9jY3VfZGVzYyA9IHsgCj4gPiA+ID4gPiA+ID4gKyAuY2N1
X2Nsa3MgPSBzdW43aV9hMjBfY2N1X2Nsa3MsIAo+ID4gPiA+ID4gPiA+ICsgLm51bV9jY3VfY2xr
cyA9IEFSUkFZX1NJWkUoc3VuN2lfYTIwX2NjdV9jbGtzKSwgCj4gPiA+ICsgCj4gPiA+ID4gPiA+
ID4gKyAuaHdfY2xrcyA9ICZzdW43aV9hMjBfaHdfY2xrcywgCj4gPiA+ICsgCj4gPiA+ID4gPiA+
ID4gKyAucmVzZXRzID0gc3VuN2lfYTIwX2NjdV9yZXNldHMsIAo+ID4gPiA+ID4gPiA+ICsgLm51
bV9yZXNldHMgPSBBUlJBWV9TSVpFKHN1bjdpX2EyMF9jY3VfcmVzZXRzKSwgCj4gPiA+ICt9OyAK
PiA+ID4gKyAKPiA+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBzdW43aV9hMjBfY2N1X3NldHVwKHN0
cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkgCj4gPiA+ICt7IAo+ID4gPiA+ID4gKyB2b2lkIF9faW9t
ZW0gKnJlZzsgCj4gPiA+ID4gPiArIHUzMiB2YWw7IAo+ID4gPiArIAo+ID4gPiA+ID4gKyByZWcg
PSBvZl9pb19yZXF1ZXN0X2FuZF9tYXAobm9kZSwgMCwgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkp
OyAKPiA+ID4gPiA+ICsgaWYgKElTX0VSUihyZWcpKSB7IAo+ID4gPiA+ID4gKyBwcl9lcnIoIiVz
OiBDb3VsZCBub3QgbWFwIHRoZSBjbG9jayByZWdpc3RlcnNcbiIsIAo+ID4gPiA+ID4gKyDCoMKg
wqDCoMKgwqDCoG9mX25vZGVfZnVsbF9uYW1lKG5vZGUpKTsgCj4gPiA+ID4gPiArIHJldHVybjsg
Cj4gPiA+ID4gPiArIH0gCj4gPiA+ICsgCj4gPiA+ICsgI2RlZmluZSBTVU43SV9QTExfQVVESU9f
UkVHIDB4MDA4IAo+ID4gCj4gPiBUaGlzIHNob3VsZCBiZSBkZWZpbmVkIGFib3ZlIAo+Cj4gV2ls
bCBkby4uIAo+ID4gCj4gPiA+ICsgCj4gPiA+ID4gPiArIC8qIEZvcmNlIHRoZSBQTEwtQXVkaW8t
MXggZGl2aWRlciB0byA0ICovIAo+ID4gPiA+ID4gKyB2YWwgPSByZWFkbChyZWcgKyBTVU43SV9Q
TExfQVVESU9fUkVHKTsgCj4gPiA+ID4gPiArIHZhbCAmPSB+R0VOTUFTSygxOSwgMTYpOyAKPiA+
ID4gPiA+ICsgd3JpdGVsKHZhbCB8ICgzIDw8IDE2KSwgcmVnICsgU1VON0lfUExMX0FVRElPX1JF
Ryk7IAo+ID4gPiArIAo+ID4gPiA+ID4gKyAvKiAKPiA+ID4gPiA+ICsgwqAqIFVzZSBQTEw2IGFz
IHBhcmVudCBmb3IgQUhCIAo+ID4gPiArIMKgKiBDUFUvQVhJIGNsb2NrIGNoYW5nZXMgcmF0ZSB3
aGVuIGNwdWZyZXEgaXMgZW5hYmxlZCAKPiA+IAo+ID4gSSdtIG5vdCBzdXJlIHdoeSB0aGF0IGxh
c3Qgc2VudGVuY2UgaXMgbmVlZGVkIHRvby4gQSBsb3Qgb2YgY2xvY2sgCj4gPiBsaXN0ZWQgdGhl
cmUgY2hhbmdlIHJhdGUgd2hlbiA8c29tZS1mZWF0dXJlPiBpcyBlbmFibGVkLiAKPgo+IFdpbGwg
cmVtb3ZlLiAKPgo+ID4gCj4gPiA+ICsvKiBTb21lIEFIQiBnYXRlcyBhcmUgZXhwb3J0ZWQgKi8g
Cj4gPiA+ID4gPiArI2RlZmluZSBDTEtfQUhCX0JJU1QgMzEgCj4gPiA+ID4gPiArI2RlZmluZSBD
TEtfQUhCX01TIDM2IAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0FIQl9TRFJBTSAzOCAKPiA+ID4g
PiA+ICsjZGVmaW5lIENMS19BSEJfQUNFIDM5IAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0FIQl9U
UyA0MSAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19BSEJfVkUgNDggCj4gPiA+ID4gPiArI2RlZmlu
ZSBDTEtfQUhCX1RWRCA0OSAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19BSEJfVFZFMSA1MSAKPiA+
ID4gPiA+ICsjZGVmaW5lIENMS19BSEJfTENEMSA1MyAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19B
SEJfQ1NJMCA1NCAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19BSEJfQ1NJMSA1NSAKPiA+ID4gPiA+
ICsjZGVmaW5lIENMS19BSEJfSERNSTAgNTYgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfQUhCX0RF
X0JFMSA1OSAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19BSEJfREVfRkUwIDYwIAo+ID4gPiA+ID4g
KyNkZWZpbmUgQ0xLX0FIQl9ERV9GRTEgNjEgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfQUhCX01Q
IDYzIAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0FIQl9HUFUgNjQgCj4gPiA+ICsgCj4gPiA+ICsv
KiBTb21lIEFQQjAgZ2F0ZXMgYXJlIGV4cG9ydGVkICovIAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xL
X0FQQjBfQUM5NyA2NyAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19BUEIwX0tFWVBBRCA3NCAKPiA+
ID4gKyAKPiA+ID4gKy8qIFNvbWUgQVBCMSBnYXRlcyBhcmUgZXhwb3J0ZWQgKi8gCj4gPiA+ID4g
PiArI2RlZmluZSBDTEtfQVBCMV9DQU4gNzkgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfQVBCMV9T
Q1IgODAgCj4gPiA+ICsgCj4gPiA+ICsvKiBTb21lIElQIG1vZHVsZSBjbG9ja3MgYXJlIGV4cG9y
dGVkICovIAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX01TIDkzIAo+ID4gPiA+ID4gKyNkZWZpbmUg
Q0xLX1RTIDEwNiAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19QQVRBIDExMSAKPiA+ID4gPiA+ICsj
ZGVmaW5lIENMS19BQzk3IDExNSAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19LRVlQQUQgMTE3IAo+
ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX1NBVEEgMTE4IAo+ID4gPiArIAo+ID4gPiArLyogU29tZSBE
UkFNIGdhdGVzIGFyZSBleHBvcnRlZCAqLyAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19EUkFNX1ZF
IDEyNSAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19EUkFNX0NTSTAgMTI2IAo+ID4gPiA+ID4gKyNk
ZWZpbmUgQ0xLX0RSQU1fQ1NJMSAxMjcgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfRFJBTV9UUyAx
MjggCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfRFJBTV9UVkQgMTI5IAo+ID4gPiA+ID4gKyNkZWZp
bmUgQ0xLX0RSQU1fVFZFMSAxMzEgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfRFJBTV9PVVQgMTMy
IAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0RSQU1fREVfRkUxIDEzMyAKPiA+ID4gPiA+ICsjZGVm
aW5lIENMS19EUkFNX0RFX0ZFMCAxMzQgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfRFJBTV9ERV9C
RTEgMTM2IAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0RSQU1fTVAgMTM3IAo+ID4gPiA+ID4gKyNk
ZWZpbmUgQ0xLX0RSQU1fQUNFIDEzOCAKPiA+ID4gKyAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19E
RV9CRTEgMTQwIAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0RFX0ZFMCAxNDEgCj4gPiA+ID4gPiAr
I2RlZmluZSBDTEtfREVfRkUxIDE0MiAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19ERV9NUCAxNDMg
Cj4gPiA+ID4gPiArI2RlZmluZSBDTEtfVENPTjFfQ0gwIDE0NSAKPiA+ID4gPiA+ICsjZGVmaW5l
IENMS19DU0lfU1BFQ0lBTCAxNDYgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfVFZEIDE0NyAKPiA+
ID4gPiA+ICsjZGVmaW5lIENMS19UQ09OMF9DSDFfU0NMSzIgMTQ4IAo+ID4gPiA+ID4gKyNkZWZp
bmUgQ0xLX1RDT04xX0NIMV9TQ0xLMiAxNTAgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfVENPTjFf
Q0gxIDE1MSAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19DU0kwIDE1MiAKPiA+ID4gPiA+ICsjZGVm
aW5lIENMS19DU0kxIDE1MyAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19WRSAxNTQgCj4gPiA+ID4g
PiArI2RlZmluZSBDTEtfQVZTIDE1NiAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19BQ0UgMTU3IAo+
ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0hETUkgMTU4IAo+ID4gPiA+ID4gKyNkZWZpbmUgQ0xLX0dQ
VSAxNTkgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfTUJVUyAxNjAgCj4gPiA+ID4gPiArI2RlZmlu
ZSBDTEtfSERNSTFfU0xPVyAxNjEgCj4gPiA+ID4gPiArI2RlZmluZSBDTEtfSERNSTFfUkVQRUFU
IDE2MiAKPiA+ID4gPiA+ICsjZGVmaW5lIENMS19PVVRfQSAxNjMgCj4gPiA+ICsjZGVmaW5lIENM
S19PVVRfQiAxNjQgCj4gPiAKPiA+IElzIHRoZXJlIGEgcmVhc29uIG5vdCB0byBleHBvc2UgdGhl
c2UgY2xvY2tzPyAKPgo+IEkgZXhwb3NlZCB0aGVtIG9uIG5lZWQgdG8gaGF2ZSBiYXNpcy4gQW5k
IGJhc2ljYWxseSBkaWQgb25lLXRvLW9uZSAKPiBjb252ZXJzaW9uIGZyb20gZGV2aWNldHJlZS4g
Cj4KPiBQw6Rpa2VzdCwgCj4gUHJpaXQgCg==

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Re: [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver
  2017-03-02 14:21         ` Maxime Ripard
@ 2017-03-02 15:05           ` Chen-Yu Tsai
  0 siblings, 0 replies; 5+ messages in thread
From: Chen-Yu Tsai @ 2017-03-02 15:05 UTC (permalink / raw)
  To: Maxime Ripard
  Cc: Priit Laes, Michael Turquette, Stephen Boyd, Rob Herring,
	Mark Rutland, Chen-Yu Tsai, Russell King, Icenowy Zheng,
	linux-clk, devicetree, linux-arm-kernel, linux-kernel,
	linux-sunxi

On Thu, Mar 2, 2017 at 10:21 PM, Maxime Ripard
<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> Hi Priit,
>
> On Wed, Mar 01, 2017 at 11:38:14PM +0200, Priit Laes wrote:
>> > > +/* PLL2 - Audio clock */
>> > > +static struct ccu_nm pll_audio_base_clk = {
>> > > > > > > + .enable         = BIT(31),
>> > > > > > > + .n              = _SUNXI_CCU_MULT_OFFSET(8, 7, 0),
>> > > > > > > + .m              = _SUNXI_CCU_DIV_OFFSET(0, 5, 0),
>> > > > > > > + .common         = {
>> > > > > > > +         .reg            = 0x008,
>> > > > > > > +         .hw.init        = CLK_HW_INIT("pll-audio-base",
>> > > > > +                                           "hosc",
>> > > > > +                                           &ccu_nm_ops,
>> > > > > +                                           0),
>> > > > > +     },
>> > > +
>> > > +};
>> >
>> > You're forgetting the post-divider here
>>
>> It's hardcoded to 4 during ccu initialization, similar to what is done
>> on the other SoCs (A13, A31..).
>
> Right, sorry, I only saw it later. Please move that define you've been
> using here, and it will be fine :)
>
>> > > +/* TODO: pll8 gpu 0x040 */
>> >
>> > Please add all the clocks.
>>
>> I'm not really comfortable adding clocks for blocks that currently lack
>> drivers.
>
> Yet, you did it for quite a significant amount already (VE, NAND,
> AC97, DE MP, etc.). Don't get me wrong, this is definitely not a
> criticism. One of the point of the switch to sunxi-ng was that we
> would get out of the previous situation where every time you wanted to
> do something, you needed to add some clocks.
>
> We have some generic code that, if fed the right data, will
> (hopefully) just work. So it's pretty safe to add (and this is better
> to be consistent, and that's the policy we had for all the other CCU
> drivers).
>
>> > > +/* BIT(21 .. 31) - reserved */
>> >
>> > I'm not sure we need those comments either.
>> >
>> > > +/*
>> > > + * TODO: SATA clock also supports external clock as parent.
>> > > + * Currently we default to using PLL6 SATA gate.
>> > > + */
>> >
>> > Which external clock? It should be modelled anyway. If we have a
>> > dependency on some other clock, it should be in our DT binding, and
>> > listed in the mux there.
>> >
>> > Otherwise, the clock framework will not be able to deal with that mux
>> > being already set by the bootloader, and if we need to support that
>> > clock in the future, our binding will be ready for it.
>>
>> I wish I knew which clock they're talking about..
>>
>> User manuals (A10/A20) only specify following in the clock register
>> description:
>>
>> BIT(24) - CLK_SRC_GATING, default 0x0
>> Clock Source Select:
>> 0: PLL6 for SATA(100MHz)
>> 1: External Clock
>>
>> There's no section for SATA (called NC) in A10 manual, and in A20
>> manual only contains list of SATA/AHCI features.
>
> Hmmmm, ok :/

The external clock is probably an optional crystal or oscillator
that can be connected to the SATA-CLKM / SATA-CLKP pins.

The datasheet does not say what the frequency or any other parameters
should be though. And to my knowledge no board uses it.

ChenYu

>> > > +/* Some AHB gates are exported */
>> > > > > +#define CLK_AHB_BIST         31
>> > > > > +#define CLK_AHB_MS           36
>> > > > > +#define CLK_AHB_SDRAM                38
>> > > > > +#define CLK_AHB_ACE          39
>> > > > > +#define CLK_AHB_TS           41
>> > > > > +#define CLK_AHB_VE           48
>> > > > > +#define CLK_AHB_TVD          49
>> > > > > +#define CLK_AHB_TVE1         51
>> > > > > +#define CLK_AHB_LCD1         53
>> > > > > +#define CLK_AHB_CSI0         54
>> > > > > +#define CLK_AHB_CSI1         55
>> > > > > +#define CLK_AHB_HDMI0                56
>> > > > > +#define CLK_AHB_DE_BE1               59
>> > > > > +#define CLK_AHB_DE_FE0               60
>> > > > > +#define CLK_AHB_DE_FE1               61
>> > > > > +#define CLK_AHB_MP           63
>> > > > > +#define CLK_AHB_GPU          64
>> > > +
>> > > +/* Some APB0 gates are exported */
>> > > > > +#define CLK_APB0_AC97                67
>> > > > > +#define CLK_APB0_KEYPAD              74
>> > > +
>> > > +/* Some APB1 gates are exported */
>> > > > > +#define CLK_APB1_CAN         79
>> > > > > +#define CLK_APB1_SCR         80
>> > > +
>> > > +/* Some IP module clocks are exported */
>> > > > > +#define CLK_MS                       93
>> > > > > +#define CLK_TS                       106
>> > > > > +#define CLK_PATA             111
>> > > > > +#define CLK_AC97             115
>> > > > > +#define CLK_KEYPAD           117
>> > > > > +#define CLK_SATA             118
>> > > +
>> > > +/* Some DRAM gates are exported */
>> > > > > +#define CLK_DRAM_VE          125
>> > > > > +#define CLK_DRAM_CSI0                126
>> > > > > +#define CLK_DRAM_CSI1                127
>> > > > > +#define CLK_DRAM_TS          128
>> > > > > +#define CLK_DRAM_TVD         129
>> > > > > +#define CLK_DRAM_TVE1                131
>> > > > > +#define CLK_DRAM_OUT         132
>> > > > > +#define CLK_DRAM_DE_FE1              133
>> > > > > +#define CLK_DRAM_DE_FE0              134
>> > > > > +#define CLK_DRAM_DE_BE1              136
>> > > > > +#define CLK_DRAM_MP          137
>> > > > > +#define CLK_DRAM_ACE         138
>> > > +
>> > > > > +#define CLK_DE_BE1           140
>> > > > > +#define CLK_DE_FE0           141
>> > > > > +#define CLK_DE_FE1           142
>> > > > > +#define CLK_DE_MP            143
>> > > > > +#define CLK_TCON1_CH0                145
>> > > > > +#define CLK_CSI_SPECIAL              146
>> > > > > +#define CLK_TVD                      147
>> > > > > +#define CLK_TCON0_CH1_SCLK2  148
>> > > > > +#define CLK_TCON1_CH1_SCLK2  150
>> > > > > +#define CLK_TCON1_CH1                151
>> > > > > +#define CLK_CSI0             152
>> > > > > +#define CLK_CSI1             153
>> > > > > +#define CLK_VE                       154
>> > > > > +#define CLK_AVS                      156
>> > > > > +#define CLK_ACE                      157
>> > > > > +#define CLK_HDMI             158
>> > > > > +#define CLK_GPU                      159
>> > > > > +#define CLK_MBUS             160
>> > > > > +#define CLK_HDMI1_SLOW               161
>> > > > > +#define CLK_HDMI1_REPEAT     162
>> > > > > +#define CLK_OUT_A            163
>> > > +#define CLK_OUT_B                164
>> >
>> > Is there a reason not to expose these clocks?
>>
>> I exposed them on need to have basis. And basically did one-to-one
>> conversion from devicetree.
>
> I guess we can still make some pretty good assumptions on what's going
> to be needed at some point.
>
> All the mod clocks will be, the bus gates too, the CPU too. All the
> internal ones (PLL, AXI, APB, etc) can remain hidden though.
>
> Thanks!
> Maxime
>
> --
> Maxime Ripard, Free Electrons
> Embedded Linux and Kernel engineering
> http://free-electrons.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Re: [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver
       [not found]       ` <1488404294.29650.3.camel-q/aMd4JkU83YtjvyW6yDsg@public.gmane.org>
@ 2017-03-02 14:21         ` Maxime Ripard
  2017-03-02 15:05           ` Chen-Yu Tsai
  0 siblings, 1 reply; 5+ messages in thread
From: Maxime Ripard @ 2017-03-02 14:21 UTC (permalink / raw)
  To: Priit Laes
  Cc: Michael Turquette, Stephen Boyd, Rob Herring, Mark Rutland,
	Chen-Yu Tsai, Russell King, Icenowy Zheng,
	linux-clk-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw

[-- Attachment #1: Type: text/plain, Size: 5961 bytes --]

Hi Priit,

On Wed, Mar 01, 2017 at 11:38:14PM +0200, Priit Laes wrote:
> > > +/* PLL2 - Audio clock */
> > > +static struct ccu_nm pll_audio_base_clk = {
> > > > > > > +	.enable		= BIT(31),
> > > > > > > +	.n		= _SUNXI_CCU_MULT_OFFSET(8, 7, 0),
> > > > > > > +	.m		= _SUNXI_CCU_DIV_OFFSET(0, 5, 0),
> > > > > > > +	.common		= {
> > > > > > > +		.reg		= 0x008,
> > > > > > > +		.hw.init	= CLK_HW_INIT("pll-audio-base",
> > > > > +					      "hosc",
> > > > > +					      &ccu_nm_ops,
> > > > > +					      0),
> > > > > +	},
> > > +
> > > +};
> > 
> > You're forgetting the post-divider here
> 
> It's hardcoded to 4 during ccu initialization, similar to what is done
> on the other SoCs (A13, A31..).

Right, sorry, I only saw it later. Please move that define you've been
using here, and it will be fine :)

> > > +/* TODO: pll8 gpu 0x040 */
> > 
> > Please add all the clocks.
> 
> I'm not really comfortable adding clocks for blocks that currently lack
> drivers.

Yet, you did it for quite a significant amount already (VE, NAND,
AC97, DE MP, etc.). Don't get me wrong, this is definitely not a
criticism. One of the point of the switch to sunxi-ng was that we
would get out of the previous situation where every time you wanted to
do something, you needed to add some clocks.

We have some generic code that, if fed the right data, will
(hopefully) just work. So it's pretty safe to add (and this is better
to be consistent, and that's the policy we had for all the other CCU
drivers).

> > > +/* BIT(21 .. 31) - reserved */
> > 
> > I'm not sure we need those comments either.
> > 
> > > +/*
> > > + * TODO: SATA clock also supports external clock as parent.
> > > + * Currently we default to using PLL6 SATA gate.
> > > + */
> > 
> > Which external clock? It should be modelled anyway. If we have a
> > dependency on some other clock, it should be in our DT binding, and
> > listed in the mux there.
> > 
> > Otherwise, the clock framework will not be able to deal with that mux
> > being already set by the bootloader, and if we need to support that
> > clock in the future, our binding will be ready for it.
> 
> I wish I knew which clock they're talking about..
> 
> User manuals (A10/A20) only specify following in the clock register
> description:
> 
> BIT(24) - CLK_SRC_GATING, default 0x0
> Clock Source Select:
> 0: PLL6 for SATA(100MHz)
> 1: External Clock
> 
> There's no section for SATA (called NC) in A10 manual, and in A20
> manual only contains list of SATA/AHCI features.

Hmmmm, ok :/

> > > +/* Some AHB gates are exported */
> > > > > +#define CLK_AHB_BIST		31
> > > > > +#define CLK_AHB_MS		36
> > > > > +#define CLK_AHB_SDRAM		38
> > > > > +#define CLK_AHB_ACE		39
> > > > > +#define CLK_AHB_TS		41
> > > > > +#define CLK_AHB_VE		48
> > > > > +#define CLK_AHB_TVD		49
> > > > > +#define CLK_AHB_TVE1		51
> > > > > +#define CLK_AHB_LCD1		53
> > > > > +#define CLK_AHB_CSI0		54
> > > > > +#define CLK_AHB_CSI1		55
> > > > > +#define CLK_AHB_HDMI0		56
> > > > > +#define CLK_AHB_DE_BE1		59
> > > > > +#define CLK_AHB_DE_FE0		60
> > > > > +#define CLK_AHB_DE_FE1		61
> > > > > +#define CLK_AHB_MP		63
> > > > > +#define CLK_AHB_GPU		64
> > > +
> > > +/* Some APB0 gates are exported */
> > > > > +#define CLK_APB0_AC97		67
> > > > > +#define CLK_APB0_KEYPAD		74
> > > +
> > > +/* Some APB1 gates are exported */
> > > > > +#define CLK_APB1_CAN		79
> > > > > +#define CLK_APB1_SCR		80
> > > +
> > > +/* Some IP module clocks are exported */
> > > > > +#define CLK_MS			93
> > > > > +#define CLK_TS			106
> > > > > +#define CLK_PATA		111
> > > > > +#define CLK_AC97		115
> > > > > +#define CLK_KEYPAD		117
> > > > > +#define CLK_SATA		118
> > > +
> > > +/* Some DRAM gates are exported */
> > > > > +#define CLK_DRAM_VE		125
> > > > > +#define CLK_DRAM_CSI0		126
> > > > > +#define CLK_DRAM_CSI1		127
> > > > > +#define CLK_DRAM_TS		128
> > > > > +#define CLK_DRAM_TVD		129
> > > > > +#define CLK_DRAM_TVE1		131
> > > > > +#define CLK_DRAM_OUT		132
> > > > > +#define CLK_DRAM_DE_FE1		133
> > > > > +#define CLK_DRAM_DE_FE0		134
> > > > > +#define CLK_DRAM_DE_BE1		136
> > > > > +#define CLK_DRAM_MP		137
> > > > > +#define CLK_DRAM_ACE		138
> > > +
> > > > > +#define CLK_DE_BE1		140
> > > > > +#define CLK_DE_FE0		141
> > > > > +#define CLK_DE_FE1		142
> > > > > +#define CLK_DE_MP		143
> > > > > +#define CLK_TCON1_CH0		145
> > > > > +#define CLK_CSI_SPECIAL		146
> > > > > +#define CLK_TVD			147
> > > > > +#define CLK_TCON0_CH1_SCLK2	148
> > > > > +#define CLK_TCON1_CH1_SCLK2	150
> > > > > +#define CLK_TCON1_CH1		151
> > > > > +#define CLK_CSI0		152
> > > > > +#define CLK_CSI1		153
> > > > > +#define CLK_VE			154
> > > > > +#define CLK_AVS			156
> > > > > +#define CLK_ACE			157
> > > > > +#define CLK_HDMI		158
> > > > > +#define CLK_GPU			159
> > > > > +#define CLK_MBUS		160
> > > > > +#define CLK_HDMI1_SLOW		161
> > > > > +#define CLK_HDMI1_REPEAT	162
> > > > > +#define CLK_OUT_A		163
> > > +#define CLK_OUT_B		164
> > 
> > Is there a reason not to expose these clocks?
> 
> I exposed them on need to have basis. And basically did one-to-one
> conversion from devicetree.

I guess we can still make some pretty good assumptions on what's going
to be needed at some point.

All the mod clocks will be, the bus gates too, the CPU too. All the
internal ones (PLL, AXI, APB, etc) can remain hidden though.

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

-- 
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Re: [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver
  2017-02-28  8:21   ` Maxime Ripard
@ 2017-03-01 21:38     ` Priit Laes
       [not found]       ` <1488404294.29650.3.camel-q/aMd4JkU83YtjvyW6yDsg@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Priit Laes @ 2017-03-01 21:38 UTC (permalink / raw)
  To: maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8
  Cc: Michael Turquette, Stephen Boyd, Rob Herring, Mark Rutland,
	Chen-Yu Tsai, Russell King, Icenowy Zheng,
	linux-clk-u79uwXL29TY76Z2rM5mHXA,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw

On Tue, 2017-02-28 at 09:21 +0100, Maxime Ripard wrote:
> Hi,
> 
> On Mon, Feb 27, 2017 at 11:09:12PM +0200, Priit Laes wrote:
> > Introduce a clock controller driver for sun7i A20 SoC.
> > 
> > > > Signed-off-by: Priit Laes <plaes-q/aMd4JkU83YtjvyW6yDsg@public.gmane.org>
> > ---
> >  drivers/clk/sunxi-ng/Kconfig         |   11 +
> >  drivers/clk/sunxi-ng/Makefile        |    1 +
> >  drivers/clk/sunxi-ng/ccu-sun7i-a20.c | 1068 ++++++++++++++++++++++++++++++++++
> >  drivers/clk/sunxi-ng/ccu-sun7i-a20.h |  121 ++++
> >  4 files changed, 1201 insertions(+)
> >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun7i-a20.c
> >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun7i-a20.h
> > 
> > diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig
> > index 695bbf9..4f436ab 100644
> > --- a/drivers/clk/sunxi-ng/Kconfig
> > +++ b/drivers/clk/sunxi-ng/Kconfig
> > @@ -85,6 +85,17 @@ config SUN6I_A31_CCU
> > > >  	select SUNXI_CCU_PHASE
> > > >  	default MACH_SUN6I
> >  
> > +config SUN7I_A20_CCU
> > > > +	bool "Support for the Allwinner A20 CCU"
> > > > +	select SUNXI_CCU_DIV
> > > > +	select SUNXI_CCU_MULT
> > > > +	select SUNXI_CCU_NK
> > > > +	select SUNXI_CCU_NKM
> > > > +	select SUNXI_CCU_NM
> > > > +	select SUNXI_CCU_MP
> > > > +	select SUNXI_CCU_PHASE
> > > > +	default MACH_SUN7I
> > +
> >  config SUN8I_A23_CCU
> > > >  	bool "Support for the Allwinner A23 CCU"
> > > >  	select SUNXI_CCU_DIV
> > diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi-ng/Makefile
> > index 6feaac0..bedda5b 100644
> > --- a/drivers/clk/sunxi-ng/Makefile
> > +++ b/drivers/clk/sunxi-ng/Makefile
> > > > @@ -21,6 +21,7 @@ obj-$(CONFIG_SUNXI_CCU_MP)	+= ccu_mp.o
> > > >  obj-$(CONFIG_SUN50I_A64_CCU)	+= ccu-sun50i-a64.o
> > > >  obj-$(CONFIG_SUN5I_CCU)		+= ccu-sun5i.o
> > > >  obj-$(CONFIG_SUN6I_A31_CCU)	+= ccu-sun6i-a31.o
> > > > +obj-$(CONFIG_SUN7I_A20_CCU)	+= ccu-sun7i-a20.o
> > > >  obj-$(CONFIG_SUN8I_A23_CCU)	+= ccu-sun8i-a23.o
> > > >  obj-$(CONFIG_SUN8I_A33_CCU)	+= ccu-sun8i-a33.o
> > > >  obj-$(CONFIG_SUN8I_H3_CCU)	+= ccu-sun8i-h3.o
> > diff --git a/drivers/clk/sunxi-ng/ccu-sun7i-a20.c b/drivers/clk/sunxi-ng/ccu-sun7i-a20.c
> > new file mode 100644
> > index 0000000..90d2f13
> > --- /dev/null
> > +++ b/drivers/clk/sunxi-ng/ccu-sun7i-a20.c
> > @@ -0,0 +1,1068 @@
> > +/*
> > + * Copyright (c) 2017 Priit Laes. All rights reserved.
> > + *
> > + * This software is licensed under the terms of the GNU General Public
> > + * License version 2, as published by the Free Software Foundation, and
> > + * may be copied, distributed, and modified under those terms.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + */
> > +
> > +#include <linux/clk-provider.h>
> > +#include <linux/of_address.h>
> > +
> > +#include "ccu_common.h"
> > +#include "ccu_reset.h"
> > +
> > +#include "ccu_div.h"
> > +#include "ccu_gate.h"
> > +#include "ccu_mp.h"
> > +#include "ccu_mult.h"
> > +#include "ccu_nk.h"
> > +#include "ccu_nkm.h"
> > +#include "ccu_nkmp.h"
> > +#include "ccu_nm.h"
> > +#include "ccu_phase.h"
> > +
> > +#include "ccu-sun7i-a20.h"
> > +
> > +/*
> > + * PLL1 - Core clock
> > + *
> > + * TODO: sigma-delta pattern bits 2 & 3
> > + * TODO: PLL1 tuning register
> 
> I don't think we need those TODO's at all, and these comments too. If
> the clock name is good enough (and it is), it's redundant.

Ok, will clean them up.

> 
> > + */
> > 
[...]
> > +};
> > +
> > +/* PLL2 - Audio clock */
> > +static struct ccu_nm pll_audio_base_clk = {
> > > > > > +	.enable		= BIT(31),
> > > > > > +	.n		= _SUNXI_CCU_MULT_OFFSET(8, 7, 0),
> > > > > > +	.m		= _SUNXI_CCU_DIV_OFFSET(0, 5, 0),
> > > > > > +	.common		= {
> > > > > > +		.reg		= 0x008,
> > > > > > +		.hw.init	= CLK_HW_INIT("pll-audio-base",
> > > > +					      "hosc",
> > > > +					      &ccu_nm_ops,
> > > > +					      0),
> > > > +	},
> > +
> > +};
> 
> You're forgetting the post-divider here

It's hardcoded to 4 during ccu initialization, similar to what is done
on the other SoCs (A13, A31..).

> 
> > +/* TODO: pll8 gpu 0x040 */
> 
> Please add all the clocks.

I'm not really comfortable adding clocks for blocks that currently lack
drivers.

> > +/* BIT(21 .. 31) - reserved */
> 
> I'm not sure we need those comments either.
> 
> > +/*
> > + * TODO: SATA clock also supports external clock as parent.
> > + * Currently we default to using PLL6 SATA gate.
> > + */
> 
> Which external clock? It should be modelled anyway. If we have a
> dependency on some other clock, it should be in our DT binding, and
> listed in the mux there.
> 
> Otherwise, the clock framework will not be able to deal with that mux
> being already set by the bootloader, and if we need to support that
> clock in the future, our binding will be ready for it.

I wish I knew which clock they're talking about..

User manuals (A10/A20) only specify following in the clock register
description:

BIT(24) - CLK_SRC_GATING, default 0x0
Clock Source Select:
0: PLL6 for SATA(100MHz)
1: External Clock

There's no section for SATA (called NC) in A10 manual, and in A20
manual only contains list of SATA/AHCI features.


> 
> > +static CLK_FIXED_FACTOR(pll_periph_2x_clk, "pll-periph-2x",
> > > > +			"pll-periph", 1, 2, CLK_SET_RATE_PARENT);
> > +/* We hardcode the divider to 4 for now */
> > +static CLK_FIXED_FACTOR(pll_audio_clk, "pll-audio",
> > > > +			"pll-audio-base", 4, 1, CLK_SET_RATE_PARENT);
> > +static CLK_FIXED_FACTOR(pll_audio_2x_clk, "pll-audio-2x",
> > > > +			"pll-audio-base", 2, 1, CLK_SET_RATE_PARENT);
> > +static CLK_FIXED_FACTOR(pll_audio_4x_clk, "pll-audio-4x",
> > > > +			"pll-audio-base", 1, 1, CLK_SET_RATE_PARENT);
> > +static CLK_FIXED_FACTOR(pll_audio_8x_clk, "pll-audio-8x",
> > > > +			"pll-audio-base", 1, 2, CLK_SET_RATE_PARENT);
> > +static CLK_FIXED_FACTOR(pll_video0_2x_clk, "pll-video0-2x",
> > > > +			"pll-video0", 1, 2, CLK_SET_RATE_PARENT);
> > +static CLK_FIXED_FACTOR(pll_video1_2x_clk, "pll-video1-2x",
> > +			"pll-video1", 1, 2, CLK_SET_RATE_PARENT);
> 
> It feels more natural to just have the clocks defined in the same
> order than their parents. So periph shouldn't be first

Ok, will move the periph clock after the video.

> > +static struct ccu_reset_map sun7i_a20_ccu_resets[] = {
> > +
> > > > > > +	[RST_USB_PHY0]		= { 0x0cc, BIT(0) },
> > > > > > +	[RST_USB_PHY1]		= { 0x0cc, BIT(1) },
> > > > > > +	[RST_USB_PHY2]		= { 0x0cc, BIT(2) },
> > > > > > +	[RST_DE_BE0]		= { 0x104, BIT(30) },
> > > > > > +	[RST_DE_BE1]		= { 0x108, BIT(30) },
> > > > > > +	[RST_DE_FE0]		= { 0x10c, BIT(30) },
> > > > > > +	[RST_DE_FE1]		= { 0x110, BIT(30) },
> > > > > > +	[RST_DE_MP]		= { 0x114, BIT(30) },
> > > > > > +	[RST_TCON0]		= { 0x118, BIT(30) },
> > > > > > +	[RST_TCON1]		= { 0x11c, BIT(30) },
> > > > > > +	[RST_CSI0]		= { 0x134, BIT(30) },
> > > > > > +	[RST_CSI1]		= { 0x138, BIT(30) },
> > > > > > +	[RST_VE]		= { 0x13c, BIT(0) },
> > > > > > +	[RST_ACE]		= { 0x148, BIT(16) },
> > > > > > +	[RST_LVDS]		= { 0x14c, BIT(0) },
> > > > > > +	[RST_GPU]		= { 0x154, BIT(30) },
> > > > > > +	[RST_HDMI_H]		= { 0x170, BIT(0) },
> > > > > > +	[RST_HDMI_SYS]		= { 0x170, BIT(1) },
> > > > > > +	[RST_HDMI_AUDIO_DMA]	= { 0x170, BIT(2) },
> > +};
> > +
> > +static const struct sunxi_ccu_desc sun7i_a20_ccu_desc = {
> > > > > > +	.ccu_clks	= sun7i_a20_ccu_clks,
> > > > > > +	.num_ccu_clks	= ARRAY_SIZE(sun7i_a20_ccu_clks),
> > +
> > > > > > +	.hw_clks	= &sun7i_a20_hw_clks,
> > +
> > > > > > +	.resets		= sun7i_a20_ccu_resets,
> > > > > > +	.num_resets	= ARRAY_SIZE(sun7i_a20_ccu_resets),
> > +};
> > +
> > +static void __init sun7i_a20_ccu_setup(struct device_node *node)
> > +{
> > > > +	void __iomem *reg;
> > > > +	u32 val;
> > +
> > > > +	reg = of_io_request_and_map(node, 0, of_node_full_name(node));
> > > > +	if (IS_ERR(reg)) {
> > > > +		pr_err("%s: Could not map the clock registers\n",
> > > > +		       of_node_full_name(node));
> > > > +		return;
> > > > +	}
> > +
> > +	#define SUN7I_PLL_AUDIO_REG	0x008
> 
> This should be defined above

Will do..
> 
> > +
> > > > +	/* Force the PLL-Audio-1x divider to 4 */
> > > > +	val = readl(reg + SUN7I_PLL_AUDIO_REG);
> > > > +	val &= ~GENMASK(19, 16);
> > > > +	writel(val | (3 << 16), reg + SUN7I_PLL_AUDIO_REG);
> > +
> > > > +	/*
> > > > +	 * Use PLL6 as parent for AHB
> > +	 * CPU/AXI clock changes rate when cpufreq is enabled
> 
> I'm not sure why that last sentence is needed too. A lot of clock
> listed there change rate when <some-feature> is enabled.

Will remove.

> 
> > +/* Some AHB gates are exported */
> > > > +#define CLK_AHB_BIST		31
> > > > +#define CLK_AHB_MS		36
> > > > +#define CLK_AHB_SDRAM		38
> > > > +#define CLK_AHB_ACE		39
> > > > +#define CLK_AHB_TS		41
> > > > +#define CLK_AHB_VE		48
> > > > +#define CLK_AHB_TVD		49
> > > > +#define CLK_AHB_TVE1		51
> > > > +#define CLK_AHB_LCD1		53
> > > > +#define CLK_AHB_CSI0		54
> > > > +#define CLK_AHB_CSI1		55
> > > > +#define CLK_AHB_HDMI0		56
> > > > +#define CLK_AHB_DE_BE1		59
> > > > +#define CLK_AHB_DE_FE0		60
> > > > +#define CLK_AHB_DE_FE1		61
> > > > +#define CLK_AHB_MP		63
> > > > +#define CLK_AHB_GPU		64
> > +
> > +/* Some APB0 gates are exported */
> > > > +#define CLK_APB0_AC97		67
> > > > +#define CLK_APB0_KEYPAD		74
> > +
> > +/* Some APB1 gates are exported */
> > > > +#define CLK_APB1_CAN		79
> > > > +#define CLK_APB1_SCR		80
> > +
> > +/* Some IP module clocks are exported */
> > > > +#define CLK_MS			93
> > > > +#define CLK_TS			106
> > > > +#define CLK_PATA		111
> > > > +#define CLK_AC97		115
> > > > +#define CLK_KEYPAD		117
> > > > +#define CLK_SATA		118
> > +
> > +/* Some DRAM gates are exported */
> > > > +#define CLK_DRAM_VE		125
> > > > +#define CLK_DRAM_CSI0		126
> > > > +#define CLK_DRAM_CSI1		127
> > > > +#define CLK_DRAM_TS		128
> > > > +#define CLK_DRAM_TVD		129
> > > > +#define CLK_DRAM_TVE1		131
> > > > +#define CLK_DRAM_OUT		132
> > > > +#define CLK_DRAM_DE_FE1		133
> > > > +#define CLK_DRAM_DE_FE0		134
> > > > +#define CLK_DRAM_DE_BE1		136
> > > > +#define CLK_DRAM_MP		137
> > > > +#define CLK_DRAM_ACE		138
> > +
> > > > +#define CLK_DE_BE1		140
> > > > +#define CLK_DE_FE0		141
> > > > +#define CLK_DE_FE1		142
> > > > +#define CLK_DE_MP		143
> > > > +#define CLK_TCON1_CH0		145
> > > > +#define CLK_CSI_SPECIAL		146
> > > > +#define CLK_TVD			147
> > > > +#define CLK_TCON0_CH1_SCLK2	148
> > > > +#define CLK_TCON1_CH1_SCLK2	150
> > > > +#define CLK_TCON1_CH1		151
> > > > +#define CLK_CSI0		152
> > > > +#define CLK_CSI1		153
> > > > +#define CLK_VE			154
> > > > +#define CLK_AVS			156
> > > > +#define CLK_ACE			157
> > > > +#define CLK_HDMI		158
> > > > +#define CLK_GPU			159
> > > > +#define CLK_MBUS		160
> > > > +#define CLK_HDMI1_SLOW		161
> > > > +#define CLK_HDMI1_REPEAT	162
> > > > +#define CLK_OUT_A		163
> > +#define CLK_OUT_B		164
> 
> Is there a reason not to expose these clocks?

I exposed them on need to have basis. And basically did one-to-one
conversion from devicetree.

Päikest,
Priit

-- 
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-03-02 15:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-02  5:54 Re: [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver Icenowy Zheng
2017-03-02  5:54 ` [linux-sunxi] " Icenowy Zheng
  -- strict thread matches above, loose matches on Subject: below --
2017-02-27 21:09 [PATCH 0/4] ARM: sun7i: Convert sun7i SoC to sunxi-ng Priit Laes
2017-02-27 21:09 ` [PATCH 2/4] clk: sunxi-ng: Add sun7i-a20 CCU driver Priit Laes
2017-02-28  8:21   ` Maxime Ripard
2017-03-01 21:38     ` Priit Laes
     [not found]       ` <1488404294.29650.3.camel-q/aMd4JkU83YtjvyW6yDsg@public.gmane.org>
2017-03-02 14:21         ` Maxime Ripard
2017-03-02 15:05           ` Chen-Yu Tsai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.