All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peng Fan <peng.fan@nxp.com>
To: Anson Huang <anson.huang@nxp.com>,
	"shawnguo@kernel.org" <shawnguo@kernel.org>,
	"s.hauer@pengutronix.de" <s.hauer@pengutronix.de>,
	"kernel@pengutronix.de" <kernel@pengutronix.de>,
	Fabio Estevam <fabio.estevam@nxp.com>,
	"mturquette@baylibre.com" <mturquette@baylibre.com>,
	"sboyd@kernel.org" <sboyd@kernel.org>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"linux-clk@vger.kernel.org" <linux-clk@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Rob Herring <robh@kernel.org>
Cc: dl-linux-imx <linux-imx@nxp.com>
Subject: RE: [PATCH 2/2] clk: imx: imx7d: remove clks_init_on array
Date: Mon, 13 Aug 2018 01:15:41 +0000	[thread overview]
Message-ID: <AM0PR04MB44813C7A3E0AF4F3BCFFCF0088390@AM0PR04MB4481.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <DB3PR0402MB3916F8BC381BBA01DB21D1C0F5260@DB3PR0402MB3916.eurprd04.prod.outlook.com>

Hi Anson,

> > > -----Original Message-----
> > > From: Anson Huang
> > > Sent: 2018年8月8日 12:39
> > > To: shawnguo@kernel.org; s.hauer@pengutronix.de;
> > > kernel@pengutronix.de; Fabio Estevam <fabio.estevam@nxp.com>;
> > > mturquette@baylibre.com; sboyd@kernel.org;
> > > linux-arm-kernel@lists.infradead.org;
> > > linux-clk@vger.kernel.org; linux-kernel@vger.kernel.org
> > > Cc: dl-linux-imx <linux-imx@nxp.com>
> > > Subject: [PATCH 2/2] clk: imx: imx7d: remove clks_init_on array
> > >
> > > Clock framework will enable those clocks registered with
> > > CLK_IS_CRITICAL flag, so no need to have clks_init_on array during
> > > clock
> > initialization now.
> >
> > Will it be more flexible to parse dts saying "critical-clocks = <xxx>"
> > or "init-on-arrary=<xxx>"
> > and enable those clocks?
> 
> Parsing the clocks arrays from dtb is another way of enabling critical clocks, but
> for current i.MX6/7 platforms, we implement it in same way as most of other
> SoCs, currently I did NOT see any necessity of putting them in dtb, just adding
> flag during clock registering is more simple, if there is any special requirement
> for different clocks set to be enabled, then we can add support to enable the
> method of parsing critical-clocks from dtb. Just my two cents.

Thinking about OP-TEE want to use one device, but it's clocks are registered
by Linux, because there is no module in Linux side use it, it will shutdown the clock,
which cause OP-TEE could not access the device.

Then people have to modify clk code to add CLK_IS_CRITICAL flag to make sure
the clocks are not shutdown by Linux.

However adding a new property in clk node and let driver code parse the dts,
there is no need to modify clk driver code when OP-TEE needs another device clock.

Regards,
Peng.

