clk: imx: Add CLK_IS_CRITICAL flag for busy divider and busy mux
PATCH v5 1/4 clk: imx: Add CLK_IS_CRITICAL flag for busy divider and busy mux
The busy divider and busy mux is actually used by the system critical clocks, so add 'CLK_IS_CRITICAL' to clocks registered with these two type.
---
change from V3->v4:
- fix a typo in commit log
change from v4->v5:
- optimize the commit subject
--- drivers/clk/imx/clk-busy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-busy.c +2 -2
@@ -101,7 +101,7 @@ struct clk *imx_clk_busy_divider(const char *name, const char *parent_name, init.name = name; init.ops = &clk_busy_divider_ops; - init.flags =CLK_SET_RATE_PARENT ; + init.flags =CLK_SET_RATE_PARENT |CLK_IS_CRITICAL ; init.parent_names = &parent_name; init.num_parents =1 ;
@@ -175,7 +175,7 @@ struct clk *imx_clk_busy_mux(const char *name, void __iomem *reg, u8 shift, init.name = name; init.ops = &clk_busy_mux_ops; - init.flags =0 ; + init.flags =CLK_IS_CRITICAL ; init.parent_names = parent_names; init.num_parents = num_parents;
Signature · 1 line
1.9.1
PATCH v5 2/4 clk: imx: add new gate/gate2 wrapper funtion
Add new gate/gate2 wrapper function to register clocks with optional flags.
---
change from v3->v4:
- no
change from v4->5:
- optimize commit subject
--- drivers/clk/imx/clk.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/clk/imx/clk.h +14 -0
@@ -123,6 +123,13 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent, shift, 0, &imx_ccm_lock); } +static inline struct clk *imx_clk_gate_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,0 , &imx_ccm_lock); +} +static inline struct clk *imx_clk_gate_dis (const char *name,const char *parent,void __iomem *reg,u8 shift) {
@@ -137,6 +144,13 @@ static inline struct clk *imx_clk_gate2(const char *name, const char *parent, shift, 0x3, 0, &imx_ccm_lock, NULL); } +static inline struct clk *imx_clk_gate2_flags (const char *name,const char *parent, +void __iomem *reg,u8 shift,unsigned long flags) +{ +return clk_register_gate2 (NULL , name, parent, flags |CLK_SET_RATE_PARENT , reg, + shift,0x3 ,0 , &imx_ccm_lock,NULL ); +} +static inline struct clk *imx_clk_gate2_shared (const char *name,const char *parent,void __iomem *reg,u8 shift,unsigned int *share_count)
Signature · 1 line
1.9.1
PATCH v5 2/4 clk: imx: add new gate/gate2 wrapper funtion
Quoted 10 lines
-----Original Message-----
From: Jacky Bai
Sent: Monday, March 12, 2018 5:29 PM
To: sboyd at kernel.org; robh+dt at kernel.org; shawnguo at kernel.org; kernel at pengutronix.de
Cc: Fabio Estevam <[email protected]>; linux-clk at vger.kernel.org; linux-arm-kernel at lists.infradead.org; dl-linux-imx <[email protected]>; A.s. Dong <[email protected]>; jacky.baip at gmail.com
Subject: [PATCH v5 2/4] clk: imx: add new gate/gate2 wrapper funtion
Quoted 3 lines
Add new gate/gate2 wrapper function to register clocks with optional flags.
Signed-off-by Bai Ping <[email protected]>
AFAIK Stephen requested to switch to clk_hw based APIs when reviewing my mx7ulp clk driver. We may need some comments from Stephen here.
Hi Stefen,
Do you have any comments about this?
Regards
Dong Aisheng
Quoted 46 lines
---
change fromv3->v4:
- no
change from v4->5:
- optimize commit subject--- drivers/clk/imx/clk.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+)drivers/clk/imx/clk.h index renamed from drivers/clk/imx/clk.h +0
-0d69c4bb..8076ec0 100644
drivers/clk/imx/clk.h +6
-0@@ -123,6 +123,13 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent, shift, 0, &imx_ccm_lock); } +static inline struct clk *imx_clk_gate_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,0 , &imx_ccm_lock); +} + static inline struct clk *imx_clk_gate_dis(const char *name, const char*parent,
drivers/clk/imx/clk.h +5
-1void __iomem *reg, u8 shift) {@@ -137,6 +144,13 @@ static inline struct clk *imx_clk_gate2(const char *name, const char *parent, shift, 0x3, 0, &imx_ccm_lock, NULL); } +static inline struct clk *imx_clk_gate2_flags (const char *name,const char *parent, +void __iomem *reg,u8 shift,unsigned long flags) { +return clk_register_gate2 (NULL , name, parent, flags |CLK_SET_RATE_PARENT , reg, + shift,0x3 ,0 , &imx_ccm_lock,NULL ); } +static inline struct clk *imx_clk_gate2_shared (const char *name,const char *parent,void __iomem *reg,u8 shift,unsigned int *share_count) --1.9.1
PATCH v5 2/4 clk: imx: add new gate/gate2 wrapper funtion
Quoted 4 lines
Quoted 4 lines
Subject: [PATCH v5 2/4] clk: imx: add new gate/gate2 wrapper funtion
Add new gate/gate2 wrapper function to register clocks with optional flags.
Quoted 9 lines
Quoted 1 line
Signed-off-by Bai Ping <[email protected]>AFAIK Stephen requested to switch to
clk_hwbased APIs when reviewing my mx7ulp clk driver. We may need some comments from Stephen here.Hi Stefen,
Do you have any comments about this?
I think we need to just keep it as we did on other imx6 platform.
In the clk driver, we need to do 'clk_set_rate/clk_set_parent' for clks that need special init sequence('assigned-clocks' in dts is not applicable for such flow) . If the we register with clk_hw_xxx API, it seems not easy to handle such things.
Additionally, if we switch to clk_hw based driver for imx6sll, all the old imx6 platform need to be changed accordingly. Too many efforts.
Jacky
Quoted 51 lines
Regards
Dong AishengQuoted 48 lines
---
change fromv3->v4:
- no
change from v4->5:
- optimize commit subject--- drivers/clk/imx/clk.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+)drivers/clk/imx/clk.h index renamed from drivers/clk/imx/clk.h +0
-0d69c4bb..8076ec0 100644
drivers/clk/imx/clk.h +7
-0@@ -123,6 +123,13 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent, shift, 0, &imx_ccm_lock); } +static inline struct clk *imx_clk_gate_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,0 , &imx_ccm_lock); +} +static inline struct clk *imx_clk_gate_dis(const char *name, const
char *parent,drivers/clk/imx/clk.h +6
-1void __iomem *reg, u8 shift) {@@ -137,6 +144,13 @@ static inline struct clk *imx_clk_gate2(const char *name, const char *parent, shift, 0x3, 0, &imx_ccm_lock, NULL); } +static inline struct clk *imx_clk_gate2_flags (const char *name,const +char *parent, +void __iomem *reg,u8 shift,unsigned long flags) { +return clk_register_gate2 (NULL , name, parent, flags |CLK_SET_RATE_PARENT , reg, + shift,0x3 ,0 , &imx_ccm_lock,NULL ); } +static inline struct clk *imx_clk_gate2_shared (const char *name,const char *parent,void __iomem *reg,u8 shift,unsigned int *share_count) --1.9.1
Stephen Boyd
maintainerPATCH v5 2/4 clk: imx: add new gate/gate2 wrapper funtion
In reply to A.s. DongQuoting A.s. Dong (2018-03-15 23:30:13)
Quoted 12 lines
Quoted 12 lines
-----Original Message-----
From: Jacky Bai
Sent: Monday, March 12, 2018 5:29 PM
To: sboyd at kernel.org; robh+dt at kernel.org; shawnguo at kernel.org; kernel at pengutronix.de
Cc: Fabio Estevam <[email protected]>; linux-clk at vger.kernel.org; linux-arm-kernel at lists.infradead.org; dl-linux-imx <[email protected]>; A.s. Dong <[email protected]>; jacky.baip at gmail.com
Subject: [PATCH v5 2/4] clk: imx: add new gate/gate2 wrapper funtionAdd new gate/gate2 wrapper function to register clocks with optional flags.
Quoted 9 lines
Quoted 1 line
Signed-off-by Bai Ping <[email protected]>AFAIK Stephen requested to switch to
clk_hwbased APIs when reviewing my mx7ulp clk driver. We may need some comments from Stephen here.Hi Stefen,
Do you have any comments about this?
Using clk_hw based APIs is preferred. If there's existing usage of non-hw based APIs then it's OK to keep same style and change later.
PATCH v5 3/4 dt-bindings: imx: update clock doc for imx6sll
In reply to Bai PingAdd clock binding doc update for imx6sll.
---
change from v3-> v4:
- use SPDX license identifier
- correct the binding doc format
change from v4-> v5:
- optimize the commit subject
--- .../devicetree/bindings/clock/imx6sll-clock.txt | 36 ++++ include/dt-bindings/clock/imx6sll-clock.h | 202 +++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/imx6sll-clock.txt create mode 100644 include/dt-bindings/clock/imx6sll-clock.h
Documentation/devicetree/bindings/clock/imx6sll-clock.txt new file +36 -0
@@ -0,0 +1,36 @@ +* Clock bindings for Freescale i.MX6 SLL + +Required properties: +- compatible: Should be "fsl,imx6sll-ccm" +- reg: Address and length of the register set +- #clock-cells: Should be <1> +- clocks: list of clock specifiers, must contain an entry for each required + entry in clock-names +- clock-names: should include entries "ckil", "osc", "ipp_di0" and "ipp_di1" + +The clock consumer should specify the desired clock by having the clock +ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx6sll-clock.h +for the full list of i.MX6 SLL clock IDs. + +Examples: + +#include <dt-bindings/clock/imx6sll-clock.h> + +clks: clock-controller@20c4000 { + compatible = "fsl,imx6sll-ccm"; + reg = <0x020c4000 0x4000>; + interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>; + #clock-cells = <1>; + clocks = <&ckil>, <&osc>, <&ipp_di0>, <&ipp_di1>; + clock-names = "ckil", "osc", "ipp_di0", "ipp_di1"; +}; + +uart1: serial@2020000 { + compatible = "fsl,imx6sl-uart", "fsl,imx6q-uart", "fsl,imx21-uart"; + reg = <0x02020000 0x4000>; + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clks IMX6SLL_CLK_UART1_IPG>, + <&clks IMX6SLL_CLK_UART1_SERIAL>; + clock-names = "ipg", "per"; +};
include/dt-bindings/clock/imx6sll-clock.h new file +202 -0
202 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v5 3/4 dt-bindings: imx: update clock doc for imx6sll
Quoted 3 lines · Bai Ping
Add clock binding doc update for imx6sll.
Signed-off-by Bai Ping <[email protected]>
The series looks good to me now, but I need Rob's ACK on this one to queue up the series for 4.17.
Shawn
PATCH v5 3/4 dt-bindings: imx: update clock doc for imx6sll
In reply to Bai PingQuoted 10 lines
-----Original Message-----
From: Jacky Bai
Sent: Monday, March 12, 2018 5:29 PM
To: sboyd at kernel.org; robh+dt at kernel.org; shawnguo at kernel.org; kernel at pengutronix.de
Cc: Fabio Estevam <[email protected]>; linux-clk at vger.kernel.org; linux-arm-kernel at lists.infradead.org; dl-linux-imx <[email protected]>; A.s. Dong <[email protected]>; jacky.baip at gmail.com
Subject: [PATCH v5 3/4] dt-bindings: imx: update clock doc for imx6sll
Quoted 3 lines
Add clock binding doc update for imx6sll.
Signed-off-by Bai Ping <[email protected]>
Looks good to me.
Regards
Dong Aisheng
Quoted 271 lines
---
change from v3-> v4:
- use SPDX license identifier
- correct the binding doc format
change from v4-> v5:
- optimize the commit subject--- .../devicetree/bindings/clock/imx6sll-clock.txt | 36 ++++ include/dt-bindings/clock/imx6sll-clock.h | 202 +++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/imx6sll- clock.txt create mode 100644 include/dt-bindings/clock/imx6sll-clock.hDocumentation/devicetree/bindings/clock/imx6sll-clock.txt new file +31
-0@@ -0,0 +1,36 @@ +* Clock bindings for Freescale i.MX6 SLL + +Required properties: +- compatible: Should be "fsl,imx6sll-ccm" +- reg: Address and length of the register set +- #clock-cells: Should be <1> +- clocks: list of clock specifiers, must contain an entry for each +required + entry in clock-names +- clock-names: should include entries "ckil", "osc", "ipp_di0" and "ipp_di1" + +The clock consumer should specify the desired clock by having the clock +ID in its "clocks" phandle cell. See +include/dt-bindings/clock/imx6sll-clock.h +for the full list of i.MX6 SLL clock IDs. + +Examples: + +#include <dt-bindings/clock/imx6sll-clock.h> + +clks: clock-controller at 20c4000 { + compatible = "fsl,imx6sll-ccm"; + reg = <0x020c4000 0x4000>; + interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>; + #clock-cells = <1>; + clocks = <&ckil>, <&osc>, <&ipp_di0>, <&ipp_di1>; + clock-names = "ckil", "osc", "ipp_di0", "ipp_di1"; }; + +uart1: serial at 2020000 { + compatible = "fsl,imx6sl-uart", "fsl,imx6q-uart", "fsl,imx21-uart";
Documentation/devicetree/bindings/clock/imx6sll-clock.txt new file +6
-0+ reg = <0x02020000 0x4000>; + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clks IMX6SLL_CLK_UART1_IPG>, + <&clks IMX6SLL_CLK_UART1_SERIAL>; + clock-names = "ipg", "per"; +};include/dt- renamed from include/dt-bindings/clock/imx6sll-clock.h +0
-0
bindings/clock/imx6sll-clock.h
new file mode 100644
index 0000000..151111einclude/dt-bindings/clock/imx6sll-clock.h new file +202
-1@@ -0,0 +1,202 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (C) 2016 Freescale Semiconductor, Inc. +* Copyright 2017-2018 NXP. +* +*/ + +#ifndef __DT_BINDINGS_CLOCK_IMX6SLL_H +#define __DT_BINDINGS_CLOCK_IMX6SLL_H + +#define IMX6SLL_CLK_DUMMY 0 +#define IMX6SLL_CLK_CKIL 1 +#define IMX6SLL_CLK_OSC 2 +#define IMX6SLL_PLL1_BYPASS_SRC 3 +#define IMX6SLL_PLL2_BYPASS_SRC 4 +#define IMX6SLL_PLL3_BYPASS_SRC 5 +#define IMX6SLL_PLL4_BYPASS_SRC 6 +#define IMX6SLL_PLL5_BYPASS_SRC 7 +#define IMX6SLL_PLL6_BYPASS_SRC 8 +#define IMX6SLL_PLL7_BYPASS_SRC 9 +#define IMX6SLL_CLK_PLL1 10 +#define IMX6SLL_CLK_PLL2 11 +#define IMX6SLL_CLK_PLL3 12 +#define IMX6SLL_CLK_PLL4 13 +#define IMX6SLL_CLK_PLL5 14 +#define IMX6SLL_CLK_PLL6 15 +#define IMX6SLL_CLK_PLL7 16 +#define IMX6SLL_PLL1_BYPASS 17 +#define IMX6SLL_PLL2_BYPASS 18 +#define IMX6SLL_PLL3_BYPASS 19 +#define IMX6SLL_PLL4_BYPASS 20 +#define IMX6SLL_PLL5_BYPASS 21 +#define IMX6SLL_PLL6_BYPASS 22 +#define IMX6SLL_PLL7_BYPASS 23 +#define IMX6SLL_CLK_PLL1_SYS 24 +#define IMX6SLL_CLK_PLL2_BUS 25 +#define IMX6SLL_CLK_PLL3_USB_OTG 26 +#define IMX6SLL_CLK_PLL4_AUDIO 27 +#define IMX6SLL_CLK_PLL5_VIDEO 28 +#define IMX6SLL_CLK_PLL6_ENET 29 +#define IMX6SLL_CLK_PLL7_USB_HOST 30 +#define IMX6SLL_CLK_USBPHY1 31 +#define IMX6SLL_CLK_USBPHY2 32 +#define IMX6SLL_CLK_USBPHY1_GATE 33 +#define IMX6SLL_CLK_USBPHY2_GATE 34 +#define IMX6SLL_CLK_PLL2_PFD0 35 +#define IMX6SLL_CLK_PLL2_PFD1 36 +#define IMX6SLL_CLK_PLL2_PFD2 37 +#define IMX6SLL_CLK_PLL2_PFD3 38 +#define IMX6SLL_CLK_PLL3_PFD0 39 +#define IMX6SLL_CLK_PLL3_PFD1 40 +#define IMX6SLL_CLK_PLL3_PFD2 41 +#define IMX6SLL_CLK_PLL3_PFD3 42 +#define IMX6SLL_CLK_PLL4_POST_DIV 43 +#define IMX6SLL_CLK_PLL4_AUDIO_DIV 44 +#define IMX6SLL_CLK_PLL5_POST_DIV 45 +#define IMX6SLL_CLK_PLL5_VIDEO_DIV 46 +#define IMX6SLL_CLK_PLL2_198M 47 +#define IMX6SLL_CLK_PLL3_120M 48 +#define IMX6SLL_CLK_PLL3_80M 49 +#define IMX6SLL_CLK_PLL3_60M 50 +#define IMX6SLL_CLK_STEP 51 +#define IMX6SLL_CLK_PLL1_SW 52 +#define IMX6SLL_CLK_AXI_ALT_SEL 53 +#define IMX6SLL_CLK_AXI_SEL 54 +#define IMX6SLL_CLK_PERIPH_PRE 55 +#define IMX6SLL_CLK_PERIPH2_PRE 56 +#define IMX6SLL_CLK_PERIPH_CLK2_SEL 57 +#define IMX6SLL_CLK_PERIPH2_CLK2_SEL 58 +#define IMX6SLL_CLK_PERCLK_SEL 59 +#define IMX6SLL_CLK_USDHC1_SEL 60 +#define IMX6SLL_CLK_USDHC2_SEL 61 +#define IMX6SLL_CLK_USDHC3_SEL 62 +#define IMX6SLL_CLK_SSI1_SEL 63 +#define IMX6SLL_CLK_SSI2_SEL 64 +#define IMX6SLL_CLK_SSI3_SEL 65 +#define IMX6SLL_CLK_PXP_SEL 66 +#define IMX6SLL_CLK_LCDIF_PRE_SEL 67 +#define IMX6SLL_CLK_LCDIF_SEL 68 +#define IMX6SLL_CLK_EPDC_PRE_SEL 69 +#define IMX6SLL_CLK_SPDIF_SEL 70 +#define IMX6SLL_CLK_ECSPI_SEL 71 +#define IMX6SLL_CLK_UART_SEL 72 +#define IMX6SLL_CLK_ARM 73 +#define IMX6SLL_CLK_PERIPH 74 +#define IMX6SLL_CLK_PERIPH2 75 +#define IMX6SLL_CLK_PERIPH2_CLK2 76 +#define IMX6SLL_CLK_PERIPH_CLK2 77 +#define IMX6SLL_CLK_MMDC_PODF 78 +#define IMX6SLL_CLK_AXI_PODF 79 +#define IMX6SLL_CLK_AHB 80 +#define IMX6SLL_CLK_IPG 81 +#define IMX6SLL_CLK_PERCLK 82 +#define IMX6SLL_CLK_USDHC1_PODF 83 +#define IMX6SLL_CLK_USDHC2_PODF 84 +#define IMX6SLL_CLK_USDHC3_PODF 85 +#define IMX6SLL_CLK_SSI1_PRED 86 +#define IMX6SLL_CLK_SSI2_PRED 87 +#define IMX6SLL_CLK_SSI3_PRED 88 +#define IMX6SLL_CLK_SSI1_PODF 89 +#define IMX6SLL_CLK_SSI2_PODF 90 +#define IMX6SLL_CLK_SSI3_PODF 91 +#define IMX6SLL_CLK_PXP_PODF 92 +#define IMX6SLL_CLK_LCDIF_PRED 93 +#define IMX6SLL_CLK_LCDIF_PODF 94 +#define IMX6SLL_CLK_EPDC_SEL 95 +#define IMX6SLL_CLK_EPDC_PODF 96 +#define IMX6SLL_CLK_SPDIF_PRED 97 +#define IMX6SLL_CLK_SPDIF_PODF 98 +#define IMX6SLL_CLK_ECSPI_PODF 99 +#define IMX6SLL_CLK_UART_PODF 100 + +/* CCGR 0 */ +#define IMX6SLL_CLK_AIPSTZ1 101 +#define IMX6SLL_CLK_AIPSTZ2 102 +#define IMX6SLL_CLK_DCP 103 +#define IMX6SLL_CLK_UART2_IPG 104 +#define IMX6SLL_CLK_UART2_SERIAL 105 + +/* CCGR 1 */ +#define IMX6SLL_CLK_ECSPI1 106 +#define IMX6SLL_CLK_ECSPI2 107 +#define IMX6SLL_CLK_ECSPI3 108 +#define IMX6SLL_CLK_ECSPI4 109 +#define IMX6SLL_CLK_UART3_IPG 110 +#define IMX6SLL_CLK_UART3_SERIAL 111 +#define IMX6SLL_CLK_UART4_IPG 112 +#define IMX6SLL_CLK_UART4_SERIAL 113 +#define IMX6SLL_CLK_EPIT1 114 +#define IMX6SLL_CLK_EPIT2 115 +#define IMX6SLL_CLK_GPT_BUS 116 +#define IMX6SLL_CLK_GPT_SERIAL 117 + +/* CCGR2 */ +#define IMX6SLL_CLK_CSI 118 +#define IMX6SLL_CLK_I2C1 119 +#define IMX6SLL_CLK_I2C2 120 +#define IMX6SLL_CLK_I2C3 121 +#define IMX6SLL_CLK_OCOTP 122 +#define IMX6SLL_CLK_LCDIF_APB 123 +#define IMX6SLL_CLK_PXP 124 + +/* CCGR3 */ +#define IMX6SLL_CLK_UART5_IPG 125 +#define IMX6SLL_CLK_UART5_SERIAL 126 +#define IMX6SLL_CLK_EPDC_AXI 127 +#define IMX6SLL_CLK_EPDC_PIX 128 +#define IMX6SLL_CLK_LCDIF_PIX 129 +#define IMX6SLL_CLK_WDOG1 130 +#define IMX6SLL_CLK_MMDC_P0_FAST 131 +#define IMX6SLL_CLK_MMDC_P0_IPG 132 +#define IMX6SLL_CLK_OCRAM 133 + +/* CCGR4 */ +#define IMX6SLL_CLK_PWM1 134 +#define IMX6SLL_CLK_PWM2 135 +#define IMX6SLL_CLK_PWM3 136 +#define IMX6SLL_CLK_PWM4 137 + +/* CCGR 5 */ +#define IMX6SLL_CLK_ROM 138 +#define IMX6SLL_CLK_SDMA 139 +#define IMX6SLL_CLK_KPP 140 +#define IMX6SLL_CLK_WDOG2 141 +#define IMX6SLL_CLK_SPBA 142 +#define IMX6SLL_CLK_SPDIF 143 +#define IMX6SLL_CLK_SPDIF_GCLK 144 +#define IMX6SLL_CLK_SSI1 145 +#define IMX6SLL_CLK_SSI1_IPG 146 +#define IMX6SLL_CLK_SSI2 147 +#define IMX6SLL_CLK_SSI2_IPG 148 +#define IMX6SLL_CLK_SSI3 149 +#define IMX6SLL_CLK_SSI3_IPG 150 +#define IMX6SLL_CLK_UART1_IPG 151 +#define IMX6SLL_CLK_UART1_SERIAL 152 + +/* CCGR 6 */ +#define IMX6SLL_CLK_USBOH3 153 +#define IMX6SLL_CLK_USDHC1 154 +#define IMX6SLL_CLK_USDHC2 155 +#define IMX6SLL_CLK_USDHC3 156 + +#define IMX6SLL_CLK_IPP_DI0 157 +#define IMX6SLL_CLK_IPP_DI1 158 +#define IMX6SLL_CLK_LDB_DI0_SEL 159 +#define IMX6SLL_CLK_LDB_DI0_DIV_3_5 160 +#define IMX6SLL_CLK_LDB_DI0_DIV_7 161 +#define IMX6SLL_CLK_LDB_DI0_DIV_SEL 162 +#define IMX6SLL_CLK_LDB_DI0 163 +#define IMX6SLL_CLK_LDB_DI1_SEL 164 +#define IMX6SLL_CLK_LDB_DI1_DIV_3_5 165 +#define IMX6SLL_CLK_LDB_DI1_DIV_7 166 +#define IMX6SLL_CLK_LDB_DI1_DIV_SEL 167 +#define IMX6SLL_CLK_LDB_DI1 168 +#define IMX6SLL_CLK_EXTERN_AUDIO_SEL 169 +#define IMX6SLL_CLK_EXTERN_AUDIO_PRED 170 +#define IMX6SLL_CLK_EXTERN_AUDIO_PODF 171 +#define IMX6SLL_CLK_EXTERN_AUDIO 172 + +#define IMX6SLL_CLK_END 173 + +#endif /* __DT_BINDINGS_CLOCK_IMX6SLL_H */ --1.9.1
PATCH v5 4/4 clk: imx: add clock driver for imx6sll
In reply to Bai PingAdd clk driver support for imx6sll.
---
change v1->v2
- fix minor comment from stephen
change v2->v3
- remove init_on array, use CLK_IS_CRITICAL flag to make sure system critical clock is always on
change v3->v4:
- update the license identifier to SPDX
- reformat the code indent
change v4->v5:
- optimize the commit subject
- remove the unnecessary macro define
--- drivers/clk/imx/Makefile | 1 + drivers/clk/imx/clk-imx6sll.c | 343 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 344 insertions(+) create mode 100644 drivers/clk/imx/clk-imx6sll.c
drivers/clk/imx/Makefile +1 -0
@@ -22,6 +22,7 @@ obj-$(CONFIG_SOC_IMX35) += clk-imx35.o obj-$(CONFIG_SOC_IMX5) += clk-imx51-imx53.o obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o +obj-$(CONFIG_SOC_IMX6SLL) += clk-imx6sll.o obj-$(CONFIG_SOC_IMX6SX) += clk-imx6sx.o obj-$(CONFIG_SOC_IMX6UL) += clk-imx6ul.o obj-$(CONFIG_SOC_IMX7D) += clk-imx7d.o
drivers/clk/imx/clk-imx6sll.c new file +343 -0
343 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v5 4/4 clk: imx: add clock driver for imx6sll
Quoted 63 lines
-----Original Message-----
From: Jacky Bai
Sent: Monday, March 12, 2018 5:29 PM
To: sboyd at kernel.org; robh+dt at kernel.org; shawnguo at kernel.org; kernel at pengutronix.de
Cc: Fabio Estevam <[email protected]>; linux-clk at vger.kernel.org; linux-arm-kernel at lists.infradead.org; dl-linux-imx <[email protected]>; A.s. Dong <[email protected]>; jacky.baip at gmail.com
Subject: [PATCH v5 4/4] clk: imx: add clock driver for imx6sllAdd clk driver support for imx6sll.
Signed-off-by Bai Ping <[email protected]>---
changev1->v2
- fix minor comment from stephen
changev2->v3
- removeinit_onarray, useCLK_IS_CRITICALflag to make sure system critical clock is always on
changev3->v4:
- update the license identifier to SPDX
- reformat the code indent
changev4->v5:
- optimize the commit subject
- remove the unnecessary macro define--- drivers/clk/imx/Makefile | 1 + drivers/clk/imx/clk-imx6sll.c | 343 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 344 insertions(+) create mode 100644 drivers/clk/imx/clk-imx6sll.cdrivers/clk/imx/Makefile index renamed from drivers/clk/imx/Makefile +0
-0f91f2b2..8c3baa7 100644
drivers/clk/imx/Makefile +1
-0@@ -22,6 +22,7 @@ obj-$(CONFIG_SOC_IMX35) += clk-imx35.o obj-$(CONFIG_SOC_IMX5) += clk-imx51-imx53.o obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o +obj-$(CONFIG_SOC_IMX6SLL) += clk-imx6sll.o obj-$(CONFIG_SOC_IMX6SX) += clk-imx6sx.o obj-$(CONFIG_SOC_IMX6UL) += clk-imx6ul.o obj-$(CONFIG_SOC_IMX7D) += clk-imx7d.o diff --git a/drivers/clk/imx/clk-
imx6sll.cb/drivers/clk/imx/clk-imx6sll.cnew file mode 100644 index 0000000..1415817drivers/clk/imx/clk-imx6sll.c new file +14
-0@@ -0,0 +1,343 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (C) 2016 Freescale Semiconductor, Inc. +* Copyright 2017-2018 NXP. +*/ + +#include <dt-bindings/clock/imx6sll-clock.h> +#include <linux/clk.h> +#include <linux/clkdev.h> +#include <linux/err.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h>
[...]
drivers/clk/imx/clk-imx6sll.c line 16
Quoted 2 lines
drivers/clk/imx/clk-imx6sll.c new file +2
-0+#include <linux/of_irq.h> +#include <linux/types.h>
Do we need above two things?
Quoted 211 lines
drivers/clk/imx/clk-imx6sll.c new file +84
-0+ +#include "clk.h" + +#define CCM_ANALOG_PLL_BYPASS (0x1 << 16) +#define BM_CCM_CCDR_MMDC_CH0_MASK (0x2 << 16) +#define xPLL_CLR (offset) (offset + 0x8) + +static const char *pll_bypass_src_sels[] = {"osc" ,"dummy" , };static +const char *pll1_bypass_sels[] = {"pll1" ,"pll1_bypass_src" , };static +const char *pll2_bypass_sels[] = {"pll2" ,"pll2_bypass_src" , };static +const char *pll3_bypass_sels[] = {"pll3" ,"pll3_bypass_src" , };static +const char *pll4_bypass_sels[] = {"pll4" ,"pll4_bypass_src" , };static +const char *pll5_bypass_sels[] = {"pll5" ,"pll5_bypass_src" , };static +const char *pll6_bypass_sels[] = {"pll6" ,"pll6_bypass_src" , };static +const char *pll7_bypass_sels[] = {"pll7" ,"pll7_bypass_src" , };static +const char *step_sels[] = {"osc" ,"pll2_pfd2_396m" , };static const +char *pll1_sw_sels[] = {"pll1_sys" ,"step" , };static const char +*axi_alt_sels[] = {"pll2_pfd2_396m" ,"pll3_pfd1_540m" , };static const +char *axi_sels[] = {"periph" ,"axi_alt_sel" , };static const char +*periph_pre_sels[] = {"pll2_bus" ,"pll2_pfd2_396m" ,"pll2_pfd0_352m" , +"pll2_198m" , };static const char *periph2_pre_sels[] = {"pll2_bus" , +"pll2_pfd2_396m" ,"pll2_pfd0_352m" ,"pll4_audio_div" , };static const +char *periph_clk2_sels[] = {"pll3_usb_otg" ,"osc" ,"osc" , };static +const char *periph2_clk2_sels[] = {"pll3_usb_otg" ,"osc" , };static +const char *periph_sels[] = {"periph_pre" ,"periph_clk2" , };static +const char *periph2_sels[] = {"periph2_pre" ,"periph2_clk2" , };static +const char *usdhc_sels[] = {"pll2_pfd2_396m" ,"pll2_pfd0_352m" , }; +static const char *ssi_sels[] = {"pll3_pfd2_508m" ,"pll3_pfd3_454m" , +"pll4_audio_div" ,"dummy" ,};static const char *spdif_sels[] = { +"pll4_audio_div" ,"pll3_pfd2_508m" ,"pll5_video_div" ,"pll3_usb_otg" , +};static const char *ldb_di0_div_sels[] = {"ldb_di0_div_3_5" , +"ldb_di0_div_7" , };static const char *ldb_di1_div_sels[] = { +"ldb_di1_div_3_5" ,"ldb_di1_div_7" , };static const char +*ldb_di0_sels[] = {"pll5_video_div" ,"pll2_pfd0_352m" , +"pll2_pfd2_396m" ,"pll2_pfd3_594m" ,"pll2_pfd1_594m" ,"pll3_pfd3_454m" , +};static const char *ldb_di1_sels[] = {"pll3_usb_otg" , +"pll2_pfd0_352m" ,"pll2_pfd2_396m" ,"pll2_bus" ,"pll3_pfd3_454m" , +"pll3_pfd2_508m" , };static const char *lcdif_pre_sels[] = { +"pll2_bus" ,"pll3_pfd3_454m" ,"pll5_video_div" ,"pll2_pfd0_352m" , +"pll2_pfd1_594m" ,"pll3_pfd1_540m" , };static const char *ecspi_sels[] += {"pll3_60m" ,"osc" , };static const char *uart_sels[] = { +"pll3_80m" ,"osc" , };static const char *perclk_sels[] = {"ipg" , +"osc" , };static const char *lcdif_sels[] = {"lcdif_podf" ,"ipp_di0" , +"ipp_di1" ,"ldb_di0" ,"ldb_di1" , }; + +static const char *epdc_pre_sels[] = {"pll2_bus" ,"pll3_usb_otg" , +"pll5_video_div" ,"pll2_pfd0_352m" ,"pll2_pfd2_396m" ,"pll3_pfd2_508m" , +};static const char *epdc_sels[] = {"epdc_podf" ,"ipp_di0" , +"ipp_di1" ,"ldb_di0" ,"ldb_di1" , }; + +static struct clk *clks[IMX6SLL_CLK_END ];static struct +clk_onecell_data clk_data; + +static const struct clk_div_table post_div_table[] = { + { .val =2 , .div =1 , }, + { .val =1 , .div =2 , }, + { .val =0 , .div =4 , }, + { } +}; + +static const struct clk_div_table video_div_table[] = { + { .val =0 , .div =1 , }, + { .val =1 , .div =2 , }, + { .val =2 , .div =1 , }, + { .val =3 , .div =4 , }, + { } +}; + +static u32 share_count_audio; +static u32 share_count_ssi1; +static u32 share_count_ssi2; +static u32 share_count_ssi3; + +static void __init imx6sll_clocks_init (struct device_node *ccm_node) { +struct device_node *np; +void __iomem *base; + + clks[IMX6SLL_CLK_DUMMY ] =imx_clk_fixed ("dummy" ,0 ); + + clks[IMX6SLL_CLK_CKIL ] =of_clk_get_by_name (ccm_node,"ckil" ); + clks[IMX6SLL_CLK_OSC ] =of_clk_get_by_name (ccm_node,"osc" ); + +/* ipp_di clock is external input */ + clks[IMX6SLL_CLK_IPP_DI0] = of_clk_get_by_name(ccm_node,"
ipp_di0");drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_IPP_DI1] = of_clk_get_by_name(ccm_node,"
ipp_di1");drivers/clk/imx/clk-imx6sll.c new file +15
-0+ + np =of_find_compatible_node (NULL ,NULL ,"fsl,imx6sll-anatop" ); + base =of_iomap (np,0 ); +WARN_ON (!base); + +/* Do not bypass PLLs initially */ +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0x0 )); +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0x10 )); +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0x20 )); +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0x30 )); +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0x70 )); +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0xa0 )); +writel_relaxed (CCM_ANALOG_PLL_BYPASS , base +xPLL_CLR (0xe0 )); + + clks[IMX6SLL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src",base +
0x00, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src",base +
0x30, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL3_BYPASS_SRC] = imx_clk_mux("pll3_bypass_src",base +
0x10, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL4_BYPASS_SRC] = imx_clk_mux("pll4_bypass_src",base +
0x70, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL5_BYPASS_SRC] = imx_clk_mux("pll5_bypass_src",base +
0xa0, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL6_BYPASS_SRC] = imx_clk_mux("pll6_bypass_src",base +
0xe0, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL7_BYPASS_SRC] = imx_clk_mux("pll7_bypass_src",base +
+0x20, 14, 1,pll_bypass_src_sels,ARRAY_SIZE(pll_bypass_src_sels));drivers/clk/imx/clk-imx6sll.c new file +2
-0+ + clks[IMX6SLL_CLK_PLL1] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1","
pll1_bypass_src", base +0x00,0x7f);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2","
pll2_bypass_src", base +0x30,0x1);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3] = imx_clk_pllv3(IMX_PLLV3_USB, "pll3","
pll3_bypass_src", base +0x10,0x3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL4] = imx_clk_pllv3(IMX_PLLV3_AV, "pll4","
pll4_bypass_src", base +0x70,0x7f);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL5] = imx_clk_pllv3(IMX_PLLV3_AV, "pll5","
pll5_bypass_src", base +0xa0,0x7f);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL6] = imx_clk_pllv3(IMX_PLLV3_ENET, "pll6","
pll6_bypass_src", base +0xe0,0x3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL7] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7","
pll7_bypass_src", base +0x20,0x3);drivers/clk/imx/clk-imx6sll.c new file +2
-0+ + clks[IMX6SLL_PLL1_BYPASS] = imx_clk_mux_flags("pll1_bypass",base +
0x00, 16, 1,pll1_bypass_sels,ARRAY_SIZE(pll1_bypass_sels),CLK_SET_RATE_PARENT);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL2_BYPASS] = imx_clk_mux_flags("pll2_bypass",base +
0x30, 16, 1,pll2_bypass_sels,ARRAY_SIZE(pll2_bypass_sels),CLK_SET_RATE_PARENT);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL3_BYPASS] = imx_clk_mux_flags("pll3_bypass",base +
0x10, 16, 1,pll3_bypass_sels,ARRAY_SIZE(pll3_bypass_sels),CLK_SET_RATE_PARENT);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL4_BYPASS] = imx_clk_mux_flags("pll4_bypass",base +
0x70, 16, 1,pll4_bypass_sels,ARRAY_SIZE(pll4_bypass_sels),CLK_SET_RATE_PARENT);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL5_BYPASS] = imx_clk_mux_flags("pll5_bypass",base +
0xa0, 16, 1,pll5_bypass_sels,ARRAY_SIZE(pll5_bypass_sels),CLK_SET_RATE_PARENT);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL6_BYPASS] = imx_clk_mux_flags("pll6_bypass",base +
0xe0, 16, 1,pll6_bypass_sels,ARRAY_SIZE(pll6_bypass_sels),CLK_SET_RATE_PARENT);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_PLL7_BYPASS] = imx_clk_mux_flags("pll7_bypass",base +
+0x20, 16, 1,pll7_bypass_sels,ARRAY_SIZE(pll7_bypass_sels),drivers/clk/imx/clk-imx6sll.c new file +3
-0+CLK_SET_RATE_PARENT); + + clks[IMX6SLL_CLK_PLL1_SYS] = imx_clk_fixed_factor("pll1_sys","
pll1_bypass", 1, 1);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2_BUS] = imx_clk_gate("pll2_bus","
pll2_bypass", base +0x30, 13);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_USB_OTG] =
imx_clk_gate("pll3_usb_otg", "pll3_bypass", base + 0x10, 13);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL4_AUDIO] = imx_clk_gate("pll4_audio","pll4_bypass", base + 0x70, 13);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL5_VIDEO] = imx_clk_gate("pll5_video","pll5_bypass", base + 0xa0, 13);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL6_ENET] = imx_clk_gate("pll6_enet","
pll6_bypass", base +0xe0, 13);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL7_USB_HOST] =
imx_clk_gate("pll7_usb_host", "pll7_bypass", base + 0x20, 13);drivers/clk/imx/clk-imx6sll.c new file +8
-0+ +/* +* Bit 20 is the reserved and read-only bit, we do this only for: +* - Do nothing for usbphy clk_enable/disable +* - Keep refcount when do usbphy clk_enable/disable, in that case, +* the clk framework many need to enable/disable usbphy's parent +*/ + clks[IMX6SLL_CLK_USBPHY1] = imx_clk_gate("usbphy1","
pll3_usb_otg", base +0x10, 20);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USBPHY2] = imx_clk_gate("usbphy2","
pll7_usb_host",drivers/clk/imx/clk-imx6sll.c new file +8
-0+base + 0x20, 20); + +/* +* usbphy*_gate needs to be on after system boots up, and software +* never needs to control it anymore. +*/ +if (IS_ENABLED (CONFIG_USB_MXS_PHY )) { + clks[IMX6SLL_CLK_USBPHY1_GATE] =
imx_clk_gate_flags("usbphy1_gate", "dummy", base + 0x10, 6, CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USBPHY2_GATE] =
imx_clk_gate_flags("usbphy2_gate", "dummy", base + 0x20, 6, CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ } + +/* name
parent_namereg idx */drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2_PFD0] = imx_clk_pfd("pll2_pfd0_352m","
pll2_bus", base +0x100, 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2_PFD1] = imx_clk_pfd("pll2_pfd1_594m","
pll2_bus", base +0x100, 1);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2_PFD2] = imx_clk_pfd("pll2_pfd2_396m","
pll2_bus", base +0x100, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2_PFD3] = imx_clk_pfd("pll2_pfd3_594m","
pll2_bus", base +0x100, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_PFD0] = imx_clk_pfd("pll3_pfd0_720m","
pll3_usb_otg", base +0xf0, 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_PFD1] = imx_clk_pfd("pll3_pfd1_540m","
pll3_usb_otg", base +0xf0, 1);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_PFD2] = imx_clk_pfd("pll3_pfd2_508m","
pll3_usb_otg", base +0xf0, 2);
drivers/clk/imx/clk-imx6sll.c
Quoted 2 lines
drivers/clk/imx/clk-imx6sll.c new file +2
-0+ clks[IMX6SLL_CLK_PLL3_PFD3 ] =imx_clk_pfd ("pll3_pfd3_454m" , +"pll3_usb_otg" , base +0xf0 ,3 );
It looks to me drivers/clk/imx/clk-pfd.c implementation may be buggy as imx6 Pfd is using share register for both divider and gate operation while no lock is kept.
Quoted 11 lines
drivers/clk/imx/clk-imx6sll.c new file +2
-0+ + clks[IMX6SLL_CLK_PLL4_POST_DIV] =clk_register_divider_table(NULL, "
pll4_post_div", "pll4_audio",drivers/clk/imx/clk-imx6sll.c new file +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base + 0x70,19, 2, 0,
post_div_table,&imx_ccm_lock);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL4_AUDIO_DIV] = clk_register_divider(NULL,"
pll4_audio_div", "pll4_post_div",drivers/clk/imx/clk-imx6sll.c new file +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base +
0x170, 15, 1, 0,&imx_ccm_lock);From the reference manual, this divide bit actually is a
AUDIO_DIV_LSB
While there're another AUDIO_DIV_MSB.
Definition as follows:
NOTE: LSB bit value pertains to the last bit, please program the MSB bit (bit 23) as well, to change divider value for more information.
00 divide by 1 (Default)
01 divide by 2
10 divide by 1
11 divide by 4
Seems we only use LSB here and reply on the HW reset value(0) of MSB bit. This makes us lose the divide 4 functionality. (MX6Q has the same issue).
Due to MSB is bit 23 which Is not alongside with LSB, the proper solution might be Invent imx specific clk_imx_register_discrete_divider_table.
As this issue is already there and not affect function currently, it might be ok to do that later.
Quoted 46 lines
drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL5_POST_DIV] =clk_register_divider_table(NULL, "
pll5_post_div", "pll5_video",drivers/clk/imx/clk-imx6sll.c new file +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base + 0xa0,19, 2, 0,
post_div_table,&imx_ccm_lock);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL5_VIDEO_DIV] =clk_register_divider_table(NULL, "
pll5_video_div", "pll5_post_div",drivers/clk/imx/clk-imx6sll.c new file +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base +
0x170, 30, 2, 0,drivers/clk/imx/clk-imx6sll.c new file +3
-0+video_div_table, &imx_ccm_lock); + +/* name
parent_namemult div */drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL2_198M] = imx_clk_fixed_factor("pll2_198m","
pll2_pfd2_396m", 1, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_120M] = imx_clk_fixed_factor("pll3_120m","
pll3_usb_otg", 1, 4);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_80M] = imx_clk_fixed_factor("pll3_80m","
pll3_usb_otg", 1, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PLL3_60M] = imx_clk_fixed_factor("pll3_60m","
pll3_usb_otg", 1, 8);drivers/clk/imx/clk-imx6sll.c new file +8
-0+ + np = ccm_node; + base =of_iomap (np,0 ); +WARN_ON (!base); + + clks[IMX6SLL_CLK_STEP ] =imx_clk_mux ("step" , base + 0x0c, 8, 1, step_sels, ARRAY_SIZE(step_sels)); + clks[IMX6SLL_CLK_PLL1_SW] = imx_clk_mux_flags("pll1_sw",base +
0x0c, 2, 1,pll1_sw_sels,ARRAY_SIZE(pll1_sw_sels), 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_AXI_ALT_SEL] = imx_clk_mux("axi_alt_sel",base + 0x14, 7, 1, axi_alt_sels, ARRAY_SIZE(axi_alt_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_AXI_SEL] = imx_clk_mux_flags("axi_sel",base +
0x14, 6, 1,axi_sels,ARRAY_SIZE(axi_sels), 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERIPH_PRE] =imx_clk_mux("periph_pre", base +
0x18, 18, 2,periph_pre_sels,ARRAY_SIZE(periph_pre_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERIPH2_PRE] =imx_clk_mux("periph2_pre", base +
0x18, 21, 2,periph2_pre_sels,ARRAY_SIZE(periph2_pre_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERIPH_CLK2_SEL] =
imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERIPH2_CLK2_SEL] =
imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC2_SEL] =
Quoted 2 lines
imx_clk_mux("usdhc2_sel", base +
0x1c, 17, 1,usdhc_sels,ARRAY_SIZE(usdhc_sels));
Any reason not in order?
Quoted 274 lines
drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC1_SEL] =imx_clk_mux("usdhc1_sel", base +
0x1c, 16, 1,usdhc_sels,ARRAY_SIZE(usdhc_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC3_SEL] =imx_clk_mux("usdhc3_sel", base +
0x1c, 18, 1,usdhc_sels,ARRAY_SIZE(usdhc_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI1_SEL] = imx_clk_mux("ssi1_sel", base +
0x1c, 10, 2,ssi_sels,ARRAY_SIZE(ssi_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI2_SEL] = imx_clk_mux("ssi2_sel", base +
0x1c, 12, 2,ssi_sels,ARRAY_SIZE(ssi_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI3_SEL] = imx_clk_mux("ssi3_sel", base +
0x1c, 14, 2,ssi_sels,ARRAY_SIZE(ssi_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERCLK_SEL] = imx_clk_mux("perclk_sel",base + 0x1c, 6, 1, perclk_sels, ARRAY_SIZE(perclk_sels));drivers/clk/imx/clk-imx6sll.c new file +5
-0+ clks[IMX6SLL_CLK_UART_SEL ] =imx_clk_mux ("uart_sel" , base + 0x24, 6, 1, uart_sels, ARRAY_SIZE(uart_sels)); + clks[IMX6SLL_CLK_SPDIF_SEL ] =imx_clk_mux ("spdif_sel" , base + 0x30, 20, 2, spdif_sels, ARRAY_SIZE(spdif_sels)); + clks[IMX6SLL_CLK_EXTERN_AUDIO_SEL] =
imx_clk_mux("extern_audio_sel", base + 0x30, 7, 2, spdif_sels, ARRAY_SIZE(spdif_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EPDC_PRE_SEL] =imx_clk_mux("epdc_pre_sel", base +
0x34, 15, 3,epdc_pre_sels,ARRAY_SIZE(epdc_pre_sels));drivers/clk/imx/clk-imx6sll.c new file +5
-0+ clks[IMX6SLL_CLK_EPDC_SEL ] =imx_clk_mux ("epdc_sel" , base + 0x34, 9, 3, epdc_sels, ARRAY_SIZE(epdc_sels)); + clks[IMX6SLL_CLK_ECSPI_SEL ] =imx_clk_mux ("ecspi_sel" , base + 0x38, 18, 1, ecspi_sels, ARRAY_SIZE(ecspi_sels)); + clks[IMX6SLL_CLK_LCDIF_PRE_SEL] =
imx_clk_mux("lcdif_pre_sel", base + 0x38, 15, 3, lcdif_pre_sels, ARRAY_SIZE(lcdif_pre_sels));drivers/clk/imx/clk-imx6sll.c new file +4
-0+ clks[IMX6SLL_CLK_LCDIF_SEL ] =imx_clk_mux ("lcdif_sel" , base + 0x38, 9, 3, lcdif_sels, ARRAY_SIZE(lcdif_sels)); + + clks[IMX6SLL_CLK_PERIPH] = imx_clk_busy_mux("periph", base +
0x14, 25, 1, base +0x48, 5,periph_sels,ARRAY_SIZE(periph_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERIPH2] = imx_clk_busy_mux("periph2", base +
0x14,
+26, 1, base +0x48, 3,periph2_sels,ARRAY_SIZE(periph2_sels));drivers/clk/imx/clk-imx6sll.c new file +2
-0+ + clks[IMX6SLL_CLK_PERIPH_CLK2] =
imx_clk_divider("periph_clk2", "periph_clk2_sel", base + 0x14, 27, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERIPH2_CLK2] =
imx_clk_divider("periph2_clk2", "periph2_clk2_sel", base + 0x14, 0, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_IPG] = imx_clk_divider("ipg","ahb", base + 0x14, 8, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LCDIF_PODF] =
imx_clk_divider("lcdif_podf", "lcdif_pred", base + 0x18, 23, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PERCLK] = imx_clk_divider("perclk","
perclk_sel", base +0x1c, 0, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC3_PODF] =
imx_clk_divider("usdhc3_podf", "usdhc3_sel", base + 0x24, 19, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC2_PODF] =
imx_clk_divider("usdhc2_podf", "usdhc2_sel", base + 0x24, 16, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC1_PODF] =
imx_clk_divider("usdhc1_podf", "usdhc1_sel", base + 0x24, 11, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART_PODF] =
imx_clk_divider("uart_podf", "uart_sel", base + 0x24, 0, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI3_PRED] = imx_clk_divider("ssi3_pred","
ssi3_sel", base +0x28, 22, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI3_PODF] = imx_clk_divider("ssi3_podf","
ssi3_pred", base +0x28, 16, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI1_PRED] = imx_clk_divider("ssi1_pred","
ssi1_sel", base +0x28, 6, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI1_PODF] = imx_clk_divider("ssi1_podf","
ssi1_pred", base +0x28, 0, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI2_PRED] = imx_clk_divider("ssi2_pred","
ssi2_sel", base +0x2c, 6, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI2_PODF] = imx_clk_divider("ssi2_podf","
ssi2_pred", base +0x2c, 0, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SPDIF_PRED] =
imx_clk_divider("spdif_pred", "spdif_sel", base + 0x30, 25, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SPDIF_PODF] =
imx_clk_divider("spdif_podf", "spdif_pred", base + 0x30, 22, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EXTERN_AUDIO_PRED] =
imx_clk_divider("extern_audio_pred", "extern_audio_sel", base + 0x30, 12, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EXTERN_AUDIO_PODF] =
imx_clk_divider("extern_audio_podf", "extern_audio_pred", base + 0x30, 9, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EPDC_PODF] = imx_clk_divider("epdc_podf","
epdc_pre_sel", base +0x34, 12, 3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_ECSPI_PODF] = imx_clk_divider("ecspi_podf","
ecspi_sel", base +0x38, 19, 6);drivers/clk/imx/clk-imx6sll.c new file +4
-0+ clks[IMX6SLL_CLK_LCDIF_PRED ] =imx_clk_divider ("lcdif_pred" , +"lcdif_pre_sel" , base +0x38 ,12 ,3 ); + + clks[IMX6SLL_CLK_ARM] =imx_clk_busy_divider("arm", "
pll1_sw", base +0x10, 0, 3, base +0x48, 16);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_MMDC_PODF] =imx_clk_busy_divider("mmdc_podf", "periph2", base +
0x14, 3, 3,
base +0x48, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_AXI_PODF] = imx_clk_busy_divider("axi","
axi_sel", base +0x14, 16, 3, base +0x48, 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_AHB] =imx_clk_busy_divider("ahb", "periph", base +
0x14, 10, 3, base +0x48, 1);drivers/clk/imx/clk-imx6sll.c new file +2
-0+ + clks[IMX6SLL_CLK_LDB_DI0_DIV_3_5] =
imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LDB_DI0_DIV_7] =
imx_clk_fixed_factor("ldb_di0_div_7", "ldb_di0_sel", 1, 7);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_DIV_3_5] =
imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1_sel", 2, 7);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_DIV_7] =
imx_clk_fixed_factor("ldb_di1_div_7", "ldb_di1_sel", 1, 7);drivers/clk/imx/clk-imx6sll.c new file +2
-0+ + clks[IMX6SLL_CLK_LDB_DI0_SEL] = imx_clk_mux("ldb_di0_sel",base +
0x2c, 9, 3,ldb_di0_sels,ARRAY_SIZE(ldb_di0_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_SEL] = imx_clk_mux("ldb_di1_sel",base +
0x1c, 7, 3,ldb_di1_sels,ARRAY_SIZE(ldb_di1_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LDB_DI0_DIV_SEL] =
imx_clk_mux("ldb_di0_div_sel", base + 0x20, 10, 1, ldb_di0_div_sels, ARRAY_SIZE(ldb_di0_div_sels));drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_DIV_SEL] =imx_clk_mux("ldb_di1_div_sel",
drivers/clk/imx/clk-imx6sll.c new file +4
-0+base + 0x20, 10, 1, ldb_di1_div_sels, ARRAY_SIZE(ldb_di1_div_sels)); + +/* CCGR0 */ + clks[IMX6SLL_CLK_AIPSTZ1] = imx_clk_gate2_flags("aips_tz1","ahb", base +
0x68, 0,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_AIPSTZ2] = imx_clk_gate2_flags("aips_tz2","ahb", base +
0x68, 2,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_DCP] = imx_clk_gate2("dcp", "ahb",base +
0x68, 10);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART2_IPG] = imx_clk_gate2("uart2_ipg","ipg", base +
0x68, 28);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART2_SERIAL] =
imx_clk_gate2("uart2_serial", "uart_podf", base + 0x68, 28);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR1 */ + clks[IMX6SLL_CLK_ECSPI1] = imx_clk_gate2("ecspi1","ecspi_podf", base + 0x6c, 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_ECSPI2] = imx_clk_gate2("ecspi2","ecspi_podf", base + 0x6c, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_ECSPI3] = imx_clk_gate2("ecspi3","ecspi_podf", base + 0x6c, 4);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_ECSPI4] = imx_clk_gate2("ecspi4","ecspi_podf", base + 0x6c, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART3_IPG] = imx_clk_gate2("uart3_ipg","ipg", base + 0x6c, 10);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART3_SERIAL] =
imx_clk_gate2("uart3_serial", "uart_podf", base + 0x6c, 10);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EPIT1] = imx_clk_gate2("epit1","perclk", base + 0x6c, 12);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EPIT2] = imx_clk_gate2("epit2","perclk", base + 0x6c, 14);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_GPT_BUS] = imx_clk_gate2("gpt1_bus","perclk", base + 0x6c, 20);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_GPT_SERIAL] =
imx_clk_gate2("gpt1_serial", "perclk", base + 0x6c, 22);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART4_IPG] = imx_clk_gate2("uart4_ipg","ipg", base + 0x6c, 24);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART4_SERIAL] =
imx_clk_gate2("uart4_serail", "uart_podf", base + 0x6c, 24);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR2 */ + clks[IMX6SLL_CLK_CSI] = imx_clk_gate2("csi", "axi",base +
0x70, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_I2C1] = imx_clk_gate2("i2c1","perclk", base + 0x70, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_I2C2] = imx_clk_gate2("i2c2","perclk", base + 0x70, 8);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_I2C3] = imx_clk_gate2("i2c3","perclk", base + 0x70, 10);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_OCOTP] = imx_clk_gate2("ocotp","ipg", base + 0x70, 12);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LCDIF_APB] = imx_clk_gate2("lcdif_apb", "axi",base +
0x70, 28);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PXP] = imx_clk_gate2("pxp","axi", base + 0x70, 30);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR3 */ + clks[IMX6SLL_CLK_UART5_IPG] = imx_clk_gate2("uart5_ipg","ipg", base + 0x74, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART5_SERIAL] =
imx_clk_gate2("uart5_serial", "uart_podf", base + 0x74, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EPDC_AXI] = imx_clk_gate2("epdc_aclk", "axi",base + 0x74, 4);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EPDC_PIX] = imx_clk_gate2("epdc_pix","epdc_podf", base + 0x74, 4);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_LCDIF_PIX] = imx_clk_gate2("lcdif_pix","lcdif_podf", base + 0x74, 10);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_WDOG1] = imx_clk_gate2("wdog1","ipg", base + 0x74, 16);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_MMDC_P0_FAST] =imx_clk_gate_flags("mmdc_p0_fast", "
mmdc_podf", base +0x74, 20,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_MMDC_P0_IPG] =imx_clk_gate2_flags("mmdc_p0_ipg", "ipg", base +
0x74, 24,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_OCRAM] =imx_clk_gate_flags("ocram","ahb", base +
0x74, 28,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR4 */ + clks[IMX6SLL_CLK_PWM1] = imx_clk_gate2("pwm1","perclk", base +
0x78, 16);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PWM2] = imx_clk_gate2("pwm2","perclk", base +
0x78, 18);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PWM3] = imx_clk_gate2("pwm3","perclk", base +
0x78, 20);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_PWM4] = imx_clk_gate2("pwm4","perclk", base +
0x78, 22);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR5 */ + clks[IMX6SLL_CLK_ROM] = imx_clk_gate2_flags("rom","ahb", base +
0x7c, 0,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SDMA] = imx_clk_gate2("sdma","ahb", base + 0x7c, 6);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_WDOG2] = imx_clk_gate2("wdog2","ipg", base +
0x7c, 10);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SPBA] = imx_clk_gate2("spba","ipg", base + 0x7c, 12);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_EXTERN_AUDIO] =
imx_clk_gate2_shared("extern_audio", "extern_audio_podf", base + 0x7c, 14, &share_count_audio);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SPDIF] =imx_clk_gate2_shared("spdif", "
spdif_podf", base +0x7c, 14,&share_count_audio);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SPDIF_GCLK] =imx_clk_gate2_shared("spdif_gclk", "ipg", base +
0x7c, 14,&share_count_audio);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI1] =imx_clk_gate2_shared("ssi1", "
ssi1_podf", base +0x7c, 18,&share_count_ssi1);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI1_IPG] = imx_clk_gate2_shared("ssi1_ipg","ipg", base + 0x7c, 18, &share_count_ssi1);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI2] =imx_clk_gate2_shared("ssi2", "
ssi2_podf", base +0x7c, 20,&share_count_ssi2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI2_IPG] = imx_clk_gate2_shared("ssi2_ipg","ipg", base + 0x7c, 20, &share_count_ssi2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI3] =imx_clk_gate2_shared("ssi3", "
ssi3_podf", base +0x7c, 22,&share_count_ssi3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_SSI3_IPG] = imx_clk_gate2_shared("ssi3_ipg","ipg", base + 0x7c, 22, &share_count_ssi3);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART1_IPG] = imx_clk_gate2("uart1_ipg","ipg", base + 0x7c, 24);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_UART1_SERIAL] =
imx_clk_gate2("uart1_serial", "uart_podf", base + 0x7c, 24);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR6 */ + clks[IMX6SLL_CLK_USBOH3] = imx_clk_gate2("usboh3", "ipg",base + 0x80, 0);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC1] = imx_clk_gate2("usdhc1","
usdhc1_podf", base +0x80, 2);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC2] = imx_clk_gate2("usdhc2","
usdhc2_podf", base +0x80, 4);drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clks[IMX6SLL_CLK_USDHC3] = imx_clk_gate2("usdhc3","
usdhc3_podf", base +0x80, 6);drivers/clk/imx/clk-imx6sll.c new file +14
-0+ +/* mask handshake of mmdc */ +writel_relaxed (BM_CCM_CCDR_MMDC_CH0_MASK , base +0x4 ); + +imx_check_clocks (clks,ARRAY_SIZE (clks)); + + clk_data.clks = clks; + clk_data.clk_num =ARRAY_SIZE (clks); +of_clk_add_provider (np, of_clk_src_onecell_get, &clk_data); + +/* Lower the AHB clock rate before changing the clock source. */ +clk_set_rate (clks[IMX6SLL_CLK_AHB ],99000000 ); + +/* Change periph_pre clock to pll2_bus to adjust AXI rate to 264MHz */
drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clk_set_parent(clks[IMX6SLL_CLK_PERIPH_CLK2_SEL],clks[IMX6SLL_CLK_PLL3_USB_OTG]);
drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clk_set_parent(clks[IMX6SLL_CLK_PERIPH],clks[IMX6SLL_CLK_PERIPH_CLK2]);
drivers/clk/imx/clk-imx6sll.c new file +1
-0+ clk_set_parent(clks[IMX6SLL_CLK_PERIPH_PRE],clks[IMX6SLL_CLK_PLL2_BUS]);
drivers/clk/imx/clk-imx6sll.c line 343
Quoted 6 lines
drivers/clk/imx/clk-imx6sll.c new file +6
-0+clk_set_parent (clks[IMX6SLL_CLK_PERIPH ], +clks[IMX6SLL_CLK_PERIPH_PRE ]); + +clk_set_rate (clks[IMX6SLL_CLK_AHB ],132000000 ); } + +CLK_OF_DECLARE (imx6sll,"fsl,imx6sll-ccm" , imx6sll_clocks_init);
As mentioned in another mail, I was requested to switch to clk_hw API by Stephen When upstreaming mx7ulp driver. As well as changing to CLK_OF_DECLARE_DRIVER.
I need Stephen's confirm whether we can keep the old way.
Stephen,
Would you please comment here?
Regards
Dong Aisheng
Quoted 2 lines
--
1.9.1
PATCH v5 4/4 clk: imx: add clock driver for imx6sll
Quoted 19 lines
Quoted 16 lines
+++
b/drivers/clk/imx/clk-imx6sll.cdrivers/clk/imx/clk-imx6sll.c new file +14
-0@@ -0,0 +1,343 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* Copyright (C) 2016 Freescale Semiconductor, Inc. +* Copyright 2017-2018 NXP. +*/ + +#include <dt-bindings/clock/imx6sll-clock.h> +#include <linux/clk.h> +#include <linux/clkdev.h> +#include <linux/err.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h> [...]
Quoted 5 lines
drivers/clk/imx/clk-imx6sll.c line 16
Quoted 2 lines
drivers/clk/imx/clk-imx6sll.c new file +2
-0+#include <linux/of_irq.h> +#include <linux/types.h> Do we need above two things?
Ok will drop thest two include.
Quoted 3 lines
Quoted 3 lines
drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +#include "clk.h" +
[...]
Quoted 12 lines
Review
Quoted 7 lines
"
pll3_usb_otg", base +0xf0, 0);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL3_PFD1] = imx_clk_pfd("pll3_pfd1_540m","
pll3_usb_otg", base +0xf0, 1);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL3_PFD2] = imx_clk_pfd("pll3_pfd2_508m","
pll3_usb_otg", base +0xf0, 2);(quoted diff) +2
-0+ clks[IMX6SLL_CLK_PLL3_PFD3] = imx_clk_pfd("pll3_pfd3_454m", +"pll3_usb_otg", base + 0xf0, 3);It looks to me
drivers/clk/imx/clk-pfd.cimplementation may be buggy as imx6 Pfd is using share register for both divider and gate operation while no lock is kept.
Yes, this should be an issue. Will fix this in another patch.
Quoted 21 lines
Quoted 9 lines
(quoted diff) +2
-0+ + clks[IMX6SLL_CLK_PLL4_POST_DIV] =clk_register_divider_table(NULL, "
pll4_post_div", "pll4_audio",(quoted diff) +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base + 0x70,19, 2, 0,
post_div_table,&imx_ccm_lock);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL4_AUDIO_DIV] = clk_register_divider(NULL,"
pll4_audio_div", "pll4_post_div",(quoted diff) +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base +
0x170, 15, 1, 0,&imx_ccm_lock);From the reference manual, this divide bit actually is a
AUDIO_DIV_LSBWhile there're anotherAUDIO_DIV_MSB.Definition as follows:
NOTE: LSB bit value pertains to the last bit, please program the MSB bit (bit 23) as well, to change divider value for more information.
00 divide by 1 (Default)
01 divide by 2
10 divide by 1
11 divide by 4
Quoted 8 lines
Seems we only use LSB here and reply on the HW reset value(0) of MSB bit. This makes us lose the divide 4 functionality. (MX6Q has the same issue).
Due to MSB is bit 23 which Is not alongside with LSB, the proper solution might be Invent imx specific
clk_imx_register_discrete_divider_table.
As this issue is already there and not affect function currently, it might be ok to do that later.
OK, we can just keep it no change now.
Quoted 42 lines
Quoted 42 lines
(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL5_POST_DIV] =clk_register_divider_table(NULL, "
pll5_post_div", "pll5_video",(quoted diff) +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base + 0xa0,19, 2, 0,
post_div_table,&imx_ccm_lock);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL5_VIDEO_DIV] =clk_register_divider_table(NULL, "
pll5_video_div", "pll5_post_div",(quoted diff) +1
-0+ CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE, base +
0x170, 30, 2, 0,(quoted diff) +3
-0+video_div_table, &imx_ccm_lock); + + /* name
parent_namemult div */(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL2_198M] = imx_clk_fixed_factor("pll2_198m","
pll2_pfd2_396m", 1, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL3_120M] = imx_clk_fixed_factor("pll3_120m","
pll3_usb_otg", 1, 4);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL3_80M] = imx_clk_fixed_factor("pll3_80m","
pll3_usb_otg", 1, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PLL3_60M] = imx_clk_fixed_factor("pll3_60m","
pll3_usb_otg", 1, 8);drivers/clk/imx/clk-imx6sll.c new file +8
-0+ + np = ccm_node; + base =of_iomap (np,0 ); +WARN_ON (!base); + + clks[IMX6SLL_CLK_STEP ] =imx_clk_mux ("step" , base + 0x0c, 8, 1, step_sels, ARRAY_SIZE(step_sels)); + clks[IMX6SLL_CLK_PLL1_SW] = imx_clk_mux_flags("pll1_sw",base +
0x0c, 2, 1,pll1_sw_sels,ARRAY_SIZE(pll1_sw_sels), 0);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_AXI_ALT_SEL] = imx_clk_mux("axi_alt_sel",base + 0x14, 7, 1, axi_alt_sels, ARRAY_SIZE(axi_alt_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_AXI_SEL] = imx_clk_mux_flags("axi_sel",base +
0x14, 6, 1,axi_sels,ARRAY_SIZE(axi_sels), 0);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERIPH_PRE] =imx_clk_mux("periph_pre", base +
0x18, 18, 2,periph_pre_sels,ARRAY_SIZE(periph_pre_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERIPH2_PRE] =imx_clk_mux("periph2_pre", base +
0x18, 21, 2,periph2_pre_sels,ARRAY_SIZE(periph2_pre_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERIPH_CLK2_SEL] =
imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
Quoted 9 lines
Quoted 6 lines
(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERIPH2_CLK2_SEL] =
imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC2_SEL] =imx_clk_mux("usdhc2_sel", base +
0x1c, 17, 1,usdhc_sels,ARRAY_SIZE(usdhc_sels));Any reason not in order?
Will be fixed
Jacky
Quoted 297 lines
Quoted 31 lines
(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC1_SEL] =imx_clk_mux("usdhc1_sel", base +
0x1c, 16, 1,usdhc_sels,ARRAY_SIZE(usdhc_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC3_SEL] =imx_clk_mux("usdhc3_sel", base +
0x1c, 18, 1,usdhc_sels,ARRAY_SIZE(usdhc_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI1_SEL] = imx_clk_mux("ssi1_sel", base +
0x1c, 10, 2,ssi_sels,ARRAY_SIZE(ssi_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI2_SEL] = imx_clk_mux("ssi2_sel", base +
0x1c, 12, 2,ssi_sels,ARRAY_SIZE(ssi_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI3_SEL] = imx_clk_mux("ssi3_sel", base +
0x1c, 14, 2,ssi_sels,ARRAY_SIZE(ssi_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERCLK_SEL] = imx_clk_mux("perclk_sel",base + 0x1c, 6, 1, perclk_sels, ARRAY_SIZE(perclk_sels));(quoted diff) +5
-0+ clks[IMX6SLL_CLK_UART_SEL] = imx_clk_mux("uart_sel", base + 0x24, 6, 1, uart_sels, ARRAY_SIZE(uart_sels)); + clks[IMX6SLL_CLK_SPDIF_SEL] = imx_clk_mux("spdif_sel", base + 0x30, 20, 2, spdif_sels, ARRAY_SIZE(spdif_sels)); + clks[IMX6SLL_CLK_EXTERN_AUDIO_SEL] =
imx_clk_mux("extern_audio_sel", base + 0x30, 7, 2, spdif_sels, ARRAY_SIZE(spdif_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EPDC_PRE_SEL] =imx_clk_mux("epdc_pre_sel", base +
0x34, 15, 3,epdc_pre_sels,ARRAY_SIZE(epdc_pre_sels));(quoted diff) +5
-0+ clks[IMX6SLL_CLK_EPDC_SEL] = imx_clk_mux("epdc_sel", base + 0x34, 9, 3, epdc_sels, ARRAY_SIZE(epdc_sels)); + clks[IMX6SLL_CLK_ECSPI_SEL] = imx_clk_mux("ecspi_sel", base + 0x38, 18, 1, ecspi_sels, ARRAY_SIZE(ecspi_sels)); + clks[IMX6SLL_CLK_LCDIF_PRE_SEL] =
imx_clk_mux("lcdif_pre_sel", base + 0x38, 15, 3, lcdif_pre_sels, ARRAY_SIZE(lcdif_pre_sels));Review
Quoted 1 line
(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LCDIF_SEL] = imx_clk_mux("lcdif_sel",base
Quoted 56 lines
+
0x38, 9, 3,lcdif_sels,ARRAY_SIZE(lcdif_sels));(quoted diff) +2
-0+ + clks[IMX6SLL_CLK_PERIPH] = imx_clk_busy_mux("periph", base +
0x14, 25, 1, base +0x48, 5,periph_sels,ARRAY_SIZE(periph_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERIPH2] = imx_clk_busy_mux("periph2", base +
0x14,
+26, 1, base +0x48, 3,periph2_sels,ARRAY_SIZE(periph2_sels));(quoted diff) +2
-0+ + clks[IMX6SLL_CLK_PERIPH_CLK2] =
imx_clk_divider("periph_clk2", "periph_clk2_sel", base + 0x14, 27, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERIPH2_CLK2] =
imx_clk_divider("periph2_clk2", "periph2_clk2_sel", base + 0x14, 0, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_IPG] = imx_clk_divider("ipg","ahb", base + 0x14, 8, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LCDIF_PODF] =
imx_clk_divider("lcdif_podf", "lcdif_pred", base + 0x18, 23, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PERCLK] = imx_clk_divider("perclk","
perclk_sel", base +0x1c, 0, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC3_PODF] =
imx_clk_divider("usdhc3_podf", "usdhc3_sel", base + 0x24, 19, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC2_PODF] =
imx_clk_divider("usdhc2_podf", "usdhc2_sel", base + 0x24, 16, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC1_PODF] =
imx_clk_divider("usdhc1_podf", "usdhc1_sel", base + 0x24, 11, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART_PODF] =
imx_clk_divider("uart_podf", "uart_sel", base + 0x24, 0, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI3_PRED] = imx_clk_divider("ssi3_pred","
ssi3_sel", base +0x28, 22, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI3_PODF] = imx_clk_divider("ssi3_podf","
ssi3_pred", base +0x28, 16, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI1_PRED] = imx_clk_divider("ssi1_pred","
ssi1_sel", base +0x28, 6, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI1_PODF] = imx_clk_divider("ssi1_podf","
ssi1_pred", base +0x28, 0, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI2_PRED] = imx_clk_divider("ssi2_pred","
ssi2_sel", base +0x2c, 6, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI2_PODF] = imx_clk_divider("ssi2_podf","
ssi2_pred", base +0x2c, 0, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SPDIF_PRED] =
imx_clk_divider("spdif_pred", "spdif_sel", base + 0x30, 25, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SPDIF_PODF] =
imx_clk_divider("spdif_podf", "spdif_pred", base + 0x30, 22, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EXTERN_AUDIO_PRED] =
imx_clk_divider("extern_audio_pred", "extern_audio_sel", base + 0x30, 12, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EXTERN_AUDIO_PODF] =
imx_clk_divider("extern_audio_podf", "extern_audio_pred", base + 0x30, 9, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EPDC_PODF] = imx_clk_divider("epdc_podf","
epdc_pre_sel", base +0x34, 12, 3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_ECSPI_PODF] = imx_clk_divider("ecspi_podf","
ecspi_sel", base +0x38, 19, 6);(quoted diff) +4
-0+ clks[IMX6SLL_CLK_LCDIF_PRED] = imx_clk_divider("lcdif_pred", +"lcdif_pre_sel", base + 0x38, 12, 3); + + clks[IMX6SLL_CLK_ARM] =Quoted 1 line
imx_clk_busy_divider("arm", "
pll1_sw", base +0x10, 0, 3,base +
Quoted 185 lines
0x48, 16);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_MMDC_PODF] =imx_clk_busy_divider("mmdc_podf", "periph2", base +
0x14, 3, 3,
base +0x48, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_AXI_PODF] = imx_clk_busy_divider("axi","
axi_sel", base +0x14, 16, 3, base +0x48, 0);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_AHB] =imx_clk_busy_divider("ahb", "periph", base +
0x14, 10, 3, base +0x48, 1);(quoted diff) +2
-0+ + clks[IMX6SLL_CLK_LDB_DI0_DIV_3_5] =
imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LDB_DI0_DIV_7] =
imx_clk_fixed_factor("ldb_di0_div_7", "ldb_di0_sel", 1, 7);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_DIV_3_5] =
imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1_sel", 2, 7);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_DIV_7] =
imx_clk_fixed_factor("ldb_di1_div_7", "ldb_di1_sel", 1, 7);(quoted diff) +2
-0+ + clks[IMX6SLL_CLK_LDB_DI0_SEL] = imx_clk_mux("ldb_di0_sel",base +
0x2c, 9, 3,ldb_di0_sels,ARRAY_SIZE(ldb_di0_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_SEL] = imx_clk_mux("ldb_di1_sel",base +
0x1c, 7, 3,ldb_di1_sels,ARRAY_SIZE(ldb_di1_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LDB_DI0_DIV_SEL] =
imx_clk_mux("ldb_di0_div_sel", base + 0x20, 10, 1, ldb_di0_div_sels, ARRAY_SIZE(ldb_di0_div_sels));(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LDB_DI1_DIV_SEL] =imx_clk_mux("ldb_di1_div_sel",
drivers/clk/imx/clk-imx6sll.c new file +4
-0+base + 0x20, 10, 1, ldb_di1_div_sels, ARRAY_SIZE(ldb_di1_div_sels)); + +/* CCGR0 */ + clks[IMX6SLL_CLK_AIPSTZ1] = imx_clk_gate2_flags("aips_tz1","ahb", base +
0x68, 0,CLK_IS_CRITICAL);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_AIPSTZ2] = imx_clk_gate2_flags("aips_tz2","ahb", base +
0x68, 2,CLK_IS_CRITICAL);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_DCP] = imx_clk_gate2("dcp", "ahb",base +
0x68, 10);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART2_IPG] = imx_clk_gate2("uart2_ipg","ipg", base +
0x68, 28);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART2_SERIAL] =
imx_clk_gate2("uart2_serial", "uart_podf", base + 0x68, 28);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR1 */ + clks[IMX6SLL_CLK_ECSPI1] = imx_clk_gate2("ecspi1","ecspi_podf", base + 0x6c, 0);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_ECSPI2] = imx_clk_gate2("ecspi2","ecspi_podf", base + 0x6c, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_ECSPI3] = imx_clk_gate2("ecspi3","ecspi_podf", base + 0x6c, 4);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_ECSPI4] = imx_clk_gate2("ecspi4","ecspi_podf", base + 0x6c, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART3_IPG] = imx_clk_gate2("uart3_ipg","ipg", base + 0x6c, 10);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART3_SERIAL] =
imx_clk_gate2("uart3_serial", "uart_podf", base + 0x6c, 10);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EPIT1] = imx_clk_gate2("epit1","perclk", base + 0x6c, 12);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EPIT2] = imx_clk_gate2("epit2","perclk", base + 0x6c, 14);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_GPT_BUS] = imx_clk_gate2("gpt1_bus","perclk", base + 0x6c, 20);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_GPT_SERIAL] =
imx_clk_gate2("gpt1_serial", "perclk", base + 0x6c, 22);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART4_IPG] = imx_clk_gate2("uart4_ipg","ipg", base + 0x6c, 24);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART4_SERIAL] =
imx_clk_gate2("uart4_serail", "uart_podf", base + 0x6c, 24);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR2 */ + clks[IMX6SLL_CLK_CSI] = imx_clk_gate2("csi", "axi",base +
0x70, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_I2C1] = imx_clk_gate2("i2c1","perclk", base + 0x70, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_I2C2] = imx_clk_gate2("i2c2","perclk", base + 0x70, 8);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_I2C3] = imx_clk_gate2("i2c3","perclk", base + 0x70, 10);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_OCOTP] = imx_clk_gate2("ocotp","ipg", base + 0x70, 12);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LCDIF_APB] = imx_clk_gate2("lcdif_apb", "axi",base +
0x70, 28);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PXP] = imx_clk_gate2("pxp","axi", base + 0x70, 30);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR3 */ + clks[IMX6SLL_CLK_UART5_IPG] = imx_clk_gate2("uart5_ipg","ipg", base + 0x74, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART5_SERIAL] =
imx_clk_gate2("uart5_serial", "uart_podf", base + 0x74, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EPDC_AXI] = imx_clk_gate2("epdc_aclk", "axi",base + 0x74, 4);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EPDC_PIX] = imx_clk_gate2("epdc_pix","epdc_podf", base + 0x74, 4);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_LCDIF_PIX] = imx_clk_gate2("lcdif_pix","lcdif_podf", base + 0x74, 10);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_WDOG1] = imx_clk_gate2("wdog1","ipg", base + 0x74, 16);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_MMDC_P0_FAST] =imx_clk_gate_flags("mmdc_p0_fast", "
mmdc_podf", base +0x74, 20,CLK_IS_CRITICAL);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_MMDC_P0_IPG] =imx_clk_gate2_flags("mmdc_p0_ipg", "ipg", base +
0x74, 24,CLK_IS_CRITICAL);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_OCRAM] =imx_clk_gate_flags("ocram","ahb", base +
0x74, 28,CLK_IS_CRITICAL);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR4 */ + clks[IMX6SLL_CLK_PWM1] = imx_clk_gate2("pwm1","perclk", base +
0x78, 16);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PWM2] = imx_clk_gate2("pwm2","perclk", base +
0x78, 18);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PWM3] = imx_clk_gate2("pwm3","perclk", base +
0x78, 20);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_PWM4] = imx_clk_gate2("pwm4","perclk", base +
0x78, 22);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR5 */ + clks[IMX6SLL_CLK_ROM] = imx_clk_gate2_flags("rom","ahb", base +
0x7c, 0,CLK_IS_CRITICAL);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SDMA] = imx_clk_gate2("sdma","ahb", base + 0x7c, 6);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_WDOG2] = imx_clk_gate2("wdog2","ipg", base +
0x7c, 10);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SPBA] = imx_clk_gate2("spba","ipg", base + 0x7c, 12);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_EXTERN_AUDIO] =
imx_clk_gate2_shared("extern_audio", "extern_audio_podf", base + 0x7c, 14, &share_count_audio);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SPDIF] =imx_clk_gate2_shared("spdif", "
spdif_podf", base +0x7c, 14,&share_count_audio);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SPDIF_GCLK] =imx_clk_gate2_shared("spdif_gclk", "ipg", base +
0x7c, 14,&share_count_audio);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI1] =imx_clk_gate2_shared("ssi1", "
ssi1_podf", base +0x7c, 18,&share_count_ssi1);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI1_IPG] = imx_clk_gate2_shared("ssi1_ipg","ipg", base + 0x7c, 18, &share_count_ssi1);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI2] =imx_clk_gate2_shared("ssi2", "
ssi2_podf", base +0x7c, 20,&share_count_ssi2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI2_IPG] = imx_clk_gate2_shared("ssi2_ipg","ipg", base + 0x7c, 20, &share_count_ssi2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI3] =imx_clk_gate2_shared("ssi3", "
ssi3_podf", base +0x7c, 22,&share_count_ssi3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_SSI3_IPG] = imx_clk_gate2_shared("ssi3_ipg","ipg", base + 0x7c, 22, &share_count_ssi3);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART1_IPG] = imx_clk_gate2("uart1_ipg","ipg", base + 0x7c, 24);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_UART1_SERIAL] =
imx_clk_gate2("uart1_serial", "uart_podf", base + 0x7c, 24);drivers/clk/imx/clk-imx6sll.c new file +3
-0+ +/* CCGR6 */ + clks[IMX6SLL_CLK_USBOH3] = imx_clk_gate2("usboh3", "ipg",base + 0x80, 0);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC1] = imx_clk_gate2("usdhc1","
usdhc1_podf", base +0x80, 2);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC2] = imx_clk_gate2("usdhc2","
usdhc2_podf", base +0x80, 4);(quoted diff) +1
-0+ clks[IMX6SLL_CLK_USDHC3] = imx_clk_gate2("usdhc3","
usdhc3_podf", base +0x80, 6);drivers/clk/imx/clk-imx6sll.c new file +14
-0+ +/* mask handshake of mmdc */ +writel_relaxed (BM_CCM_CCDR_MMDC_CH0_MASK , base +0x4 ); + +imx_check_clocks (clks,ARRAY_SIZE (clks)); + + clk_data.clks = clks; + clk_data.clk_num =ARRAY_SIZE (clks); +of_clk_add_provider (np, of_clk_src_onecell_get, &clk_data); + +/* Lower the AHB clock rate before changing the clock source. */ +clk_set_rate (clks[IMX6SLL_CLK_AHB ],99000000 ); + +/* Change periph_pre clock to pll2_bus to adjust AXI rate to 264MHz */
(quoted diff) +1
-0+ clk_set_parent(clks[IMX6SLL_CLK_PERIPH_CLK2_SEL],clks[IMX6SLL_CLK_PLL3_USB_OTG]);
(quoted diff) +1
-0+ clk_set_parent(clks[IMX6SLL_CLK_PERIPH],clks[IMX6SLL_CLK_PERIPH_CLK2]);
(quoted diff) +1
-0+ clk_set_parent(clks[IMX6SLL_CLK_PERIPH_PRE],clks[IMX6SLL_CLK_PLL2_BUS]);
drivers/clk/imx/clk-imx6sll.c line 343
Quoted 6 lines
drivers/clk/imx/clk-imx6sll.c new file +6
-0+clk_set_parent (clks[IMX6SLL_CLK_PERIPH ], +clks[IMX6SLL_CLK_PERIPH_PRE ]); + +clk_set_rate (clks[IMX6SLL_CLK_AHB ],132000000 ); } + +CLK_OF_DECLARE (imx6sll,"fsl,imx6sll-ccm" , imx6sll_clocks_init);As mentioned in another mail, I was requested to switch to
clk_hwAPI by Stephen When upstreaming mx7ulp driver. As well as changing toCLK_OF_DECLARE_DRIVER.I need Stephen's confirm whether we can keep the old way.
Stephen,
Would you please comment here?Regards
Dong AishengQuoted 2 lines
--
1.9.1
PATCH v5 1/4 clk: imx: Add CLK_IS_CRITICAL flag for busy divider and busy mux
In reply to Bai PingQuoted 11 lines
-----Original Message-----
From: Jacky Bai
Sent: Monday, March 12, 2018 5:29 PM
To: sboyd at kernel.org; robh+dt at kernel.org; shawnguo at kernel.org; kernel at pengutronix.de
Cc: Fabio Estevam <[email protected]>; linux-clk at vger.kernel.org; linux-arm-kernel at lists.infradead.org; dl-linux-imx <[email protected]>; A.s. Dong <[email protected]>; jacky.baip at gmail.com
Subject: [PATCH v5 1/4] clk: imx: AddCLK_IS_CRITICALflag for busy divider and busy mux
Quoted 3 lines
The busy divider and busy mux is actually used by the system critical clocks, so add '
CLK_IS_CRITICAL' to clocks registered with these two type.
We probably could fine tune clk_init_on for other platforms later. So:
Regards
Dong Aisheng
Quoted 36 lines
Signed-off-by Bai Ping <[email protected]>---
change fromV3->v4:
- fix a typo in commit log
change fromv4->v5:
- optimize the commit subject--- drivers/clk/imx/clk-busy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/clk/imx/clk-busy.c index renamed from drivers/clk/imx/clk-busy.c +0
-06df3389..9903652 100644
drivers/clk/imx/clk-busy.c +2
-3@@ -101,7 +101,7 @@ struct clk *imx_clk_busy_divider(const char *name,const char *parent_name, init.name = name; init.ops = &clk_busy_divider_ops; - init.flags =CLK_SET_RATE_PARENT ; + init.flags =CLK_SET_RATE_PARENT |CLK_IS_CRITICAL ; init.parent_names = &parent_name; init.num_parents =1 ;@@ -175,7 +175,7 @@ struct clk *imx_clk_busy_mux(const char *name, void __iomem *reg, u8 shift, init.name = name; init.ops = &clk_busy_mux_ops; - init.flags =0 ; + init.flags =CLK_IS_CRITICAL ; init.parent_names = parent_names; init.num_parents = num_parents; --1.9.1