> 
> Anson.
> 
> >
> > Regards,
> > Peng.
> >
> > >
> > > Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
> > > ---
> > >  drivers/clk/imx/clk-imx7d.c | 27 ++++++++-------------------
> > >  drivers/clk/imx/clk.h       |  7 +++++++
> > >  2 files changed, 15 insertions(+), 19 deletions(-)
> > >
> > > diff --git a/drivers/clk/imx/clk-imx7d.c
> > > b/drivers/clk/imx/clk-imx7d.c index c4518d7..076460b 100644
> > > --- a/drivers/clk/imx/clk-imx7d.c
> > > +++ b/drivers/clk/imx/clk-imx7d.c
> > > @@ -379,13 +379,6 @@ static const char *pll_enet_bypass_sel[] = {
> > > "pll_enet_main", "pll_enet_main_src  static const char
> > > *pll_audio_bypass_sel[] = { "pll_audio_main", "pll_audio_main_src",
> > > }; static const char *pll_video_bypass_sel[] = { "pll_video_main",
> > > "pll_video_main_src", };
> > >
> > > -static int const clks_init_on[] __initconst = {
> > > -	IMX7D_ARM_A7_ROOT_CLK, IMX7D_MAIN_AXI_ROOT_CLK,
> > > -	IMX7D_PLL_SYS_MAIN_480M_CLK, IMX7D_IPG_ROOT_CLK,
> > > -	IMX7D_DRAM_PHYM_ROOT_CLK, IMX7D_DRAM_ROOT_CLK,
> > > -	IMX7D_DRAM_PHYM_ALT_ROOT_CLK, IMX7D_DRAM_ALT_ROOT_CLK,
> > > -};
> > > -
> > >  static struct clk_onecell_data clk_data;
> > >
> > >  static struct clk ** const uart_clks[] __initconst = { @@ -403,7
> > > +396,6 @@ static void __init imx7d_clocks_init(struct device_node
> > *ccm_node)  {
> > >  	struct device_node *np;
> > >  	void __iomem *base;
> > > -	int i;
> > >
> > >  	clks[IMX7D_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
> > >  	clks[IMX7D_OSC_24M_CLK] = of_clk_get_by_name(ccm_node, "osc");
> > @@
> > > -466,7 +458,7 @@ static void __init imx7d_clocks_init(struct
> > > device_node
> > > *ccm_node)
> > >  	clks[IMX7D_PLL_SYS_MAIN_120M] =
> > > imx_clk_fixed_factor("pll_sys_main_120m", "pll_sys_main_clk", 1, 4);
> > >  	clks[IMX7D_PLL_DRAM_MAIN_533M] =
> > > imx_clk_fixed_factor("pll_dram_533m", "pll_dram_main_clk", 1, 2);
> > >
> > > -	clks[IMX7D_PLL_SYS_MAIN_480M_CLK] =
> > > imx_clk_gate_dis("pll_sys_main_480m_clk", "pll_sys_main_480m", base
> > > + 0xb0, 4);
> > > +	clks[IMX7D_PLL_SYS_MAIN_480M_CLK] =
> > > +imx_clk_gate_dis_flags("pll_sys_main_480m_clk",
> > > +"pll_sys_main_480m", base + 0xb0, 4, CLK_IS_CRITICAL);
> > >  	clks[IMX7D_PLL_SYS_MAIN_240M_CLK] =
> > > imx_clk_gate_dis("pll_sys_main_240m_clk", "pll_sys_main_240m", base
> > > + 0xb0, 5);
> > >  	clks[IMX7D_PLL_SYS_MAIN_120M_CLK] =
> > > imx_clk_gate_dis("pll_sys_main_120m_clk", "pll_sys_main_120m", base
> > > + 0xb0, 6);
> > >  	clks[IMX7D_PLL_DRAM_MAIN_533M_CLK] =
> > > imx_clk_gate("pll_dram_533m_clk", "pll_dram_533m", base + 0x70, 12);
> > > @@
> > > -719,7 +711,7 @@ static void __init imx7d_clocks_init(struct
> > > device_node
> > > *ccm_node)
> > >  	clks[IMX7D_ENET_AXI_ROOT_DIV] =
> > > imx_clk_divider2("enet_axi_post_div", "enet_axi_pre_div", base +
> > > 0x8900, 0,
> > 6);
> > >  	clks[IMX7D_NAND_USDHC_BUS_ROOT_CLK] =
> > > imx_clk_divider2("nand_usdhc_root_clk", "nand_usdhc_pre_div", base +
> > > 0x8980, 0, 6);
> > >  	clks[IMX7D_AHB_CHANNEL_ROOT_DIV] =
> > > imx_clk_divider2("ahb_root_clk", "ahb_pre_div", base + 0x9000, 0, 6);
> > > -	clks[IMX7D_IPG_ROOT_CLK] = imx_clk_divider2("ipg_root_clk",
> > > "ahb_root_clk", base + 0x9080, 0, 2);
> > > +	clks[IMX7D_IPG_ROOT_CLK] = imx_clk_divider_flags("ipg_root_clk",
> > > +"ahb_root_clk", base + 0x9080, 0, 2, CLK_IS_CRITICAL |
> > > +CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_PARENT);
> > >  	clks[IMX7D_DRAM_ROOT_DIV] = imx_clk_divider2("dram_post_div",
> > > "dram_cg", base + 0x9880, 0, 3);
> > >  	clks[IMX7D_DRAM_PHYM_ALT_ROOT_DIV] =
> > > imx_clk_divider2("dram_phym_alt_post_div", "dram_phym_alt_pre_div",
> > > base
> > > + 0xa000, 0, 3);
> > >  	clks[IMX7D_DRAM_ALT_ROOT_DIV] =
> > > imx_clk_divider2("dram_alt_post_div", "dram_alt_pre_div", base +
> > > 0xa080, 0, 3); @@ -783,17 +775,17 @@ static void __init
> > > imx7d_clocks_init(struct device_node *ccm_node)
> > >  	clks[IMX7D_CLKO1_ROOT_DIV] = imx_clk_divider2("clko1_post_div",
> > > "clko1_pre_div", base + 0xbd80, 0, 6);
> > >  	clks[IMX7D_CLKO2_ROOT_DIV] = imx_clk_divider2("clko2_post_div",
> > > "clko2_pre_div", base + 0xbe00, 0, 6);
> > >
> > > -	clks[IMX7D_ARM_A7_ROOT_CLK] = imx_clk_gate4("arm_a7_root_clk",
> > > "arm_a7_div", base + 0x4000, 0);
> > > +	clks[IMX7D_ARM_A7_ROOT_CLK] =
> > > imx_clk_gate2_flags("arm_a7_root_clk",
> > > +"arm_a7_div", base + 0x4000, 0, CLK_IS_CRITICAL |
> > > +CLK_OPS_PARENT_ENABLE);
> > >  	clks[IMX7D_ARM_M4_ROOT_CLK] =
> imx_clk_gate4("arm_m4_root_clk",
> > > "arm_m4_div", base + 0x4010, 0);
> > > -	clks[IMX7D_MAIN_AXI_ROOT_CLK] = imx_clk_gate4("main_axi_root_clk",
> > > "axi_post_div", base + 0x4040, 0);
> > > +	clks[IMX7D_MAIN_AXI_ROOT_CLK] =
> > > +imx_clk_gate2_flags("main_axi_root_clk", "axi_post_div", base +
> > > +0x4040, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
> > >  	clks[IMX7D_DISP_AXI_ROOT_CLK] =
> imx_clk_gate4("disp_axi_root_clk",
> > > "disp_axi_post_div", base + 0x4050, 0);
> > >  	clks[IMX7D_ENET_AXI_ROOT_CLK] =
> imx_clk_gate4("enet_axi_root_clk",
> > > "enet_axi_post_div", base + 0x4060, 0);
> > >  	clks[IMX7D_OCRAM_CLK] = imx_clk_gate4("ocram_clk",
> > > "main_axi_root_clk", base + 0x4110, 0);
> > >  	clks[IMX7D_OCRAM_S_CLK] = imx_clk_gate4("ocram_s_clk",
> > > "ahb_root_clk", base + 0x4120, 0);
> > > -	clks[IMX7D_DRAM_ROOT_CLK] = imx_clk_gate4("dram_root_clk",
> > > "dram_post_div", base + 0x4130, 0);
> > > -	clks[IMX7D_DRAM_PHYM_ROOT_CLK] =
> > > imx_clk_gate4("dram_phym_root_clk", "dram_phym_cg", base + 0x4130,
> 0);
> > > -	clks[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] =
> > > imx_clk_gate4("dram_phym_alt_root_clk", "dram_phym_alt_post_div",
> > > base
> > > + 0x4130, 0);
> > > -	clks[IMX7D_DRAM_ALT_ROOT_CLK] =
> > imx_clk_gate4("dram_alt_root_clk",
> > > "dram_alt_post_div", base + 0x4130, 0);
> > > +	clks[IMX7D_DRAM_ROOT_CLK] =
> imx_clk_gate2_flags("dram_root_clk",
> > > "dram_post_div", base + 0x4130, 0, CLK_IS_CRITICAL |
> > > CLK_OPS_PARENT_ENABLE);
> > > +	clks[IMX7D_DRAM_PHYM_ROOT_CLK] =
> > > imx_clk_gate2_flags("dram_phym_root_clk", "dram_phym_cg", base +
> > > 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
> > > +	clks[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] =
> > > imx_clk_gate2_flags("dram_phym_alt_root_clk",
> > > "dram_phym_alt_post_div", base + 0x4130, 0, CLK_IS_CRITICAL |
> > > CLK_OPS_PARENT_ENABLE);
> > > +	clks[IMX7D_DRAM_ALT_ROOT_CLK] =
> > > +imx_clk_gate2_flags("dram_alt_root_clk", "dram_alt_post_div", base
> > > ++ 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
> > >  	clks[IMX7D_OCOTP_CLK] = imx_clk_gate4("ocotp_clk",
> "ipg_root_clk",
> > > base + 0x4230, 0);
> > >  	clks[IMX7D_SNVS_CLK] = imx_clk_gate4("snvs_clk", "ipg_root_clk",
> > > base + 0x4250, 0);
> > >  	clks[IMX7D_MU_ROOT_CLK] = imx_clk_gate4("mu_root_clk",
> > > "ipg_root_clk", base + 0x4270, 0); @@ -882,9 +874,6 @@ static void
> > > __init imx7d_clocks_init(struct device_node *ccm_node)
> > >  	clk_data.clk_num = ARRAY_SIZE(clks);
> > >  	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
> > >
> > > -	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
> > > -		clk_prepare_enable(clks[clks_init_on[i]]);
> > > -
> > >  	clk_set_parent(clks[IMX7D_PLL_ARM_MAIN_BYPASS],
> > > clks[IMX7D_PLL_ARM_MAIN]);
> > >  	clk_set_parent(clks[IMX7D_PLL_DRAM_MAIN_BYPASS],
> > > clks[IMX7D_PLL_DRAM_MAIN]);
> > >  	clk_set_parent(clks[IMX7D_PLL_SYS_MAIN_BYPASS],
> > > clks[IMX7D_PLL_SYS_MAIN]); diff --git a/drivers/clk/imx/clk.h
> > > b/drivers/clk/imx/clk.h index 8076ec0..5895e223 100644
> > > --- a/drivers/clk/imx/clk.h
> > > +++ b/drivers/clk/imx/clk.h
> > > @@ -137,6 +137,13 @@ static inline struct clk
> > > *imx_clk_gate_dis(const char *name, const char *parent,
> > >  			shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);  }
> > >
> > > +static inline struct clk *imx_clk_gate_dis_flags(const char *name,
> > > +const char
> > > *parent,
> > > +		void __iomem *reg, u8 shift, unsigned long flags) {
> > > +	return clk_register_gate(NULL, name, parent, flags |
> > > CLK_SET_RATE_PARENT, reg,
> > > +			shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock); }
> > > +
> > >  static inline struct clk *imx_clk_gate2(const char *name, const
> > > char
> > *parent,
> > >  		void __iomem *reg, u8 shift)
> > >  {
> > > --
> > > 2.7.4


WARNING: multiple messages have this Message-ID (diff)
From: Peng Fan <peng.fan@nxp.com>
To: Anson Huang <anson.huang@nxp.com>,
	"shawnguo@kernel.org" <shawnguo@kernel.org>,
	"s.hauer@pengutronix.de" <s.hauer@pengutronix.de>,
	"kernel@pengutronix.de" <kernel@pengutronix.de>,
	Fabio Estevam <fabio.estevam@nxp.com>,
	"mturquette@baylibre.com" <mturquette@baylibre.com>,
	"sboyd@kernel.org" <sboyd@kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-clk@vger.kernel.org" <linux-clk@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Rob Herring <robh@kernel.org>
Cc: dl-linux-imx <linux-imx@nxp.com>
Subject: RE: [PATCH 2/2] clk: imx: imx7d: remove clks_init_on array
Date: Mon, 13 Aug 2018 01:15:41 +0000	[thread overview]
Message-ID: <AM0PR04MB44813C7A3E0AF4F3BCFFCF0088390@AM0PR04MB4481.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <DB3PR0402MB3916F8BC381BBA01DB21D1C0F5260@DB3PR0402MB3916.eurprd04.prod.outlook.com>

SGkgQW5zb24sDQoNCj4gPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4gPiBGcm9t
OiBBbnNvbiBIdWFuZw0KPiA+ID4gU2VudDogMjAxOMTqONTCOMjVIDEyOjM5DQo+ID4gPiBUbzog
c2hhd25ndW9Aa2VybmVsLm9yZzsgcy5oYXVlckBwZW5ndXRyb25peC5kZTsNCj4gPiA+IGtlcm5l
bEBwZW5ndXRyb25peC5kZTsgRmFiaW8gRXN0ZXZhbSA8ZmFiaW8uZXN0ZXZhbUBueHAuY29tPjsN
Cj4gPiA+IG10dXJxdWV0dGVAYmF5bGlicmUuY29tOyBzYm95ZEBrZXJuZWwub3JnOw0KPiA+ID4g
bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOw0KPiA+ID4gbGludXgtY2xrQHZn
ZXIua2VybmVsLm9yZzsgbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZw0KPiA+ID4gQ2M6IGRs
LWxpbnV4LWlteCA8bGludXgtaW14QG54cC5jb20+DQo+ID4gPiBTdWJqZWN0OiBbUEFUQ0ggMi8y
XSBjbGs6IGlteDogaW14N2Q6IHJlbW92ZSBjbGtzX2luaXRfb24gYXJyYXkNCj4gPiA+DQo+ID4g
PiBDbG9jayBmcmFtZXdvcmsgd2lsbCBlbmFibGUgdGhvc2UgY2xvY2tzIHJlZ2lzdGVyZWQgd2l0
aA0KPiA+ID4gQ0xLX0lTX0NSSVRJQ0FMIGZsYWcsIHNvIG5vIG5lZWQgdG8gaGF2ZSBjbGtzX2lu
aXRfb24gYXJyYXkgZHVyaW5nDQo+ID4gPiBjbG9jaw0KPiA+IGluaXRpYWxpemF0aW9uIG5vdy4N
Cj4gPg0KPiA+IFdpbGwgaXQgYmUgbW9yZSBmbGV4aWJsZSB0byBwYXJzZSBkdHMgc2F5aW5nICJj
cml0aWNhbC1jbG9ja3MgPSA8eHh4PiINCj4gPiBvciAiaW5pdC1vbi1hcnJhcnk9PHh4eD4iDQo+
ID4gYW5kIGVuYWJsZSB0aG9zZSBjbG9ja3M/DQo+IA0KPiBQYXJzaW5nIHRoZSBjbG9ja3MgYXJy
YXlzIGZyb20gZHRiIGlzIGFub3RoZXIgd2F5IG9mIGVuYWJsaW5nIGNyaXRpY2FsIGNsb2Nrcywg
YnV0DQo+IGZvciBjdXJyZW50IGkuTVg2LzcgcGxhdGZvcm1zLCB3ZSBpbXBsZW1lbnQgaXQgaW4g
c2FtZSB3YXkgYXMgbW9zdCBvZiBvdGhlcg0KPiBTb0NzLCBjdXJyZW50bHkgSSBkaWQgTk9UIHNl
ZSBhbnkgbmVjZXNzaXR5IG9mIHB1dHRpbmcgdGhlbSBpbiBkdGIsIGp1c3QgYWRkaW5nDQo+IGZs
YWcgZHVyaW5nIGNsb2NrIHJlZ2lzdGVyaW5nIGlzIG1vcmUgc2ltcGxlLCBpZiB0aGVyZSBpcyBh
bnkgc3BlY2lhbCByZXF1aXJlbWVudA0KPiBmb3IgZGlmZmVyZW50IGNsb2NrcyBzZXQgdG8gYmUg
ZW5hYmxlZCwgdGhlbiB3ZSBjYW4gYWRkIHN1cHBvcnQgdG8gZW5hYmxlIHRoZQ0KPiBtZXRob2Qg
b2YgcGFyc2luZyBjcml0aWNhbC1jbG9ja3MgZnJvbSBkdGIuIEp1c3QgbXkgdHdvIGNlbnRzLg0K
DQpUaGlua2luZyBhYm91dCBPUC1URUUgd2FudCB0byB1c2Ugb25lIGRldmljZSwgYnV0IGl0J3Mg
Y2xvY2tzIGFyZSByZWdpc3RlcmVkDQpieSBMaW51eCwgYmVjYXVzZSB0aGVyZSBpcyBubyBtb2R1
bGUgaW4gTGludXggc2lkZSB1c2UgaXQsIGl0IHdpbGwgc2h1dGRvd24gdGhlIGNsb2NrLA0Kd2hp
Y2ggY2F1c2UgT1AtVEVFIGNvdWxkIG5vdCBhY2Nlc3MgdGhlIGRldmljZS4NCg0KVGhlbiBwZW9w
bGUgaGF2ZSB0byBtb2RpZnkgY2xrIGNvZGUgdG8gYWRkIENMS19JU19DUklUSUNBTCBmbGFnIHRv
IG1ha2Ugc3VyZQ0KdGhlIGNsb2NrcyBhcmUgbm90IHNodXRkb3duIGJ5IExpbnV4Lg0KDQpIb3dl
dmVyIGFkZGluZyBhIG5ldyBwcm9wZXJ0eSBpbiBjbGsgbm9kZSBhbmQgbGV0IGRyaXZlciBjb2Rl
IHBhcnNlIHRoZSBkdHMsDQp0aGVyZSBpcyBubyBuZWVkIHRvIG1vZGlmeSBjbGsgZHJpdmVyIGNv
ZGUgd2hlbiBPUC1URUUgbmVlZHMgYW5vdGhlciBkZXZpY2UgY2xvY2suDQoNClJlZ2FyZHMsDQpQ
ZW5nLg0KDQo+IA0KPiBBbnNvbi4NCj4gDQo+ID4NCj4gPiBSZWdhcmRzLA0KPiA+IFBlbmcuDQo+
ID4NCj4gPiA+DQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBBbnNvbiBIdWFuZyA8QW5zb24uSHVhbmdA
bnhwLmNvbT4NCj4gPiA+IC0tLQ0KPiA+ID4gIGRyaXZlcnMvY2xrL2lteC9jbGstaW14N2QuYyB8
IDI3ICsrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiA+ID4gIGRyaXZlcnMvY2xrL2lteC9j
bGsuaCAgICAgICB8ICA3ICsrKysrKysNCj4gPiA+ICAyIGZpbGVzIGNoYW5nZWQsIDE1IGluc2Vy
dGlvbnMoKyksIDE5IGRlbGV0aW9ucygtKQ0KPiA+ID4NCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2
ZXJzL2Nsay9pbXgvY2xrLWlteDdkLmMNCj4gPiA+IGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg3
ZC5jIGluZGV4IGM0NTE4ZDcuLjA3NjQ2MGIgMTAwNjQ0DQo+ID4gPiAtLS0gYS9kcml2ZXJzL2Ns
ay9pbXgvY2xrLWlteDdkLmMNCj4gPiA+ICsrKyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14N2Qu
Yw0KPiA+ID4gQEAgLTM3OSwxMyArMzc5LDYgQEAgc3RhdGljIGNvbnN0IGNoYXIgKnBsbF9lbmV0
X2J5cGFzc19zZWxbXSA9IHsNCj4gPiA+ICJwbGxfZW5ldF9tYWluIiwgInBsbF9lbmV0X21haW5f
c3JjICBzdGF0aWMgY29uc3QgY2hhcg0KPiA+ID4gKnBsbF9hdWRpb19ieXBhc3Nfc2VsW10gPSB7
ICJwbGxfYXVkaW9fbWFpbiIsICJwbGxfYXVkaW9fbWFpbl9zcmMiLA0KPiA+ID4gfTsgc3RhdGlj
IGNvbnN0IGNoYXIgKnBsbF92aWRlb19ieXBhc3Nfc2VsW10gPSB7ICJwbGxfdmlkZW9fbWFpbiIs
DQo+ID4gPiAicGxsX3ZpZGVvX21haW5fc3JjIiwgfTsNCj4gPiA+DQo+ID4gPiAtc3RhdGljIGlu
dCBjb25zdCBjbGtzX2luaXRfb25bXSBfX2luaXRjb25zdCA9IHsNCj4gPiA+IC0JSU1YN0RfQVJN
X0E3X1JPT1RfQ0xLLCBJTVg3RF9NQUlOX0FYSV9ST09UX0NMSywNCj4gPiA+IC0JSU1YN0RfUExM
X1NZU19NQUlOXzQ4ME1fQ0xLLCBJTVg3RF9JUEdfUk9PVF9DTEssDQo+ID4gPiAtCUlNWDdEX0RS
QU1fUEhZTV9ST09UX0NMSywgSU1YN0RfRFJBTV9ST09UX0NMSywNCj4gPiA+IC0JSU1YN0RfRFJB
TV9QSFlNX0FMVF9ST09UX0NMSywgSU1YN0RfRFJBTV9BTFRfUk9PVF9DTEssDQo+ID4gPiAtfTsN
Cj4gPiA+IC0NCj4gPiA+ICBzdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7
DQo+ID4gPg0KPiA+ID4gIHN0YXRpYyBzdHJ1Y3QgY2xrICoqIGNvbnN0IHVhcnRfY2xrc1tdIF9f
aW5pdGNvbnN0ID0geyBAQCAtNDAzLDcNCj4gPiA+ICszOTYsNiBAQCBzdGF0aWMgdm9pZCBfX2lu
aXQgaW14N2RfY2xvY2tzX2luaXQoc3RydWN0IGRldmljZV9ub2RlDQo+ID4gKmNjbV9ub2RlKSAg
ew0KPiA+ID4gIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOw0KPiA+ID4gIAl2b2lkIF9faW9tZW0g
KmJhc2U7DQo+ID4gPiAtCWludCBpOw0KPiA+ID4NCj4gPiA+ICAJY2xrc1tJTVg3RF9DTEtfRFVN
TVldID0gaW14X2Nsa19maXhlZCgiZHVtbXkiLCAwKTsNCj4gPiA+ICAJY2xrc1tJTVg3RF9PU0Nf
MjRNX0NMS10gPSBvZl9jbGtfZ2V0X2J5X25hbWUoY2NtX25vZGUsICJvc2MiKTsNCj4gPiBAQA0K
PiA+ID4gLTQ2Niw3ICs0NTgsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgaW14N2RfY2xvY2tzX2lu
aXQoc3RydWN0DQo+ID4gPiBkZXZpY2Vfbm9kZQ0KPiA+ID4gKmNjbV9ub2RlKQ0KPiA+ID4gIAlj
bGtzW0lNWDdEX1BMTF9TWVNfTUFJTl8xMjBNXSA9DQo+ID4gPiBpbXhfY2xrX2ZpeGVkX2ZhY3Rv
cigicGxsX3N5c19tYWluXzEyMG0iLCAicGxsX3N5c19tYWluX2NsayIsIDEsIDQpOw0KPiA+ID4g
IAljbGtzW0lNWDdEX1BMTF9EUkFNX01BSU5fNTMzTV0gPQ0KPiA+ID4gaW14X2Nsa19maXhlZF9m
YWN0b3IoInBsbF9kcmFtXzUzM20iLCAicGxsX2RyYW1fbWFpbl9jbGsiLCAxLCAyKTsNCj4gPiA+
DQo+ID4gPiAtCWNsa3NbSU1YN0RfUExMX1NZU19NQUlOXzQ4ME1fQ0xLXSA9DQo+ID4gPiBpbXhf
Y2xrX2dhdGVfZGlzKCJwbGxfc3lzX21haW5fNDgwbV9jbGsiLCAicGxsX3N5c19tYWluXzQ4MG0i
LCBiYXNlDQo+ID4gPiArIDB4YjAsIDQpOw0KPiA+ID4gKwljbGtzW0lNWDdEX1BMTF9TWVNfTUFJ
Tl80ODBNX0NMS10gPQ0KPiA+ID4gK2lteF9jbGtfZ2F0ZV9kaXNfZmxhZ3MoInBsbF9zeXNfbWFp
bl80ODBtX2NsayIsDQo+ID4gPiArInBsbF9zeXNfbWFpbl80ODBtIiwgYmFzZSArIDB4YjAsIDQs
IENMS19JU19DUklUSUNBTCk7DQo+ID4gPiAgCWNsa3NbSU1YN0RfUExMX1NZU19NQUlOXzI0ME1f
Q0xLXSA9DQo+ID4gPiBpbXhfY2xrX2dhdGVfZGlzKCJwbGxfc3lzX21haW5fMjQwbV9jbGsiLCAi
cGxsX3N5c19tYWluXzI0MG0iLCBiYXNlDQo+ID4gPiArIDB4YjAsIDUpOw0KPiA+ID4gIAljbGtz
W0lNWDdEX1BMTF9TWVNfTUFJTl8xMjBNX0NMS10gPQ0KPiA+ID4gaW14X2Nsa19nYXRlX2Rpcygi
cGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9zeXNfbWFpbl8xMjBtIiwgYmFzZQ0KPiA+ID4g
KyAweGIwLCA2KTsNCj4gPiA+ICAJY2xrc1tJTVg3RF9QTExfRFJBTV9NQUlOXzUzM01fQ0xLXSA9
DQo+ID4gPiBpbXhfY2xrX2dhdGUoInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9kcmFtXzUzM20i
LCBiYXNlICsgMHg3MCwgMTIpOw0KPiA+ID4gQEANCj4gPiA+IC03MTksNyArNzExLDcgQEAgc3Rh
dGljIHZvaWQgX19pbml0IGlteDdkX2Nsb2Nrc19pbml0KHN0cnVjdA0KPiA+ID4gZGV2aWNlX25v
ZGUNCj4gPiA+ICpjY21fbm9kZSkNCj4gPiA+ICAJY2xrc1tJTVg3RF9FTkVUX0FYSV9ST09UX0RJ
Vl0gPQ0KPiA+ID4gaW14X2Nsa19kaXZpZGVyMigiZW5ldF9heGlfcG9zdF9kaXYiLCAiZW5ldF9h
eGlfcHJlX2RpdiIsIGJhc2UgKw0KPiA+ID4gMHg4OTAwLCAwLA0KPiA+IDYpOw0KPiA+ID4gIAlj
bGtzW0lNWDdEX05BTkRfVVNESENfQlVTX1JPT1RfQ0xLXSA9DQo+ID4gPiBpbXhfY2xrX2Rpdmlk
ZXIyKCJuYW5kX3VzZGhjX3Jvb3RfY2xrIiwgIm5hbmRfdXNkaGNfcHJlX2RpdiIsIGJhc2UgKw0K
PiA+ID4gMHg4OTgwLCAwLCA2KTsNCj4gPiA+ICAJY2xrc1tJTVg3RF9BSEJfQ0hBTk5FTF9ST09U
X0RJVl0gPQ0KPiA+ID4gaW14X2Nsa19kaXZpZGVyMigiYWhiX3Jvb3RfY2xrIiwgImFoYl9wcmVf
ZGl2IiwgYmFzZSArIDB4OTAwMCwgMCwgNik7DQo+ID4gPiAtCWNsa3NbSU1YN0RfSVBHX1JPT1Rf
Q0xLXSA9IGlteF9jbGtfZGl2aWRlcjIoImlwZ19yb290X2NsayIsDQo+ID4gPiAiYWhiX3Jvb3Rf
Y2xrIiwgYmFzZSArIDB4OTA4MCwgMCwgMik7DQo+ID4gPiArCWNsa3NbSU1YN0RfSVBHX1JPT1Rf
Q0xLXSA9IGlteF9jbGtfZGl2aWRlcl9mbGFncygiaXBnX3Jvb3RfY2xrIiwNCj4gPiA+ICsiYWhi
X3Jvb3RfY2xrIiwgYmFzZSArIDB4OTA4MCwgMCwgMiwgQ0xLX0lTX0NSSVRJQ0FMIHwNCj4gPiA+
ICtDTEtfT1BTX1BBUkVOVF9FTkFCTEUgfCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsNCj4gPiA+ICAJ
Y2xrc1tJTVg3RF9EUkFNX1JPT1RfRElWXSA9IGlteF9jbGtfZGl2aWRlcjIoImRyYW1fcG9zdF9k
aXYiLA0KPiA+ID4gImRyYW1fY2ciLCBiYXNlICsgMHg5ODgwLCAwLCAzKTsNCj4gPiA+ICAJY2xr
c1tJTVg3RF9EUkFNX1BIWU1fQUxUX1JPT1RfRElWXSA9DQo+ID4gPiBpbXhfY2xrX2RpdmlkZXIy
KCJkcmFtX3BoeW1fYWx0X3Bvc3RfZGl2IiwgImRyYW1fcGh5bV9hbHRfcHJlX2RpdiIsDQo+ID4g
PiBiYXNlDQo+ID4gPiArIDB4YTAwMCwgMCwgMyk7DQo+ID4gPiAgCWNsa3NbSU1YN0RfRFJBTV9B
TFRfUk9PVF9ESVZdID0NCj4gPiA+IGlteF9jbGtfZGl2aWRlcjIoImRyYW1fYWx0X3Bvc3RfZGl2
IiwgImRyYW1fYWx0X3ByZV9kaXYiLCBiYXNlICsNCj4gPiA+IDB4YTA4MCwgMCwgMyk7IEBAIC03
ODMsMTcgKzc3NSwxNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQNCj4gPiA+IGlteDdkX2Nsb2Nrc19p
bml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2NtX25vZGUpDQo+ID4gPiAgCWNsa3NbSU1YN0RfQ0xL
TzFfUk9PVF9ESVZdID0gaW14X2Nsa19kaXZpZGVyMigiY2xrbzFfcG9zdF9kaXYiLA0KPiA+ID4g
ImNsa28xX3ByZV9kaXYiLCBiYXNlICsgMHhiZDgwLCAwLCA2KTsNCj4gPiA+ICAJY2xrc1tJTVg3
RF9DTEtPMl9ST09UX0RJVl0gPSBpbXhfY2xrX2RpdmlkZXIyKCJjbGtvMl9wb3N0X2RpdiIsDQo+
ID4gPiAiY2xrbzJfcHJlX2RpdiIsIGJhc2UgKyAweGJlMDAsIDAsIDYpOw0KPiA+ID4NCj4gPiA+
IC0JY2xrc1tJTVg3RF9BUk1fQTdfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgiYXJtX2E3X3Jv
b3RfY2xrIiwNCj4gPiA+ICJhcm1fYTdfZGl2IiwgYmFzZSArIDB4NDAwMCwgMCk7DQo+ID4gPiAr
CWNsa3NbSU1YN0RfQVJNX0E3X1JPT1RfQ0xLXSA9DQo+ID4gPiBpbXhfY2xrX2dhdGUyX2ZsYWdz
KCJhcm1fYTdfcm9vdF9jbGsiLA0KPiA+ID4gKyJhcm1fYTdfZGl2IiwgYmFzZSArIDB4NDAwMCwg
MCwgQ0xLX0lTX0NSSVRJQ0FMIHwNCj4gPiA+ICtDTEtfT1BTX1BBUkVOVF9FTkFCTEUpOw0KPiA+
ID4gIAljbGtzW0lNWDdEX0FSTV9NNF9ST09UX0NMS10gPQ0KPiBpbXhfY2xrX2dhdGU0KCJhcm1f
bTRfcm9vdF9jbGsiLA0KPiA+ID4gImFybV9tNF9kaXYiLCBiYXNlICsgMHg0MDEwLCAwKTsNCj4g
PiA+IC0JY2xrc1tJTVg3RF9NQUlOX0FYSV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJtYWlu
X2F4aV9yb290X2NsayIsDQo+ID4gPiAiYXhpX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDA0MCwgMCk7
DQo+ID4gPiArCWNsa3NbSU1YN0RfTUFJTl9BWElfUk9PVF9DTEtdID0NCj4gPiA+ICtpbXhfY2xr
X2dhdGUyX2ZsYWdzKCJtYWluX2F4aV9yb290X2NsayIsICJheGlfcG9zdF9kaXYiLCBiYXNlICsN
Cj4gPiA+ICsweDQwNDAsIDAsIENMS19JU19DUklUSUNBTCB8IENMS19PUFNfUEFSRU5UX0VOQUJM
RSk7DQo+ID4gPiAgCWNsa3NbSU1YN0RfRElTUF9BWElfUk9PVF9DTEtdID0NCj4gaW14X2Nsa19n
YXRlNCgiZGlzcF9heGlfcm9vdF9jbGsiLA0KPiA+ID4gImRpc3BfYXhpX3Bvc3RfZGl2IiwgYmFz
ZSArIDB4NDA1MCwgMCk7DQo+ID4gPiAgCWNsa3NbSU1YN0RfRU5FVF9BWElfUk9PVF9DTEtdID0N
Cj4gaW14X2Nsa19nYXRlNCgiZW5ldF9heGlfcm9vdF9jbGsiLA0KPiA+ID4gImVuZXRfYXhpX3Bv
c3RfZGl2IiwgYmFzZSArIDB4NDA2MCwgMCk7DQo+ID4gPiAgCWNsa3NbSU1YN0RfT0NSQU1fQ0xL
XSA9IGlteF9jbGtfZ2F0ZTQoIm9jcmFtX2NsayIsDQo+ID4gPiAibWFpbl9heGlfcm9vdF9jbGsi
LCBiYXNlICsgMHg0MTEwLCAwKTsNCj4gPiA+ICAJY2xrc1tJTVg3RF9PQ1JBTV9TX0NMS10gPSBp
bXhfY2xrX2dhdGU0KCJvY3JhbV9zX2NsayIsDQo+ID4gPiAiYWhiX3Jvb3RfY2xrIiwgYmFzZSAr
IDB4NDEyMCwgMCk7DQo+ID4gPiAtCWNsa3NbSU1YN0RfRFJBTV9ST09UX0NMS10gPSBpbXhfY2xr
X2dhdGU0KCJkcmFtX3Jvb3RfY2xrIiwNCj4gPiA+ICJkcmFtX3Bvc3RfZGl2IiwgYmFzZSArIDB4
NDEzMCwgMCk7DQo+ID4gPiAtCWNsa3NbSU1YN0RfRFJBTV9QSFlNX1JPT1RfQ0xLXSA9DQo+ID4g
PiBpbXhfY2xrX2dhdGU0KCJkcmFtX3BoeW1fcm9vdF9jbGsiLCAiZHJhbV9waHltX2NnIiwgYmFz
ZSArIDB4NDEzMCwNCj4gMCk7DQo+ID4gPiAtCWNsa3NbSU1YN0RfRFJBTV9QSFlNX0FMVF9ST09U
X0NMS10gPQ0KPiA+ID4gaW14X2Nsa19nYXRlNCgiZHJhbV9waHltX2FsdF9yb290X2NsayIsICJk
cmFtX3BoeW1fYWx0X3Bvc3RfZGl2IiwNCj4gPiA+IGJhc2UNCj4gPiA+ICsgMHg0MTMwLCAwKTsN
Cj4gPiA+IC0JY2xrc1tJTVg3RF9EUkFNX0FMVF9ST09UX0NMS10gPQ0KPiA+IGlteF9jbGtfZ2F0
ZTQoImRyYW1fYWx0X3Jvb3RfY2xrIiwNCj4gPiA+ICJkcmFtX2FsdF9wb3N0X2RpdiIsIGJhc2Ug
KyAweDQxMzAsIDApOw0KPiA+ID4gKwljbGtzW0lNWDdEX0RSQU1fUk9PVF9DTEtdID0NCj4gaW14
X2Nsa19nYXRlMl9mbGFncygiZHJhbV9yb290X2NsayIsDQo+ID4gPiAiZHJhbV9wb3N0X2RpdiIs
IGJhc2UgKyAweDQxMzAsIDAsIENMS19JU19DUklUSUNBTCB8DQo+ID4gPiBDTEtfT1BTX1BBUkVO
VF9FTkFCTEUpOw0KPiA+ID4gKwljbGtzW0lNWDdEX0RSQU1fUEhZTV9ST09UX0NMS10gPQ0KPiA+
ID4gaW14X2Nsa19nYXRlMl9mbGFncygiZHJhbV9waHltX3Jvb3RfY2xrIiwgImRyYW1fcGh5bV9j
ZyIsIGJhc2UgKw0KPiA+ID4gMHg0MTMwLCAwLCBDTEtfSVNfQ1JJVElDQUwgfCBDTEtfT1BTX1BB
UkVOVF9FTkFCTEUpOw0KPiA+ID4gKwljbGtzW0lNWDdEX0RSQU1fUEhZTV9BTFRfUk9PVF9DTEtd
ID0NCj4gPiA+IGlteF9jbGtfZ2F0ZTJfZmxhZ3MoImRyYW1fcGh5bV9hbHRfcm9vdF9jbGsiLA0K
PiA+ID4gImRyYW1fcGh5bV9hbHRfcG9zdF9kaXYiLCBiYXNlICsgMHg0MTMwLCAwLCBDTEtfSVNf
Q1JJVElDQUwgfA0KPiA+ID4gQ0xLX09QU19QQVJFTlRfRU5BQkxFKTsNCj4gPiA+ICsJY2xrc1tJ
TVg3RF9EUkFNX0FMVF9ST09UX0NMS10gPQ0KPiA+ID4gK2lteF9jbGtfZ2F0ZTJfZmxhZ3MoImRy
YW1fYWx0X3Jvb3RfY2xrIiwgImRyYW1fYWx0X3Bvc3RfZGl2IiwgYmFzZQ0KPiA+ID4gKysgMHg0
MTMwLCAwLCBDTEtfSVNfQ1JJVElDQUwgfCBDTEtfT1BTX1BBUkVOVF9FTkFCTEUpOw0KPiA+ID4g
IAljbGtzW0lNWDdEX09DT1RQX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJvY290cF9jbGsiLA0KPiAi
aXBnX3Jvb3RfY2xrIiwNCj4gPiA+IGJhc2UgKyAweDQyMzAsIDApOw0KPiA+ID4gIAljbGtzW0lN
WDdEX1NOVlNfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInNudnNfY2xrIiwgImlwZ19yb290X2NsayIs
DQo+ID4gPiBiYXNlICsgMHg0MjUwLCAwKTsNCj4gPiA+ICAJY2xrc1tJTVg3RF9NVV9ST09UX0NM
S10gPSBpbXhfY2xrX2dhdGU0KCJtdV9yb290X2NsayIsDQo+ID4gPiAiaXBnX3Jvb3RfY2xrIiwg
YmFzZSArIDB4NDI3MCwgMCk7IEBAIC04ODIsOSArODc0LDYgQEAgc3RhdGljIHZvaWQNCj4gPiA+
IF9faW5pdCBpbXg3ZF9jbG9ja3NfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmNjbV9ub2RlKQ0K
PiA+ID4gIAljbGtfZGF0YS5jbGtfbnVtID0gQVJSQVlfU0laRShjbGtzKTsNCj4gPiA+ICAJb2Zf
Y2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsN
Cj4gPiA+DQo+ID4gPiAtCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsa3NfaW5pdF9vbik7
IGkrKykNCj4gPiA+IC0JCWNsa19wcmVwYXJlX2VuYWJsZShjbGtzW2Nsa3NfaW5pdF9vbltpXV0p
Ow0KPiA+ID4gLQ0KPiA+ID4gIAljbGtfc2V0X3BhcmVudChjbGtzW0lNWDdEX1BMTF9BUk1fTUFJ
Tl9CWVBBU1NdLA0KPiA+ID4gY2xrc1tJTVg3RF9QTExfQVJNX01BSU5dKTsNCj4gPiA+ICAJY2xr
X3NldF9wYXJlbnQoY2xrc1tJTVg3RF9QTExfRFJBTV9NQUlOX0JZUEFTU10sDQo+ID4gPiBjbGtz
W0lNWDdEX1BMTF9EUkFNX01BSU5dKTsNCj4gPiA+ICAJY2xrX3NldF9wYXJlbnQoY2xrc1tJTVg3
RF9QTExfU1lTX01BSU5fQllQQVNTXSwNCj4gPiA+IGNsa3NbSU1YN0RfUExMX1NZU19NQUlOXSk7
IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9pbXgvY2xrLmgNCj4gPiA+IGIvZHJpdmVycy9jbGsv
aW14L2Nsay5oIGluZGV4IDgwNzZlYzAuLjU4OTVlMjIzIDEwMDY0NA0KPiA+ID4gLS0tIGEvZHJp
dmVycy9jbGsvaW14L2Nsay5oDQo+ID4gPiArKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLmgNCj4g
PiA+IEBAIC0xMzcsNiArMTM3LDEzIEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNsaw0KPiA+ID4g
KmlteF9jbGtfZ2F0ZV9kaXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50LA0K
PiA+ID4gIAkJCXNoaWZ0LCBDTEtfR0FURV9TRVRfVE9fRElTQUJMRSwgJmlteF9jY21fbG9jayk7
ICB9DQo+ID4gPg0KPiA+ID4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqaW14X2Nsa19nYXRl
X2Rpc19mbGFncyhjb25zdCBjaGFyICpuYW1lLA0KPiA+ID4gK2NvbnN0IGNoYXINCj4gPiA+ICpw
YXJlbnQsDQo+ID4gPiArCQl2b2lkIF9faW9tZW0gKnJlZywgdTggc2hpZnQsIHVuc2lnbmVkIGxv
bmcgZmxhZ3MpIHsNCj4gPiA+ICsJcmV0dXJuIGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIG5hbWUs
IHBhcmVudCwgZmxhZ3MgfA0KPiA+ID4gQ0xLX1NFVF9SQVRFX1BBUkVOVCwgcmVnLA0KPiA+ID4g
KwkJCXNoaWZ0LCBDTEtfR0FURV9TRVRfVE9fRElTQUJMRSwgJmlteF9jY21fbG9jayk7IH0NCj4g
PiA+ICsNCj4gPiA+ICBzdGF0aWMgaW5saW5lIHN0cnVjdCBjbGsgKmlteF9jbGtfZ2F0ZTIoY29u
c3QgY2hhciAqbmFtZSwgY29uc3QNCj4gPiA+IGNoYXINCj4gPiAqcGFyZW50LA0KPiA+ID4gIAkJ
dm9pZCBfX2lvbWVtICpyZWcsIHU4IHNoaWZ0KQ0KPiA+ID4gIHsNCj4gPiA+IC0tDQo+ID4gPiAy
LjcuNA0KDQo=

WARNING: multiple messages have this Message-ID (diff)
From: peng.fan@nxp.com (Peng Fan)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] clk: imx: imx7d: remove clks_init_on array
Date: Mon, 13 Aug 2018 01:15:41 +0000	[thread overview]
Message-ID: <AM0PR04MB44813C7A3E0AF4F3BCFFCF0088390@AM0PR04MB4481.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <DB3PR0402MB3916F8BC381BBA01DB21D1C0F5260@DB3PR0402MB3916.eurprd04.prod.outlook.com>

Hi Anson,

> > > -----Original Message-----
> > > From: Anson Huang
> > > Sent: 2018?8?8? 12:39
> > > To: shawnguo at kernel.org; s.hauer at pengutronix.de;
> > > kernel at pengutronix.de; Fabio Estevam <fabio.estevam@nxp.com>;
> > > mturquette at baylibre.com; sboyd at kernel.org;
> > > linux-arm-kernel at lists.infradead.org;
> > > linux-clk at vger.kernel.org; linux-kernel at vger.kernel.org
> > > Cc: dl-linux-imx <linux-imx@nxp.com>
> > > Subject: [PATCH 2/2] clk: imx: imx7d: remove clks_init_on array
> > >
> > > Clock framework will enable those clocks registered with
> > > CLK_IS_CRITICAL flag, so no need to have clks_init_on array during
> > > clock
> > initialization now.
> >
> > Will it be more flexible to parse dts saying "critical-clocks = <xxx>"
> > or "init-on-arrary=<xxx>"
> > and enable those clocks?
> 
> Parsing the clocks arrays from dtb is another way of enabling critical clocks, but
> for current i.MX6/7 platforms, we implement it in same way as most of other
> SoCs, currently I did NOT see any necessity of putting them in dtb, just adding
> flag during clock registering is more simple, if there is any special requirement
> for different clocks set to be enabled, then we can add support to enable the
> method of parsing critical-clocks from dtb. Just my two cents.

Thinking about OP-TEE want to use one device, but it's clocks are registered
by Linux, because there is no module in Linux side use it, it will shutdown the clock,
which cause OP-TEE could not access the device.

Then people have to modify clk code to add CLK_IS_CRITICAL flag to make sure
the clocks are not shutdown by Linux.

However adding a new property in clk node and let driver code parse the dts,
there is no need to modify clk driver code when OP-TEE needs another device clock.

Regards,
Peng.

> 
> Anson.
> 
> >
> > Regards,
> > Peng.
> >
> > >
> > > Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
> > > ---
> > >  drivers/clk/imx/clk-imx7d.c | 27 ++++++++-------------------
> > >  drivers/clk/imx/clk.h       |  7 +++++++
> > >  2 files changed, 15 insertions(+), 19 deletions(-)
> > >
> > > diff --git a/drivers/clk/imx/clk-imx7d.c
> > > b/drivers/clk/imx/clk-imx7d.c index c4518d7..076460b 100644
> > > --- a/drivers/clk/imx/clk-imx7d.c
> > > +++ b/drivers/clk/imx/clk-imx7d.c
> > > @@ -379,13 +379,6 @@ static const char *pll_enet_bypass_sel[] = {
> > > "pll_enet_main", "pll_enet_main_src  static const char
> > > *pll_audio_bypass_sel[] = { "pll_audio_main", "pll_audio_main_src",
> > > }; static const char *pll_video_bypass_sel[] = { "pll_video_main",
> > > "pll_video_main_src", };
> > >
> > > -static int const clks_init_on[] __initconst = {
> > > -	IMX7D_ARM_A7_ROOT_CLK, IMX7D_MAIN_AXI_ROOT_CLK,
> > > -	IMX7D_PLL_SYS_MAIN_480M_CLK, IMX7D_IPG_ROOT_CLK,
> > > -	IMX7D_DRAM_PHYM_ROOT_CLK, IMX7D_DRAM_ROOT_CLK,
> > > -	IMX7D_DRAM_PHYM_ALT_ROOT_CLK, IMX7D_DRAM_ALT_ROOT_CLK,
> > > -};
> > > -
> > >  static struct clk_onecell_data clk_data;
> > >
> > >  static struct clk ** const uart_clks[] __initconst = { @@ -403,7
> > > +396,6 @@ static void __init imx7d_clocks_init(struct device_node
> > *ccm_node)  {
> > >  	struct device_node *np;
> > >  	void __iomem *base;
> > > -	int i;
> > >
> > >  	clks[IMX7D_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
> > >  	clks[IMX7D_OSC_24M_CLK] = of_clk_get_by_name(ccm_node, "osc");
> > @@
> > > -466,7 +458,7 @@ static void __init imx7d_clocks_init(struct
> > > device_node
> > > *ccm_node)
> > >  	clks[IMX7D_PLL_SYS_MAIN_120M] =
> > > imx_clk_fixed_factor("pll_sys_main_120m", "pll_sys_main_clk", 1, 4);
> > >  	clks[IMX7D_PLL_DRAM_MAIN_533M] =
> > > imx_clk_fixed_factor("pll_dram_533m", "pll_dram_main_clk", 1, 2);
> > >
> > > -	clks[IMX7D_PLL_SYS_MAIN_480M_CLK] =
> > > imx_clk_gate_dis("pll_sys_main_480m_clk", "pll_sys_main_480m", base
> > > + 0xb0, 4);
> > > +	clks[IMX7D_PLL_SYS_MAIN_480M_CLK] =
> > > +imx_clk_gate_dis_flags("pll_sys_main_480m_clk",
> > > +"pll_sys_main_480m", base + 0xb0, 4, CLK_IS_CRITICAL);
> > >  	clks[IMX7D_PLL_SYS_MAIN_240M_CLK] =
> > > imx_clk_gate_dis("pll_sys_main_240m_clk", "pll_sys_main_240m", base
> > > + 0xb0, 5);
> > >  	clks[IMX7D_PLL_SYS_MAIN_120M_CLK] =
> > > imx_clk_gate_dis("pll_sys_main_120m_clk", "pll_sys_main_120m", base
> > > + 0xb0, 6);
> > >  	clks[IMX7D_PLL_DRAM_MAIN_533M_CLK] =
> > > imx_clk_gate("pll_dram_533m_clk", "pll_dram_533m", base + 0x70, 12);
> > > @@
> > > -719,7 +711,7 @@ static void __init imx7d_clocks_init(struct
> > > device_node
> > > *ccm_node)
> > >  	clks[IMX7D_ENET_AXI_ROOT_DIV] =
> > > imx_clk_divider2("enet_axi_post_div", "enet_axi_pre_div", base +
> > > 0x8900, 0,
> > 6);
> > >  	clks[IMX7D_NAND_USDHC_BUS_ROOT_CLK] =
> > > imx_clk_divider2("nand_usdhc_root_clk", "nand_usdhc_pre_div", base +
> > > 0x8980, 0, 6);
> > >  	clks[IMX7D_AHB_CHANNEL_ROOT_DIV] =
> > > imx_clk_divider2("ahb_root_clk", "ahb_pre_div", base + 0x9000, 0, 6);
> > > -	clks[IMX7D_IPG_ROOT_CLK] = imx_clk_divider2("ipg_root_clk",
> > > "ahb_root_clk", base + 0x9080, 0, 2);
> > > +	clks[IMX7D_IPG_ROOT_CLK] = imx_clk_divider_flags("ipg_root_clk",
> > > +"ahb_root_clk", base + 0x9080, 0, 2, CLK_IS_CRITICAL |
> > > +CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_PARENT);
> > >  	clks[IMX7D_DRAM_ROOT_DIV] = imx_clk_divider2("dram_post_div",
> > > "dram_cg", base + 0x9880, 0, 3);
> > >  	clks[IMX7D_DRAM_PHYM_ALT_ROOT_DIV] =
> > > imx_clk_divider2("dram_phym_alt_post_div", "dram_phym_alt_pre_div",
> > > base
> > > + 0xa000, 0, 3);
> > >  	clks[IMX7D_DRAM_ALT_ROOT_DIV] =
> > > imx_clk_divider2("dram_alt_post_div", "dram_alt_pre_div", base +
> > > 0xa080, 0, 3); @@ -783,17 +775,17 @@ static void __init
> > > imx7d_clocks_init(struct device_node *ccm_node)
> > >  	clks[IMX7D_CLKO1_ROOT_DIV] = imx_clk_divider2("clko1_post_div",
> > > "clko1_pre_div", base + 0xbd80, 0, 6);
> > >  	clks[IMX7D_CLKO2_ROOT_DIV] = imx_clk_divider2("clko2_post_div",
> > > "clko2_pre_div", base + 0xbe00, 0, 6);
> > >
> > > -	clks[IMX7D_ARM_A7_ROOT_CLK] = imx_clk_gate4("arm_a7_root_clk",
> > > "arm_a7_div", base + 0x4000, 0);
> > > +	clks[IMX7D_ARM_A7_ROOT_CLK] =
> > > imx_clk_gate2_flags("arm_a7_root_clk",
> > > +"arm_a7_div", base + 0x4000, 0, CLK_IS_CRITICAL |
> > > +CLK_OPS_PARENT_ENABLE);
> > >  	clks[IMX7D_ARM_M4_ROOT_CLK] =
> imx_clk_gate4("arm_m4_root_clk",
> > > "arm_m4_div", base + 0x4010, 0);
> > > -	clks[IMX7D_MAIN_AXI_ROOT_CLK] = imx_clk_gate4("main_axi_root_clk",
> > > "axi_post_div", base + 0x4040, 0);
> > > +	clks[IMX7D_MAIN_AXI_ROOT_CLK] =
> > > +imx_clk_gate2_flags("main_axi_root_clk", "axi_post_div", base +
> > > +0x4040, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
> > >  	clks[IMX7D_DISP_AXI_ROOT_CLK] =
> imx_clk_gate4("disp_axi_root_clk",
> > > "disp_axi_post_div", base + 0x4050, 0);
> > >  	clks[IMX7D_ENET_AXI_ROOT_CLK] =
> imx_clk_gate4("enet_axi_root_clk",
> > > "enet_axi_post_div", base + 0x4060, 0);
> > >  	clks[IMX7D_OCRAM_CLK] = imx_clk_gate4("ocram_clk",
> > > "main_axi_root_clk", base + 0x4110, 0);
> > >  	clks[IMX7D_OCRAM_S_CLK] = imx_clk_gate4("ocram_s_clk",
> > > "ahb_root_clk", base + 0x4120, 0);
> > > -	clks[IMX7D_DRAM_ROOT_CLK] = imx_clk_gate4("dram_root_clk",
> > > "dram_post_div", base + 0x4130, 0);
> > > -	clks[IMX7D_DRAM_PHYM_ROOT_CLK] =
> > > imx_clk_gate4("dram_phym_root_clk", "dram_phym_cg", base + 0x4130,
> 0);
> > > -	clks[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] =
> > > imx_clk_gate4("dram_phym_alt_root_clk", "dram_phym_alt_post_div",
> > > base
> > > + 0x4130, 0);
> > > -	clks[IMX7D_DRAM_ALT_ROOT_CLK] =
> > imx_clk_gate4("dram_alt_root_clk",
> > > "dram_alt_post_div", base + 0x4130, 0);
> > > +	clks[IMX7D_DRAM_ROOT_CLK] =
> imx_clk_gate2_flags("dram_root_clk",
> > > "dram_post_div", base + 0x4130, 0, CLK_IS_CRITICAL |
> > > CLK_OPS_PARENT_ENABLE);
> > > +	clks[IMX7D_DRAM_PHYM_ROOT_CLK] =
> > > imx_clk_gate2_flags("dram_phym_root_clk", "dram_phym_cg", base +
> > > 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
> > > +	clks[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] =
> > > imx_clk_gate2_flags("dram_phym_alt_root_clk",
> > > "dram_phym_alt_post_div", base + 0x4130, 0, CLK_IS_CRITICAL |
> > > CLK_OPS_PARENT_ENABLE);
> > > +	clks[IMX7D_DRAM_ALT_ROOT_CLK] =
> > > +imx_clk_gate2_flags("dram_alt_root_clk", "dram_alt_post_div", base
> > > ++ 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
> > >  	clks[IMX7D_OCOTP_CLK] = imx_clk_gate4("ocotp_clk",
> "ipg_root_clk",
> > > base + 0x4230, 0);
> > >  	clks[IMX7D_SNVS_CLK] = imx_clk_gate4("snvs_clk", "ipg_root_clk",
> > > base + 0x4250, 0);
> > >  	clks[IMX7D_MU_ROOT_CLK] = imx_clk_gate4("mu_root_clk",
> > > "ipg_root_clk", base + 0x4270, 0); @@ -882,9 +874,6 @@ static void
> > > __init imx7d_clocks_init(struct device_node *ccm_node)
> > >  	clk_data.clk_num = ARRAY_SIZE(clks);
> > >  	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
> > >
> > > -	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
> > > -		clk_prepare_enable(clks[clks_init_on[i]]);
> > > -
> > >  	clk_set_parent(clks[IMX7D_PLL_ARM_MAIN_BYPASS],
> > > clks[IMX7D_PLL_ARM_MAIN]);
> > >  	clk_set_parent(clks[IMX7D_PLL_DRAM_MAIN_BYPASS],
> > > clks[IMX7D_PLL_DRAM_MAIN]);
> > >  	clk_set_parent(clks[IMX7D_PLL_SYS_MAIN_BYPASS],
> > > clks[IMX7D_PLL_SYS_MAIN]); diff --git a/drivers/clk/imx/clk.h
> > > b/drivers/clk/imx/clk.h index 8076ec0..5895e223 100644
> > > --- a/drivers/clk/imx/clk.h
> > > +++ b/drivers/clk/imx/clk.h
> > > @@ -137,6 +137,13 @@ static inline struct clk
> > > *imx_clk_gate_dis(const char *name, const char *parent,
> > >  			shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);  }
> > >
> > > +static inline struct clk *imx_clk_gate_dis_flags(const char *name,
> > > +const char
> > > *parent,
> > > +		void __iomem *reg, u8 shift, unsigned long flags) {
> > > +	return clk_register_gate(NULL, name, parent, flags |
> > > CLK_SET_RATE_PARENT, reg,
> > > +			shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock); }
> > > +
> > >  static inline struct clk *imx_clk_gate2(const char *name, const
> > > char
> > *parent,
> > >  		void __iomem *reg, u8 shift)
> > >  {
> > > --
> > > 2.7.4

  reply	other threads:[~2018-08-13  1:15 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-08  4:39 [PATCH 1/2] clk: imx: imx7d: remove unnecessary clocks from clks_init_on array Anson Huang
2018-08-08  4:39 ` Anson Huang
2018-08-08  4:39 ` [PATCH 2/2] clk: imx: imx7d: remove " Anson Huang
2018-08-08  4:39   ` Anson Huang
2018-08-08  8:48   ` Peng Fan
2018-08-08  8:48     ` Peng Fan
2018-08-08  8:48     ` Peng Fan
2018-08-08  9:00     ` Anson Huang
2018-08-08  9:00       ` Anson Huang
2018-08-08  9:00       ` Anson Huang
2018-08-13  1:15       ` Peng Fan [this message]
2018-08-13  1:15         ` Peng Fan
2018-08-13  1:15         ` Peng Fan
2018-08-14  7:31         ` Anson Huang
2018-08-14  7:31           ` Anson Huang
2018-08-14  7:31           ` Anson Huang
2018-08-31  1:29         ` Stephen Boyd
2018-08-31  1:29           ` Stephen Boyd
2018-08-31  1:29           ` Stephen Boyd
2018-08-31  1:40           ` Anson Huang
2018-08-31  1:40             ` Anson Huang
2018-08-31  1:40             ` Anson Huang
2018-08-31  8:01           ` Jerome Forissier
2018-08-31  8:01             ` Jerome Forissier
2018-08-31  8:01             ` Jerome Forissier
2018-08-31 17:57             ` Stephen Boyd
2018-08-31 17:57               ` Stephen Boyd
2018-08-31 17:57               ` Stephen Boyd
2018-09-03  7:20               ` Anson Huang
2018-09-03  7:20                 ` Anson Huang
2018-09-03  7:20                 ` Anson Huang
2018-09-10  9:18                 ` Anson Huang
2018-09-10  9:18                   ` Anson Huang
2018-09-10  9:18                   ` Anson Huang
2018-10-08  7:40                 ` Stephen Boyd
2018-10-08  7:40                   ` Stephen Boyd
2018-10-08  8:34                   ` Anson Huang
2018-10-08  8:34                     ` Anson Huang
2018-10-12 19:48                     ` Stephen Boyd
2018-10-12 19:48                       ` Stephen Boyd
2018-10-15  9:33                       ` Anson Huang
2018-10-15  9:33                         ` Anson Huang
2018-10-15 16:45                         ` Stephen Boyd
2018-10-15 16:45                           ` Stephen Boyd
2018-10-16  4:37                           ` Anson Huang
2018-10-16  4:37                             ` Anson Huang
2018-10-16 22:24                             ` Stephen Boyd
2018-10-16 22:24                               ` Stephen Boyd

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM0PR04MB44813C7A3E0AF4F3BCFFCF0088390@AM0PR04MB4481.eurprd04.prod.outlook.com \
    --to=peng.fan@nxp.com \
    --cc=anson.huang@nxp.com \
    --cc=fabio.estevam@nxp.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=sboyd@kernel.org \
    --cc=shawnguo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.