Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
Pull clk updates from Stephen Boyd:
"Nothing changed in the clk framework core this time around. We did get
some updates to the basic clk types to use determine_rate for the
divider type and add a power of two fractional divider flag though.
Otherwise, this is a collection of clk driver updates. More than half
the diffstat is in the Qualcomm clk driver where we add a bunch of
data to describe clks on various SoCs and fix bugs. The other big new
thing in here is the Mediatek MT8192 clk driver. That's been under
review for a while and it's nice to see that it's finally upstream.
Beyond that it's the usual set of minor fixes and tweaks to clk
drivers. There are some non-clk driver bits in here which have all
been acked by the respective maintainers.
New Drivers:
- Support video, gpu, display clks on qcom sc7280 SoCs
- GCC clks on qcom MSM8953, SM4250/6115, and SM6350 SoCs
- Multimedia clks (MMCC) on qcom MSM8994/MSM8992
- RPMh clks on qcom SM6350 SoCs
- Support for Mediatek MT8192 SoCs
- Add display (DU and DSI) clocks on Renesas R-Car V3U
- Add I2C, DMAC, USB, sound (SSIF-2), GPIO, CANFD, and ADC clocks and
resets on Renesas RZ/G2L
Updates:
- Support the SD/OE pin on IDT VersaClock 5 and 6 clock generators
- Add power of two flag to fractional divider clk type
- Migrate some clk drivers to clk_divider_ops.determine_rate
- Migrate to clk_parent_data in gcc-sdm660
- Fix CLKOUT clocks on i.MX8MM and i.MX8MN by using imx_clk_hw_mux2
- Switch from .round_rate to .determine_rate in clk-divider-gate
- Fix clock tree update for TF-A controlled clocks for all i.MX8M
- Add missing M7 core clock for i.MX8MN
- YAML conversion of rk3399 clock controller binding
- Removal of GRF dependency for the rk3328/rk3036 pll types
- Drop CLK_IS_CRITICAL flag from Tegra fuse clk
- Make CLK_R9A06G032 Kconfig symbol invisible
- Convert various DT bindings to YAML"
* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (128 commits)
dt-bindings: clock: samsung: fix header path in example
clk: tegra: fix old-style declaration
clk: qcom: Add SM6350 GCC driver
MAINTAINERS: clock: include S3C and S5P in Samsung SoC clock entry
dt-bindings: clock: samsung: convert S5Pv210 AudSS to dtschema
dt-bindings: clock: samsung: convert Exynos AudSS to dtschema
dt-bindings: clock: samsung: convert Exynos4 to dtschema
dt-bindings: clock: samsung: convert Exynos3250 to dtschema
dt-bindings: clock: samsung: convert Exynos542x to dtschema
dt-bindings: clock: samsung: add bindings for Exynos external clock
dt-bindings: clock: samsung: convert Exynos5250 to dtschema
clk: vc5: Add properties for configuring SD/OE behavior
clk: vc5: Use dev_err_probe
dt-bindings: clk: vc5: Add properties for configuring the SD/OE pin
dt-bindings: clock: brcm,iproc-clocks: fix armpll properties
clk: zynqmp: Fix kernel-doc format
clk: at91: clk-generated: Limit the requested rate to our range
clk: ralink: avoid to set 'CLK_IS_CRITICAL' flag for gates
clk: zynqmp: Fix a memory leak
clk: zynqmp: Check the return type
...
This commit is contained in:
@@ -13,6 +13,7 @@ Required Properties:
|
|||||||
- "mediatek,mt7623-audsys", "mediatek,mt2701-audsys", "syscon"
|
- "mediatek,mt7623-audsys", "mediatek,mt2701-audsys", "syscon"
|
||||||
- "mediatek,mt8167-audiosys", "syscon"
|
- "mediatek,mt8167-audiosys", "syscon"
|
||||||
- "mediatek,mt8183-audiosys", "syscon"
|
- "mediatek,mt8183-audiosys", "syscon"
|
||||||
|
- "mediatek,mt8192-audsys", "syscon"
|
||||||
- "mediatek,mt8516-audsys", "syscon"
|
- "mediatek,mt8516-audsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ properties:
|
|||||||
- mediatek,mt8167-mmsys
|
- mediatek,mt8167-mmsys
|
||||||
- mediatek,mt8173-mmsys
|
- mediatek,mt8173-mmsys
|
||||||
- mediatek,mt8183-mmsys
|
- mediatek,mt8183-mmsys
|
||||||
|
- mediatek,mt8192-mmsys
|
||||||
- mediatek,mt8365-mmsys
|
- mediatek,mt8365-mmsys
|
||||||
- const: syscon
|
- const: syscon
|
||||||
- items:
|
- items:
|
||||||
|
|||||||
@@ -0,0 +1,199 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8192-clock.yaml#"
|
||||||
|
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||||
|
|
||||||
|
title: MediaTek Functional Clock Controller for MT8192
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Mediatek functional clock controller provides various clocks on MT8192.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
- mediatek,mt8192-scp_adsp
|
||||||
|
- mediatek,mt8192-imp_iic_wrap_c
|
||||||
|
- mediatek,mt8192-imp_iic_wrap_e
|
||||||
|
- mediatek,mt8192-imp_iic_wrap_s
|
||||||
|
- mediatek,mt8192-imp_iic_wrap_ws
|
||||||
|
- mediatek,mt8192-imp_iic_wrap_w
|
||||||
|
- mediatek,mt8192-imp_iic_wrap_n
|
||||||
|
- mediatek,mt8192-msdc_top
|
||||||
|
- mediatek,mt8192-msdc
|
||||||
|
- mediatek,mt8192-mfgcfg
|
||||||
|
- mediatek,mt8192-imgsys
|
||||||
|
- mediatek,mt8192-imgsys2
|
||||||
|
- mediatek,mt8192-vdecsys_soc
|
||||||
|
- mediatek,mt8192-vdecsys
|
||||||
|
- mediatek,mt8192-vencsys
|
||||||
|
- mediatek,mt8192-camsys
|
||||||
|
- mediatek,mt8192-camsys_rawa
|
||||||
|
- mediatek,mt8192-camsys_rawb
|
||||||
|
- mediatek,mt8192-camsys_rawc
|
||||||
|
- mediatek,mt8192-ipesys
|
||||||
|
- mediatek,mt8192-mdpsys
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
scp_adsp: clock-controller@10720000 {
|
||||||
|
compatible = "mediatek,mt8192-scp_adsp";
|
||||||
|
reg = <0x10720000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imp_iic_wrap_c: clock-controller@11007000 {
|
||||||
|
compatible = "mediatek,mt8192-imp_iic_wrap_c";
|
||||||
|
reg = <0x11007000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imp_iic_wrap_e: clock-controller@11cb1000 {
|
||||||
|
compatible = "mediatek,mt8192-imp_iic_wrap_e";
|
||||||
|
reg = <0x11cb1000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imp_iic_wrap_s: clock-controller@11d03000 {
|
||||||
|
compatible = "mediatek,mt8192-imp_iic_wrap_s";
|
||||||
|
reg = <0x11d03000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imp_iic_wrap_ws: clock-controller@11d23000 {
|
||||||
|
compatible = "mediatek,mt8192-imp_iic_wrap_ws";
|
||||||
|
reg = <0x11d23000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imp_iic_wrap_w: clock-controller@11e01000 {
|
||||||
|
compatible = "mediatek,mt8192-imp_iic_wrap_w";
|
||||||
|
reg = <0x11e01000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imp_iic_wrap_n: clock-controller@11f02000 {
|
||||||
|
compatible = "mediatek,mt8192-imp_iic_wrap_n";
|
||||||
|
reg = <0x11f02000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
msdc_top: clock-controller@11f10000 {
|
||||||
|
compatible = "mediatek,mt8192-msdc_top";
|
||||||
|
reg = <0x11f10000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
msdc: clock-controller@11f60000 {
|
||||||
|
compatible = "mediatek,mt8192-msdc";
|
||||||
|
reg = <0x11f60000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
mfgcfg: clock-controller@13fbf000 {
|
||||||
|
compatible = "mediatek,mt8192-mfgcfg";
|
||||||
|
reg = <0x13fbf000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imgsys: clock-controller@15020000 {
|
||||||
|
compatible = "mediatek,mt8192-imgsys";
|
||||||
|
reg = <0x15020000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
imgsys2: clock-controller@15820000 {
|
||||||
|
compatible = "mediatek,mt8192-imgsys2";
|
||||||
|
reg = <0x15820000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
vdecsys_soc: clock-controller@1600f000 {
|
||||||
|
compatible = "mediatek,mt8192-vdecsys_soc";
|
||||||
|
reg = <0x1600f000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
vdecsys: clock-controller@1602f000 {
|
||||||
|
compatible = "mediatek,mt8192-vdecsys";
|
||||||
|
reg = <0x1602f000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
vencsys: clock-controller@17000000 {
|
||||||
|
compatible = "mediatek,mt8192-vencsys";
|
||||||
|
reg = <0x17000000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
camsys: clock-controller@1a000000 {
|
||||||
|
compatible = "mediatek,mt8192-camsys";
|
||||||
|
reg = <0x1a000000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
camsys_rawa: clock-controller@1a04f000 {
|
||||||
|
compatible = "mediatek,mt8192-camsys_rawa";
|
||||||
|
reg = <0x1a04f000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
camsys_rawb: clock-controller@1a06f000 {
|
||||||
|
compatible = "mediatek,mt8192-camsys_rawb";
|
||||||
|
reg = <0x1a06f000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
camsys_rawc: clock-controller@1a08f000 {
|
||||||
|
compatible = "mediatek,mt8192-camsys_rawc";
|
||||||
|
reg = <0x1a08f000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
ipesys: clock-controller@1b000000 {
|
||||||
|
compatible = "mediatek,mt8192-ipesys";
|
||||||
|
reg = <0x1b000000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
mdpsys: clock-controller@1f000000 {
|
||||||
|
compatible = "mediatek,mt8192-mdpsys";
|
||||||
|
reg = <0x1f000000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8192-sys-clock.yaml#"
|
||||||
|
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||||
|
|
||||||
|
title: MediaTek System Clock Controller for MT8192
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
description:
|
||||||
|
The Mediatek system clock controller provides various clocks and system configuration
|
||||||
|
like reset and bus protection on MT8192.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
- mediatek,mt8192-topckgen
|
||||||
|
- mediatek,mt8192-infracfg
|
||||||
|
- mediatek,mt8192-pericfg
|
||||||
|
- mediatek,mt8192-apmixedsys
|
||||||
|
- const: syscon
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
topckgen: syscon@10000000 {
|
||||||
|
compatible = "mediatek,mt8192-topckgen", "syscon";
|
||||||
|
reg = <0x10000000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
infracfg: syscon@10001000 {
|
||||||
|
compatible = "mediatek,mt8192-infracfg", "syscon";
|
||||||
|
reg = <0x10001000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
pericfg: syscon@10003000 {
|
||||||
|
compatible = "mediatek,mt8192-pericfg", "syscon";
|
||||||
|
reg = <0x10003000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
- |
|
||||||
|
apmixedsys: syscon@1000c000 {
|
||||||
|
compatible = "mediatek,mt8192-apmixedsys", "syscon";
|
||||||
|
reg = <0x1000c000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -61,13 +61,30 @@ properties:
|
|||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
'#clock-cells':
|
'#clock-cells':
|
||||||
const: 1
|
true
|
||||||
|
|
||||||
clock-output-names:
|
clock-output-names:
|
||||||
minItems: 1
|
minItems: 1
|
||||||
maxItems: 45
|
maxItems: 45
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- brcm,cygnus-armpll
|
||||||
|
- brcm,nsp-armpll
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
'#clock-cells':
|
||||||
|
const: 0
|
||||||
|
else:
|
||||||
|
properties:
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
required:
|
||||||
|
- clock-output-names
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
@@ -358,7 +375,6 @@ required:
|
|||||||
- reg
|
- reg
|
||||||
- clocks
|
- clocks
|
||||||
- '#clock-cells'
|
- '#clock-cells'
|
||||||
- clock-output-names
|
|
||||||
|
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
||||||
@@ -392,3 +408,10 @@ examples:
|
|||||||
clocks = <&osc2>;
|
clocks = <&osc2>;
|
||||||
clock-output-names = "keypad", "adc/touch", "pwm";
|
clock-output-names = "keypad", "adc/touch", "pwm";
|
||||||
};
|
};
|
||||||
|
- |
|
||||||
|
arm_clk@0 {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
compatible = "brcm,nsp-armpll";
|
||||||
|
clocks = <&osc>;
|
||||||
|
reg = <0x0 0x1000>;
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,103 +0,0 @@
|
|||||||
* Samsung Audio Subsystem Clock Controller
|
|
||||||
|
|
||||||
The Samsung Audio Subsystem clock controller generates and supplies clocks
|
|
||||||
to Audio Subsystem block available in the S5PV210 and Exynos SoCs. The clock
|
|
||||||
binding described here is applicable to all SoCs in Exynos family.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be one of the following:
|
|
||||||
- "samsung,exynos4210-audss-clock" - controller compatible with all Exynos4 SoCs.
|
|
||||||
- "samsung,exynos5250-audss-clock" - controller compatible with Exynos5250
|
|
||||||
SoCs.
|
|
||||||
- "samsung,exynos5410-audss-clock" - controller compatible with Exynos5410
|
|
||||||
SoCs.
|
|
||||||
- "samsung,exynos5420-audss-clock" - controller compatible with Exynos5420
|
|
||||||
SoCs.
|
|
||||||
- reg: physical base address and length of the controller's register set.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
- clocks:
|
|
||||||
- pll_ref: Fixed rate PLL reference clock, parent of mout_audss. "fin_pll"
|
|
||||||
is used if not specified.
|
|
||||||
- pll_in: Input PLL to the AudioSS block, parent of mout_audss. "fout_epll"
|
|
||||||
is used if not specified.
|
|
||||||
- cdclk: External i2s clock, parent of mout_i2s. "cdclk0" is used if not
|
|
||||||
specified.
|
|
||||||
- sclk_audio: Audio bus clock, parent of mout_i2s. "sclk_audio0" is used if
|
|
||||||
not specified.
|
|
||||||
- sclk_pcm_in: PCM clock, parent of sclk_pcm. "sclk_pcm0" is used if not
|
|
||||||
specified.
|
|
||||||
|
|
||||||
- clock-names: Aliases for the above clocks. They should be "pll_ref",
|
|
||||||
"pll_in", "cdclk", "sclk_audio", and "sclk_pcm_in" respectively.
|
|
||||||
|
|
||||||
Optional Properties:
|
|
||||||
|
|
||||||
- power-domains: a phandle to respective power domain node as described by
|
|
||||||
generic PM domain bindings (see power/power_domain.txt for more
|
|
||||||
information).
|
|
||||||
|
|
||||||
The following is the list of clocks generated by the controller. Each clock is
|
|
||||||
assigned an identifier and client nodes use this identifier to specify the
|
|
||||||
clock which they consume. Some of the clocks are available only on a particular
|
|
||||||
Exynos4 SoC and this is specified where applicable.
|
|
||||||
|
|
||||||
Provided clocks:
|
|
||||||
|
|
||||||
Clock ID SoC (if specific)
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
mout_audss 0
|
|
||||||
mout_i2s 1
|
|
||||||
dout_srp 2
|
|
||||||
dout_aud_bus 3
|
|
||||||
dout_i2s 4
|
|
||||||
srp_clk 5
|
|
||||||
i2s_bus 6
|
|
||||||
sclk_i2s 7
|
|
||||||
pcm_bus 8
|
|
||||||
sclk_pcm 9
|
|
||||||
adma 10 Exynos5420
|
|
||||||
|
|
||||||
Example 1: An example of a clock controller node using the default input
|
|
||||||
clock names is listed below.
|
|
||||||
|
|
||||||
clock_audss: audss-clock-controller@3810000 {
|
|
||||||
compatible = "samsung,exynos5250-audss-clock";
|
|
||||||
reg = <0x03810000 0x0C>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example 2: An example of a clock controller node with the input clocks
|
|
||||||
specified.
|
|
||||||
|
|
||||||
clock_audss: audss-clock-controller@3810000 {
|
|
||||||
compatible = "samsung,exynos5250-audss-clock";
|
|
||||||
reg = <0x03810000 0x0C>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
clocks = <&clock 1>, <&clock 7>, <&clock 138>, <&clock 160>,
|
|
||||||
<&ext_i2s_clk>;
|
|
||||||
clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in", "cdclk";
|
|
||||||
};
|
|
||||||
|
|
||||||
Example 3: I2S controller node that consumes the clock generated by the clock
|
|
||||||
controller. Refer to the standard clock bindings for information
|
|
||||||
about 'clocks' and 'clock-names' property.
|
|
||||||
|
|
||||||
i2s0: i2s@3830000 {
|
|
||||||
compatible = "samsung,i2s-v5";
|
|
||||||
reg = <0x03830000 0x100>;
|
|
||||||
dmas = <&pdma0 10
|
|
||||||
&pdma0 9
|
|
||||||
&pdma0 8>;
|
|
||||||
dma-names = "tx", "rx", "tx-sec";
|
|
||||||
clocks = <&clock_audss EXYNOS_I2S_BUS>,
|
|
||||||
<&clock_audss EXYNOS_I2S_BUS>,
|
|
||||||
<&clock_audss EXYNOS_SCLK_I2S>,
|
|
||||||
<&clock_audss EXYNOS_MOUT_AUDSS>,
|
|
||||||
<&clock_audss EXYNOS_MOUT_I2S>;
|
|
||||||
clock-names = "iis", "i2s_opclk0", "i2s_opclk1",
|
|
||||||
"mout_audss", "mout_i2s";
|
|
||||||
};
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
* Samsung Audio Subsystem Clock Controller
|
|
||||||
|
|
||||||
The Samsung Audio Subsystem clock controller generates and supplies clocks
|
|
||||||
to Audio Subsystem block available in the S5PV210 and compatible SoCs.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be "samsung,s5pv210-audss-clock".
|
|
||||||
- reg: physical base address and length of the controller's register set.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
- clocks:
|
|
||||||
- hclk: AHB bus clock of the Audio Subsystem.
|
|
||||||
- xxti: Optional fixed rate PLL reference clock, parent of mout_audss. If
|
|
||||||
not specified (i.e. xusbxti is used for PLL reference), it is fixed to
|
|
||||||
a clock named "xxti".
|
|
||||||
- fout_epll: Input PLL to the AudioSS block, parent of mout_audss.
|
|
||||||
- iiscdclk0: Optional external i2s clock, parent of mout_i2s. If not
|
|
||||||
specified, it is fixed to a clock named "iiscdclk0".
|
|
||||||
- sclk_audio0: Audio bus clock, parent of mout_i2s.
|
|
||||||
|
|
||||||
- clock-names: Aliases for the above clocks. They should be "hclk",
|
|
||||||
"xxti", "fout_epll", "iiscdclk0", and "sclk_audio0" respectively.
|
|
||||||
|
|
||||||
All available clocks are defined as preprocessor macros in
|
|
||||||
dt-bindings/clock/s5pv210-audss-clk.h header and can be used in device
|
|
||||||
tree sources.
|
|
||||||
|
|
||||||
Example: Clock controller node.
|
|
||||||
|
|
||||||
clk_audss: clock-controller@c0900000 {
|
|
||||||
compatible = "samsung,s5pv210-audss-clock";
|
|
||||||
reg = <0xc0900000 0x1000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
clock-names = "hclk", "xxti",
|
|
||||||
"fout_epll", "sclk_audio0";
|
|
||||||
clocks = <&clocks DOUT_HCLKP>, <&xxti>,
|
|
||||||
<&clocks FOUT_EPLL>, <&clocks SCLK_AUDIO0>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example: I2S controller node that consumes the clock generated by the clock
|
|
||||||
controller. Refer to the standard clock bindings for information
|
|
||||||
about 'clocks' and 'clock-names' property.
|
|
||||||
|
|
||||||
i2s0: i2s@3830000 {
|
|
||||||
/* ... */
|
|
||||||
clock-names = "iis", "i2s_opclk0",
|
|
||||||
"i2s_opclk1";
|
|
||||||
clocks = <&clk_audss CLK_I2S>, <&clk_audss CLK_I2S>,
|
|
||||||
<&clk_audss CLK_DOUT_AUD_BUS>;
|
|
||||||
/* ... */
|
|
||||||
};
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
* Samsung Exynos3250 Clock Controller
|
|
||||||
|
|
||||||
The Exynos3250 clock controller generates and supplies clock to various
|
|
||||||
controllers within the Exynos3250 SoC.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be one of the following.
|
|
||||||
- "samsung,exynos3250-cmu" - controller compatible with Exynos3250 SoC.
|
|
||||||
- "samsung,exynos3250-cmu-dmc" - controller compatible with
|
|
||||||
Exynos3250 SoC for Dynamic Memory Controller domain.
|
|
||||||
- "samsung,exynos3250-cmu-isp" - ISP block clock controller compatible
|
|
||||||
with Exynos3250 SOC
|
|
||||||
|
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
|
||||||
region.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
Each clock is assigned an identifier and client nodes can use this identifier
|
|
||||||
to specify the clock which they consume.
|
|
||||||
|
|
||||||
All available clocks are defined as preprocessor macros in
|
|
||||||
dt-bindings/clock/exynos3250.h header and can be used in device
|
|
||||||
tree sources.
|
|
||||||
|
|
||||||
Example 1: Examples of clock controller nodes are listed below.
|
|
||||||
|
|
||||||
cmu: clock-controller@10030000 {
|
|
||||||
compatible = "samsung,exynos3250-cmu";
|
|
||||||
reg = <0x10030000 0x20000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
cmu_dmc: clock-controller@105c0000 {
|
|
||||||
compatible = "samsung,exynos3250-cmu-dmc";
|
|
||||||
reg = <0x105C0000 0x2000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
cmu_isp: clock-controller@10048000 {
|
|
||||||
compatible = "samsung,exynos3250-cmu-isp";
|
|
||||||
reg = <0x10048000 0x1000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example 2: UART controller node that consumes the clock generated by the clock
|
|
||||||
controller. Refer to the standard clock bindings for information
|
|
||||||
about 'clocks' and 'clock-names' property.
|
|
||||||
|
|
||||||
serial@13800000 {
|
|
||||||
compatible = "samsung,exynos4210-uart";
|
|
||||||
reg = <0x13800000 0x100>;
|
|
||||||
interrupts = <0 109 0>;
|
|
||||||
clocks = <&cmu CLK_UART0>, <&cmu CLK_SCLK_UART0>;
|
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
|
||||||
};
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
* Samsung Exynos4 Clock Controller
|
|
||||||
|
|
||||||
The Exynos4 clock controller generates and supplies clock to various controllers
|
|
||||||
within the Exynos4 SoC. The clock binding described here is applicable to all
|
|
||||||
SoC's in the Exynos4 family.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be one of the following.
|
|
||||||
- "samsung,exynos4210-clock" - controller compatible with Exynos4210 SoC.
|
|
||||||
- "samsung,exynos4412-clock" - controller compatible with Exynos4412 SoC.
|
|
||||||
|
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
|
||||||
region.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
Each clock is assigned an identifier and client nodes can use this identifier
|
|
||||||
to specify the clock which they consume.
|
|
||||||
|
|
||||||
All available clocks are defined as preprocessor macros in
|
|
||||||
dt-bindings/clock/exynos4.h header and can be used in device
|
|
||||||
tree sources.
|
|
||||||
|
|
||||||
Example 1: An example of a clock controller node is listed below.
|
|
||||||
|
|
||||||
clock: clock-controller@10030000 {
|
|
||||||
compatible = "samsung,exynos4210-clock";
|
|
||||||
reg = <0x10030000 0x20000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example 2: UART controller node that consumes the clock generated by the clock
|
|
||||||
controller. Refer to the standard clock bindings for information
|
|
||||||
about 'clocks' and 'clock-names' property.
|
|
||||||
|
|
||||||
serial@13820000 {
|
|
||||||
compatible = "samsung,exynos4210-uart";
|
|
||||||
reg = <0x13820000 0x100>;
|
|
||||||
interrupts = <0 54 0>;
|
|
||||||
clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
|
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
|
||||||
};
|
|
||||||
|
|
||||||
Exynos4412 SoC contains some additional clocks for FIMC-ISP (Camera ISP)
|
|
||||||
subsystem. Registers for those clocks are located in the ISP power domain.
|
|
||||||
Because those registers are also located in a different memory region than
|
|
||||||
the main clock controller, a separate clock controller has to be defined for
|
|
||||||
handling them.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be "samsung,exynos4412-isp-clock".
|
|
||||||
|
|
||||||
- reg: physical base address of the ISP clock controller and length of memory
|
|
||||||
mapped region.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
- clocks: list of the clock controller input clock identifiers,
|
|
||||||
from common clock bindings, should point to CLK_ACLK200 and
|
|
||||||
CLK_ACLK400_MCUISP clocks from the main clock controller.
|
|
||||||
|
|
||||||
- clock-names: list of the clock controller input clock names,
|
|
||||||
as described in clock-bindings.txt, should be "aclk200" and
|
|
||||||
"aclk400_mcuisp".
|
|
||||||
|
|
||||||
- power-domains: a phandle to ISP power domain node as described by
|
|
||||||
generic PM domain bindings.
|
|
||||||
|
|
||||||
Example 3: The clock controllers bindings for Exynos4412 SoCs.
|
|
||||||
|
|
||||||
clock: clock-controller@10030000 {
|
|
||||||
compatible = "samsung,exynos4412-clock";
|
|
||||||
reg = <0x10030000 0x18000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
isp_clock: clock-controller@10048000 {
|
|
||||||
compatible = "samsung,exynos4412-isp-clock";
|
|
||||||
reg = <0x10048000 0x1000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
power-domains = <&pd_isp>;
|
|
||||||
clocks = <&clock CLK_ACLK200>, <&clock CLK_ACLK400_MCUISP>;
|
|
||||||
clock-names = "aclk200", "aclk400_mcuisp";
|
|
||||||
};
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
* Samsung Exynos5250 Clock Controller
|
|
||||||
|
|
||||||
The Exynos5250 clock controller generates and supplies clock to various
|
|
||||||
controllers within the Exynos5250 SoC.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be one of the following.
|
|
||||||
- "samsung,exynos5250-clock" - controller compatible with Exynos5250 SoC.
|
|
||||||
|
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
|
||||||
region.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
Each clock is assigned an identifier and client nodes can use this identifier
|
|
||||||
to specify the clock which they consume.
|
|
||||||
|
|
||||||
All available clocks are defined as preprocessor macros in
|
|
||||||
dt-bindings/clock/exynos5250.h header and can be used in device
|
|
||||||
tree sources.
|
|
||||||
|
|
||||||
Example 1: An example of a clock controller node is listed below.
|
|
||||||
|
|
||||||
clock: clock-controller@10010000 {
|
|
||||||
compatible = "samsung,exynos5250-clock";
|
|
||||||
reg = <0x10010000 0x30000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example 2: UART controller node that consumes the clock generated by the clock
|
|
||||||
controller. Refer to the standard clock bindings for information
|
|
||||||
about 'clocks' and 'clock-names' property.
|
|
||||||
|
|
||||||
serial@13820000 {
|
|
||||||
compatible = "samsung,exynos4210-uart";
|
|
||||||
reg = <0x13820000 0x100>;
|
|
||||||
interrupts = <0 54 0>;
|
|
||||||
clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
|
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
|
||||||
};
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
* Samsung Exynos5420 Clock Controller
|
|
||||||
|
|
||||||
The Exynos5420 clock controller generates and supplies clock to various
|
|
||||||
controllers within the Exynos5420 SoC and for the Exynos5800 SoC.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: should be one of the following.
|
|
||||||
- "samsung,exynos5420-clock" - controller compatible with Exynos5420 SoC.
|
|
||||||
- "samsung,exynos5800-clock" - controller compatible with Exynos5800 SoC.
|
|
||||||
|
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
|
||||||
region.
|
|
||||||
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
|
|
||||||
Each clock is assigned an identifier and client nodes can use this identifier
|
|
||||||
to specify the clock which they consume.
|
|
||||||
|
|
||||||
All available clocks are defined as preprocessor macros in
|
|
||||||
dt-bindings/clock/exynos5420.h header and can be used in device
|
|
||||||
tree sources.
|
|
||||||
|
|
||||||
Example 1: An example of a clock controller node is listed below.
|
|
||||||
|
|
||||||
clock: clock-controller@10010000 {
|
|
||||||
compatible = "samsung,exynos5420-clock";
|
|
||||||
reg = <0x10010000 0x30000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example 2: UART controller node that consumes the clock generated by the clock
|
|
||||||
controller. Refer to the standard clock bindings for information
|
|
||||||
about 'clocks' and 'clock-names' property.
|
|
||||||
|
|
||||||
serial@13820000 {
|
|
||||||
compatible = "samsung,exynos4210-uart";
|
|
||||||
reg = <0x13820000 0x100>;
|
|
||||||
interrupts = <0 54 0>;
|
|
||||||
clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
|
|
||||||
clock-names = "uart", "clk_uart_baud0";
|
|
||||||
};
|
|
||||||
@@ -30,6 +30,20 @@ description: |
|
|||||||
3 -- OUT3
|
3 -- OUT3
|
||||||
4 -- OUT4
|
4 -- OUT4
|
||||||
|
|
||||||
|
The idt,shutdown and idt,output-enable-active properties control the
|
||||||
|
SH (en_global_shutdown) and SP bits of the Primary Source and Shutdown
|
||||||
|
Register, respectively. Their behavior is summarized by the following
|
||||||
|
table:
|
||||||
|
|
||||||
|
SH SP Output when the SD/OE pin is Low/High
|
||||||
|
== == =====================================
|
||||||
|
0 0 Active/Inactive
|
||||||
|
0 1 Inactive/Active
|
||||||
|
1 0 Active/Shutdown
|
||||||
|
1 1 Inactive/Shutdown
|
||||||
|
|
||||||
|
The case where SH and SP are both 1 is likely not very interesting.
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Luca Ceresoli <luca@lucaceresoli.net>
|
- Luca Ceresoli <luca@lucaceresoli.net>
|
||||||
|
|
||||||
@@ -64,6 +78,26 @@ properties:
|
|||||||
maximum: 22760
|
maximum: 22760
|
||||||
description: Optional load capacitor for XTAL1 and XTAL2
|
description: Optional load capacitor for XTAL1 and XTAL2
|
||||||
|
|
||||||
|
idt,shutdown:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [0, 1]
|
||||||
|
description: |
|
||||||
|
If 1, this enables the shutdown functionality: the chip will be
|
||||||
|
shut down if the SD/OE pin is driven high. If 0, this disables the
|
||||||
|
shutdown functionality: the chip will never be shut down based on
|
||||||
|
the value of the SD/OE pin. This property corresponds to the SH
|
||||||
|
bit of the Primary Source and Shutdown Register.
|
||||||
|
|
||||||
|
idt,output-enable-active:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32
|
||||||
|
enum: [0, 1]
|
||||||
|
description: |
|
||||||
|
If 1, this enables output when the SD/OE pin is high, and disables
|
||||||
|
output when the SD/OE pin is low. If 0, this disables output when
|
||||||
|
the SD/OE pin is high, and enables output when the SD/OE pin is
|
||||||
|
low. This corresponds to the SP bit of the Primary Source and
|
||||||
|
Shutdown Register.
|
||||||
|
|
||||||
patternProperties:
|
patternProperties:
|
||||||
"^OUT[1-4]$":
|
"^OUT[1-4]$":
|
||||||
type: object
|
type: object
|
||||||
@@ -90,6 +124,8 @@ required:
|
|||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
- '#clock-cells'
|
- '#clock-cells'
|
||||||
|
- idt,shutdown
|
||||||
|
- idt,output-enable-active
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- if:
|
- if:
|
||||||
@@ -139,6 +175,10 @@ examples:
|
|||||||
clocks = <&ref25m>;
|
clocks = <&ref25m>;
|
||||||
clock-names = "xin";
|
clock-names = "xin";
|
||||||
|
|
||||||
|
/* Set the SD/OE pin's settings */
|
||||||
|
idt,shutdown = <0>;
|
||||||
|
idt,output-enable-active = <0>;
|
||||||
|
|
||||||
OUT1 {
|
OUT1 {
|
||||||
idt,mode = <VC5_CMOSD>;
|
idt,mode = <VC5_CMOSD>;
|
||||||
idt,voltage-microvolt = <1800000>;
|
idt,voltage-microvolt = <1800000>;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ properties:
|
|||||||
enum:
|
enum:
|
||||||
- qcom,ipq6018-a53pll
|
- qcom,ipq6018-a53pll
|
||||||
- qcom,msm8916-a53pll
|
- qcom,msm8916-a53pll
|
||||||
|
- qcom,msm8939-a53pll
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
@@ -33,6 +34,8 @@ properties:
|
|||||||
items:
|
items:
|
||||||
- const: xo
|
- const: xo
|
||||||
|
|
||||||
|
operating-points-v2: true
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
|
|||||||
72
Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml
Normal file
72
Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/qcom,gcc-sm6115.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm Global Clock & Reset Controller Binding for SM6115 and SM4250
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Iskren Chernev <iskren.chernev@gmail.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Qualcomm global clock control module which supports the clocks, resets and
|
||||||
|
power domains on SM4250/6115.
|
||||||
|
|
||||||
|
See also:
|
||||||
|
- dt-bindings/clock/qcom,gcc-sm6115.h
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: qcom,gcc-sm6115
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Board XO source
|
||||||
|
- description: Sleep clock source
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: bi_tcxo
|
||||||
|
- const: sleep_clk
|
||||||
|
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
'#reset-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
'#power-domain-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
protected-clocks:
|
||||||
|
description:
|
||||||
|
Protected clock specifier list as per common clock binding.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- reg
|
||||||
|
- '#clock-cells'
|
||||||
|
- '#reset-cells'
|
||||||
|
- '#power-domain-cells'
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/qcom,rpmcc.h>
|
||||||
|
clock-controller@1400000 {
|
||||||
|
compatible = "qcom,gcc-sm6115";
|
||||||
|
reg = <0x01400000 0x1f0000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
clock-names = "bi_tcxo", "sleep_clk";
|
||||||
|
clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>, <&sleep_clk>;
|
||||||
|
};
|
||||||
|
...
|
||||||
76
Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml
Normal file
76
Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/qcom,gcc-sm6350.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm Global Clock & Reset Controller Binding for SM6350
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Konrad Dybcio <konrad.dybcio@somainline.org>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Qualcomm global clock control module which supports the clocks, resets and
|
||||||
|
power domains on SM6350.
|
||||||
|
|
||||||
|
See also:
|
||||||
|
- dt-bindings/clock/qcom,gcc-sm6350.h
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: qcom,gcc-sm6350
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Board XO source
|
||||||
|
- description: Board active XO source
|
||||||
|
- description: Sleep clock source
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: bi_tcxo
|
||||||
|
- const: bi_tcxo_ao
|
||||||
|
- const: sleep_clk
|
||||||
|
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
'#reset-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
'#power-domain-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
protected-clocks:
|
||||||
|
description:
|
||||||
|
Protected clock specifier list as per common clock binding.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- reg
|
||||||
|
- '#clock-cells'
|
||||||
|
- '#reset-cells'
|
||||||
|
- '#power-domain-cells'
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||||
|
clock-controller@100000 {
|
||||||
|
compatible = "qcom,gcc-sm6350";
|
||||||
|
reg = <0x00100000 0x1f0000>;
|
||||||
|
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||||
|
<&rpmhcc RPMH_CXO_CLK_A>,
|
||||||
|
<&sleep_clk>;
|
||||||
|
clock-names = "bi_tcxo", "bi_tcxo_ao", "sleep_clk";
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
};
|
||||||
|
...
|
||||||
@@ -23,6 +23,7 @@ description: |
|
|||||||
- dt-bindings/clock/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064)
|
- dt-bindings/clock/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064)
|
||||||
- dt-bindings/reset/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064)
|
- dt-bindings/reset/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064)
|
||||||
- dt-bindings/clock/qcom,gcc-msm8939.h
|
- dt-bindings/clock/qcom,gcc-msm8939.h
|
||||||
|
- dt-bindings/clock/qcom,gcc-msm8953.h
|
||||||
- dt-bindings/reset/qcom,gcc-msm8939.h
|
- dt-bindings/reset/qcom,gcc-msm8939.h
|
||||||
- dt-bindings/clock/qcom,gcc-msm8660.h
|
- dt-bindings/clock/qcom,gcc-msm8660.h
|
||||||
- dt-bindings/reset/qcom,gcc-msm8660.h
|
- dt-bindings/reset/qcom,gcc-msm8660.h
|
||||||
@@ -46,6 +47,7 @@ properties:
|
|||||||
- qcom,gcc-msm8660
|
- qcom,gcc-msm8660
|
||||||
- qcom,gcc-msm8916
|
- qcom,gcc-msm8916
|
||||||
- qcom,gcc-msm8939
|
- qcom,gcc-msm8939
|
||||||
|
- qcom,gcc-msm8953
|
||||||
- qcom,gcc-msm8960
|
- qcom,gcc-msm8960
|
||||||
- qcom,gcc-msm8974
|
- qcom,gcc-msm8974
|
||||||
- qcom,gcc-msm8974pro
|
- qcom,gcc-msm8974pro
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://devicetree.org/schemas/clock/qcom,gpucc.yaml#
|
$id: http://devicetree.org/schemas/clock/qcom,gpucc.yaml#
|
||||||
@@ -11,11 +11,12 @@ maintainers:
|
|||||||
|
|
||||||
description: |
|
description: |
|
||||||
Qualcomm graphics clock control module which supports the clocks, resets and
|
Qualcomm graphics clock control module which supports the clocks, resets and
|
||||||
power domains on SDM845/SC7180/SM8150/SM8250.
|
power domains on Qualcomm SoCs.
|
||||||
|
|
||||||
See also:
|
See also:
|
||||||
dt-bindings/clock/qcom,gpucc-sdm845.h
|
dt-bindings/clock/qcom,gpucc-sdm845.h
|
||||||
dt-bindings/clock/qcom,gpucc-sc7180.h
|
dt-bindings/clock/qcom,gpucc-sc7180.h
|
||||||
|
dt-bindings/clock/qcom,gpucc-sc7280.h
|
||||||
dt-bindings/clock/qcom,gpucc-sm8150.h
|
dt-bindings/clock/qcom,gpucc-sm8150.h
|
||||||
dt-bindings/clock/qcom,gpucc-sm8250.h
|
dt-bindings/clock/qcom,gpucc-sm8250.h
|
||||||
|
|
||||||
@@ -24,6 +25,8 @@ properties:
|
|||||||
enum:
|
enum:
|
||||||
- qcom,sdm845-gpucc
|
- qcom,sdm845-gpucc
|
||||||
- qcom,sc7180-gpucc
|
- qcom,sc7180-gpucc
|
||||||
|
- qcom,sc7280-gpucc
|
||||||
|
- qcom,sc8180x-gpucc
|
||||||
- qcom,sm8150-gpucc
|
- qcom,sm8150-gpucc
|
||||||
- qcom,sm8250-gpucc
|
- qcom,sm8250-gpucc
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ properties:
|
|||||||
- qcom,mmcc-msm8660
|
- qcom,mmcc-msm8660
|
||||||
- qcom,mmcc-msm8960
|
- qcom,mmcc-msm8960
|
||||||
- qcom,mmcc-msm8974
|
- qcom,mmcc-msm8974
|
||||||
|
- qcom,mmcc-msm8992
|
||||||
|
- qcom,mmcc-msm8994
|
||||||
- qcom,mmcc-msm8996
|
- qcom,mmcc-msm8996
|
||||||
- qcom,mmcc-msm8998
|
- qcom,mmcc-msm8998
|
||||||
- qcom,mmcc-sdm630
|
- qcom,mmcc-sdm630
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ Required properties :
|
|||||||
- compatible : shall contain only one of the following. The generic
|
- compatible : shall contain only one of the following. The generic
|
||||||
compatible "qcom,rpmcc" should be also included.
|
compatible "qcom,rpmcc" should be also included.
|
||||||
|
|
||||||
|
"qcom,rpmcc-mdm9607", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-msm8660", "qcom,rpmcc"
|
"qcom,rpmcc-msm8660", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-apq8060", "qcom,rpmcc"
|
"qcom,rpmcc-apq8060", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-msm8226", "qcom,rpmcc"
|
"qcom,rpmcc-msm8226", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-msm8916", "qcom,rpmcc"
|
"qcom,rpmcc-msm8916", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-msm8936", "qcom,rpmcc"
|
"qcom,rpmcc-msm8936", "qcom,rpmcc"
|
||||||
|
"qcom,rpmcc-msm8953", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-msm8974", "qcom,rpmcc"
|
"qcom,rpmcc-msm8974", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-msm8976", "qcom,rpmcc"
|
"qcom,rpmcc-msm8976", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-apq8064", "qcom,rpmcc"
|
"qcom,rpmcc-apq8064", "qcom,rpmcc"
|
||||||
@@ -25,6 +27,8 @@ Required properties :
|
|||||||
"qcom,rpmcc-msm8998", "qcom,rpmcc"
|
"qcom,rpmcc-msm8998", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-qcs404", "qcom,rpmcc"
|
"qcom,rpmcc-qcs404", "qcom,rpmcc"
|
||||||
"qcom,rpmcc-sdm660", "qcom,rpmcc"
|
"qcom,rpmcc-sdm660", "qcom,rpmcc"
|
||||||
|
"qcom,rpmcc-sm6115", "qcom,rpmcc"
|
||||||
|
"qcom,rpmcc-sm6125", "qcom,rpmcc"
|
||||||
|
|
||||||
- #clock-cells : shall contain 1
|
- #clock-cells : shall contain 1
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ properties:
|
|||||||
- qcom,sc8180x-rpmh-clk
|
- qcom,sc8180x-rpmh-clk
|
||||||
- qcom,sdm845-rpmh-clk
|
- qcom,sdm845-rpmh-clk
|
||||||
- qcom,sdx55-rpmh-clk
|
- qcom,sdx55-rpmh-clk
|
||||||
|
- qcom,sm6350-rpmh-clk
|
||||||
- qcom,sm8150-rpmh-clk
|
- qcom,sm8150-rpmh-clk
|
||||||
- qcom,sm8250-rpmh-clk
|
- qcom,sm8250-rpmh-clk
|
||||||
- qcom,sm8350-rpmh-clk
|
- qcom,sm8350-rpmh-clk
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/qcom,sc7280-dispcc.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Qualcomm Display Clock & Reset Controller Binding for SC7280
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Taniya Das <tdas@codeaurora.org>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Qualcomm display clock control module which supports the clocks, resets and
|
||||||
|
power domains on SC7280.
|
||||||
|
|
||||||
|
See also dt-bindings/clock/qcom,dispcc-sc7280.h.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: qcom,sc7280-dispcc
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: Board XO source
|
||||||
|
- description: GPLL0 source from GCC
|
||||||
|
- description: Byte clock from DSI PHY
|
||||||
|
- description: Pixel clock from DSI PHY
|
||||||
|
- description: Link clock from DP PHY
|
||||||
|
- description: VCO DIV clock from DP PHY
|
||||||
|
- description: Link clock from EDP PHY
|
||||||
|
- description: VCO DIV clock from EDP PHY
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: bi_tcxo
|
||||||
|
- const: gcc_disp_gpll0_clk
|
||||||
|
- const: dsi0_phy_pll_out_byteclk
|
||||||
|
- const: dsi0_phy_pll_out_dsiclk
|
||||||
|
- const: dp_phy_pll_link_clk
|
||||||
|
- const: dp_phy_pll_vco_div_clk
|
||||||
|
- const: edp_phy_pll_link_clk
|
||||||
|
- const: edp_phy_pll_vco_div_clk
|
||||||
|
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
'#reset-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
'#power-domain-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- '#clock-cells'
|
||||||
|
- '#reset-cells'
|
||||||
|
- '#power-domain-cells'
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/qcom,gcc-sc7280.h>
|
||||||
|
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||||
|
clock-controller@af00000 {
|
||||||
|
compatible = "qcom,sc7280-dispcc";
|
||||||
|
reg = <0x0af00000 0x200000>;
|
||||||
|
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||||
|
<&gcc GCC_DISP_GPLL0_CLK_SRC>,
|
||||||
|
<&dsi_phy 0>,
|
||||||
|
<&dsi_phy 1>,
|
||||||
|
<&dp_phy 0>,
|
||||||
|
<&dp_phy 1>,
|
||||||
|
<&edp_phy 0>,
|
||||||
|
<&edp_phy 1>;
|
||||||
|
clock-names = "bi_tcxo",
|
||||||
|
"gcc_disp_gpll0_clk",
|
||||||
|
"dsi0_phy_pll_out_byteclk",
|
||||||
|
"dsi0_phy_pll_out_dsiclk",
|
||||||
|
"dp_phy_pll_link_clk",
|
||||||
|
"dp_phy_pll_vco_div_clk",
|
||||||
|
"edp_phy_pll_link_clk",
|
||||||
|
"edp_phy_pll_vco_div_clk";
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
};
|
||||||
|
...
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://devicetree.org/schemas/clock/qcom,videocc.yaml#
|
$id: http://devicetree.org/schemas/clock/qcom,videocc.yaml#
|
||||||
@@ -11,10 +11,11 @@ maintainers:
|
|||||||
|
|
||||||
description: |
|
description: |
|
||||||
Qualcomm video clock control module which supports the clocks, resets and
|
Qualcomm video clock control module which supports the clocks, resets and
|
||||||
power domains on SDM845/SC7180/SM8150/SM8250.
|
power domains on Qualcomm SoCs.
|
||||||
|
|
||||||
See also:
|
See also:
|
||||||
dt-bindings/clock/qcom,videocc-sc7180.h
|
dt-bindings/clock/qcom,videocc-sc7180.h
|
||||||
|
dt-bindings/clock/qcom,videocc-sc7280.h
|
||||||
dt-bindings/clock/qcom,videocc-sdm845.h
|
dt-bindings/clock/qcom,videocc-sdm845.h
|
||||||
dt-bindings/clock/qcom,videocc-sm8150.h
|
dt-bindings/clock/qcom,videocc-sm8150.h
|
||||||
dt-bindings/clock/qcom,videocc-sm8250.h
|
dt-bindings/clock/qcom,videocc-sm8250.h
|
||||||
@@ -23,6 +24,7 @@ properties:
|
|||||||
compatible:
|
compatible:
|
||||||
enum:
|
enum:
|
||||||
- qcom,sc7180-videocc
|
- qcom,sc7180-videocc
|
||||||
|
- qcom,sc7280-videocc
|
||||||
- qcom,sdm845-videocc
|
- qcom,sdm845-videocc
|
||||||
- qcom,sm8150-videocc
|
- qcom,sm8150-videocc
|
||||||
- qcom,sm8250-videocc
|
- qcom,sm8250-videocc
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
* Rockchip RK3399 Clock and Reset Unit
|
|
||||||
|
|
||||||
The RK3399 clock controller generates and supplies clock to various
|
|
||||||
controllers within the SoC and also implements a reset controller for SoC
|
|
||||||
peripherals.
|
|
||||||
|
|
||||||
Required Properties:
|
|
||||||
|
|
||||||
- compatible: PMU for CRU should be "rockchip,rk3399-pmucru"
|
|
||||||
- compatible: CRU should be "rockchip,rk3399-cru"
|
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
|
||||||
region.
|
|
||||||
- #clock-cells: should be 1.
|
|
||||||
- #reset-cells: should be 1.
|
|
||||||
|
|
||||||
Optional Properties:
|
|
||||||
|
|
||||||
- rockchip,grf: phandle to the syscon managing the "general register files".
|
|
||||||
It is used for GRF muxes, if missing any muxes present in the GRF will not
|
|
||||||
be available.
|
|
||||||
|
|
||||||
Each clock is assigned an identifier and client nodes can use this identifier
|
|
||||||
to specify the clock which they consume. All available clocks are defined as
|
|
||||||
preprocessor macros in the dt-bindings/clock/rk3399-cru.h headers and can be
|
|
||||||
used in device tree sources. Similar macros exist for the reset sources in
|
|
||||||
these files.
|
|
||||||
|
|
||||||
External clocks:
|
|
||||||
|
|
||||||
There are several clocks that are generated outside the SoC. It is expected
|
|
||||||
that they are defined using standard clock bindings with following
|
|
||||||
clock-output-names:
|
|
||||||
- "xin24m" - crystal input - required,
|
|
||||||
- "xin32k" - rtc clock - optional,
|
|
||||||
- "clkin_gmac" - external GMAC clock - optional,
|
|
||||||
- "clkin_i2s" - external I2S clock - optional,
|
|
||||||
- "pclkin_cif" - external ISP clock - optional,
|
|
||||||
- "clk_usbphy0_480m" - output clock of the pll in the usbphy0
|
|
||||||
- "clk_usbphy1_480m" - output clock of the pll in the usbphy1
|
|
||||||
|
|
||||||
Example: Clock controller node:
|
|
||||||
|
|
||||||
pmucru: pmu-clock-controller@ff750000 {
|
|
||||||
compatible = "rockchip,rk3399-pmucru";
|
|
||||||
reg = <0x0 0xff750000 0x0 0x1000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
#reset-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
cru: clock-controller@ff760000 {
|
|
||||||
compatible = "rockchip,rk3399-cru";
|
|
||||||
reg = <0x0 0xff760000 0x0 0x1000>;
|
|
||||||
#clock-cells = <1>;
|
|
||||||
#reset-cells = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Example: UART controller node that consumes the clock generated by the clock
|
|
||||||
controller:
|
|
||||||
|
|
||||||
uart0: serial@ff1a0000 {
|
|
||||||
compatible = "rockchip,rk3399-uart", "snps,dw-apb-uart";
|
|
||||||
reg = <0x0 0xff180000 0x0 0x100>;
|
|
||||||
clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
|
|
||||||
clock-names = "baudclk", "apb_pclk";
|
|
||||||
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
|
||||||
reg-shift = <2>;
|
|
||||||
reg-io-width = <4>;
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/rockchip,rk3399-cru.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Rockchip RK3399 Clock and Reset Unit
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Xing Zheng <zhengxing@rock-chips.com>
|
||||||
|
- Heiko Stuebner <heiko@sntech.de>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The RK3399 clock controller generates and supplies clock to various
|
||||||
|
controllers within the SoC and also implements a reset controller for SoC
|
||||||
|
peripherals.
|
||||||
|
Each clock is assigned an identifier and client nodes can use this identifier
|
||||||
|
to specify the clock which they consume. All available clocks are defined as
|
||||||
|
preprocessor macros in the dt-bindings/clock/rk3399-cru.h headers and can be
|
||||||
|
used in device tree sources. Similar macros exist for the reset sources in
|
||||||
|
these files.
|
||||||
|
There are several clocks that are generated outside the SoC. It is expected
|
||||||
|
that they are defined using standard clock bindings with following
|
||||||
|
clock-output-names:
|
||||||
|
- "xin24m" - crystal input - required,
|
||||||
|
- "xin32k" - rtc clock - optional,
|
||||||
|
- "clkin_gmac" - external GMAC clock - optional,
|
||||||
|
- "clkin_i2s" - external I2S clock - optional,
|
||||||
|
- "pclkin_cif" - external ISP clock - optional,
|
||||||
|
- "clk_usbphy0_480m" - output clock of the pll in the usbphy0
|
||||||
|
- "clk_usbphy1_480m" - output clock of the pll in the usbphy1
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- rockchip,rk3399-pmucru
|
||||||
|
- rockchip,rk3399-cru
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
"#reset-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 1
|
||||||
|
|
||||||
|
assigned-clocks:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 64
|
||||||
|
|
||||||
|
assigned-clock-parents:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 64
|
||||||
|
|
||||||
|
assigned-clock-rates:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 64
|
||||||
|
|
||||||
|
rockchip,grf:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/phandle
|
||||||
|
description: >
|
||||||
|
phandle to the syscon managing the "general register files". It is used
|
||||||
|
for GRF muxes, if missing any muxes present in the GRF will not be
|
||||||
|
available.
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- "#clock-cells"
|
||||||
|
- "#reset-cells"
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
pmucru: pmu-clock-controller@ff750000 {
|
||||||
|
compatible = "rockchip,rk3399-pmucru";
|
||||||
|
reg = <0xff750000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
|
- |
|
||||||
|
cru: clock-controller@ff760000 {
|
||||||
|
compatible = "rockchip,rk3399-cru";
|
||||||
|
reg = <0xff760000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
#reset-cells = <1>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/samsung,exynos-audss-clock.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Samsung Exynos SoC Audio SubSystem clock controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chanwoo Choi <cw00.choi@samsung.com>
|
||||||
|
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||||
|
- Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
- Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
All available clocks are defined as preprocessor macros in
|
||||||
|
include/dt-bindings/clock/exynos-audss-clk.h header.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- samsung,exynos4210-audss-clock
|
||||||
|
- samsung,exynos5250-audss-clock
|
||||||
|
- samsung,exynos5410-audss-clock
|
||||||
|
- samsung,exynos5420-audss-clock
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 2
|
||||||
|
items:
|
||||||
|
- description:
|
||||||
|
Fixed rate PLL reference clock, parent of mout_audss. "fin_pll" is
|
||||||
|
used if not specified.
|
||||||
|
- description:
|
||||||
|
Input PLL to the AudioSS block, parent of mout_audss. "fout_epll" is
|
||||||
|
used if not specified.
|
||||||
|
- description:
|
||||||
|
Audio bus clock, parent of mout_i2s. "sclk_audio0" is used if not
|
||||||
|
specified.
|
||||||
|
- description:
|
||||||
|
PCM clock, parent of sclk_pcm. "sclk_pcm0" is used if not specified.
|
||||||
|
- description:
|
||||||
|
External i2s clock, parent of mout_i2s. "cdclk0" is used if not
|
||||||
|
specified.
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
minItems: 2
|
||||||
|
items:
|
||||||
|
- const: pll_ref
|
||||||
|
- const: pll_in
|
||||||
|
- const: sclk_audio
|
||||||
|
- const: sclk_pcm_in
|
||||||
|
- const: cdclk
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- "#clock-cells"
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
clock-controller@3810000 {
|
||||||
|
compatible = "samsung,exynos5250-audss-clock";
|
||||||
|
reg = <0x03810000 0x0c>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
clocks = <&clock 1>, <&clock 7>, <&clock 138>, <&clock 160>, <&ext_i2s_clk>;
|
||||||
|
clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in", "cdclk";
|
||||||
|
};
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/samsung,exynos-clock.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Samsung Exynos SoC clock controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chanwoo Choi <cw00.choi@samsung.com>
|
||||||
|
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||||
|
- Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
- Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
All available clocks are defined as preprocessor macros in
|
||||||
|
dt-bindings/clock/ headers.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- enum:
|
||||||
|
- samsung,exynos3250-cmu
|
||||||
|
- samsung,exynos3250-cmu-dmc
|
||||||
|
- samsung,exynos3250-cmu-isp
|
||||||
|
- samsung,exynos4210-clock
|
||||||
|
- samsung,exynos4412-clock
|
||||||
|
- samsung,exynos5250-clock
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- samsung,exynos5420-clock
|
||||||
|
- samsung,exynos5800-clock
|
||||||
|
- const: syscon
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 4
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- "#clock-cells"
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/exynos5250.h>
|
||||||
|
clock: clock-controller@10010000 {
|
||||||
|
compatible = "samsung,exynos5250-clock";
|
||||||
|
reg = <0x10010000 0x30000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/samsung,exynos-ext-clock.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Samsung SoC external/osc/XXTI/XusbXTI clock
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chanwoo Choi <cw00.choi@samsung.com>
|
||||||
|
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||||
|
- Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
- Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Samsung SoCs require an external clock supplied through XXTI or XusbXTI pins.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- samsung,clock-xxti
|
||||||
|
- samsung,clock-xusbxti
|
||||||
|
- samsung,exynos5420-oscclk
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
clock-frequency: true
|
||||||
|
|
||||||
|
clock-output-names:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clock-frequency
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
fixed-rate-clocks {
|
||||||
|
clock {
|
||||||
|
compatible = "samsung,clock-xxti";
|
||||||
|
clock-frequency = <24000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/samsung,exynos4412-isp-clock.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Samsung Exynos4412 SoC ISP clock controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chanwoo Choi <cw00.choi@samsung.com>
|
||||||
|
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||||
|
- Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
- Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Clock controller for Samsung Exynos4412 SoC FIMC-ISP (Camera ISP)
|
||||||
|
All available clocks are defined as preprocessor macros in
|
||||||
|
dt-bindings/clock/ headers.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: samsung,exynos4412-isp-clock
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: CLK_ACLK200 from the main clock controller
|
||||||
|
- description: CLK_ACLK400_MCUISP from the main clock controller
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
items:
|
||||||
|
- const: aclk200
|
||||||
|
- const: aclk400_mcuisp
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- "#clock-cells"
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- power-domains
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/exynos4.h>
|
||||||
|
clock-controller@10048000 {
|
||||||
|
compatible = "samsung,exynos4412-isp-clock";
|
||||||
|
reg = <0x10048000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
power-domains = <&pd_isp>;
|
||||||
|
clocks = <&clock CLK_ACLK200>, <&clock CLK_ACLK400_MCUISP>;
|
||||||
|
clock-names = "aclk200", "aclk400_mcuisp";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/samsung,s5pv210-audss-clock.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Samsung S5Pv210 SoC Audio SubSystem clock controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chanwoo Choi <cw00.choi@samsung.com>
|
||||||
|
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||||
|
- Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
- Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
All available clocks are defined as preprocessor macros in
|
||||||
|
include/dt-bindings/clock/s5pv210-audss.h header.
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: samsung,s5pv210-audss-clock
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
minItems: 4
|
||||||
|
items:
|
||||||
|
- description:
|
||||||
|
AHB bus clock of the Audio Subsystem.
|
||||||
|
- description:
|
||||||
|
Optional fixed rate PLL reference clock, parent of mout_audss. If not
|
||||||
|
specified (i.e. xusbxti is used for PLL reference), it is fixed to a
|
||||||
|
clock named "xxti".
|
||||||
|
- description:
|
||||||
|
Input PLL to the AudioSS block, parent of mout_audss.
|
||||||
|
- description:
|
||||||
|
Audio bus clock, parent of mout_i2s.
|
||||||
|
- description:
|
||||||
|
Optional external i2s clock, parent of mout_i2s. If not specified, it
|
||||||
|
is fixed to a clock named "iiscdclk0".
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
minItems: 4
|
||||||
|
items:
|
||||||
|
- const: hclk
|
||||||
|
- const: xxti
|
||||||
|
- const: fout_epll
|
||||||
|
- const: sclk_audio0
|
||||||
|
- const: iiscdclk0
|
||||||
|
|
||||||
|
"#clock-cells":
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
power-domains:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- clocks
|
||||||
|
- clock-names
|
||||||
|
- "#clock-cells"
|
||||||
|
- reg
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/s5pv210.h>
|
||||||
|
|
||||||
|
clock-controller@c0900000 {
|
||||||
|
compatible = "samsung,s5pv210-audss-clock";
|
||||||
|
reg = <0xc0900000 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
clock-names = "hclk", "xxti", "fout_epll", "sclk_audio0";
|
||||||
|
clocks = <&clocks DOUT_HCLKP>, <&xxti>, <&clocks FOUT_EPLL>,
|
||||||
|
<&clocks SCLK_AUDIO0>;
|
||||||
|
};
|
||||||
@@ -16519,10 +16519,14 @@ L: linux-samsung-soc@vger.kernel.org
|
|||||||
S: Supported
|
S: Supported
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
|
||||||
F: Documentation/devicetree/bindings/clock/exynos*.txt
|
F: Documentation/devicetree/bindings/clock/exynos*.txt
|
||||||
|
F: Documentation/devicetree/bindings/clock/samsung,*.yaml
|
||||||
F: Documentation/devicetree/bindings/clock/samsung,s3c*
|
F: Documentation/devicetree/bindings/clock/samsung,s3c*
|
||||||
F: Documentation/devicetree/bindings/clock/samsung,s5p*
|
F: Documentation/devicetree/bindings/clock/samsung,s5p*
|
||||||
F: drivers/clk/samsung/
|
F: drivers/clk/samsung/
|
||||||
F: include/dt-bindings/clock/exynos*.h
|
F: include/dt-bindings/clock/exynos*.h
|
||||||
|
F: include/dt-bindings/clock/s3c*.h
|
||||||
|
F: include/dt-bindings/clock/s5p*.h
|
||||||
|
F: include/dt-bindings/clock/samsung,*.h
|
||||||
F: include/linux/clk/samsung.h
|
F: include/linux/clk/samsung.h
|
||||||
F: include/linux/platform_data/clk-s3c2410.h
|
F: include/linux/platform_data/clk-s3c2410.h
|
||||||
|
|
||||||
|
|||||||
@@ -385,7 +385,9 @@ static struct platform_device *lpss_clk_dev;
|
|||||||
|
|
||||||
static inline void lpt_register_clock_device(void)
|
static inline void lpt_register_clock_device(void)
|
||||||
{
|
{
|
||||||
lpss_clk_dev = platform_device_register_simple("clk-lpt", -1, NULL, 0);
|
lpss_clk_dev = platform_device_register_simple("clk-lpss-atom",
|
||||||
|
PLATFORM_DEVID_NONE,
|
||||||
|
NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int register_device_clock(struct acpi_device *adev,
|
static int register_device_clock(struct acpi_device *adev,
|
||||||
@@ -434,8 +436,8 @@ static int register_device_clock(struct acpi_device *adev,
|
|||||||
if (!clk_name)
|
if (!clk_name)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
clk = clk_register_fractional_divider(NULL, clk_name, parent,
|
clk = clk_register_fractional_divider(NULL, clk_name, parent,
|
||||||
0, prv_base,
|
CLK_FRAC_DIVIDER_POWER_OF_TWO_PS,
|
||||||
1, 15, 16, 15, 0, NULL);
|
prv_base, 1, 15, 16, 15, 0, NULL);
|
||||||
parent = clk_name;
|
parent = clk_name;
|
||||||
|
|
||||||
clk_name = kasprintf(GFP_KERNEL, "%s-update", devname);
|
clk_name = kasprintf(GFP_KERNEL, "%s-update", devname);
|
||||||
@@ -1337,7 +1339,7 @@ void __init acpi_lpss_init(void)
|
|||||||
const struct x86_cpu_id *id;
|
const struct x86_cpu_id *id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = lpt_clk_init();
|
ret = lpss_atom_clk_init();
|
||||||
if (ret)
|
if (ret)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -519,6 +519,23 @@ void pm_clk_destroy(struct device *dev)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pm_clk_destroy);
|
EXPORT_SYMBOL_GPL(pm_clk_destroy);
|
||||||
|
|
||||||
|
static void pm_clk_destroy_action(void *data)
|
||||||
|
{
|
||||||
|
pm_clk_destroy(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int devm_pm_clk_create(struct device *dev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = pm_clk_create(dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return devm_add_action_or_reset(dev, pm_clk_destroy_action, dev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_pm_clk_create);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pm_clk_suspend - Disable clocks in a device's PM clock list.
|
* pm_clk_suspend - Disable clocks in a device's PM clock list.
|
||||||
* @dev: Device to disable the clocks for.
|
* @dev: Device to disable the clocks for.
|
||||||
|
|||||||
@@ -1447,6 +1447,23 @@ void pm_runtime_enable(struct device *dev)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pm_runtime_enable);
|
EXPORT_SYMBOL_GPL(pm_runtime_enable);
|
||||||
|
|
||||||
|
static void pm_runtime_disable_action(void *data)
|
||||||
|
{
|
||||||
|
pm_runtime_disable(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.
|
||||||
|
* @dev: Device to handle.
|
||||||
|
*/
|
||||||
|
int devm_pm_runtime_enable(struct device *dev)
|
||||||
|
{
|
||||||
|
pm_runtime_enable(dev);
|
||||||
|
|
||||||
|
return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_pm_runtime_enable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pm_runtime_forbid - Block runtime PM of a device.
|
* pm_runtime_forbid - Block runtime PM of a device.
|
||||||
* @dev: Device to handle.
|
* @dev: Device to handle.
|
||||||
|
|||||||
@@ -128,6 +128,12 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
|
|||||||
int i;
|
int i;
|
||||||
u32 div;
|
u32 div;
|
||||||
|
|
||||||
|
/* do not look for a rate that is outside of our range */
|
||||||
|
if (gck->range.max && req->rate > gck->range.max)
|
||||||
|
req->rate = gck->range.max;
|
||||||
|
if (gck->range.min && req->rate < gck->range.min)
|
||||||
|
req->rate = gck->range.min;
|
||||||
|
|
||||||
for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
|
for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
|
||||||
if (gck->chg_pid == i)
|
if (gck->chg_pid == i)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ static DEFINE_SPINLOCK(pmc_pll_lock);
|
|||||||
static DEFINE_SPINLOCK(pmc_mck0_lock);
|
static DEFINE_SPINLOCK(pmc_mck0_lock);
|
||||||
static DEFINE_SPINLOCK(pmc_mckX_lock);
|
static DEFINE_SPINLOCK(pmc_mckX_lock);
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* PLL clocks identifiers
|
* PLL clocks identifiers
|
||||||
* @PLL_ID_CPU: CPU PLL identifier
|
* @PLL_ID_CPU: CPU PLL identifier
|
||||||
* @PLL_ID_SYS: System PLL identifier
|
* @PLL_ID_SYS: System PLL identifier
|
||||||
@@ -56,7 +56,7 @@ enum pll_ids {
|
|||||||
PLL_ID_MAX,
|
PLL_ID_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* PLL type identifiers
|
* PLL type identifiers
|
||||||
* @PLL_TYPE_FRAC: fractional PLL identifier
|
* @PLL_TYPE_FRAC: fractional PLL identifier
|
||||||
* @PLL_TYPE_DIV: divider PLL identifier
|
* @PLL_TYPE_DIV: divider PLL identifier
|
||||||
@@ -118,7 +118,7 @@ static const struct clk_pll_characteristics pll_characteristics = {
|
|||||||
.output = pll_outputs,
|
.output = pll_outputs,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* PLL clocks description
|
* PLL clocks description
|
||||||
* @n: clock name
|
* @n: clock name
|
||||||
* @p: clock parent
|
* @p: clock parent
|
||||||
@@ -285,7 +285,7 @@ static const struct {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Master clock (MCK[1..4]) description
|
* Master clock (MCK[1..4]) description
|
||||||
* @n: clock name
|
* @n: clock name
|
||||||
* @ep: extra parents names array
|
* @ep: extra parents names array
|
||||||
@@ -337,7 +337,7 @@ static const struct {
|
|||||||
.c = 1, },
|
.c = 1, },
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* System clock description
|
* System clock description
|
||||||
* @n: clock name
|
* @n: clock name
|
||||||
* @p: clock parent name
|
* @p: clock parent name
|
||||||
@@ -361,7 +361,7 @@ static const struct {
|
|||||||
/* Mux table for programmable clocks. */
|
/* Mux table for programmable clocks. */
|
||||||
static u32 sama7g5_prog_mux_table[] = { 0, 1, 2, 5, 6, 7, 8, 9, 10, };
|
static u32 sama7g5_prog_mux_table[] = { 0, 1, 2, 5, 6, 7, 8, 9, 10, };
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Peripheral clock description
|
* Peripheral clock description
|
||||||
* @n: clock name
|
* @n: clock name
|
||||||
* @p: clock parent name
|
* @p: clock parent name
|
||||||
@@ -449,7 +449,7 @@ static const struct {
|
|||||||
{ .n = "uhphs_clk", .p = "mck1", .id = 106, },
|
{ .n = "uhphs_clk", .p = "mck1", .id = 106, },
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Generic clock description
|
* Generic clock description
|
||||||
* @n: clock name
|
* @n: clock name
|
||||||
* @pp: PLL parents
|
* @pp: PLL parents
|
||||||
|
|||||||
@@ -805,11 +805,10 @@ static int bcm2835_pll_divider_is_on(struct clk_hw *hw)
|
|||||||
return !(cprman_read(cprman, data->a2w_reg) & A2W_PLL_CHANNEL_DISABLE);
|
return !(cprman_read(cprman, data->a2w_reg) & A2W_PLL_CHANNEL_DISABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long bcm2835_pll_divider_round_rate(struct clk_hw *hw,
|
static int bcm2835_pll_divider_determine_rate(struct clk_hw *hw,
|
||||||
unsigned long rate,
|
struct clk_rate_request *req)
|
||||||
unsigned long *parent_rate)
|
|
||||||
{
|
{
|
||||||
return clk_divider_ops.round_rate(hw, rate, parent_rate);
|
return clk_divider_ops.determine_rate(hw, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long bcm2835_pll_divider_get_rate(struct clk_hw *hw,
|
static unsigned long bcm2835_pll_divider_get_rate(struct clk_hw *hw,
|
||||||
@@ -901,7 +900,7 @@ static const struct clk_ops bcm2835_pll_divider_clk_ops = {
|
|||||||
.unprepare = bcm2835_pll_divider_off,
|
.unprepare = bcm2835_pll_divider_off,
|
||||||
.recalc_rate = bcm2835_pll_divider_get_rate,
|
.recalc_rate = bcm2835_pll_divider_get_rate,
|
||||||
.set_rate = bcm2835_pll_divider_set_rate,
|
.set_rate = bcm2835_pll_divider_set_rate,
|
||||||
.round_rate = bcm2835_pll_divider_round_rate,
|
.determine_rate = bcm2835_pll_divider_determine_rate,
|
||||||
.debug_init = bcm2835_pll_divider_debug_init,
|
.debug_init = bcm2835_pll_divider_debug_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -446,6 +446,27 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
|||||||
divider->width, divider->flags);
|
divider->width, divider->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int clk_divider_determine_rate(struct clk_hw *hw,
|
||||||
|
struct clk_rate_request *req)
|
||||||
|
{
|
||||||
|
struct clk_divider *divider = to_clk_divider(hw);
|
||||||
|
|
||||||
|
/* if read only, just return current value */
|
||||||
|
if (divider->flags & CLK_DIVIDER_READ_ONLY) {
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = clk_div_readl(divider) >> divider->shift;
|
||||||
|
val &= clk_div_mask(divider->width);
|
||||||
|
|
||||||
|
return divider_ro_determine_rate(hw, req, divider->table,
|
||||||
|
divider->width,
|
||||||
|
divider->flags, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
return divider_determine_rate(hw, req, divider->table, divider->width,
|
||||||
|
divider->flags);
|
||||||
|
}
|
||||||
|
|
||||||
int divider_get_val(unsigned long rate, unsigned long parent_rate,
|
int divider_get_val(unsigned long rate, unsigned long parent_rate,
|
||||||
const struct clk_div_table *table, u8 width,
|
const struct clk_div_table *table, u8 width,
|
||||||
unsigned long flags)
|
unsigned long flags)
|
||||||
@@ -501,6 +522,7 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||||||
const struct clk_ops clk_divider_ops = {
|
const struct clk_ops clk_divider_ops = {
|
||||||
.recalc_rate = clk_divider_recalc_rate,
|
.recalc_rate = clk_divider_recalc_rate,
|
||||||
.round_rate = clk_divider_round_rate,
|
.round_rate = clk_divider_round_rate,
|
||||||
|
.determine_rate = clk_divider_determine_rate,
|
||||||
.set_rate = clk_divider_set_rate,
|
.set_rate = clk_divider_set_rate,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(clk_divider_ops);
|
EXPORT_SYMBOL_GPL(clk_divider_ops);
|
||||||
@@ -508,6 +530,7 @@ EXPORT_SYMBOL_GPL(clk_divider_ops);
|
|||||||
const struct clk_ops clk_divider_ro_ops = {
|
const struct clk_ops clk_divider_ro_ops = {
|
||||||
.recalc_rate = clk_divider_recalc_rate,
|
.recalc_rate = clk_divider_recalc_rate,
|
||||||
.round_rate = clk_divider_round_rate,
|
.round_rate = clk_divider_round_rate,
|
||||||
|
.determine_rate = clk_divider_determine_rate,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
|
EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,39 @@
|
|||||||
* Copyright (C) 2014 Intel Corporation
|
* Copyright (C) 2014 Intel Corporation
|
||||||
*
|
*
|
||||||
* Adjustable fractional divider clock implementation.
|
* Adjustable fractional divider clock implementation.
|
||||||
* Output rate = (m / n) * parent_rate.
|
|
||||||
* Uses rational best approximation algorithm.
|
* Uses rational best approximation algorithm.
|
||||||
|
*
|
||||||
|
* Output is calculated as
|
||||||
|
*
|
||||||
|
* rate = (m / n) * parent_rate (1)
|
||||||
|
*
|
||||||
|
* This is useful when we have a prescaler block which asks for
|
||||||
|
* m (numerator) and n (denominator) values to be provided to satisfy
|
||||||
|
* the (1) as much as possible.
|
||||||
|
*
|
||||||
|
* Since m and n have the limitation by a range, e.g.
|
||||||
|
*
|
||||||
|
* n >= 1, n < N_width, where N_width = 2^nwidth (2)
|
||||||
|
*
|
||||||
|
* for some cases the output may be saturated. Hence, from (1) and (2),
|
||||||
|
* assuming the worst case when m = 1, the inequality
|
||||||
|
*
|
||||||
|
* floor(log2(parent_rate / rate)) <= nwidth (3)
|
||||||
|
*
|
||||||
|
* may be derived. Thus, in cases when
|
||||||
|
*
|
||||||
|
* (parent_rate / rate) >> N_width (4)
|
||||||
|
*
|
||||||
|
* we might scale up the rate by 2^scale (see the description of
|
||||||
|
* CLK_FRAC_DIVIDER_POWER_OF_TWO_PS for additional information), where
|
||||||
|
*
|
||||||
|
* scale = floor(log2(parent_rate / rate)) - nwidth (5)
|
||||||
|
*
|
||||||
|
* and assume that the IP, that needs m and n, has also its own
|
||||||
|
* prescaler, which is capable to divide by 2^scale. In this way
|
||||||
|
* we get the denominator to satisfy the desired range (2) and
|
||||||
|
* at the same time much much better result of m and n than simple
|
||||||
|
* saturated values.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk-provider.h>
|
#include <linux/clk-provider.h>
|
||||||
@@ -14,6 +45,8 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/rational.h>
|
#include <linux/rational.h>
|
||||||
|
|
||||||
|
#include "clk-fractional-divider.h"
|
||||||
|
|
||||||
static inline u32 clk_fd_readl(struct clk_fractional_divider *fd)
|
static inline u32 clk_fd_readl(struct clk_fractional_divider *fd)
|
||||||
{
|
{
|
||||||
if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
|
if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
|
||||||
@@ -68,21 +101,26 @@ static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clk_fd_general_approximation(struct clk_hw *hw, unsigned long rate,
|
void clk_fractional_divider_general_approximation(struct clk_hw *hw,
|
||||||
|
unsigned long rate,
|
||||||
unsigned long *parent_rate,
|
unsigned long *parent_rate,
|
||||||
unsigned long *m, unsigned long *n)
|
unsigned long *m, unsigned long *n)
|
||||||
{
|
{
|
||||||
struct clk_fractional_divider *fd = to_clk_fd(hw);
|
struct clk_fractional_divider *fd = to_clk_fd(hw);
|
||||||
unsigned long scale;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get rate closer to *parent_rate to guarantee there is no overflow
|
* Get rate closer to *parent_rate to guarantee there is no overflow
|
||||||
* for m and n. In the result it will be the nearest rate left shifted
|
* for m and n. In the result it will be the nearest rate left shifted
|
||||||
* by (scale - fd->nwidth) bits.
|
* by (scale - fd->nwidth) bits.
|
||||||
|
*
|
||||||
|
* For the detailed explanation see the top comment in this file.
|
||||||
*/
|
*/
|
||||||
scale = fls_long(*parent_rate / rate - 1);
|
if (fd->flags & CLK_FRAC_DIVIDER_POWER_OF_TWO_PS) {
|
||||||
|
unsigned long scale = fls_long(*parent_rate / rate - 1);
|
||||||
|
|
||||||
if (scale > fd->nwidth)
|
if (scale > fd->nwidth)
|
||||||
rate <<= scale - fd->nwidth;
|
rate <<= scale - fd->nwidth;
|
||||||
|
}
|
||||||
|
|
||||||
rational_best_approximation(rate, *parent_rate,
|
rational_best_approximation(rate, *parent_rate,
|
||||||
GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
|
GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
|
||||||
@@ -102,7 +140,7 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
|
|||||||
if (fd->approximation)
|
if (fd->approximation)
|
||||||
fd->approximation(hw, rate, parent_rate, &m, &n);
|
fd->approximation(hw, rate, parent_rate, &m, &n);
|
||||||
else
|
else
|
||||||
clk_fd_general_approximation(hw, rate, parent_rate, &m, &n);
|
clk_fractional_divider_general_approximation(hw, rate, parent_rate, &m, &n);
|
||||||
|
|
||||||
ret = (u64)*parent_rate * m;
|
ret = (u64)*parent_rate * m;
|
||||||
do_div(ret, n);
|
do_div(ret, n);
|
||||||
|
|||||||
15
drivers/clk/clk-fractional-divider.h
Normal file
15
drivers/clk/clk-fractional-divider.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _CLK_FRACTIONAL_DIV_H
|
||||||
|
#define _CLK_FRACTIONAL_DIV_H
|
||||||
|
|
||||||
|
struct clk_hw;
|
||||||
|
|
||||||
|
extern const struct clk_ops clk_fractional_divider_ops;
|
||||||
|
|
||||||
|
void clk_fractional_divider_general_approximation(struct clk_hw *hw,
|
||||||
|
unsigned long rate,
|
||||||
|
unsigned long *parent_rate,
|
||||||
|
unsigned long *m,
|
||||||
|
unsigned long *n);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -269,23 +269,14 @@ static bool lmk04832_regmap_rd_regs(struct device *dev, unsigned int reg)
|
|||||||
{
|
{
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case LMK04832_REG_RST3W ... LMK04832_REG_ID_MASKREV:
|
case LMK04832_REG_RST3W ... LMK04832_REG_ID_MASKREV:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_ID_VNDR_MSB:
|
case LMK04832_REG_ID_VNDR_MSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_ID_VNDR_LSB:
|
case LMK04832_REG_ID_VNDR_LSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
|
case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_PLL2_LD:
|
case LMK04832_REG_PLL2_LD:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_PLL2_PD:
|
case LMK04832_REG_PLL2_PD:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_PLL1R_RST:
|
case LMK04832_REG_PLL1R_RST:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
|
case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_RB_HOLDOVER:
|
case LMK04832_REG_RB_HOLDOVER:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_SPI_LOCK:
|
case LMK04832_REG_SPI_LOCK:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
@@ -297,27 +288,18 @@ static bool lmk04832_regmap_wr_regs(struct device *dev, unsigned int reg)
|
|||||||
{
|
{
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case LMK04832_REG_RST3W:
|
case LMK04832_REG_RST3W:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_POWERDOWN:
|
case LMK04832_REG_POWERDOWN:
|
||||||
return true;
|
return true;
|
||||||
case LMK04832_REG_ID_DEV_TYPE ... LMK04832_REG_ID_MASKREV:
|
case LMK04832_REG_ID_DEV_TYPE ... LMK04832_REG_ID_MASKREV:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_ID_VNDR_MSB:
|
case LMK04832_REG_ID_VNDR_MSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_ID_VNDR_LSB:
|
case LMK04832_REG_ID_VNDR_LSB:
|
||||||
return false;
|
return false;
|
||||||
case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
|
case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_PLL2_LD:
|
case LMK04832_REG_PLL2_LD:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_PLL2_PD:
|
case LMK04832_REG_PLL2_PD:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_PLL1R_RST:
|
case LMK04832_REG_PLL1R_RST:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
|
case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_RB_HOLDOVER:
|
case LMK04832_REG_RB_HOLDOVER:
|
||||||
fallthrough;
|
|
||||||
case LMK04832_REG_SPI_LOCK:
|
case LMK04832_REG_SPI_LOCK:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Clock driver for Palmas device.
|
* Clock driver for Palmas device.
|
||||||
*
|
*
|
||||||
@@ -6,15 +7,6 @@
|
|||||||
*
|
*
|
||||||
* Author: Laxman Dewangan <ldewangan@nvidia.com>
|
* Author: Laxman Dewangan <ldewangan@nvidia.com>
|
||||||
* Peter Ujfalusi <peter.ujfalusi@ti.com>
|
* Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation version 2.
|
|
||||||
*
|
|
||||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
|
|
||||||
* whether express or implied; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|||||||
@@ -709,10 +709,10 @@ static unsigned long stm32f4_pll_div_recalc_rate(struct clk_hw *hw,
|
|||||||
return clk_divider_ops.recalc_rate(hw, parent_rate);
|
return clk_divider_ops.recalc_rate(hw, parent_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long stm32f4_pll_div_round_rate(struct clk_hw *hw, unsigned long rate,
|
static int stm32f4_pll_div_determine_rate(struct clk_hw *hw,
|
||||||
unsigned long *prate)
|
struct clk_rate_request *req)
|
||||||
{
|
{
|
||||||
return clk_divider_ops.round_rate(hw, rate, prate);
|
return clk_divider_ops.determine_rate(hw, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stm32f4_pll_div_set_rate(struct clk_hw *hw, unsigned long rate,
|
static int stm32f4_pll_div_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
@@ -738,7 +738,7 @@ static int stm32f4_pll_div_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||||||
|
|
||||||
static const struct clk_ops stm32f4_pll_div_ops = {
|
static const struct clk_ops stm32f4_pll_div_ops = {
|
||||||
.recalc_rate = stm32f4_pll_div_recalc_rate,
|
.recalc_rate = stm32f4_pll_div_recalc_rate,
|
||||||
.round_rate = stm32f4_pll_div_round_rate,
|
.determine_rate = stm32f4_pll_div_determine_rate,
|
||||||
.set_rate = stm32f4_pll_div_set_rate,
|
.set_rate = stm32f4_pll_div_set_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -845,10 +845,10 @@ static unsigned long odf_divider_recalc_rate(struct clk_hw *hw,
|
|||||||
return clk_divider_ops.recalc_rate(hw, parent_rate);
|
return clk_divider_ops.recalc_rate(hw, parent_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long odf_divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
static int odf_divider_determine_rate(struct clk_hw *hw,
|
||||||
unsigned long *prate)
|
struct clk_rate_request *req)
|
||||||
{
|
{
|
||||||
return clk_divider_ops.round_rate(hw, rate, prate);
|
return clk_divider_ops.determine_rate(hw, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
@@ -875,7 +875,7 @@ static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||||||
|
|
||||||
static const struct clk_ops odf_divider_ops = {
|
static const struct clk_ops odf_divider_ops = {
|
||||||
.recalc_rate = odf_divider_recalc_rate,
|
.recalc_rate = odf_divider_recalc_rate,
|
||||||
.round_rate = odf_divider_round_rate,
|
.determine_rate = odf_divider_determine_rate,
|
||||||
.set_rate = odf_divider_set_rate,
|
.set_rate = odf_divider_set_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1076,14 +1076,10 @@ static int clk_divider_rtc_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||||||
|
|
||||||
static int clk_divider_rtc_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
|
static int clk_divider_rtc_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
|
||||||
{
|
{
|
||||||
unsigned long best_parent_rate = req->best_parent_rate;
|
if (req->best_parent_hw == clk_hw_get_parent_by_index(hw, HSE_RTC))
|
||||||
|
return clk_divider_ops.determine_rate(hw, req);
|
||||||
|
|
||||||
if (req->best_parent_hw == clk_hw_get_parent_by_index(hw, HSE_RTC)) {
|
req->rate = req->best_parent_rate;
|
||||||
req->rate = clk_divider_ops.round_rate(hw, req->rate, &best_parent_rate);
|
|
||||||
req->best_parent_rate = best_parent_rate;
|
|
||||||
} else {
|
|
||||||
req->rate = best_parent_rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -907,6 +907,7 @@ static const struct of_device_id clk_vc5_of_match[];
|
|||||||
|
|
||||||
static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||||
{
|
{
|
||||||
|
unsigned int oe, sd, src_mask = 0, src_val = 0;
|
||||||
struct vc5_driver_data *vc5;
|
struct vc5_driver_data *vc5;
|
||||||
struct clk_init_data init;
|
struct clk_init_data init;
|
||||||
const char *parent_names[2];
|
const char *parent_names[2];
|
||||||
@@ -930,11 +931,33 @@ static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
|
|
||||||
vc5->regmap = devm_regmap_init_i2c(client, &vc5_regmap_config);
|
vc5->regmap = devm_regmap_init_i2c(client, &vc5_regmap_config);
|
||||||
if (IS_ERR(vc5->regmap)) {
|
if (IS_ERR(vc5->regmap))
|
||||||
dev_err(&client->dev, "failed to allocate register map\n");
|
return dev_err_probe(&client->dev, PTR_ERR(vc5->regmap),
|
||||||
return PTR_ERR(vc5->regmap);
|
"failed to allocate register map\n");
|
||||||
|
|
||||||
|
ret = of_property_read_u32(client->dev.of_node, "idt,shutdown", &sd);
|
||||||
|
if (!ret) {
|
||||||
|
src_mask |= VC5_PRIM_SRC_SHDN_EN_GBL_SHDN;
|
||||||
|
if (sd)
|
||||||
|
src_val |= VC5_PRIM_SRC_SHDN_EN_GBL_SHDN;
|
||||||
|
} else if (ret != -EINVAL) {
|
||||||
|
return dev_err_probe(&client->dev, ret,
|
||||||
|
"could not read idt,shutdown\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = of_property_read_u32(client->dev.of_node,
|
||||||
|
"idt,output-enable-active", &oe);
|
||||||
|
if (!ret) {
|
||||||
|
src_mask |= VC5_PRIM_SRC_SHDN_SP;
|
||||||
|
if (oe)
|
||||||
|
src_val |= VC5_PRIM_SRC_SHDN_SP;
|
||||||
|
} else if (ret != -EINVAL) {
|
||||||
|
return dev_err_probe(&client->dev, ret,
|
||||||
|
"could not read idt,output-enable-active\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN, src_mask, src_val);
|
||||||
|
|
||||||
/* Register clock input mux */
|
/* Register clock input mux */
|
||||||
memset(&init, 0, sizeof(init));
|
memset(&init, 0, sizeof(init));
|
||||||
|
|
||||||
@@ -957,10 +980,9 @@ static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||||||
__clk_get_name(vc5->pin_clkin);
|
__clk_get_name(vc5->pin_clkin);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!init.num_parents) {
|
if (!init.num_parents)
|
||||||
dev_err(&client->dev, "no input clock specified!\n");
|
return dev_err_probe(&client->dev, -EINVAL,
|
||||||
return -EINVAL;
|
"no input clock specified!\n");
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure Optional Loading Capacitance for external XTAL */
|
/* Configure Optional Loading Capacitance for external XTAL */
|
||||||
if (!(vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)) {
|
if (!(vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)) {
|
||||||
@@ -1099,14 +1121,16 @@ static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||||||
|
|
||||||
ret = of_clk_add_hw_provider(client->dev.of_node, vc5_of_clk_get, vc5);
|
ret = of_clk_add_hw_provider(client->dev.of_node, vc5_of_clk_get, vc5);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to add clk provider\n");
|
dev_err_probe(&client->dev, ret,
|
||||||
|
"unable to add clk provider\n");
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_clk_register:
|
err_clk_register:
|
||||||
dev_err(&client->dev, "unable to register %s\n", init.name);
|
dev_err_probe(&client->dev, ret,
|
||||||
|
"unable to register %s\n", init.name);
|
||||||
kfree(init.name); /* clock framework made a copy of the name */
|
kfree(init.name); /* clock framework made a copy of the name */
|
||||||
err_clk:
|
err_clk:
|
||||||
if (vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)
|
if (vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
||||||
|
#include "../clk-fractional-divider.h"
|
||||||
#include "clk.h"
|
#include "clk.h"
|
||||||
|
|
||||||
#define PCG_PCS_SHIFT 24
|
#define PCG_PCS_SHIFT 24
|
||||||
|
|||||||
@@ -216,6 +216,7 @@ struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
|
|||||||
div->width = PCG_PREDIV_WIDTH;
|
div->width = PCG_PREDIV_WIDTH;
|
||||||
divider_ops = &imx8m_clk_composite_divider_ops;
|
divider_ops = &imx8m_clk_composite_divider_ops;
|
||||||
mux_ops = &clk_mux_ops;
|
mux_ops = &clk_mux_ops;
|
||||||
|
if (!(composite_flags & IMX_COMPOSITE_FW_MANAGED))
|
||||||
flags |= CLK_SET_PARENT_GATE;
|
flags |= CLK_SET_PARENT_GATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,10 +64,10 @@ static unsigned long clk_divider_gate_recalc_rate(struct clk_hw *hw,
|
|||||||
div->flags, div->width);
|
div->flags, div->width);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
|
static int clk_divider_determine_rate(struct clk_hw *hw,
|
||||||
unsigned long *prate)
|
struct clk_rate_request *req)
|
||||||
{
|
{
|
||||||
return clk_divider_ops.round_rate(hw, rate, prate);
|
return clk_divider_ops.determine_rate(hw, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int clk_divider_gate_set_rate(struct clk_hw *hw, unsigned long rate,
|
static int clk_divider_gate_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
@@ -154,12 +154,12 @@ static int clk_divider_is_enabled(struct clk_hw *hw)
|
|||||||
|
|
||||||
static const struct clk_ops clk_divider_gate_ro_ops = {
|
static const struct clk_ops clk_divider_gate_ro_ops = {
|
||||||
.recalc_rate = clk_divider_gate_recalc_rate_ro,
|
.recalc_rate = clk_divider_gate_recalc_rate_ro,
|
||||||
.round_rate = clk_divider_round_rate,
|
.determine_rate = clk_divider_determine_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct clk_ops clk_divider_gate_ops = {
|
static const struct clk_ops clk_divider_gate_ops = {
|
||||||
.recalc_rate = clk_divider_gate_recalc_rate,
|
.recalc_rate = clk_divider_gate_recalc_rate,
|
||||||
.round_rate = clk_divider_round_rate,
|
.determine_rate = clk_divider_determine_rate,
|
||||||
.set_rate = clk_divider_gate_set_rate,
|
.set_rate = clk_divider_gate_set_rate,
|
||||||
.enable = clk_divider_enable,
|
.enable = clk_divider_enable,
|
||||||
.disable = clk_divider_disable,
|
.disable = clk_divider_disable,
|
||||||
|
|||||||
@@ -407,10 +407,10 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
|
|||||||
hws[IMX8MM_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
|
hws[IMX8MM_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
|
||||||
hws[IMX8MM_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
|
hws[IMX8MM_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
|
||||||
|
|
||||||
hws[IMX8MM_CLK_CLKOUT1_SEL] = imx_clk_hw_mux("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
hws[IMX8MM_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
||||||
hws[IMX8MM_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", base + 0x128, 0, 4);
|
hws[IMX8MM_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", base + 0x128, 0, 4);
|
||||||
hws[IMX8MM_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", base + 0x128, 8);
|
hws[IMX8MM_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", base + 0x128, 8);
|
||||||
hws[IMX8MM_CLK_CLKOUT2_SEL] = imx_clk_hw_mux("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
hws[IMX8MM_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
||||||
hws[IMX8MM_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", base + 0x128, 16, 4);
|
hws[IMX8MM_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", base + 0x128, 16, 4);
|
||||||
hws[IMX8MM_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", base + 0x128, 24);
|
hws[IMX8MM_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", base + 0x128, 24);
|
||||||
|
|
||||||
@@ -470,10 +470,11 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* DRAM clocks are manipulated from TF-A outside clock framework.
|
* DRAM clocks are manipulated from TF-A outside clock framework.
|
||||||
* Mark with GET_RATE_NOCACHE to always read div value from hardware
|
* The fw_managed helper sets GET_RATE_NOCACHE and clears SET_PARENT_GATE
|
||||||
|
* as div value should always be read from hardware
|
||||||
*/
|
*/
|
||||||
hws[IMX8MM_CLK_DRAM_ALT] = __imx8m_clk_hw_composite("dram_alt", imx8mm_dram_alt_sels, base + 0xa000, CLK_GET_RATE_NOCACHE);
|
hws[IMX8MM_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mm_dram_alt_sels, base + 0xa000);
|
||||||
hws[IMX8MM_CLK_DRAM_APB] = __imx8m_clk_hw_composite("dram_apb", imx8mm_dram_apb_sels, base + 0xa080, CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE);
|
hws[IMX8MM_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mm_dram_apb_sels, base + 0xa080);
|
||||||
|
|
||||||
/* IP */
|
/* IP */
|
||||||
hws[IMX8MM_CLK_VPU_G1] = imx8m_clk_hw_composite("vpu_g1", imx8mm_vpu_g1_sels, base + 0xa100);
|
hws[IMX8MM_CLK_VPU_G1] = imx8m_clk_hw_composite("vpu_g1", imx8mm_vpu_g1_sels, base + 0xa100);
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ static const char * const imx8mn_a53_sels[] = {"osc_24m", "arm_pll_out", "sys_pl
|
|||||||
|
|
||||||
static const char * const imx8mn_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", };
|
static const char * const imx8mn_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", };
|
||||||
|
|
||||||
|
static const char * const imx8mn_m7_sels[] = {"osc_24m", "sys_pll2_200m", "sys_pll2_250m", "vpu_pll_out",
|
||||||
|
"sys_pll1_800m", "audio_pll1_out", "video_pll1_out", "sys_pll3_out", };
|
||||||
|
|
||||||
static const char * const imx8mn_gpu_core_sels[] = {"osc_24m", "gpu_pll_out", "sys_pll1_800m",
|
static const char * const imx8mn_gpu_core_sels[] = {"osc_24m", "gpu_pll_out", "sys_pll1_800m",
|
||||||
"sys_pll3_out", "sys_pll2_1000m", "audio_pll1_out",
|
"sys_pll3_out", "sys_pll2_1000m", "audio_pll1_out",
|
||||||
"video_pll1_out", "audio_pll2_out", };
|
"video_pll1_out", "audio_pll2_out", };
|
||||||
@@ -402,10 +405,10 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
|
|||||||
hws[IMX8MN_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
|
hws[IMX8MN_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
|
||||||
hws[IMX8MN_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
|
hws[IMX8MN_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
|
||||||
|
|
||||||
hws[IMX8MN_CLK_CLKOUT1_SEL] = imx_clk_hw_mux("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
hws[IMX8MN_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
||||||
hws[IMX8MN_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", base + 0x128, 0, 4);
|
hws[IMX8MN_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", base + 0x128, 0, 4);
|
||||||
hws[IMX8MN_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", base + 0x128, 8);
|
hws[IMX8MN_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", base + 0x128, 8);
|
||||||
hws[IMX8MN_CLK_CLKOUT2_SEL] = imx_clk_hw_mux("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
hws[IMX8MN_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
|
||||||
hws[IMX8MN_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", base + 0x128, 16, 4);
|
hws[IMX8MN_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", base + 0x128, 16, 4);
|
||||||
hws[IMX8MN_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", base + 0x128, 24);
|
hws[IMX8MN_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", base + 0x128, 24);
|
||||||
|
|
||||||
@@ -421,6 +424,8 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
|
|||||||
hws[IMX8MN_CLK_A53_SRC] = hws[IMX8MN_CLK_A53_DIV];
|
hws[IMX8MN_CLK_A53_SRC] = hws[IMX8MN_CLK_A53_DIV];
|
||||||
hws[IMX8MN_CLK_A53_CG] = hws[IMX8MN_CLK_A53_DIV];
|
hws[IMX8MN_CLK_A53_CG] = hws[IMX8MN_CLK_A53_DIV];
|
||||||
|
|
||||||
|
hws[IMX8MN_CLK_M7_CORE] = imx8m_clk_hw_composite_core("arm_m7_core", imx8mn_m7_sels, base + 0x8080);
|
||||||
|
|
||||||
hws[IMX8MN_CLK_GPU_CORE] = imx8m_clk_hw_composite_core("gpu_core", imx8mn_gpu_core_sels, base + 0x8180);
|
hws[IMX8MN_CLK_GPU_CORE] = imx8m_clk_hw_composite_core("gpu_core", imx8mn_gpu_core_sels, base + 0x8180);
|
||||||
hws[IMX8MN_CLK_GPU_SHADER] = imx8m_clk_hw_composite_core("gpu_shader", imx8mn_gpu_shader_sels, base + 0x8200);
|
hws[IMX8MN_CLK_GPU_SHADER] = imx8m_clk_hw_composite_core("gpu_shader", imx8mn_gpu_shader_sels, base + 0x8200);
|
||||||
|
|
||||||
@@ -453,10 +458,11 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* DRAM clocks are manipulated from TF-A outside clock framework.
|
* DRAM clocks are manipulated from TF-A outside clock framework.
|
||||||
* Mark with GET_RATE_NOCACHE to always read div value from hardware
|
* The fw_managed helper sets GET_RATE_NOCACHE and clears SET_PARENT_GATE
|
||||||
|
* as div value should always be read from hardware
|
||||||
*/
|
*/
|
||||||
hws[IMX8MN_CLK_DRAM_ALT] = __imx8m_clk_hw_composite("dram_alt", imx8mn_dram_alt_sels, base + 0xa000, CLK_GET_RATE_NOCACHE);
|
hws[IMX8MN_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mn_dram_alt_sels, base + 0xa000);
|
||||||
hws[IMX8MN_CLK_DRAM_APB] = __imx8m_clk_hw_composite("dram_apb", imx8mn_dram_apb_sels, base + 0xa080, CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE);
|
hws[IMX8MN_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mn_dram_apb_sels, base + 0xa080);
|
||||||
|
|
||||||
hws[IMX8MN_CLK_DISP_PIXEL] = imx8m_clk_hw_composite("disp_pixel", imx8mn_disp_pixel_sels, base + 0xa500);
|
hws[IMX8MN_CLK_DISP_PIXEL] = imx8m_clk_hw_composite("disp_pixel", imx8mn_disp_pixel_sels, base + 0xa500);
|
||||||
hws[IMX8MN_CLK_SAI2] = imx8m_clk_hw_composite("sai2", imx8mn_sai2_sels, base + 0xa600);
|
hws[IMX8MN_CLK_SAI2] = imx8m_clk_hw_composite("sai2", imx8mn_sai2_sels, base + 0xa600);
|
||||||
|
|||||||
@@ -449,11 +449,12 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* DRAM clocks are manipulated from TF-A outside clock framework.
|
* DRAM clocks are manipulated from TF-A outside clock framework.
|
||||||
* Mark with GET_RATE_NOCACHE to always read div value from hardware
|
* The fw_managed helper sets GET_RATE_NOCACHE and clears SET_PARENT_GATE
|
||||||
|
* as div value should always be read from hardware
|
||||||
*/
|
*/
|
||||||
hws[IMX8MQ_CLK_DRAM_CORE] = imx_clk_hw_mux2_flags("dram_core_clk", base + 0x9800, 24, 1, imx8mq_dram_core_sels, ARRAY_SIZE(imx8mq_dram_core_sels), CLK_IS_CRITICAL);
|
hws[IMX8MQ_CLK_DRAM_CORE] = imx_clk_hw_mux2_flags("dram_core_clk", base + 0x9800, 24, 1, imx8mq_dram_core_sels, ARRAY_SIZE(imx8mq_dram_core_sels), CLK_IS_CRITICAL);
|
||||||
hws[IMX8MQ_CLK_DRAM_ALT] = __imx8m_clk_hw_composite("dram_alt", imx8mq_dram_alt_sels, base + 0xa000, CLK_GET_RATE_NOCACHE);
|
hws[IMX8MQ_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mq_dram_alt_sels, base + 0xa000);
|
||||||
hws[IMX8MQ_CLK_DRAM_APB] = __imx8m_clk_hw_composite("dram_apb", imx8mq_dram_apb_sels, base + 0xa080, CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE);
|
hws[IMX8MQ_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mq_dram_apb_sels, base + 0xa080);
|
||||||
|
|
||||||
/* IP */
|
/* IP */
|
||||||
hws[IMX8MQ_CLK_VPU_G1] = imx8m_clk_hw_composite("vpu_g1", imx8mq_vpu_g1_sels, base + 0xa100);
|
hws[IMX8MQ_CLK_VPU_G1] = imx8m_clk_hw_composite("vpu_g1", imx8mq_vpu_g1_sels, base + 0xa100);
|
||||||
|
|||||||
@@ -532,6 +532,7 @@ struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,
|
|||||||
|
|
||||||
#define IMX_COMPOSITE_CORE BIT(0)
|
#define IMX_COMPOSITE_CORE BIT(0)
|
||||||
#define IMX_COMPOSITE_BUS BIT(1)
|
#define IMX_COMPOSITE_BUS BIT(1)
|
||||||
|
#define IMX_COMPOSITE_FW_MANAGED BIT(2)
|
||||||
|
|
||||||
struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
|
struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
|
||||||
const char * const *parent_names,
|
const char * const *parent_names,
|
||||||
@@ -567,6 +568,17 @@ struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
|
|||||||
ARRAY_SIZE(parent_names), reg, 0, \
|
ARRAY_SIZE(parent_names), reg, 0, \
|
||||||
flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
|
flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
|
||||||
|
|
||||||
|
#define __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, flags) \
|
||||||
|
imx8m_clk_hw_composite_flags(name, parent_names, \
|
||||||
|
ARRAY_SIZE(parent_names), reg, IMX_COMPOSITE_FW_MANAGED, \
|
||||||
|
flags | CLK_GET_RATE_NOCACHE | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
|
||||||
|
|
||||||
|
#define imx8m_clk_hw_fw_managed_composite(name, parent_names, reg) \
|
||||||
|
__imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, 0)
|
||||||
|
|
||||||
|
#define imx8m_clk_hw_fw_managed_composite_critical(name, parent_names, reg) \
|
||||||
|
__imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, CLK_IS_CRITICAL)
|
||||||
|
|
||||||
#define __imx8m_clk_composite(name, parent_names, reg, flags) \
|
#define __imx8m_clk_composite(name, parent_names, reg, flags) \
|
||||||
to_clk(__imx8m_clk_hw_composite(name, parent_names, reg, flags))
|
to_clk(__imx8m_clk_hw_composite(name, parent_names, reg, flags))
|
||||||
|
|
||||||
|
|||||||
@@ -362,41 +362,36 @@ config COMMON_CLK_MT8167
|
|||||||
|
|
||||||
config COMMON_CLK_MT8167_AUDSYS
|
config COMMON_CLK_MT8167_AUDSYS
|
||||||
bool "Clock driver for MediaTek MT8167 audsys"
|
bool "Clock driver for MediaTek MT8167 audsys"
|
||||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
depends on COMMON_CLK_MT8167
|
||||||
select COMMON_CLK_MEDIATEK
|
default COMMON_CLK_MT8167
|
||||||
default ARCH_MEDIATEK
|
|
||||||
help
|
help
|
||||||
This driver supports MediaTek MT8167 audsys clocks.
|
This driver supports MediaTek MT8167 audsys clocks.
|
||||||
|
|
||||||
config COMMON_CLK_MT8167_IMGSYS
|
config COMMON_CLK_MT8167_IMGSYS
|
||||||
bool "Clock driver for MediaTek MT8167 imgsys"
|
bool "Clock driver for MediaTek MT8167 imgsys"
|
||||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
depends on COMMON_CLK_MT8167
|
||||||
select COMMON_CLK_MEDIATEK
|
default COMMON_CLK_MT8167
|
||||||
default ARCH_MEDIATEK
|
|
||||||
help
|
help
|
||||||
This driver supports MediaTek MT8167 imgsys clocks.
|
This driver supports MediaTek MT8167 imgsys clocks.
|
||||||
|
|
||||||
config COMMON_CLK_MT8167_MFGCFG
|
config COMMON_CLK_MT8167_MFGCFG
|
||||||
bool "Clock driver for MediaTek MT8167 mfgcfg"
|
bool "Clock driver for MediaTek MT8167 mfgcfg"
|
||||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
depends on COMMON_CLK_MT8167
|
||||||
select COMMON_CLK_MEDIATEK
|
default COMMON_CLK_MT8167
|
||||||
default ARCH_MEDIATEK
|
|
||||||
help
|
help
|
||||||
This driver supports MediaTek MT8167 mfgcfg clocks.
|
This driver supports MediaTek MT8167 mfgcfg clocks.
|
||||||
|
|
||||||
config COMMON_CLK_MT8167_MMSYS
|
config COMMON_CLK_MT8167_MMSYS
|
||||||
bool "Clock driver for MediaTek MT8167 mmsys"
|
bool "Clock driver for MediaTek MT8167 mmsys"
|
||||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
depends on COMMON_CLK_MT8167
|
||||||
select COMMON_CLK_MEDIATEK
|
default COMMON_CLK_MT8167
|
||||||
default ARCH_MEDIATEK
|
|
||||||
help
|
help
|
||||||
This driver supports MediaTek MT8167 mmsys clocks.
|
This driver supports MediaTek MT8167 mmsys clocks.
|
||||||
|
|
||||||
config COMMON_CLK_MT8167_VDECSYS
|
config COMMON_CLK_MT8167_VDECSYS
|
||||||
bool "Clock driver for MediaTek MT8167 vdecsys"
|
bool "Clock driver for MediaTek MT8167 vdecsys"
|
||||||
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
|
depends on COMMON_CLK_MT8167
|
||||||
select COMMON_CLK_MEDIATEK
|
default COMMON_CLK_MT8167
|
||||||
default ARCH_MEDIATEK
|
|
||||||
help
|
help
|
||||||
This driver supports MediaTek MT8167 vdecsys clocks.
|
This driver supports MediaTek MT8167 vdecsys clocks.
|
||||||
|
|
||||||
@@ -500,6 +495,86 @@ config COMMON_CLK_MT8183_VENCSYS
|
|||||||
help
|
help
|
||||||
This driver supports MediaTek MT8183 vencsys clocks.
|
This driver supports MediaTek MT8183 vencsys clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192
|
||||||
|
bool "Clock driver for MediaTek MT8192"
|
||||||
|
depends on ARM64 || COMPILE_TEST
|
||||||
|
select COMMON_CLK_MEDIATEK
|
||||||
|
default ARM64
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 basic clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_AUDSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 audsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 audsys clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_CAMSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 camsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 camsys and camsys_raw clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_IMGSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 imgsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 imgsys and imgsys2 clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_IMP_IIC_WRAP
|
||||||
|
bool "Clock driver for MediaTek MT8192 imp_iic_wrap"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 imp_iic_wrap clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_IPESYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 ipesys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 ipesys clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_MDPSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 mdpsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 mdpsys clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_MFGCFG
|
||||||
|
bool "Clock driver for MediaTek MT8192 mfgcfg"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 mfgcfg clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_MMSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 mmsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 mmsys clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_MSDC
|
||||||
|
bool "Clock driver for MediaTek MT8192 msdc"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 msdc and msdc_top clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_SCP_ADSP
|
||||||
|
bool "Clock driver for MediaTek MT8192 scp_adsp"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 scp_adsp clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_VDECSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 vdecsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 vdecsys and vdecsys_soc clocks.
|
||||||
|
|
||||||
|
config COMMON_CLK_MT8192_VENCSYS
|
||||||
|
bool "Clock driver for MediaTek MT8192 vencsys"
|
||||||
|
depends on COMMON_CLK_MT8192
|
||||||
|
help
|
||||||
|
This driver supports MediaTek MT8192 vencsys clocks.
|
||||||
|
|
||||||
config COMMON_CLK_MT8516
|
config COMMON_CLK_MT8516
|
||||||
bool "Clock driver for MediaTek MT8516"
|
bool "Clock driver for MediaTek MT8516"
|
||||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||||
|
|||||||
@@ -67,5 +67,18 @@ obj-$(CONFIG_COMMON_CLK_MT8183_MFGCFG) += clk-mt8183-mfgcfg.o
|
|||||||
obj-$(CONFIG_COMMON_CLK_MT8183_MMSYS) += clk-mt8183-mm.o
|
obj-$(CONFIG_COMMON_CLK_MT8183_MMSYS) += clk-mt8183-mm.o
|
||||||
obj-$(CONFIG_COMMON_CLK_MT8183_VDECSYS) += clk-mt8183-vdec.o
|
obj-$(CONFIG_COMMON_CLK_MT8183_VDECSYS) += clk-mt8183-vdec.o
|
||||||
obj-$(CONFIG_COMMON_CLK_MT8183_VENCSYS) += clk-mt8183-venc.o
|
obj-$(CONFIG_COMMON_CLK_MT8183_VENCSYS) += clk-mt8183-venc.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_IMGSYS) += clk-mt8192-img.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP) += clk-mt8192-imp_iic_wrap.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_IPESYS) += clk-mt8192-ipe.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_MDPSYS) += clk-mt8192-mdp.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_MFGCFG) += clk-mt8192-mfg.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_MMSYS) += clk-mt8192-mm.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_MSDC) += clk-mt8192-msdc.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_SCP_ADSP) += clk-mt8192-scp_adsp.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_VDECSYS) += clk-mt8192-vdec.o
|
||||||
|
obj-$(CONFIG_COMMON_CLK_MT8192_VENCSYS) += clk-mt8192-venc.o
|
||||||
obj-$(CONFIG_COMMON_CLK_MT8516) += clk-mt8516.o
|
obj-$(CONFIG_COMMON_CLK_MT8516) += clk-mt8516.o
|
||||||
obj-$(CONFIG_COMMON_CLK_MT8516_AUDSYS) += clk-mt8516-aud.o
|
obj-$(CONFIG_COMMON_CLK_MT8516_AUDSYS) += clk-mt8516-aud.o
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ int mtk_clk_register_cpumuxes(struct device_node *node,
|
|||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
|
||||||
regmap = syscon_node_to_regmap(node);
|
regmap = device_node_to_regmap(node);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
pr_err("Cannot find regmap for %pOF: %ld\n", node,
|
pr_err("Cannot find regmap for %pOF: %ld\n", node,
|
||||||
PTR_ERR(regmap));
|
PTR_ERR(regmap));
|
||||||
|
|||||||
118
drivers/clk/mediatek/clk-mt8192-aud.c
Normal file
118
drivers/clk/mediatek/clk-mt8192-aud.c
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_platform.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs aud0_cg_regs = {
|
||||||
|
.set_ofs = 0x0,
|
||||||
|
.clr_ofs = 0x0,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs aud1_cg_regs = {
|
||||||
|
.set_ofs = 0x4,
|
||||||
|
.clr_ofs = 0x4,
|
||||||
|
.sta_ofs = 0x4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs aud2_cg_regs = {
|
||||||
|
.set_ofs = 0x8,
|
||||||
|
.clr_ofs = 0x8,
|
||||||
|
.sta_ofs = 0x8,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_AUD0(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &aud0_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
|
||||||
|
|
||||||
|
#define GATE_AUD1(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &aud1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
|
||||||
|
|
||||||
|
#define GATE_AUD2(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &aud2_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate aud_clks[] = {
|
||||||
|
/* AUD0 */
|
||||||
|
GATE_AUD0(CLK_AUD_AFE, "aud_afe", "audio_sel", 2),
|
||||||
|
GATE_AUD0(CLK_AUD_22M, "aud_22m", "aud_engen1_sel", 8),
|
||||||
|
GATE_AUD0(CLK_AUD_24M, "aud_24m", "aud_engen2_sel", 9),
|
||||||
|
GATE_AUD0(CLK_AUD_APLL2_TUNER, "aud_apll2_tuner", "aud_engen2_sel", 18),
|
||||||
|
GATE_AUD0(CLK_AUD_APLL_TUNER, "aud_apll_tuner", "aud_engen1_sel", 19),
|
||||||
|
GATE_AUD0(CLK_AUD_TDM, "aud_tdm", "aud_1_sel", 20),
|
||||||
|
GATE_AUD0(CLK_AUD_ADC, "aud_adc", "audio_sel", 24),
|
||||||
|
GATE_AUD0(CLK_AUD_DAC, "aud_dac", "audio_sel", 25),
|
||||||
|
GATE_AUD0(CLK_AUD_DAC_PREDIS, "aud_dac_predis", "audio_sel", 26),
|
||||||
|
GATE_AUD0(CLK_AUD_TML, "aud_tml", "audio_sel", 27),
|
||||||
|
GATE_AUD0(CLK_AUD_NLE, "aud_nle", "audio_sel", 28),
|
||||||
|
/* AUD1 */
|
||||||
|
GATE_AUD1(CLK_AUD_I2S1_B, "aud_i2s1_b", "audio_sel", 4),
|
||||||
|
GATE_AUD1(CLK_AUD_I2S2_B, "aud_i2s2_b", "audio_sel", 5),
|
||||||
|
GATE_AUD1(CLK_AUD_I2S3_B, "aud_i2s3_b", "audio_sel", 6),
|
||||||
|
GATE_AUD1(CLK_AUD_I2S4_B, "aud_i2s4_b", "audio_sel", 7),
|
||||||
|
GATE_AUD1(CLK_AUD_CONNSYS_I2S_ASRC, "aud_connsys_i2s_asrc", "audio_sel", 12),
|
||||||
|
GATE_AUD1(CLK_AUD_GENERAL1_ASRC, "aud_general1_asrc", "audio_sel", 13),
|
||||||
|
GATE_AUD1(CLK_AUD_GENERAL2_ASRC, "aud_general2_asrc", "audio_sel", 14),
|
||||||
|
GATE_AUD1(CLK_AUD_DAC_HIRES, "aud_dac_hires", "audio_h_sel", 15),
|
||||||
|
GATE_AUD1(CLK_AUD_ADC_HIRES, "aud_adc_hires", "audio_h_sel", 16),
|
||||||
|
GATE_AUD1(CLK_AUD_ADC_HIRES_TML, "aud_adc_hires_tml", "audio_h_sel", 17),
|
||||||
|
GATE_AUD1(CLK_AUD_ADDA6_ADC, "aud_adda6_adc", "audio_sel", 20),
|
||||||
|
GATE_AUD1(CLK_AUD_ADDA6_ADC_HIRES, "aud_adda6_adc_hires", "audio_h_sel", 21),
|
||||||
|
GATE_AUD1(CLK_AUD_3RD_DAC, "aud_3rd_dac", "audio_sel", 28),
|
||||||
|
GATE_AUD1(CLK_AUD_3RD_DAC_PREDIS, "aud_3rd_dac_predis", "audio_sel", 29),
|
||||||
|
GATE_AUD1(CLK_AUD_3RD_DAC_TML, "aud_3rd_dac_tml", "audio_sel", 30),
|
||||||
|
GATE_AUD1(CLK_AUD_3RD_DAC_HIRES, "aud_3rd_dac_hires", "audio_h_sel", 31),
|
||||||
|
/* AUD2 */
|
||||||
|
GATE_AUD2(CLK_AUD_I2S5_B, "aud_i2s5_b", "audio_sel", 0),
|
||||||
|
GATE_AUD2(CLK_AUD_I2S6_B, "aud_i2s6_b", "audio_sel", 1),
|
||||||
|
GATE_AUD2(CLK_AUD_I2S7_B, "aud_i2s7_b", "audio_sel", 2),
|
||||||
|
GATE_AUD2(CLK_AUD_I2S8_B, "aud_i2s8_b", "audio_sel", 3),
|
||||||
|
GATE_AUD2(CLK_AUD_I2S9_B, "aud_i2s9_b", "audio_sel", 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int clk_mt8192_aud_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
struct device_node *node = pdev->dev.of_node;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
|
||||||
|
if (!clk_data)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
r = mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = devm_of_platform_populate(&pdev->dev);
|
||||||
|
if (r)
|
||||||
|
of_clk_del_provider(node);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_aud[] = {
|
||||||
|
{ .compatible = "mediatek,mt8192-audsys", },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_aud_drv = {
|
||||||
|
.probe = clk_mt8192_aud_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-aud",
|
||||||
|
.of_match_table = of_match_clk_mt8192_aud,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_aud_drv);
|
||||||
107
drivers/clk/mediatek/clk-mt8192-cam.c
Normal file
107
drivers/clk/mediatek/clk-mt8192-cam.c
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs cam_cg_regs = {
|
||||||
|
.set_ofs = 0x4,
|
||||||
|
.clr_ofs = 0x8,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_CAM(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &cam_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate cam_clks[] = {
|
||||||
|
GATE_CAM(CLK_CAM_LARB13, "cam_larb13", "cam_sel", 0),
|
||||||
|
GATE_CAM(CLK_CAM_DFP_VAD, "cam_dfp_vad", "cam_sel", 1),
|
||||||
|
GATE_CAM(CLK_CAM_LARB14, "cam_larb14", "cam_sel", 2),
|
||||||
|
GATE_CAM(CLK_CAM_CAM, "cam_cam", "cam_sel", 6),
|
||||||
|
GATE_CAM(CLK_CAM_CAMTG, "cam_camtg", "cam_sel", 7),
|
||||||
|
GATE_CAM(CLK_CAM_SENINF, "cam_seninf", "cam_sel", 8),
|
||||||
|
GATE_CAM(CLK_CAM_CAMSV0, "cam_camsv0", "cam_sel", 9),
|
||||||
|
GATE_CAM(CLK_CAM_CAMSV1, "cam_camsv1", "cam_sel", 10),
|
||||||
|
GATE_CAM(CLK_CAM_CAMSV2, "cam_camsv2", "cam_sel", 11),
|
||||||
|
GATE_CAM(CLK_CAM_CAMSV3, "cam_camsv3", "cam_sel", 12),
|
||||||
|
GATE_CAM(CLK_CAM_CCU0, "cam_ccu0", "cam_sel", 13),
|
||||||
|
GATE_CAM(CLK_CAM_CCU1, "cam_ccu1", "cam_sel", 14),
|
||||||
|
GATE_CAM(CLK_CAM_MRAW0, "cam_mraw0", "cam_sel", 15),
|
||||||
|
GATE_CAM(CLK_CAM_FAKE_ENG, "cam_fake_eng", "cam_sel", 17),
|
||||||
|
GATE_CAM(CLK_CAM_CCU_GALS, "cam_ccu_gals", "cam_sel", 18),
|
||||||
|
GATE_CAM(CLK_CAM_CAM2MM_GALS, "cam2mm_gals", "cam_sel", 19),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate cam_rawa_clks[] = {
|
||||||
|
GATE_CAM(CLK_CAM_RAWA_LARBX, "cam_rawa_larbx", "cam_sel", 0),
|
||||||
|
GATE_CAM(CLK_CAM_RAWA_CAM, "cam_rawa_cam", "cam_sel", 1),
|
||||||
|
GATE_CAM(CLK_CAM_RAWA_CAMTG, "cam_rawa_camtg", "cam_sel", 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate cam_rawb_clks[] = {
|
||||||
|
GATE_CAM(CLK_CAM_RAWB_LARBX, "cam_rawb_larbx", "cam_sel", 0),
|
||||||
|
GATE_CAM(CLK_CAM_RAWB_CAM, "cam_rawb_cam", "cam_sel", 1),
|
||||||
|
GATE_CAM(CLK_CAM_RAWB_CAMTG, "cam_rawb_camtg", "cam_sel", 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate cam_rawc_clks[] = {
|
||||||
|
GATE_CAM(CLK_CAM_RAWC_LARBX, "cam_rawc_larbx", "cam_sel", 0),
|
||||||
|
GATE_CAM(CLK_CAM_RAWC_CAM, "cam_rawc_cam", "cam_sel", 1),
|
||||||
|
GATE_CAM(CLK_CAM_RAWC_CAMTG, "cam_rawc_camtg", "cam_sel", 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc cam_desc = {
|
||||||
|
.clks = cam_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(cam_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc cam_rawa_desc = {
|
||||||
|
.clks = cam_rawa_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(cam_rawa_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc cam_rawb_desc = {
|
||||||
|
.clks = cam_rawb_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(cam_rawb_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc cam_rawc_desc = {
|
||||||
|
.clks = cam_rawc_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(cam_rawc_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_cam[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-camsys",
|
||||||
|
.data = &cam_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-camsys_rawa",
|
||||||
|
.data = &cam_rawa_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-camsys_rawb",
|
||||||
|
.data = &cam_rawb_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-camsys_rawc",
|
||||||
|
.data = &cam_rawc_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_cam_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-cam",
|
||||||
|
.of_match_table = of_match_clk_mt8192_cam,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_cam_drv);
|
||||||
70
drivers/clk/mediatek/clk-mt8192-img.c
Normal file
70
drivers/clk/mediatek/clk-mt8192-img.c
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs img_cg_regs = {
|
||||||
|
.set_ofs = 0x4,
|
||||||
|
.clr_ofs = 0x8,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_IMG(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate img_clks[] = {
|
||||||
|
GATE_IMG(CLK_IMG_LARB9, "img_larb9", "img1_sel", 0),
|
||||||
|
GATE_IMG(CLK_IMG_LARB10, "img_larb10", "img1_sel", 1),
|
||||||
|
GATE_IMG(CLK_IMG_DIP, "img_dip", "img1_sel", 2),
|
||||||
|
GATE_IMG(CLK_IMG_GALS, "img_gals", "img1_sel", 12),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate img2_clks[] = {
|
||||||
|
GATE_IMG(CLK_IMG2_LARB11, "img2_larb11", "img1_sel", 0),
|
||||||
|
GATE_IMG(CLK_IMG2_LARB12, "img2_larb12", "img1_sel", 1),
|
||||||
|
GATE_IMG(CLK_IMG2_MFB, "img2_mfb", "img1_sel", 6),
|
||||||
|
GATE_IMG(CLK_IMG2_WPE, "img2_wpe", "img1_sel", 7),
|
||||||
|
GATE_IMG(CLK_IMG2_MSS, "img2_mss", "img1_sel", 8),
|
||||||
|
GATE_IMG(CLK_IMG2_GALS, "img2_gals", "img1_sel", 12),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc img_desc = {
|
||||||
|
.clks = img_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(img_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc img2_desc = {
|
||||||
|
.clks = img2_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(img2_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_img[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-imgsys",
|
||||||
|
.data = &img_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-imgsys2",
|
||||||
|
.data = &img2_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_img_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-img",
|
||||||
|
.of_match_table = of_match_clk_mt8192_img,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_img_drv);
|
||||||
119
drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
Normal file
119
drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs imp_iic_wrap_cg_regs = {
|
||||||
|
.set_ofs = 0xe08,
|
||||||
|
.clr_ofs = 0xe04,
|
||||||
|
.sta_ofs = 0xe00,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_IMP_IIC_WRAP(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK_FLAGS(_id, _name, _parent, &imp_iic_wrap_cg_regs, _shift, \
|
||||||
|
&mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE)
|
||||||
|
|
||||||
|
static const struct mtk_gate imp_iic_wrap_c_clks[] = {
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C10, "imp_iic_wrap_c_i2c10", "infra_i2c0", 0),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C11, "imp_iic_wrap_c_i2c11", "infra_i2c0", 1),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C12, "imp_iic_wrap_c_i2c12", "infra_i2c0", 2),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C13, "imp_iic_wrap_c_i2c13", "infra_i2c0", 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate imp_iic_wrap_e_clks[] = {
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_E_I2C3, "imp_iic_wrap_e_i2c3", "infra_i2c0", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate imp_iic_wrap_n_clks[] = {
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_N_I2C0, "imp_iic_wrap_n_i2c0", "infra_i2c0", 0),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_N_I2C6, "imp_iic_wrap_n_i2c6", "infra_i2c0", 1),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate imp_iic_wrap_s_clks[] = {
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C7, "imp_iic_wrap_s_i2c7", "infra_i2c0", 0),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C8, "imp_iic_wrap_s_i2c8", "infra_i2c0", 1),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C9, "imp_iic_wrap_s_i2c9", "infra_i2c0", 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate imp_iic_wrap_w_clks[] = {
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C5, "imp_iic_wrap_w_i2c5", "infra_i2c0", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate imp_iic_wrap_ws_clks[] = {
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_WS_I2C1, "imp_iic_wrap_ws_i2c1", "infra_i2c0", 0),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_WS_I2C2, "imp_iic_wrap_ws_i2c2", "infra_i2c0", 1),
|
||||||
|
GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_WS_I2C4, "imp_iic_wrap_ws_i2c4", "infra_i2c0", 2),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc imp_iic_wrap_c_desc = {
|
||||||
|
.clks = imp_iic_wrap_c_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(imp_iic_wrap_c_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc imp_iic_wrap_e_desc = {
|
||||||
|
.clks = imp_iic_wrap_e_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(imp_iic_wrap_e_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc imp_iic_wrap_n_desc = {
|
||||||
|
.clks = imp_iic_wrap_n_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(imp_iic_wrap_n_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc imp_iic_wrap_s_desc = {
|
||||||
|
.clks = imp_iic_wrap_s_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(imp_iic_wrap_s_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc imp_iic_wrap_w_desc = {
|
||||||
|
.clks = imp_iic_wrap_w_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(imp_iic_wrap_w_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc imp_iic_wrap_ws_desc = {
|
||||||
|
.clks = imp_iic_wrap_ws_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(imp_iic_wrap_ws_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-imp_iic_wrap_c",
|
||||||
|
.data = &imp_iic_wrap_c_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-imp_iic_wrap_e",
|
||||||
|
.data = &imp_iic_wrap_e_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-imp_iic_wrap_n",
|
||||||
|
.data = &imp_iic_wrap_n_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-imp_iic_wrap_s",
|
||||||
|
.data = &imp_iic_wrap_s_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-imp_iic_wrap_w",
|
||||||
|
.data = &imp_iic_wrap_w_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-imp_iic_wrap_ws",
|
||||||
|
.data = &imp_iic_wrap_ws_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_imp_iic_wrap_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-imp_iic_wrap",
|
||||||
|
.of_match_table = of_match_clk_mt8192_imp_iic_wrap,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_imp_iic_wrap_drv);
|
||||||
57
drivers/clk/mediatek/clk-mt8192-ipe.c
Normal file
57
drivers/clk/mediatek/clk-mt8192-ipe.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs ipe_cg_regs = {
|
||||||
|
.set_ofs = 0x4,
|
||||||
|
.clr_ofs = 0x8,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_IPE(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &ipe_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate ipe_clks[] = {
|
||||||
|
GATE_IPE(CLK_IPE_LARB19, "ipe_larb19", "ipe_sel", 0),
|
||||||
|
GATE_IPE(CLK_IPE_LARB20, "ipe_larb20", "ipe_sel", 1),
|
||||||
|
GATE_IPE(CLK_IPE_SMI_SUBCOM, "ipe_smi_subcom", "ipe_sel", 2),
|
||||||
|
GATE_IPE(CLK_IPE_FD, "ipe_fd", "ipe_sel", 3),
|
||||||
|
GATE_IPE(CLK_IPE_FE, "ipe_fe", "ipe_sel", 4),
|
||||||
|
GATE_IPE(CLK_IPE_RSC, "ipe_rsc", "ipe_sel", 5),
|
||||||
|
GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "ipe_sel", 6),
|
||||||
|
GATE_IPE(CLK_IPE_GALS, "ipe_gals", "ipe_sel", 8),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc ipe_desc = {
|
||||||
|
.clks = ipe_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(ipe_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_ipe[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-ipesys",
|
||||||
|
.data = &ipe_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_ipe_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-ipe",
|
||||||
|
.of_match_table = of_match_clk_mt8192_ipe,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_ipe_drv);
|
||||||
82
drivers/clk/mediatek/clk-mt8192-mdp.c
Normal file
82
drivers/clk/mediatek/clk-mt8192-mdp.c
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs mdp0_cg_regs = {
|
||||||
|
.set_ofs = 0x104,
|
||||||
|
.clr_ofs = 0x108,
|
||||||
|
.sta_ofs = 0x100,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs mdp1_cg_regs = {
|
||||||
|
.set_ofs = 0x124,
|
||||||
|
.clr_ofs = 0x128,
|
||||||
|
.sta_ofs = 0x120,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_MDP0(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &mdp0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
#define GATE_MDP1(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &mdp1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate mdp_clks[] = {
|
||||||
|
/* MDP0 */
|
||||||
|
GATE_MDP0(CLK_MDP_RDMA0, "mdp_mdp_rdma0", "mdp_sel", 0),
|
||||||
|
GATE_MDP0(CLK_MDP_TDSHP0, "mdp_mdp_tdshp0", "mdp_sel", 1),
|
||||||
|
GATE_MDP0(CLK_MDP_IMG_DL_ASYNC0, "mdp_img_dl_async0", "mdp_sel", 2),
|
||||||
|
GATE_MDP0(CLK_MDP_IMG_DL_ASYNC1, "mdp_img_dl_async1", "mdp_sel", 3),
|
||||||
|
GATE_MDP0(CLK_MDP_RDMA1, "mdp_mdp_rdma1", "mdp_sel", 4),
|
||||||
|
GATE_MDP0(CLK_MDP_TDSHP1, "mdp_mdp_tdshp1", "mdp_sel", 5),
|
||||||
|
GATE_MDP0(CLK_MDP_SMI0, "mdp_smi0", "mdp_sel", 6),
|
||||||
|
GATE_MDP0(CLK_MDP_APB_BUS, "mdp_apb_bus", "mdp_sel", 7),
|
||||||
|
GATE_MDP0(CLK_MDP_WROT0, "mdp_mdp_wrot0", "mdp_sel", 8),
|
||||||
|
GATE_MDP0(CLK_MDP_RSZ0, "mdp_mdp_rsz0", "mdp_sel", 9),
|
||||||
|
GATE_MDP0(CLK_MDP_HDR0, "mdp_mdp_hdr0", "mdp_sel", 10),
|
||||||
|
GATE_MDP0(CLK_MDP_MUTEX0, "mdp_mdp_mutex0", "mdp_sel", 11),
|
||||||
|
GATE_MDP0(CLK_MDP_WROT1, "mdp_mdp_wrot1", "mdp_sel", 12),
|
||||||
|
GATE_MDP0(CLK_MDP_RSZ1, "mdp_mdp_rsz1", "mdp_sel", 13),
|
||||||
|
GATE_MDP0(CLK_MDP_HDR1, "mdp_mdp_hdr1", "mdp_sel", 14),
|
||||||
|
GATE_MDP0(CLK_MDP_FAKE_ENG0, "mdp_mdp_fake_eng0", "mdp_sel", 15),
|
||||||
|
GATE_MDP0(CLK_MDP_AAL0, "mdp_mdp_aal0", "mdp_sel", 16),
|
||||||
|
GATE_MDP0(CLK_MDP_AAL1, "mdp_mdp_aal1", "mdp_sel", 17),
|
||||||
|
GATE_MDP0(CLK_MDP_COLOR0, "mdp_mdp_color0", "mdp_sel", 18),
|
||||||
|
GATE_MDP0(CLK_MDP_COLOR1, "mdp_mdp_color1", "mdp_sel", 19),
|
||||||
|
/* MDP1 */
|
||||||
|
GATE_MDP1(CLK_MDP_IMG_DL_RELAY0_ASYNC0, "mdp_img_dl_relay0_async0", "mdp_sel", 0),
|
||||||
|
GATE_MDP1(CLK_MDP_IMG_DL_RELAY1_ASYNC1, "mdp_img_dl_relay1_async1", "mdp_sel", 8),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc mdp_desc = {
|
||||||
|
.clks = mdp_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(mdp_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_mdp[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-mdpsys",
|
||||||
|
.data = &mdp_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_mdp_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-mdp",
|
||||||
|
.of_match_table = of_match_clk_mt8192_mdp,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_mdp_drv);
|
||||||
50
drivers/clk/mediatek/clk-mt8192-mfg.c
Normal file
50
drivers/clk/mediatek/clk-mt8192-mfg.c
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs mfg_cg_regs = {
|
||||||
|
.set_ofs = 0x4,
|
||||||
|
.clr_ofs = 0x8,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_MFG(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate mfg_clks[] = {
|
||||||
|
GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_pll_sel", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc mfg_desc = {
|
||||||
|
.clks = mfg_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(mfg_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_mfg[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-mfgcfg",
|
||||||
|
.data = &mfg_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_mfg_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-mfg",
|
||||||
|
.of_match_table = of_match_clk_mt8192_mfg,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_mfg_drv);
|
||||||
108
drivers/clk/mediatek/clk-mt8192-mm.c
Normal file
108
drivers/clk/mediatek/clk-mt8192-mm.c
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs mm0_cg_regs = {
|
||||||
|
.set_ofs = 0x104,
|
||||||
|
.clr_ofs = 0x108,
|
||||||
|
.sta_ofs = 0x100,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs mm1_cg_regs = {
|
||||||
|
.set_ofs = 0x114,
|
||||||
|
.clr_ofs = 0x118,
|
||||||
|
.sta_ofs = 0x110,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs mm2_cg_regs = {
|
||||||
|
.set_ofs = 0x1a4,
|
||||||
|
.clr_ofs = 0x1a8,
|
||||||
|
.sta_ofs = 0x1a0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_MM0(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &mm0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
#define GATE_MM1(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &mm1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
#define GATE_MM2(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &mm2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate mm_clks[] = {
|
||||||
|
/* MM0 */
|
||||||
|
GATE_MM0(CLK_MM_DISP_MUTEX0, "mm_disp_mutex0", "disp_sel", 0),
|
||||||
|
GATE_MM0(CLK_MM_DISP_CONFIG, "mm_disp_config", "disp_sel", 1),
|
||||||
|
GATE_MM0(CLK_MM_DISP_OVL0, "mm_disp_ovl0", "disp_sel", 2),
|
||||||
|
GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "disp_sel", 3),
|
||||||
|
GATE_MM0(CLK_MM_DISP_OVL0_2L, "mm_disp_ovl0_2l", "disp_sel", 4),
|
||||||
|
GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "disp_sel", 5),
|
||||||
|
GATE_MM0(CLK_MM_DISP_UFBC_WDMA0, "mm_disp_ufbc_wdma0", "disp_sel", 6),
|
||||||
|
GATE_MM0(CLK_MM_DISP_RSZ0, "mm_disp_rsz0", "disp_sel", 7),
|
||||||
|
GATE_MM0(CLK_MM_DISP_AAL0, "mm_disp_aal0", "disp_sel", 8),
|
||||||
|
GATE_MM0(CLK_MM_DISP_CCORR0, "mm_disp_ccorr0", "disp_sel", 9),
|
||||||
|
GATE_MM0(CLK_MM_DISP_DITHER0, "mm_disp_dither0", "disp_sel", 10),
|
||||||
|
GATE_MM0(CLK_MM_SMI_INFRA, "mm_smi_infra", "disp_sel", 11),
|
||||||
|
GATE_MM0(CLK_MM_DISP_GAMMA0, "mm_disp_gamma0", "disp_sel", 12),
|
||||||
|
GATE_MM0(CLK_MM_DISP_POSTMASK0, "mm_disp_postmask0", "disp_sel", 13),
|
||||||
|
GATE_MM0(CLK_MM_DISP_DSC_WRAP0, "mm_disp_dsc_wrap0", "disp_sel", 14),
|
||||||
|
GATE_MM0(CLK_MM_DSI0, "mm_dsi0", "disp_sel", 15),
|
||||||
|
GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "disp_sel", 16),
|
||||||
|
GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "disp_sel", 17),
|
||||||
|
GATE_MM0(CLK_MM_DISP_FAKE_ENG0, "mm_disp_fake_eng0", "disp_sel", 18),
|
||||||
|
GATE_MM0(CLK_MM_DISP_FAKE_ENG1, "mm_disp_fake_eng1", "disp_sel", 19),
|
||||||
|
GATE_MM0(CLK_MM_MDP_TDSHP4, "mm_mdp_tdshp4", "disp_sel", 20),
|
||||||
|
GATE_MM0(CLK_MM_MDP_RSZ4, "mm_mdp_rsz4", "disp_sel", 21),
|
||||||
|
GATE_MM0(CLK_MM_MDP_AAL4, "mm_mdp_aal4", "disp_sel", 22),
|
||||||
|
GATE_MM0(CLK_MM_MDP_HDR4, "mm_mdp_hdr4", "disp_sel", 23),
|
||||||
|
GATE_MM0(CLK_MM_MDP_RDMA4, "mm_mdp_rdma4", "disp_sel", 24),
|
||||||
|
GATE_MM0(CLK_MM_MDP_COLOR4, "mm_mdp_color4", "disp_sel", 25),
|
||||||
|
GATE_MM0(CLK_MM_DISP_Y2R0, "mm_disp_y2r0", "disp_sel", 26),
|
||||||
|
GATE_MM0(CLK_MM_SMI_GALS, "mm_smi_gals", "disp_sel", 27),
|
||||||
|
GATE_MM0(CLK_MM_DISP_OVL2_2L, "mm_disp_ovl2_2l", "disp_sel", 28),
|
||||||
|
GATE_MM0(CLK_MM_DISP_RDMA4, "mm_disp_rdma4", "disp_sel", 29),
|
||||||
|
GATE_MM0(CLK_MM_DISP_DPI0, "mm_disp_dpi0", "disp_sel", 30),
|
||||||
|
/* MM1 */
|
||||||
|
GATE_MM1(CLK_MM_SMI_IOMMU, "mm_smi_iommu", "disp_sel", 0),
|
||||||
|
/* MM2 */
|
||||||
|
GATE_MM2(CLK_MM_DSI_DSI0, "mm_dsi_dsi0", "disp_sel", 0),
|
||||||
|
GATE_MM2(CLK_MM_DPI_DPI0, "mm_dpi_dpi0", "dpi_sel", 8),
|
||||||
|
GATE_MM2(CLK_MM_26MHZ, "mm_26mhz", "clk26m", 24),
|
||||||
|
GATE_MM2(CLK_MM_32KHZ, "mm_32khz", "clk32k", 25),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int clk_mt8192_mm_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
struct device_node *node = dev->parent->of_node;
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
|
||||||
|
if (!clk_data)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
r = mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_mm_drv = {
|
||||||
|
.probe = clk_mt8192_mm_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-mm",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_mm_drv);
|
||||||
85
drivers/clk/mediatek/clk-mt8192-msdc.c
Normal file
85
drivers/clk/mediatek/clk-mt8192-msdc.c
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs msdc_cg_regs = {
|
||||||
|
.set_ofs = 0xb4,
|
||||||
|
.clr_ofs = 0xb4,
|
||||||
|
.sta_ofs = 0xb4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs msdc_top_cg_regs = {
|
||||||
|
.set_ofs = 0x0,
|
||||||
|
.clr_ofs = 0x0,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_MSDC(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &msdc_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
|
||||||
|
|
||||||
|
#define GATE_MSDC_TOP(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &msdc_top_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
|
||||||
|
|
||||||
|
static const struct mtk_gate msdc_clks[] = {
|
||||||
|
GATE_MSDC(CLK_MSDC_AXI_WRAP, "msdc_axi_wrap", "axi_sel", 22),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate msdc_top_clks[] = {
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_AES_0P, "msdc_top_aes_0p", "aes_msdcfde_sel", 0),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_0P, "msdc_top_src_0p", "infra_msdc0_src", 1),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_1P, "msdc_top_src_1p", "infra_msdc1_src", 2),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_2P, "msdc_top_src_2p", "infra_msdc2_src", 3),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC0, "msdc_top_p_msdc0", "axi_sel", 4),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC1, "msdc_top_p_msdc1", "axi_sel", 5),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC2, "msdc_top_p_msdc2", "axi_sel", 6),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_P_CFG, "msdc_top_p_cfg", "axi_sel", 7),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_AXI, "msdc_top_axi", "axi_sel", 8),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_0P, "msdc_top_h_mst_0p", "infra_msdc0", 9),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_1P, "msdc_top_h_mst_1p", "infra_msdc1", 10),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_2P, "msdc_top_h_mst_2p", "infra_msdc2", 11),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_MEM_OFF_DLY_26M, "msdc_top_mem_off_dly_26m", "clk26m", 12),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_32K, "msdc_top_32k", "clk32k", 13),
|
||||||
|
GATE_MSDC_TOP(CLK_MSDC_TOP_AHB2AXI_BRG_AXI, "msdc_top_ahb2axi_brg_axi", "axi_sel", 14),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc msdc_desc = {
|
||||||
|
.clks = msdc_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(msdc_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc msdc_top_desc = {
|
||||||
|
.clks = msdc_top_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(msdc_top_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_msdc[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-msdc",
|
||||||
|
.data = &msdc_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-msdc_top",
|
||||||
|
.data = &msdc_top_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_msdc_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-msdc",
|
||||||
|
.of_match_table = of_match_clk_mt8192_msdc,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_msdc_drv);
|
||||||
50
drivers/clk/mediatek/clk-mt8192-scp_adsp.c
Normal file
50
drivers/clk/mediatek/clk-mt8192-scp_adsp.c
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs scp_adsp_cg_regs = {
|
||||||
|
.set_ofs = 0x180,
|
||||||
|
.clr_ofs = 0x180,
|
||||||
|
.sta_ofs = 0x180,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_SCP_ADSP(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &scp_adsp_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
|
||||||
|
|
||||||
|
static const struct mtk_gate scp_adsp_clks[] = {
|
||||||
|
GATE_SCP_ADSP(CLK_SCP_ADSP_AUDIODSP, "scp_adsp_audiodsp", "adsp_sel", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc scp_adsp_desc = {
|
||||||
|
.clks = scp_adsp_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(scp_adsp_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_scp_adsp[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-scp_adsp",
|
||||||
|
.data = &scp_adsp_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_scp_adsp_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-scp_adsp",
|
||||||
|
.of_match_table = of_match_clk_mt8192_scp_adsp,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_scp_adsp_drv);
|
||||||
94
drivers/clk/mediatek/clk-mt8192-vdec.c
Normal file
94
drivers/clk/mediatek/clk-mt8192-vdec.c
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs vdec0_cg_regs = {
|
||||||
|
.set_ofs = 0x0,
|
||||||
|
.clr_ofs = 0x4,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs vdec1_cg_regs = {
|
||||||
|
.set_ofs = 0x200,
|
||||||
|
.clr_ofs = 0x204,
|
||||||
|
.sta_ofs = 0x200,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs vdec2_cg_regs = {
|
||||||
|
.set_ofs = 0x8,
|
||||||
|
.clr_ofs = 0xc,
|
||||||
|
.sta_ofs = 0x8,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_VDEC0(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &vdec0_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
|
||||||
|
|
||||||
|
#define GATE_VDEC1(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &vdec1_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
|
||||||
|
|
||||||
|
#define GATE_VDEC2(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &vdec2_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
|
||||||
|
|
||||||
|
static const struct mtk_gate vdec_clks[] = {
|
||||||
|
/* VDEC0 */
|
||||||
|
GATE_VDEC0(CLK_VDEC_VDEC, "vdec_vdec", "vdec_sel", 0),
|
||||||
|
GATE_VDEC0(CLK_VDEC_ACTIVE, "vdec_active", "vdec_sel", 4),
|
||||||
|
/* VDEC1 */
|
||||||
|
GATE_VDEC1(CLK_VDEC_LAT, "vdec_lat", "vdec_sel", 0),
|
||||||
|
GATE_VDEC1(CLK_VDEC_LAT_ACTIVE, "vdec_lat_active", "vdec_sel", 4),
|
||||||
|
/* VDEC2 */
|
||||||
|
GATE_VDEC2(CLK_VDEC_LARB1, "vdec_larb1", "vdec_sel", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_gate vdec_soc_clks[] = {
|
||||||
|
/* VDEC_SOC0 */
|
||||||
|
GATE_VDEC0(CLK_VDEC_SOC_VDEC, "vdec_soc_vdec", "vdec_sel", 0),
|
||||||
|
GATE_VDEC0(CLK_VDEC_SOC_VDEC_ACTIVE, "vdec_soc_vdec_active", "vdec_sel", 4),
|
||||||
|
/* VDEC_SOC1 */
|
||||||
|
GATE_VDEC1(CLK_VDEC_SOC_LAT, "vdec_soc_lat", "vdec_sel", 0),
|
||||||
|
GATE_VDEC1(CLK_VDEC_SOC_LAT_ACTIVE, "vdec_soc_lat_active", "vdec_sel", 4),
|
||||||
|
/* VDEC_SOC2 */
|
||||||
|
GATE_VDEC2(CLK_VDEC_SOC_LARB1, "vdec_soc_larb1", "vdec_sel", 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc vdec_desc = {
|
||||||
|
.clks = vdec_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(vdec_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc vdec_soc_desc = {
|
||||||
|
.clks = vdec_soc_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(vdec_soc_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_vdec[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-vdecsys",
|
||||||
|
.data = &vdec_desc,
|
||||||
|
}, {
|
||||||
|
.compatible = "mediatek,mt8192-vdecsys_soc",
|
||||||
|
.data = &vdec_soc_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_vdec_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-vdec",
|
||||||
|
.of_match_table = of_match_clk_mt8192_vdec,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_vdec_drv);
|
||||||
53
drivers/clk/mediatek/clk-mt8192-venc.c
Normal file
53
drivers/clk/mediatek/clk-mt8192-venc.c
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
//
|
||||||
|
// Copyright (c) 2021 MediaTek Inc.
|
||||||
|
// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#include "clk-mtk.h"
|
||||||
|
#include "clk-gate.h"
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/mt8192-clk.h>
|
||||||
|
|
||||||
|
static const struct mtk_gate_regs venc_cg_regs = {
|
||||||
|
.set_ofs = 0x4,
|
||||||
|
.clr_ofs = 0x8,
|
||||||
|
.sta_ofs = 0x0,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GATE_VENC(_id, _name, _parent, _shift) \
|
||||||
|
GATE_MTK(_id, _name, _parent, &venc_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
|
||||||
|
|
||||||
|
static const struct mtk_gate venc_clks[] = {
|
||||||
|
GATE_VENC(CLK_VENC_SET0_LARB, "venc_set0_larb", "venc_sel", 0),
|
||||||
|
GATE_VENC(CLK_VENC_SET1_VENC, "venc_set1_venc", "venc_sel", 4),
|
||||||
|
GATE_VENC(CLK_VENC_SET2_JPGENC, "venc_set2_jpgenc", "venc_sel", 8),
|
||||||
|
GATE_VENC(CLK_VENC_SET5_GALS, "venc_set5_gals", "venc_sel", 28),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_clk_desc venc_desc = {
|
||||||
|
.clks = venc_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(venc_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id of_match_clk_mt8192_venc[] = {
|
||||||
|
{
|
||||||
|
.compatible = "mediatek,mt8192-vencsys",
|
||||||
|
.data = &venc_desc,
|
||||||
|
}, {
|
||||||
|
/* sentinel */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_driver clk_mt8192_venc_drv = {
|
||||||
|
.probe = mtk_clk_simple_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "clk-mt8192-venc",
|
||||||
|
.of_match_table = of_match_clk_mt8192_venc,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
builtin_platform_driver(clk_mt8192_venc_drv);
|
||||||
1326
drivers/clk/mediatek/clk-mt8192.c
Normal file
1326
drivers/clk/mediatek/clk-mt8192.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -13,6 +13,7 @@
|
|||||||
#include <linux/clkdev.h>
|
#include <linux/clkdev.h>
|
||||||
#include <linux/mfd/syscon.h>
|
#include <linux/mfd/syscon.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
|
||||||
#include "clk-mtk.h"
|
#include "clk-mtk.h"
|
||||||
#include "clk-gate.h"
|
#include "clk-gate.h"
|
||||||
@@ -106,7 +107,7 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
|
|||||||
if (!clk_data)
|
if (!clk_data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
regmap = syscon_node_to_regmap(node);
|
regmap = device_node_to_regmap(node);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
pr_err("Cannot find regmap for %pOF: %ld\n", node,
|
pr_err("Cannot find regmap for %pOF: %ld\n", node,
|
||||||
PTR_ERR(regmap));
|
PTR_ERR(regmap));
|
||||||
@@ -286,3 +287,25 @@ void mtk_clk_register_dividers(const struct mtk_clk_divider *mcds,
|
|||||||
clk_data->clks[mcd->id] = clk;
|
clk_data->clks[mcd->id] = clk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mtk_clk_simple_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
const struct mtk_clk_desc *mcd;
|
||||||
|
struct clk_onecell_data *clk_data;
|
||||||
|
struct device_node *node = pdev->dev.of_node;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
mcd = of_device_get_match_data(&pdev->dev);
|
||||||
|
if (!mcd)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
clk_data = mtk_alloc_clk_data(mcd->num_clks);
|
||||||
|
if (!clk_data)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
r = mtk_clk_register_gates(node, mcd->clks, mcd->num_clks, clk_data);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/clk-provider.h>
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
struct clk;
|
struct clk;
|
||||||
struct clk_onecell_data;
|
struct clk_onecell_data;
|
||||||
@@ -213,13 +214,13 @@ struct mtk_pll_div_table {
|
|||||||
struct mtk_pll_data {
|
struct mtk_pll_data {
|
||||||
int id;
|
int id;
|
||||||
const char *name;
|
const char *name;
|
||||||
uint32_t reg;
|
u32 reg;
|
||||||
uint32_t pwr_reg;
|
u32 pwr_reg;
|
||||||
uint32_t en_mask;
|
u32 en_mask;
|
||||||
uint32_t pd_reg;
|
u32 pd_reg;
|
||||||
uint32_t tuner_reg;
|
u32 tuner_reg;
|
||||||
uint32_t tuner_en_reg;
|
u32 tuner_en_reg;
|
||||||
uint8_t tuner_en_bit;
|
u8 tuner_en_bit;
|
||||||
int pd_shift;
|
int pd_shift;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
const struct clk_ops *ops;
|
const struct clk_ops *ops;
|
||||||
@@ -228,11 +229,13 @@ struct mtk_pll_data {
|
|||||||
unsigned long fmax;
|
unsigned long fmax;
|
||||||
int pcwbits;
|
int pcwbits;
|
||||||
int pcwibits;
|
int pcwibits;
|
||||||
uint32_t pcw_reg;
|
u32 pcw_reg;
|
||||||
int pcw_shift;
|
int pcw_shift;
|
||||||
uint32_t pcw_chg_reg;
|
u32 pcw_chg_reg;
|
||||||
const struct mtk_pll_div_table *div_table;
|
const struct mtk_pll_div_table *div_table;
|
||||||
const char *parent_name;
|
const char *parent_name;
|
||||||
|
u32 en_reg;
|
||||||
|
u8 pll_en_bit; /* Assume 0, indicates BIT(0) by default */
|
||||||
};
|
};
|
||||||
|
|
||||||
void mtk_clk_register_plls(struct device_node *node,
|
void mtk_clk_register_plls(struct device_node *node,
|
||||||
@@ -248,4 +251,11 @@ void mtk_register_reset_controller(struct device_node *np,
|
|||||||
void mtk_register_reset_controller_set_clr(struct device_node *np,
|
void mtk_register_reset_controller_set_clr(struct device_node *np,
|
||||||
unsigned int num_regs, int regofs);
|
unsigned int num_regs, int regofs);
|
||||||
|
|
||||||
|
struct mtk_clk_desc {
|
||||||
|
const struct mtk_gate *clks;
|
||||||
|
size_t num_clks;
|
||||||
|
};
|
||||||
|
|
||||||
|
int mtk_clk_simple_probe(struct platform_device *pdev);
|
||||||
|
|
||||||
#endif /* __DRV_CLK_MTK_H */
|
#endif /* __DRV_CLK_MTK_H */
|
||||||
|
|||||||
@@ -116,7 +116,12 @@ static int mtk_clk_mux_set_parent_setclr_lock(struct clk_hw *hw, u8 index)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct clk_ops mtk_mux_ops = {
|
const struct clk_ops mtk_mux_clr_set_upd_ops = {
|
||||||
|
.get_parent = mtk_clk_mux_get_parent,
|
||||||
|
.set_parent = mtk_clk_mux_set_parent_setclr_lock,
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct clk_ops mtk_mux_gate_clr_set_upd_ops = {
|
||||||
.enable = mtk_clk_mux_enable_setclr,
|
.enable = mtk_clk_mux_enable_setclr,
|
||||||
.disable = mtk_clk_mux_disable_setclr,
|
.disable = mtk_clk_mux_disable_setclr,
|
||||||
.is_enabled = mtk_clk_mux_is_enabled,
|
.is_enabled = mtk_clk_mux_is_enabled,
|
||||||
@@ -140,7 +145,7 @@ static struct clk *mtk_clk_register_mux(const struct mtk_mux *mux,
|
|||||||
init.flags = mux->flags | CLK_SET_RATE_PARENT;
|
init.flags = mux->flags | CLK_SET_RATE_PARENT;
|
||||||
init.parent_names = mux->parent_names;
|
init.parent_names = mux->parent_names;
|
||||||
init.num_parents = mux->num_parents;
|
init.num_parents = mux->num_parents;
|
||||||
init.ops = &mtk_mux_ops;
|
init.ops = mux->ops;
|
||||||
|
|
||||||
clk_mux->regmap = regmap;
|
clk_mux->regmap = regmap;
|
||||||
clk_mux->data = mux;
|
clk_mux->data = mux;
|
||||||
@@ -165,7 +170,7 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
|
|||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
regmap = syscon_node_to_regmap(node);
|
regmap = device_node_to_regmap(node);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
pr_err("Cannot find regmap for %pOF: %ld\n", node,
|
pr_err("Cannot find regmap for %pOF: %ld\n", node,
|
||||||
PTR_ERR(regmap));
|
PTR_ERR(regmap));
|
||||||
|
|||||||
@@ -33,12 +33,13 @@ struct mtk_mux {
|
|||||||
u8 gate_shift;
|
u8 gate_shift;
|
||||||
s8 upd_shift;
|
s8 upd_shift;
|
||||||
|
|
||||||
|
const struct clk_ops *ops;
|
||||||
signed char num_parents;
|
signed char num_parents;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
#define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
||||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||||
_gate, _upd_ofs, _upd, _flags) { \
|
_gate, _upd_ofs, _upd, _flags, _ops) { \
|
||||||
.id = _id, \
|
.id = _id, \
|
||||||
.name = _name, \
|
.name = _name, \
|
||||||
.mux_ofs = _mux_ofs, \
|
.mux_ofs = _mux_ofs, \
|
||||||
@@ -52,14 +53,19 @@ struct mtk_mux {
|
|||||||
.parent_names = _parents, \
|
.parent_names = _parents, \
|
||||||
.num_parents = ARRAY_SIZE(_parents), \
|
.num_parents = ARRAY_SIZE(_parents), \
|
||||||
.flags = _flags, \
|
.flags = _flags, \
|
||||||
|
.ops = &_ops, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern const struct clk_ops mtk_mux_clr_set_upd_ops;
|
||||||
|
extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
|
||||||
|
|
||||||
#define MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
#define MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
||||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||||
_gate, _upd_ofs, _upd, _flags) \
|
_gate, _upd_ofs, _upd, _flags) \
|
||||||
GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
||||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||||
_gate, _upd_ofs, _upd, _flags) \
|
_gate, _upd_ofs, _upd, _flags, \
|
||||||
|
mtk_mux_gate_clr_set_upd_ops)
|
||||||
|
|
||||||
#define MUX_GATE_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \
|
#define MUX_GATE_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \
|
||||||
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||||
@@ -69,6 +75,14 @@ struct mtk_mux {
|
|||||||
_width, _gate, _upd_ofs, _upd, \
|
_width, _gate, _upd_ofs, _upd, \
|
||||||
CLK_SET_RATE_PARENT)
|
CLK_SET_RATE_PARENT)
|
||||||
|
|
||||||
|
#define MUX_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \
|
||||||
|
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||||
|
_upd_ofs, _upd) \
|
||||||
|
GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \
|
||||||
|
_mux_set_ofs, _mux_clr_ofs, _shift, _width, \
|
||||||
|
0, _upd_ofs, _upd, CLK_SET_RATE_PARENT, \
|
||||||
|
mtk_mux_clr_set_upd_ops)
|
||||||
|
|
||||||
int mtk_clk_register_muxes(const struct mtk_mux *muxes,
|
int mtk_clk_register_muxes(const struct mtk_mux *muxes,
|
||||||
int num, struct device_node *node,
|
int num, struct device_node *node,
|
||||||
spinlock_t *lock,
|
spinlock_t *lock,
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ struct mtk_clk_pll {
|
|||||||
void __iomem *tuner_en_addr;
|
void __iomem *tuner_en_addr;
|
||||||
void __iomem *pcw_addr;
|
void __iomem *pcw_addr;
|
||||||
void __iomem *pcw_chg_addr;
|
void __iomem *pcw_chg_addr;
|
||||||
|
void __iomem *en_addr;
|
||||||
const struct mtk_pll_data *data;
|
const struct mtk_pll_data *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -56,7 +57,7 @@ static int mtk_pll_is_prepared(struct clk_hw *hw)
|
|||||||
{
|
{
|
||||||
struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
|
struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
|
||||||
|
|
||||||
return (readl(pll->base_addr + REG_CON0) & CON0_BASE_EN) != 0;
|
return (readl(pll->en_addr) & BIT(pll->data->pll_en_bit)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long __mtk_pll_recalc_rate(struct mtk_clk_pll *pll, u32 fin,
|
static unsigned long __mtk_pll_recalc_rate(struct mtk_clk_pll *pll, u32 fin,
|
||||||
@@ -238,6 +239,7 @@ static int mtk_pll_prepare(struct clk_hw *hw)
|
|||||||
{
|
{
|
||||||
struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
|
struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
|
||||||
u32 r;
|
u32 r;
|
||||||
|
u32 div_en_mask;
|
||||||
|
|
||||||
r = readl(pll->pwr_addr) | CON0_PWR_ON;
|
r = readl(pll->pwr_addr) | CON0_PWR_ON;
|
||||||
writel(r, pll->pwr_addr);
|
writel(r, pll->pwr_addr);
|
||||||
@@ -247,9 +249,14 @@ static int mtk_pll_prepare(struct clk_hw *hw)
|
|||||||
writel(r, pll->pwr_addr);
|
writel(r, pll->pwr_addr);
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
|
||||||
r = readl(pll->base_addr + REG_CON0);
|
r = readl(pll->en_addr) | BIT(pll->data->pll_en_bit);
|
||||||
r |= pll->data->en_mask;
|
writel(r, pll->en_addr);
|
||||||
|
|
||||||
|
div_en_mask = pll->data->en_mask & ~CON0_BASE_EN;
|
||||||
|
if (div_en_mask) {
|
||||||
|
r = readl(pll->base_addr + REG_CON0) | div_en_mask;
|
||||||
writel(r, pll->base_addr + REG_CON0);
|
writel(r, pll->base_addr + REG_CON0);
|
||||||
|
}
|
||||||
|
|
||||||
__mtk_pll_tuner_enable(pll);
|
__mtk_pll_tuner_enable(pll);
|
||||||
|
|
||||||
@@ -268,6 +275,7 @@ static void mtk_pll_unprepare(struct clk_hw *hw)
|
|||||||
{
|
{
|
||||||
struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
|
struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
|
||||||
u32 r;
|
u32 r;
|
||||||
|
u32 div_en_mask;
|
||||||
|
|
||||||
if (pll->data->flags & HAVE_RST_BAR) {
|
if (pll->data->flags & HAVE_RST_BAR) {
|
||||||
r = readl(pll->base_addr + REG_CON0);
|
r = readl(pll->base_addr + REG_CON0);
|
||||||
@@ -277,9 +285,14 @@ static void mtk_pll_unprepare(struct clk_hw *hw)
|
|||||||
|
|
||||||
__mtk_pll_tuner_disable(pll);
|
__mtk_pll_tuner_disable(pll);
|
||||||
|
|
||||||
r = readl(pll->base_addr + REG_CON0);
|
div_en_mask = pll->data->en_mask & ~CON0_BASE_EN;
|
||||||
r &= ~CON0_BASE_EN;
|
if (div_en_mask) {
|
||||||
|
r = readl(pll->base_addr + REG_CON0) & ~div_en_mask;
|
||||||
writel(r, pll->base_addr + REG_CON0);
|
writel(r, pll->base_addr + REG_CON0);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = readl(pll->en_addr) & ~BIT(pll->data->pll_en_bit);
|
||||||
|
writel(r, pll->en_addr);
|
||||||
|
|
||||||
r = readl(pll->pwr_addr) | CON0_ISO_EN;
|
r = readl(pll->pwr_addr) | CON0_ISO_EN;
|
||||||
writel(r, pll->pwr_addr);
|
writel(r, pll->pwr_addr);
|
||||||
@@ -321,6 +334,10 @@ static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data,
|
|||||||
pll->tuner_addr = base + data->tuner_reg;
|
pll->tuner_addr = base + data->tuner_reg;
|
||||||
if (data->tuner_en_reg)
|
if (data->tuner_en_reg)
|
||||||
pll->tuner_en_addr = base + data->tuner_en_reg;
|
pll->tuner_en_addr = base + data->tuner_en_reg;
|
||||||
|
if (data->en_reg)
|
||||||
|
pll->en_addr = base + data->en_reg;
|
||||||
|
else
|
||||||
|
pll->en_addr = pll->base_addr + REG_CON0;
|
||||||
pll->hw.init = &init;
|
pll->hw.init = &init;
|
||||||
pll->data = data;
|
pll->data = data;
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ static void mtk_register_reset_controller_common(struct device_node *np,
|
|||||||
int ret;
|
int ret;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
|
||||||
regmap = syscon_node_to_regmap(np);
|
regmap = device_node_to_regmap(np);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
pr_err("Cannot find regmap for %pOF: %ld\n", np,
|
pr_err("Cannot find regmap for %pOF: %ld\n", np,
|
||||||
PTR_ERR(regmap));
|
PTR_ERR(regmap));
|
||||||
|
|||||||
@@ -265,6 +265,7 @@ static const char *powersave_parents[] = {
|
|||||||
static const struct clk_muxing_soc_desc kirkwood_mux_desc[] __initconst = {
|
static const struct clk_muxing_soc_desc kirkwood_mux_desc[] __initconst = {
|
||||||
{ "powersave", powersave_parents, ARRAY_SIZE(powersave_parents),
|
{ "powersave", powersave_parents, ARRAY_SIZE(powersave_parents),
|
||||||
11, 1, 0 },
|
11, 1, 0 },
|
||||||
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk *clk_muxing_get_src(
|
static struct clk *clk_muxing_get_src(
|
||||||
|
|||||||
@@ -240,6 +240,14 @@ config MSM_MMCC_8960
|
|||||||
Say Y if you want to support multimedia devices such as display,
|
Say Y if you want to support multimedia devices such as display,
|
||||||
graphics, video encode/decode, camera, etc.
|
graphics, video encode/decode, camera, etc.
|
||||||
|
|
||||||
|
config MSM_GCC_8953
|
||||||
|
tristate "MSM8953 Global Clock Controller"
|
||||||
|
select QCOM_GDSC
|
||||||
|
help
|
||||||
|
Support for the global clock controller on msm8953 devices.
|
||||||
|
Say Y if you want to use devices such as UART, SPI i2c, USB,
|
||||||
|
SD/eMMC, display, graphics, camera etc.
|
||||||
|
|
||||||
config MSM_GCC_8974
|
config MSM_GCC_8974
|
||||||
tristate "MSM8974 Global Clock Controller"
|
tristate "MSM8974 Global Clock Controller"
|
||||||
select QCOM_GDSC
|
select QCOM_GDSC
|
||||||
@@ -257,6 +265,15 @@ config MSM_MMCC_8974
|
|||||||
Say Y if you want to support multimedia devices such as display,
|
Say Y if you want to support multimedia devices such as display,
|
||||||
graphics, video encode/decode, camera, etc.
|
graphics, video encode/decode, camera, etc.
|
||||||
|
|
||||||
|
config MSM_MMCC_8994
|
||||||
|
tristate "MSM8994 Multimedia Clock Controller"
|
||||||
|
select MSM_GCC_8994
|
||||||
|
select QCOM_GDSC
|
||||||
|
help
|
||||||
|
Support for the multimedia clock controller on msm8994 devices.
|
||||||
|
Say Y if you want to support multimedia devices such as display,
|
||||||
|
graphics, video encode/decode, camera, etc.
|
||||||
|
|
||||||
config MSM_GCC_8994
|
config MSM_GCC_8994
|
||||||
tristate "MSM8994 Global Clock Controller"
|
tristate "MSM8994 Global Clock Controller"
|
||||||
help
|
help
|
||||||
@@ -332,6 +349,15 @@ config SC_DISPCC_7180
|
|||||||
Say Y if you want to support display devices and functionality such as
|
Say Y if you want to support display devices and functionality such as
|
||||||
splash screen.
|
splash screen.
|
||||||
|
|
||||||
|
config SC_DISPCC_7280
|
||||||
|
tristate "SC7280 Display Clock Controller"
|
||||||
|
select SC_GCC_7280
|
||||||
|
help
|
||||||
|
Support for the display clock controller on Qualcomm Technologies, Inc.
|
||||||
|
SC7280 devices.
|
||||||
|
Say Y if you want to support display devices and functionality such as
|
||||||
|
splash screen.
|
||||||
|
|
||||||
config SC_GCC_7180
|
config SC_GCC_7180
|
||||||
tristate "SC7180 Global Clock Controller"
|
tristate "SC7180 Global Clock Controller"
|
||||||
select QCOM_GDSC
|
select QCOM_GDSC
|
||||||
@@ -376,6 +402,14 @@ config SC_GPUCC_7180
|
|||||||
Say Y if you want to support graphics controller devices and
|
Say Y if you want to support graphics controller devices and
|
||||||
functionality such as 3D graphics.
|
functionality such as 3D graphics.
|
||||||
|
|
||||||
|
config SC_GPUCC_7280
|
||||||
|
tristate "SC7280 Graphics Clock Controller"
|
||||||
|
select SC_GCC_7280
|
||||||
|
help
|
||||||
|
Support for the graphics clock controller on SC7280 devices.
|
||||||
|
Say Y if you want to support graphics controller devices and
|
||||||
|
functionality such as 3D graphics.
|
||||||
|
|
||||||
config SC_MSS_7180
|
config SC_MSS_7180
|
||||||
tristate "SC7180 Modem Clock Controller"
|
tristate "SC7180 Modem Clock Controller"
|
||||||
select SC_GCC_7180
|
select SC_GCC_7180
|
||||||
@@ -393,6 +427,14 @@ config SC_VIDEOCC_7180
|
|||||||
Say Y if you want to support video devices and functionality such as
|
Say Y if you want to support video devices and functionality such as
|
||||||
video encode and decode.
|
video encode and decode.
|
||||||
|
|
||||||
|
config SC_VIDEOCC_7280
|
||||||
|
tristate "SC7280 Video Clock Controller"
|
||||||
|
select SC_GCC_7280
|
||||||
|
help
|
||||||
|
Support for the video clock controller on SC7280 devices.
|
||||||
|
Say Y if you want to support video devices and functionality such as
|
||||||
|
video encode and decode.
|
||||||
|
|
||||||
config SDM_CAMCC_845
|
config SDM_CAMCC_845
|
||||||
tristate "SDM845 Camera Clock Controller"
|
tristate "SDM845 Camera Clock Controller"
|
||||||
select SDM_GCC_845
|
select SDM_GCC_845
|
||||||
@@ -506,6 +548,13 @@ config SM_DISPCC_8250
|
|||||||
Say Y if you want to support display devices and functionality such as
|
Say Y if you want to support display devices and functionality such as
|
||||||
splash screen.
|
splash screen.
|
||||||
|
|
||||||
|
config SM_GCC_6115
|
||||||
|
tristate "SM6115 and SM4250 Global Clock Controller"
|
||||||
|
help
|
||||||
|
Support for the global clock controller on SM6115 and SM4250 devices.
|
||||||
|
Say Y if you want to use peripheral devices such as UART, SPI,
|
||||||
|
i2C, USB, UFS, SDDC, PCIe, etc.
|
||||||
|
|
||||||
config SM_GCC_6125
|
config SM_GCC_6125
|
||||||
tristate "SM6125 Global Clock Controller"
|
tristate "SM6125 Global Clock Controller"
|
||||||
help
|
help
|
||||||
@@ -513,6 +562,13 @@ config SM_GCC_6125
|
|||||||
Say Y if you want to use peripheral devices such as UART,
|
Say Y if you want to use peripheral devices such as UART,
|
||||||
SPI, I2C, USB, SD/UFS, PCIe etc.
|
SPI, I2C, USB, SD/UFS, PCIe etc.
|
||||||
|
|
||||||
|
config SM_GCC_6350
|
||||||
|
tristate "SM6350 Global Clock Controller"
|
||||||
|
help
|
||||||
|
Support for the global clock controller on SM6350 devices.
|
||||||
|
Say Y if you want to use peripheral devices such as UART,
|
||||||
|
SPI, I2C, USB, SD/UFS, PCIe etc.
|
||||||
|
|
||||||
config SM_GCC_8150
|
config SM_GCC_8150
|
||||||
tristate "SM8150 Global Clock Controller"
|
tristate "SM8150 Global Clock Controller"
|
||||||
help
|
help
|
||||||
@@ -554,7 +610,7 @@ config SM_GPUCC_8250
|
|||||||
|
|
||||||
config SM_VIDEOCC_8150
|
config SM_VIDEOCC_8150
|
||||||
tristate "SM8150 Video Clock Controller"
|
tristate "SM8150 Video Clock Controller"
|
||||||
select SDM_GCC_8150
|
select SM_GCC_8150
|
||||||
select QCOM_GDSC
|
select QCOM_GDSC
|
||||||
help
|
help
|
||||||
Support for the video clock controller on SM8150 devices.
|
Support for the video clock controller on SM8150 devices.
|
||||||
@@ -563,7 +619,7 @@ config SM_VIDEOCC_8150
|
|||||||
|
|
||||||
config SM_VIDEOCC_8250
|
config SM_VIDEOCC_8250
|
||||||
tristate "SM8250 Video Clock Controller"
|
tristate "SM8250 Video Clock Controller"
|
||||||
select SDM_GCC_8250
|
select SM_GCC_8250
|
||||||
select QCOM_GDSC
|
select QCOM_GDSC
|
||||||
help
|
help
|
||||||
Support for the video clock controller on SM8250 devices.
|
Support for the video clock controller on SM8250 devices.
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ obj-$(CONFIG_MDM_LCC_9615) += lcc-mdm9615.o
|
|||||||
obj-$(CONFIG_MSM_GCC_8660) += gcc-msm8660.o
|
obj-$(CONFIG_MSM_GCC_8660) += gcc-msm8660.o
|
||||||
obj-$(CONFIG_MSM_GCC_8916) += gcc-msm8916.o
|
obj-$(CONFIG_MSM_GCC_8916) += gcc-msm8916.o
|
||||||
obj-$(CONFIG_MSM_GCC_8939) += gcc-msm8939.o
|
obj-$(CONFIG_MSM_GCC_8939) += gcc-msm8939.o
|
||||||
|
obj-$(CONFIG_MSM_GCC_8953) += gcc-msm8953.o
|
||||||
obj-$(CONFIG_MSM_GCC_8960) += gcc-msm8960.o
|
obj-$(CONFIG_MSM_GCC_8960) += gcc-msm8960.o
|
||||||
obj-$(CONFIG_MSM_GCC_8974) += gcc-msm8974.o
|
obj-$(CONFIG_MSM_GCC_8974) += gcc-msm8974.o
|
||||||
obj-$(CONFIG_MSM_GCC_8994) += gcc-msm8994.o
|
obj-$(CONFIG_MSM_GCC_8994) += gcc-msm8994.o
|
||||||
@@ -42,6 +43,7 @@ obj-$(CONFIG_MSM_GCC_8998) += gcc-msm8998.o
|
|||||||
obj-$(CONFIG_MSM_GPUCC_8998) += gpucc-msm8998.o
|
obj-$(CONFIG_MSM_GPUCC_8998) += gpucc-msm8998.o
|
||||||
obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o
|
obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o
|
||||||
obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o
|
obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o
|
||||||
|
obj-$(CONFIG_MSM_MMCC_8994) += mmcc-msm8994.o
|
||||||
obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o
|
obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o
|
||||||
obj-$(CONFIG_MSM_MMCC_8998) += mmcc-msm8998.o
|
obj-$(CONFIG_MSM_MMCC_8998) += mmcc-msm8998.o
|
||||||
obj-$(CONFIG_QCOM_A53PLL) += a53-pll.o
|
obj-$(CONFIG_QCOM_A53PLL) += a53-pll.o
|
||||||
@@ -57,13 +59,16 @@ obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o
|
|||||||
obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
|
obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
|
||||||
obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o
|
obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o
|
||||||
obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
|
obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
|
||||||
|
obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o
|
||||||
obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o
|
obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o
|
||||||
obj-$(CONFIG_SC_GCC_7280) += gcc-sc7280.o
|
obj-$(CONFIG_SC_GCC_7280) += gcc-sc7280.o
|
||||||
obj-$(CONFIG_SC_GCC_8180X) += gcc-sc8180x.o
|
obj-$(CONFIG_SC_GCC_8180X) += gcc-sc8180x.o
|
||||||
obj-$(CONFIG_SC_GPUCC_7180) += gpucc-sc7180.o
|
obj-$(CONFIG_SC_GPUCC_7180) += gpucc-sc7180.o
|
||||||
|
obj-$(CONFIG_SC_GPUCC_7280) += gpucc-sc7280.o
|
||||||
obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
|
obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
|
||||||
obj-$(CONFIG_SC_MSS_7180) += mss-sc7180.o
|
obj-$(CONFIG_SC_MSS_7180) += mss-sc7180.o
|
||||||
obj-$(CONFIG_SC_VIDEOCC_7180) += videocc-sc7180.o
|
obj-$(CONFIG_SC_VIDEOCC_7180) += videocc-sc7180.o
|
||||||
|
obj-$(CONFIG_SC_VIDEOCC_7280) += videocc-sc7280.o
|
||||||
obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o
|
obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o
|
||||||
obj-$(CONFIG_SDM_DISPCC_845) += dispcc-sdm845.o
|
obj-$(CONFIG_SDM_DISPCC_845) += dispcc-sdm845.o
|
||||||
obj-$(CONFIG_SDM_GCC_660) += gcc-sdm660.o
|
obj-$(CONFIG_SDM_GCC_660) += gcc-sdm660.o
|
||||||
@@ -76,7 +81,9 @@ obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o
|
|||||||
obj-$(CONFIG_SDX_GCC_55) += gcc-sdx55.o
|
obj-$(CONFIG_SDX_GCC_55) += gcc-sdx55.o
|
||||||
obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o
|
obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o
|
||||||
obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
|
obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
|
||||||
|
obj-$(CONFIG_SM_GCC_6115) += gcc-sm6115.o
|
||||||
obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o
|
obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o
|
||||||
|
obj-$(CONFIG_SM_GCC_6350) += gcc-sm6350.o
|
||||||
obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o
|
obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o
|
||||||
obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o
|
obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o
|
||||||
obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o
|
obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o
|
||||||
|
|||||||
@@ -6,9 +6,11 @@
|
|||||||
* Author: Georgi Djakov <georgi.djakov@linaro.org>
|
* Author: Georgi Djakov <georgi.djakov@linaro.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk.h>
|
||||||
#include <linux/clk-provider.h>
|
#include <linux/clk-provider.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/pm_opp.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
||||||
@@ -34,9 +36,59 @@ static const struct regmap_config a53pll_regmap_config = {
|
|||||||
.fast_io = true,
|
.fast_io = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct pll_freq_tbl *qcom_a53pll_get_freq_tbl(struct device *dev)
|
||||||
|
{
|
||||||
|
struct pll_freq_tbl *freq_tbl;
|
||||||
|
unsigned long xo_freq;
|
||||||
|
unsigned long freq;
|
||||||
|
struct clk *xo_clk;
|
||||||
|
int count;
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
xo_clk = devm_clk_get(dev, "xo");
|
||||||
|
if (IS_ERR(xo_clk))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
xo_freq = clk_get_rate(xo_clk);
|
||||||
|
|
||||||
|
ret = devm_pm_opp_of_add_table(dev);
|
||||||
|
if (ret)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
count = dev_pm_opp_get_opp_count(dev);
|
||||||
|
if (count <= 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
freq_tbl = devm_kcalloc(dev, count + 1, sizeof(*freq_tbl), GFP_KERNEL);
|
||||||
|
if (!freq_tbl)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (i = 0, freq = 0; i < count; i++, freq++) {
|
||||||
|
struct dev_pm_opp *opp;
|
||||||
|
|
||||||
|
opp = dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||||
|
if (IS_ERR(opp))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Skip the freq that is not divisible */
|
||||||
|
if (freq % xo_freq)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
freq_tbl[i].freq = freq;
|
||||||
|
freq_tbl[i].l = freq / xo_freq;
|
||||||
|
freq_tbl[i].n = 1;
|
||||||
|
|
||||||
|
dev_pm_opp_put(opp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return freq_tbl;
|
||||||
|
}
|
||||||
|
|
||||||
static int qcom_a53pll_probe(struct platform_device *pdev)
|
static int qcom_a53pll_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
|
struct device_node *np = dev->of_node;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
struct clk_pll *pll;
|
struct clk_pll *pll;
|
||||||
@@ -64,13 +116,22 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
|
|||||||
pll->mode_reg = 0x00;
|
pll->mode_reg = 0x00;
|
||||||
pll->status_reg = 0x1c;
|
pll->status_reg = 0x1c;
|
||||||
pll->status_bit = 16;
|
pll->status_bit = 16;
|
||||||
pll->freq_tbl = a53pll_freq;
|
|
||||||
|
|
||||||
init.name = "a53pll";
|
pll->freq_tbl = qcom_a53pll_get_freq_tbl(dev);
|
||||||
|
if (!pll->freq_tbl) {
|
||||||
|
/* Fall on a53pll_freq if no freq_tbl is found from OPP */
|
||||||
|
pll->freq_tbl = a53pll_freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use an unique name by appending @unit-address */
|
||||||
|
init.name = devm_kasprintf(dev, GFP_KERNEL, "a53pll%s",
|
||||||
|
strchrnul(np->full_name, '@'));
|
||||||
|
if (!init.name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
init.parent_names = (const char *[]){ "xo" };
|
init.parent_names = (const char *[]){ "xo" };
|
||||||
init.num_parents = 1;
|
init.num_parents = 1;
|
||||||
init.ops = &clk_pll_sr2_ops;
|
init.ops = &clk_pll_sr2_ops;
|
||||||
init.flags = CLK_IS_CRITICAL;
|
|
||||||
pll->clkr.hw.init = &init;
|
pll->clkr.hw.init = &init;
|
||||||
|
|
||||||
ret = devm_clk_register_regmap(dev, &pll->clkr);
|
ret = devm_clk_register_regmap(dev, &pll->clkr);
|
||||||
@@ -91,6 +152,7 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
static const struct of_device_id qcom_a53pll_match_table[] = {
|
static const struct of_device_id qcom_a53pll_match_table[] = {
|
||||||
{ .compatible = "qcom,msm8916-a53pll" },
|
{ .compatible = "qcom,msm8916-a53pll" },
|
||||||
|
{ .compatible = "qcom,msm8939-a53pll" },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, qcom_a53pll_match_table);
|
MODULE_DEVICE_TABLE(of, qcom_a53pll_match_table);
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ static int qcom_apcs_msm8916_clk_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct device *parent = dev->parent;
|
struct device *parent = dev->parent;
|
||||||
|
struct device_node *np = parent->of_node;
|
||||||
struct clk_regmap_mux_div *a53cc;
|
struct clk_regmap_mux_div *a53cc;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
struct clk_init_data init = { };
|
struct clk_init_data init = { };
|
||||||
@@ -61,11 +62,16 @@ static int qcom_apcs_msm8916_clk_probe(struct platform_device *pdev)
|
|||||||
if (!a53cc)
|
if (!a53cc)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
init.name = "a53mux";
|
/* Use an unique name by appending parent's @unit-address */
|
||||||
|
init.name = devm_kasprintf(dev, GFP_KERNEL, "a53mux%s",
|
||||||
|
strchrnul(np->full_name, '@'));
|
||||||
|
if (!init.name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
init.parent_data = pdata;
|
init.parent_data = pdata;
|
||||||
init.num_parents = ARRAY_SIZE(pdata);
|
init.num_parents = ARRAY_SIZE(pdata);
|
||||||
init.ops = &clk_regmap_mux_div_ops;
|
init.ops = &clk_regmap_mux_div_ops;
|
||||||
init.flags = CLK_SET_RATE_PARENT;
|
init.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT;
|
||||||
|
|
||||||
a53cc->clkr.hw.init = &init;
|
a53cc->clkr.hw.init = &init;
|
||||||
a53cc->clkr.regmap = regmap;
|
a53cc->clkr.regmap = regmap;
|
||||||
|
|||||||
@@ -1652,32 +1652,35 @@ static int cam_cc_sc7180_probe(struct platform_device *pdev)
|
|||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||||
ret = pm_clk_create(&pdev->dev);
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = devm_pm_clk_create(&pdev->dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = pm_clk_add(&pdev->dev, "xo");
|
ret = pm_clk_add(&pdev->dev, "xo");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to acquire XO clock\n");
|
dev_err(&pdev->dev, "Failed to acquire XO clock\n");
|
||||||
goto disable_pm_runtime;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pm_clk_add(&pdev->dev, "iface");
|
ret = pm_clk_add(&pdev->dev, "iface");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to acquire iface clock\n");
|
dev_err(&pdev->dev, "Failed to acquire iface clock\n");
|
||||||
goto disable_pm_runtime;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pm_runtime_get(&pdev->dev);
|
ret = pm_runtime_get(&pdev->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
|
|
||||||
regmap = qcom_cc_map(pdev, &cam_cc_sc7180_desc);
|
regmap = qcom_cc_map(pdev, &cam_cc_sc7180_desc);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
ret = PTR_ERR(regmap);
|
ret = PTR_ERR(regmap);
|
||||||
pm_runtime_put(&pdev->dev);
|
pm_runtime_put(&pdev->dev);
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk_fabia_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
clk_fabia_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
||||||
@@ -1689,18 +1692,10 @@ static int cam_cc_sc7180_probe(struct platform_device *pdev)
|
|||||||
pm_runtime_put(&pdev->dev);
|
pm_runtime_put(&pdev->dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to register CAM CC clocks\n");
|
dev_err(&pdev->dev, "Failed to register CAM CC clocks\n");
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
destroy_pm_clk:
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
|
|
||||||
disable_pm_runtime:
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct dev_pm_ops cam_cc_pm_ops = {
|
static const struct dev_pm_ops cam_cc_pm_ops = {
|
||||||
|
|||||||
@@ -536,6 +536,26 @@ static const struct clk_rpmh_desc clk_rpmh_sc7280 = {
|
|||||||
.num_clks = ARRAY_SIZE(sc7280_rpmh_clocks),
|
.num_clks = ARRAY_SIZE(sc7280_rpmh_clocks),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DEFINE_CLK_RPMH_VRM(sm6350, ln_bb_clk2, ln_bb_clk2_ao, "lnbclkg2", 4);
|
||||||
|
DEFINE_CLK_RPMH_VRM(sm6350, ln_bb_clk3, ln_bb_clk3_ao, "lnbclkg3", 4);
|
||||||
|
DEFINE_CLK_RPMH_ARC(sm6350, qlink, qlink_ao, "qphy.lvl", 0x1, 4);
|
||||||
|
|
||||||
|
static struct clk_hw *sm6350_rpmh_clocks[] = {
|
||||||
|
[RPMH_CXO_CLK] = &sc7280_bi_tcxo.hw,
|
||||||
|
[RPMH_CXO_CLK_A] = &sc7280_bi_tcxo_ao.hw,
|
||||||
|
[RPMH_LN_BB_CLK2] = &sm6350_ln_bb_clk2.hw,
|
||||||
|
[RPMH_LN_BB_CLK2_A] = &sm6350_ln_bb_clk2_ao.hw,
|
||||||
|
[RPMH_LN_BB_CLK3] = &sm6350_ln_bb_clk3.hw,
|
||||||
|
[RPMH_LN_BB_CLK3_A] = &sm6350_ln_bb_clk3_ao.hw,
|
||||||
|
[RPMH_QLINK_CLK] = &sm6350_qlink.hw,
|
||||||
|
[RPMH_QLINK_CLK_A] = &sm6350_qlink_ao.hw,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_rpmh_desc clk_rpmh_sm6350 = {
|
||||||
|
.clks = sm6350_rpmh_clocks,
|
||||||
|
.num_clks = ARRAY_SIZE(sm6350_rpmh_clocks),
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec,
|
static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
@@ -623,6 +643,7 @@ static const struct of_device_id clk_rpmh_match_table[] = {
|
|||||||
{ .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x},
|
{ .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x},
|
||||||
{ .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845},
|
{ .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845},
|
||||||
{ .compatible = "qcom,sdx55-rpmh-clk", .data = &clk_rpmh_sdx55},
|
{ .compatible = "qcom,sdx55-rpmh-clk", .data = &clk_rpmh_sdx55},
|
||||||
|
{ .compatible = "qcom,sm6350-rpmh-clk", .data = &clk_rpmh_sm6350},
|
||||||
{ .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150},
|
{ .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150},
|
||||||
{ .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250},
|
{ .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250},
|
||||||
{ .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350},
|
{ .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350},
|
||||||
|
|||||||
@@ -913,10 +913,166 @@ static const struct rpm_smd_clk_desc rpm_clk_sdm660 = {
|
|||||||
.num_clks = ARRAY_SIZE(sdm660_clks),
|
.num_clks = ARRAY_SIZE(sdm660_clks),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk_smd_rpm *mdm9607_clks[] = {
|
||||||
|
[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo,
|
||||||
|
[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a,
|
||||||
|
[RPM_SMD_PCNOC_CLK] = &msm8916_pcnoc_clk,
|
||||||
|
[RPM_SMD_PCNOC_A_CLK] = &msm8916_pcnoc_a_clk,
|
||||||
|
[RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk,
|
||||||
|
[RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk,
|
||||||
|
[RPM_SMD_QPIC_CLK] = &qcs404_qpic_clk,
|
||||||
|
[RPM_SMD_QPIC_CLK_A] = &qcs404_qpic_a_clk,
|
||||||
|
[RPM_SMD_QDSS_CLK] = &msm8916_qdss_clk,
|
||||||
|
[RPM_SMD_QDSS_A_CLK] = &msm8916_qdss_a_clk,
|
||||||
|
[RPM_SMD_BB_CLK1] = &msm8916_bb_clk1,
|
||||||
|
[RPM_SMD_BB_CLK1_A] = &msm8916_bb_clk1_a,
|
||||||
|
[RPM_SMD_BB_CLK1_PIN] = &msm8916_bb_clk1_pin,
|
||||||
|
[RPM_SMD_BB_CLK1_A_PIN] = &msm8916_bb_clk1_a_pin,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct rpm_smd_clk_desc rpm_clk_mdm9607 = {
|
||||||
|
.clks = mdm9607_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(mdm9607_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_smd_rpm *msm8953_clks[] = {
|
||||||
|
[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo,
|
||||||
|
[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a,
|
||||||
|
[RPM_SMD_PCNOC_CLK] = &msm8916_pcnoc_clk,
|
||||||
|
[RPM_SMD_PCNOC_A_CLK] = &msm8916_pcnoc_a_clk,
|
||||||
|
[RPM_SMD_SNOC_CLK] = &msm8916_snoc_clk,
|
||||||
|
[RPM_SMD_SNOC_A_CLK] = &msm8916_snoc_a_clk,
|
||||||
|
[RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk,
|
||||||
|
[RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk,
|
||||||
|
[RPM_SMD_IPA_CLK] = &msm8976_ipa_clk,
|
||||||
|
[RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk,
|
||||||
|
[RPM_SMD_SYSMMNOC_CLK] = &msm8936_sysmmnoc_clk,
|
||||||
|
[RPM_SMD_SYSMMNOC_A_CLK] = &msm8936_sysmmnoc_a_clk,
|
||||||
|
[RPM_SMD_QDSS_CLK] = &msm8916_qdss_clk,
|
||||||
|
[RPM_SMD_QDSS_A_CLK] = &msm8916_qdss_a_clk,
|
||||||
|
[RPM_SMD_BB_CLK1] = &msm8916_bb_clk1,
|
||||||
|
[RPM_SMD_BB_CLK1_A] = &msm8916_bb_clk1_a,
|
||||||
|
[RPM_SMD_BB_CLK2] = &msm8916_bb_clk2,
|
||||||
|
[RPM_SMD_BB_CLK2_A] = &msm8916_bb_clk2_a,
|
||||||
|
[RPM_SMD_RF_CLK2] = &msm8916_rf_clk2,
|
||||||
|
[RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_a,
|
||||||
|
[RPM_SMD_RF_CLK3] = &msm8992_ln_bb_clk,
|
||||||
|
[RPM_SMD_RF_CLK3_A] = &msm8992_ln_bb_a_clk,
|
||||||
|
[RPM_SMD_DIV_CLK2] = &msm8974_div_clk2,
|
||||||
|
[RPM_SMD_DIV_A_CLK2] = &msm8974_div_a_clk2,
|
||||||
|
[RPM_SMD_BB_CLK1_PIN] = &msm8916_bb_clk1_pin,
|
||||||
|
[RPM_SMD_BB_CLK1_A_PIN] = &msm8916_bb_clk1_a_pin,
|
||||||
|
[RPM_SMD_BB_CLK2_PIN] = &msm8916_bb_clk2_pin,
|
||||||
|
[RPM_SMD_BB_CLK2_A_PIN] = &msm8916_bb_clk2_a_pin,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct rpm_smd_clk_desc rpm_clk_msm8953 = {
|
||||||
|
.clks = msm8953_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(msm8953_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SM6125 */
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1);
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2);
|
||||||
|
DEFINE_CLK_SMD_RPM_BRANCH(sm6125, qdss_clk, qdss_a_clk,
|
||||||
|
QCOM_SMD_RPM_MISC_CLK, 1, 19200000);
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, qup_clk, qup_a_clk, QCOM_SMD_RPM_QUP_CLK, 0);
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, mmnrt_clk, mmnrt_a_clk, QCOM_SMD_RPM_MMAXI_CLK, 0);
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, mmrt_clk, mmrt_a_clk, QCOM_SMD_RPM_MMAXI_CLK, 1);
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, snoc_periph_clk, snoc_periph_a_clk,
|
||||||
|
QCOM_SMD_RPM_BUS_CLK, 0);
|
||||||
|
DEFINE_CLK_SMD_RPM(sm6125, snoc_lpass_clk, snoc_lpass_a_clk,
|
||||||
|
QCOM_SMD_RPM_BUS_CLK, 5);
|
||||||
|
|
||||||
|
static struct clk_smd_rpm *sm6125_clks[] = {
|
||||||
|
[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo,
|
||||||
|
[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a,
|
||||||
|
[RPM_SMD_SNOC_CLK] = &sm6125_snoc_clk,
|
||||||
|
[RPM_SMD_SNOC_A_CLK] = &sm6125_snoc_a_clk,
|
||||||
|
[RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk,
|
||||||
|
[RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk,
|
||||||
|
[RPM_SMD_QDSS_CLK] = &sm6125_qdss_clk,
|
||||||
|
[RPM_SMD_QDSS_A_CLK] = &sm6125_qdss_a_clk,
|
||||||
|
[RPM_SMD_RF_CLK1] = &msm8916_rf_clk1,
|
||||||
|
[RPM_SMD_RF_CLK1_A] = &msm8916_rf_clk1_a,
|
||||||
|
[RPM_SMD_RF_CLK2] = &msm8916_rf_clk2,
|
||||||
|
[RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_a,
|
||||||
|
[RPM_SMD_CNOC_CLK] = &sm6125_cnoc_clk,
|
||||||
|
[RPM_SMD_CNOC_A_CLK] = &sm6125_cnoc_a_clk,
|
||||||
|
[RPM_SMD_IPA_CLK] = &msm8976_ipa_clk,
|
||||||
|
[RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk,
|
||||||
|
[RPM_SMD_CE1_CLK] = &msm8992_ce1_clk,
|
||||||
|
[RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk,
|
||||||
|
[RPM_SMD_LN_BB_CLK1] = &msm8916_bb_clk1,
|
||||||
|
[RPM_SMD_LN_BB_CLK1_A] = &msm8916_bb_clk1_a,
|
||||||
|
[RPM_SMD_LN_BB_CLK2] = &msm8916_bb_clk2,
|
||||||
|
[RPM_SMD_LN_BB_CLK2_A] = &msm8916_bb_clk2_a,
|
||||||
|
[RPM_SMD_LN_BB_CLK3] = &sdm660_ln_bb_clk3,
|
||||||
|
[RPM_SMD_LN_BB_CLK3_A] = &sdm660_ln_bb_clk3_a,
|
||||||
|
[RPM_SMD_QUP_CLK] = &sm6125_qup_clk,
|
||||||
|
[RPM_SMD_QUP_A_CLK] = &sm6125_qup_a_clk,
|
||||||
|
[RPM_SMD_MMRT_CLK] = &sm6125_mmrt_clk,
|
||||||
|
[RPM_SMD_MMRT_A_CLK] = &sm6125_mmrt_a_clk,
|
||||||
|
[RPM_SMD_MMNRT_CLK] = &sm6125_mmnrt_clk,
|
||||||
|
[RPM_SMD_MMNRT_A_CLK] = &sm6125_mmnrt_a_clk,
|
||||||
|
[RPM_SMD_SNOC_PERIPH_CLK] = &sm6125_snoc_periph_clk,
|
||||||
|
[RPM_SMD_SNOC_PERIPH_A_CLK] = &sm6125_snoc_periph_a_clk,
|
||||||
|
[RPM_SMD_SNOC_LPASS_CLK] = &sm6125_snoc_lpass_clk,
|
||||||
|
[RPM_SMD_SNOC_LPASS_A_CLK] = &sm6125_snoc_lpass_a_clk,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct rpm_smd_clk_desc rpm_clk_sm6125 = {
|
||||||
|
.clks = sm6125_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(sm6125_clks),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SM6115 */
|
||||||
|
static struct clk_smd_rpm *sm6115_clks[] = {
|
||||||
|
[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo,
|
||||||
|
[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a,
|
||||||
|
[RPM_SMD_SNOC_CLK] = &sm6125_snoc_clk,
|
||||||
|
[RPM_SMD_SNOC_A_CLK] = &sm6125_snoc_a_clk,
|
||||||
|
[RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk,
|
||||||
|
[RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk,
|
||||||
|
[RPM_SMD_QDSS_CLK] = &sm6125_qdss_clk,
|
||||||
|
[RPM_SMD_QDSS_A_CLK] = &sm6125_qdss_a_clk,
|
||||||
|
[RPM_SMD_RF_CLK1] = &msm8916_rf_clk1,
|
||||||
|
[RPM_SMD_RF_CLK1_A] = &msm8916_rf_clk1_a,
|
||||||
|
[RPM_SMD_RF_CLK2] = &msm8916_rf_clk2,
|
||||||
|
[RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_a,
|
||||||
|
[RPM_SMD_CNOC_CLK] = &sm6125_cnoc_clk,
|
||||||
|
[RPM_SMD_CNOC_A_CLK] = &sm6125_cnoc_a_clk,
|
||||||
|
[RPM_SMD_IPA_CLK] = &msm8976_ipa_clk,
|
||||||
|
[RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk,
|
||||||
|
[RPM_SMD_CE1_CLK] = &msm8992_ce1_clk,
|
||||||
|
[RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk,
|
||||||
|
[RPM_SMD_QUP_CLK] = &sm6125_qup_clk,
|
||||||
|
[RPM_SMD_QUP_A_CLK] = &sm6125_qup_a_clk,
|
||||||
|
[RPM_SMD_MMRT_CLK] = &sm6125_mmrt_clk,
|
||||||
|
[RPM_SMD_MMRT_A_CLK] = &sm6125_mmrt_a_clk,
|
||||||
|
[RPM_SMD_MMNRT_CLK] = &sm6125_mmnrt_clk,
|
||||||
|
[RPM_SMD_MMNRT_A_CLK] = &sm6125_mmnrt_a_clk,
|
||||||
|
[RPM_SMD_SNOC_PERIPH_CLK] = &sm6125_snoc_periph_clk,
|
||||||
|
[RPM_SMD_SNOC_PERIPH_A_CLK] = &sm6125_snoc_periph_a_clk,
|
||||||
|
[RPM_SMD_SNOC_LPASS_CLK] = &sm6125_snoc_lpass_clk,
|
||||||
|
[RPM_SMD_SNOC_LPASS_A_CLK] = &sm6125_snoc_lpass_a_clk,
|
||||||
|
[RPM_SMD_RF_CLK1_PIN] = &msm8916_rf_clk1_pin,
|
||||||
|
[RPM_SMD_RF_CLK1_A_PIN] = &msm8916_rf_clk1_a_pin,
|
||||||
|
[RPM_SMD_RF_CLK2_PIN] = &msm8916_rf_clk2_pin,
|
||||||
|
[RPM_SMD_RF_CLK2_A_PIN] = &msm8916_rf_clk2_a_pin,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct rpm_smd_clk_desc rpm_clk_sm6115 = {
|
||||||
|
.clks = sm6115_clks,
|
||||||
|
.num_clks = ARRAY_SIZE(sm6115_clks),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct of_device_id rpm_smd_clk_match_table[] = {
|
static const struct of_device_id rpm_smd_clk_match_table[] = {
|
||||||
|
{ .compatible = "qcom,rpmcc-mdm9607", .data = &rpm_clk_mdm9607 },
|
||||||
{ .compatible = "qcom,rpmcc-msm8226", .data = &rpm_clk_msm8974 },
|
{ .compatible = "qcom,rpmcc-msm8226", .data = &rpm_clk_msm8974 },
|
||||||
{ .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 },
|
{ .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 },
|
||||||
{ .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 },
|
{ .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 },
|
||||||
|
{ .compatible = "qcom,rpmcc-msm8953", .data = &rpm_clk_msm8953 },
|
||||||
{ .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 },
|
{ .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 },
|
||||||
{ .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 },
|
{ .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 },
|
||||||
{ .compatible = "qcom,rpmcc-msm8992", .data = &rpm_clk_msm8992 },
|
{ .compatible = "qcom,rpmcc-msm8992", .data = &rpm_clk_msm8992 },
|
||||||
@@ -925,6 +1081,8 @@ static const struct of_device_id rpm_smd_clk_match_table[] = {
|
|||||||
{ .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 },
|
{ .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 },
|
||||||
{ .compatible = "qcom,rpmcc-qcs404", .data = &rpm_clk_qcs404 },
|
{ .compatible = "qcom,rpmcc-qcs404", .data = &rpm_clk_qcs404 },
|
||||||
{ .compatible = "qcom,rpmcc-sdm660", .data = &rpm_clk_sdm660 },
|
{ .compatible = "qcom,rpmcc-sdm660", .data = &rpm_clk_sdm660 },
|
||||||
|
{ .compatible = "qcom,rpmcc-sm6115", .data = &rpm_clk_sm6115 },
|
||||||
|
{ .compatible = "qcom,rpmcc-sm6125", .data = &rpm_clk_sm6125 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table);
|
MODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table);
|
||||||
|
|||||||
908
drivers/clk/qcom/dispcc-sc7280.c
Normal file
908
drivers/clk/qcom/dispcc-sc7280.c
Normal file
@@ -0,0 +1,908 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/regmap.h>
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/qcom,dispcc-sc7280.h>
|
||||||
|
|
||||||
|
#include "clk-alpha-pll.h"
|
||||||
|
#include "clk-branch.h"
|
||||||
|
#include "clk-rcg.h"
|
||||||
|
#include "clk-regmap-divider.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "gdsc.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
P_BI_TCXO,
|
||||||
|
P_DISP_CC_PLL0_OUT_EVEN,
|
||||||
|
P_DISP_CC_PLL0_OUT_MAIN,
|
||||||
|
P_DP_PHY_PLL_LINK_CLK,
|
||||||
|
P_DP_PHY_PLL_VCO_DIV_CLK,
|
||||||
|
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||||
|
P_DSI0_PHY_PLL_OUT_DSICLK,
|
||||||
|
P_EDP_PHY_PLL_LINK_CLK,
|
||||||
|
P_EDP_PHY_PLL_VCO_DIV_CLK,
|
||||||
|
P_GCC_DISP_GPLL0_CLK,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct pll_vco lucid_vco[] = {
|
||||||
|
{ 249600000, 2000000000, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 1520MHz Configuration*/
|
||||||
|
static const struct alpha_pll_config disp_cc_pll0_config = {
|
||||||
|
.l = 0x4F,
|
||||||
|
.alpha = 0x2AAA,
|
||||||
|
.config_ctl_val = 0x20485699,
|
||||||
|
.config_ctl_hi_val = 0x00002261,
|
||||||
|
.config_ctl_hi1_val = 0x329A299C,
|
||||||
|
.user_ctl_val = 0x00000001,
|
||||||
|
.user_ctl_hi_val = 0x00000805,
|
||||||
|
.user_ctl_hi1_val = 0x00000000,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_alpha_pll disp_cc_pll0 = {
|
||||||
|
.offset = 0x0,
|
||||||
|
.vco_table = lucid_vco,
|
||||||
|
.num_vco = ARRAY_SIZE(lucid_vco),
|
||||||
|
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
|
||||||
|
.clkr = {
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_pll0",
|
||||||
|
.parent_data = &(const struct clk_parent_data){
|
||||||
|
.fw_name = "bi_tcxo",
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_alpha_pll_lucid_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_0[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_0[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_1[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_DP_PHY_PLL_LINK_CLK, 1 },
|
||||||
|
{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_1[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .fw_name = "dp_phy_pll_link_clk" },
|
||||||
|
{ .fw_name = "dp_phy_pll_vco_div_clk" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_2[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_2[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .fw_name = "dsi0_phy_pll_out_byteclk" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_3[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_EDP_PHY_PLL_LINK_CLK, 1 },
|
||||||
|
{ P_EDP_PHY_PLL_VCO_DIV_CLK, 2 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_3[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .fw_name = "edp_phy_pll_link_clk" },
|
||||||
|
{ .fw_name = "edp_phy_pll_vco_div_clk" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_4[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
|
||||||
|
{ P_GCC_DISP_GPLL0_CLK, 4 },
|
||||||
|
{ P_DISP_CC_PLL0_OUT_EVEN, 5 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_4[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||||
|
{ .fw_name = "gcc_disp_gpll0_clk" },
|
||||||
|
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_5[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_GCC_DISP_GPLL0_CLK, 4 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_5[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .fw_name = "gcc_disp_gpll0_clk" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map disp_cc_parent_map_6[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data disp_cc_parent_data_6[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .fw_name = "dsi0_phy_pll_out_dsiclk" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
|
||||||
|
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||||
|
F(37500000, P_GCC_DISP_GPLL0_CLK, 16, 0, 0),
|
||||||
|
F(75000000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1170,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_5,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_ahb_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_5,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
|
||||||
|
.ops = &clk_rcg2_shared_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
|
||||||
|
.cmd_rcgr = 0x10d8,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_2,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_byte0_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_2,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_byte2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
|
||||||
|
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1158,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_0,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_aux_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_0,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||||
|
.ops = &clk_rcg2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1128,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_1,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_crypto_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_1,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||||
|
.ops = &clk_byte2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
|
||||||
|
.cmd_rcgr = 0x110c,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_1,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_link_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_1,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||||
|
.ops = &clk_byte2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1140,
|
||||||
|
.mnd_width = 16,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_1,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_pixel_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_1,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||||
|
.ops = &clk_dp_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_edp_aux_clk_src = {
|
||||||
|
.cmd_rcgr = 0x11d0,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_0,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_aux_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_0,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||||
|
.ops = &clk_rcg2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_edp_link_clk_src = {
|
||||||
|
.cmd_rcgr = 0x11a0,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_3,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_link_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_3,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_byte2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_edp_pixel_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1188,
|
||||||
|
.mnd_width = 16,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_3,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_pixel_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_3,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||||
|
.ops = &clk_dp_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
|
||||||
|
.cmd_rcgr = 0x10f4,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_2,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_esc0_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_2,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||||
|
.ops = &clk_rcg2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
|
||||||
|
F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0),
|
||||||
|
F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0),
|
||||||
|
F(380000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
|
||||||
|
F(506666667, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||||
|
F(608000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1090,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_4,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_mdp_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_4,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
|
||||||
|
.ops = &clk_rcg2_shared_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1078,
|
||||||
|
.mnd_width = 8,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_6,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_pclk0_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_6,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_pixel_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
|
||||||
|
.cmd_rcgr = 0x10a8,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_4,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_rot_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_4,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
|
||||||
|
.ops = &clk_rcg2_shared_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
|
||||||
|
.cmd_rcgr = 0x10c0,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = disp_cc_parent_map_0,
|
||||||
|
.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_vsync_clk_src",
|
||||||
|
.parent_data = disp_cc_parent_data_0,
|
||||||
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||||
|
.ops = &clk_rcg2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
|
||||||
|
.reg = 0x10f0,
|
||||||
|
.shift = 0,
|
||||||
|
.width = 4,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
|
.name = "disp_cc_mdss_byte0_div_clk_src",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_regmap_div_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
|
||||||
|
.reg = 0x1124,
|
||||||
|
.shift = 0,
|
||||||
|
.width = 4,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
|
.name = "disp_cc_mdss_dp_link_div_clk_src",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_dp_link_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_regmap_div_ro_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap_div disp_cc_mdss_edp_link_div_clk_src = {
|
||||||
|
.reg = 0x11b8,
|
||||||
|
.shift = 0,
|
||||||
|
.width = 4,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
|
.name = "disp_cc_mdss_edp_link_div_clk_src",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_edp_link_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_regmap_div_ro_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_ahb_clk = {
|
||||||
|
.halt_reg = 0x1050,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1050,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_ahb_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_byte0_clk = {
|
||||||
|
.halt_reg = 0x1030,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1030,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_byte0_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
|
||||||
|
.halt_reg = 0x1034,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1034,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_byte0_intf_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_byte0_div_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_dp_aux_clk = {
|
||||||
|
.halt_reg = 0x104c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x104c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_aux_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_dp_aux_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
|
||||||
|
.halt_reg = 0x1044,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1044,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_crypto_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_dp_link_clk = {
|
||||||
|
.halt_reg = 0x103c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x103c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_link_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_dp_link_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
|
||||||
|
.halt_reg = 0x1040,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1040,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_link_intf_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
|
||||||
|
.halt_reg = 0x1048,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1048,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_dp_pixel_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_edp_aux_clk = {
|
||||||
|
.halt_reg = 0x1060,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1060,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_aux_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_edp_aux_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_edp_link_clk = {
|
||||||
|
.halt_reg = 0x1058,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1058,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_link_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_edp_link_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_edp_link_intf_clk = {
|
||||||
|
.halt_reg = 0x105c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x105c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_link_intf_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_edp_link_div_clk_src.clkr.hw
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_edp_pixel_clk = {
|
||||||
|
.halt_reg = 0x1054,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1054,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_edp_pixel_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_edp_pixel_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_esc0_clk = {
|
||||||
|
.halt_reg = 0x1038,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1038,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_esc0_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_esc0_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_mdp_clk = {
|
||||||
|
.halt_reg = 0x1014,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1014,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_mdp_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
|
||||||
|
.halt_reg = 0x1024,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1024,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_mdp_lut_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
|
||||||
|
.halt_reg = 0x2004,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x2004,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_non_gdsc_ahb_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_pclk0_clk = {
|
||||||
|
.halt_reg = 0x1010,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1010,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_pclk0_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_pclk0_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_rot_clk = {
|
||||||
|
.halt_reg = 0x101c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x101c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_rot_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_rot_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
|
||||||
|
.halt_reg = 0x200c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x200c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_rscc_ahb_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
|
||||||
|
.halt_reg = 0x2008,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x2008,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_rscc_vsync_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||||
|
.halt_reg = 0x102c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x102c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_mdss_vsync_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch disp_cc_sleep_clk = {
|
||||||
|
.halt_reg = 0x5004,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x5004,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "disp_cc_sleep_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc disp_cc_mdss_core_gdsc = {
|
||||||
|
.gdscr = 0x1004,
|
||||||
|
.pd = {
|
||||||
|
.name = "disp_cc_mdss_core_gdsc",
|
||||||
|
},
|
||||||
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
.flags = HW_CTRL | RETAIN_FF_ENABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap *disp_cc_sc7280_clocks[] = {
|
||||||
|
[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] =
|
||||||
|
&disp_cc_mdss_dp_link_div_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_AUX_CLK] = &disp_cc_mdss_edp_aux_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_AUX_CLK_SRC] = &disp_cc_mdss_edp_aux_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_LINK_CLK] = &disp_cc_mdss_edp_link_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_LINK_CLK_SRC] = &disp_cc_mdss_edp_link_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_LINK_DIV_CLK_SRC] =
|
||||||
|
&disp_cc_mdss_edp_link_div_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_LINK_INTF_CLK] = &disp_cc_mdss_edp_link_intf_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_PIXEL_CLK] = &disp_cc_mdss_edp_pixel_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_EDP_PIXEL_CLK_SRC] = &disp_cc_mdss_edp_pixel_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
|
||||||
|
[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
|
||||||
|
[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
|
||||||
|
[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
|
||||||
|
[DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc *disp_cc_sc7280_gdscs[] = {
|
||||||
|
[DISP_CC_MDSS_CORE_GDSC] = &disp_cc_mdss_core_gdsc,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct regmap_config disp_cc_sc7280_regmap_config = {
|
||||||
|
.reg_bits = 32,
|
||||||
|
.reg_stride = 4,
|
||||||
|
.val_bits = 32,
|
||||||
|
.max_register = 0x10000,
|
||||||
|
.fast_io = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qcom_cc_desc disp_cc_sc7280_desc = {
|
||||||
|
.config = &disp_cc_sc7280_regmap_config,
|
||||||
|
.clks = disp_cc_sc7280_clocks,
|
||||||
|
.num_clks = ARRAY_SIZE(disp_cc_sc7280_clocks),
|
||||||
|
.gdscs = disp_cc_sc7280_gdscs,
|
||||||
|
.num_gdscs = ARRAY_SIZE(disp_cc_sc7280_gdscs),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id disp_cc_sc7280_match_table[] = {
|
||||||
|
{ .compatible = "qcom,sc7280-dispcc" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, disp_cc_sc7280_match_table);
|
||||||
|
|
||||||
|
static int disp_cc_sc7280_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct regmap *regmap;
|
||||||
|
|
||||||
|
regmap = qcom_cc_map(pdev, &disp_cc_sc7280_desc);
|
||||||
|
if (IS_ERR(regmap))
|
||||||
|
return PTR_ERR(regmap);
|
||||||
|
|
||||||
|
clk_lucid_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep the clocks always-ON
|
||||||
|
* DISP_CC_XO_CLK
|
||||||
|
*/
|
||||||
|
regmap_update_bits(regmap, 0x5008, BIT(0), BIT(0));
|
||||||
|
|
||||||
|
return qcom_cc_really_probe(pdev, &disp_cc_sc7280_desc, regmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver disp_cc_sc7280_driver = {
|
||||||
|
.probe = disp_cc_sc7280_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "disp_cc-sc7280",
|
||||||
|
.of_match_table = disp_cc_sc7280_match_table,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init disp_cc_sc7280_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&disp_cc_sc7280_driver);
|
||||||
|
}
|
||||||
|
subsys_initcall(disp_cc_sc7280_init);
|
||||||
|
|
||||||
|
static void __exit disp_cc_sc7280_exit(void)
|
||||||
|
{
|
||||||
|
platform_driver_unregister(&disp_cc_sc7280_driver);
|
||||||
|
}
|
||||||
|
module_exit(disp_cc_sc7280_exit);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("QTI DISP_CC sc7280 Driver");
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
@@ -26,6 +26,10 @@ enum {
|
|||||||
P_DISP_CC_PLL1_OUT_MAIN,
|
P_DISP_CC_PLL1_OUT_MAIN,
|
||||||
P_DP_PHY_PLL_LINK_CLK,
|
P_DP_PHY_PLL_LINK_CLK,
|
||||||
P_DP_PHY_PLL_VCO_DIV_CLK,
|
P_DP_PHY_PLL_VCO_DIV_CLK,
|
||||||
|
P_DPTX1_PHY_PLL_LINK_CLK,
|
||||||
|
P_DPTX1_PHY_PLL_VCO_DIV_CLK,
|
||||||
|
P_DPTX2_PHY_PLL_LINK_CLK,
|
||||||
|
P_DPTX2_PHY_PLL_VCO_DIV_CLK,
|
||||||
P_EDP_PHY_PLL_LINK_CLK,
|
P_EDP_PHY_PLL_LINK_CLK,
|
||||||
P_EDP_PHY_PLL_VCO_DIV_CLK,
|
P_EDP_PHY_PLL_VCO_DIV_CLK,
|
||||||
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||||
@@ -98,12 +102,20 @@ static const struct parent_map disp_cc_parent_map_0[] = {
|
|||||||
{ P_BI_TCXO, 0 },
|
{ P_BI_TCXO, 0 },
|
||||||
{ P_DP_PHY_PLL_LINK_CLK, 1 },
|
{ P_DP_PHY_PLL_LINK_CLK, 1 },
|
||||||
{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
|
{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
|
||||||
|
{ P_DPTX1_PHY_PLL_LINK_CLK, 3 },
|
||||||
|
{ P_DPTX1_PHY_PLL_VCO_DIV_CLK, 4 },
|
||||||
|
{ P_DPTX2_PHY_PLL_LINK_CLK, 5 },
|
||||||
|
{ P_DPTX2_PHY_PLL_VCO_DIV_CLK, 6 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct clk_parent_data disp_cc_parent_data_0[] = {
|
static const struct clk_parent_data disp_cc_parent_data_0[] = {
|
||||||
{ .fw_name = "bi_tcxo" },
|
{ .fw_name = "bi_tcxo" },
|
||||||
{ .fw_name = "dp_phy_pll_link_clk" },
|
{ .fw_name = "dp_phy_pll_link_clk" },
|
||||||
{ .fw_name = "dp_phy_pll_vco_div_clk" },
|
{ .fw_name = "dp_phy_pll_vco_div_clk" },
|
||||||
|
{ .fw_name = "dptx1_phy_pll_link_clk" },
|
||||||
|
{ .fw_name = "dptx1_phy_pll_vco_div_clk" },
|
||||||
|
{ .fw_name = "dptx2_phy_pll_link_clk" },
|
||||||
|
{ .fw_name = "dptx2_phy_pll_vco_div_clk" },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct parent_map disp_cc_parent_map_1[] = {
|
static const struct parent_map disp_cc_parent_map_1[] = {
|
||||||
@@ -269,20 +281,11 @@ static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct freq_tbl ftbl_disp_cc_mdss_dp_link1_clk_src[] = {
|
|
||||||
F(162000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(270000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(540000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(810000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
{ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk_rcg2 disp_cc_mdss_dp_link1_clk_src = {
|
static struct clk_rcg2 disp_cc_mdss_dp_link1_clk_src = {
|
||||||
.cmd_rcgr = 0x220c,
|
.cmd_rcgr = 0x220c,
|
||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_0,
|
.parent_map = disp_cc_parent_map_0,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dp_link1_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data){
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
.name = "disp_cc_mdss_dp_link1_clk_src",
|
.name = "disp_cc_mdss_dp_link1_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_0,
|
.parent_data = disp_cc_parent_data_0,
|
||||||
@@ -296,7 +299,6 @@ static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
|
|||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_0,
|
.parent_map = disp_cc_parent_map_0,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dp_link1_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data){
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
.name = "disp_cc_mdss_dp_link_clk_src",
|
.name = "disp_cc_mdss_dp_link_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_0,
|
.parent_data = disp_cc_parent_data_0,
|
||||||
|
|||||||
4250
drivers/clk/qcom/gcc-msm8953.c
Normal file
4250
drivers/clk/qcom/gcc-msm8953.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
3544
drivers/clk/qcom/gcc-sm6115.c
Normal file
3544
drivers/clk/qcom/gcc-sm6115.c
Normal file
File diff suppressed because it is too large
Load Diff
2588
drivers/clk/qcom/gcc-sm6350.c
Normal file
2588
drivers/clk/qcom/gcc-sm6350.c
Normal file
File diff suppressed because it is too large
Load Diff
491
drivers/clk/qcom/gpucc-sc7280.c
Normal file
491
drivers/clk/qcom/gpucc-sc7280.c
Normal file
@@ -0,0 +1,491 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/regmap.h>
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/qcom,gpucc-sc7280.h>
|
||||||
|
|
||||||
|
#include "clk-alpha-pll.h"
|
||||||
|
#include "clk-branch.h"
|
||||||
|
#include "clk-rcg.h"
|
||||||
|
#include "clk-regmap-divider.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "reset.h"
|
||||||
|
#include "gdsc.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
P_BI_TCXO,
|
||||||
|
P_GCC_GPU_GPLL0_CLK_SRC,
|
||||||
|
P_GCC_GPU_GPLL0_DIV_CLK_SRC,
|
||||||
|
P_GPU_CC_PLL0_OUT_MAIN,
|
||||||
|
P_GPU_CC_PLL1_OUT_MAIN,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct pll_vco lucid_vco[] = {
|
||||||
|
{ 249600000, 2000000000, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||||
|
.offset = 0x0,
|
||||||
|
.vco_table = lucid_vco,
|
||||||
|
.num_vco = ARRAY_SIZE(lucid_vco),
|
||||||
|
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
|
||||||
|
.clkr = {
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_pll0",
|
||||||
|
.parent_data = &(const struct clk_parent_data){
|
||||||
|
.fw_name = "bi_tcxo",
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_alpha_pll_lucid_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 500MHz Configuration */
|
||||||
|
static const struct alpha_pll_config gpu_cc_pll1_config = {
|
||||||
|
.l = 0x1A,
|
||||||
|
.alpha = 0xAAA,
|
||||||
|
.config_ctl_val = 0x20485699,
|
||||||
|
.config_ctl_hi_val = 0x00002261,
|
||||||
|
.config_ctl_hi1_val = 0x329A299C,
|
||||||
|
.user_ctl_val = 0x00000001,
|
||||||
|
.user_ctl_hi_val = 0x00000805,
|
||||||
|
.user_ctl_hi1_val = 0x00000000,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||||
|
.offset = 0x100,
|
||||||
|
.vco_table = lucid_vco,
|
||||||
|
.num_vco = ARRAY_SIZE(lucid_vco),
|
||||||
|
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
|
||||||
|
.clkr = {
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_pll1",
|
||||||
|
.parent_data = &(const struct clk_parent_data){
|
||||||
|
.fw_name = "bi_tcxo",
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_alpha_pll_lucid_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
|
||||||
|
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||||
|
{ P_GCC_GPU_GPLL0_CLK_SRC, 5 },
|
||||||
|
{ P_GCC_GPU_GPLL0_DIV_CLK_SRC, 6 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data gpu_cc_parent_data_0[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||||
|
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||||
|
{ .fw_name = "gcc_gpu_gpll0_clk_src" },
|
||||||
|
{ .fw_name = "gcc_gpu_gpll0_div_clk_src" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map gpu_cc_parent_map_1[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||||
|
{ P_GCC_GPU_GPLL0_CLK_SRC, 5 },
|
||||||
|
{ P_GCC_GPU_GPLL0_DIV_CLK_SRC, 6 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||||
|
{ .fw_name = "bi_tcxo", },
|
||||||
|
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||||
|
{ .fw_name = "gcc_gpu_gpll0_clk_src", },
|
||||||
|
{ .fw_name = "gcc_gpu_gpll0_div_clk_src", },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||||
|
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||||
|
F(200000000, P_GCC_GPU_GPLL0_DIV_CLK_SRC, 1.5, 0, 0),
|
||||||
|
F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1120,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = gpu_cc_parent_map_0,
|
||||||
|
.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_gmu_clk_src",
|
||||||
|
.parent_data = gpu_cc_parent_data_0,
|
||||||
|
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
|
||||||
|
.ops = &clk_rcg2_shared_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
|
||||||
|
F(150000000, P_GCC_GPU_GPLL0_DIV_CLK_SRC, 2, 0, 0),
|
||||||
|
F(240000000, P_GCC_GPU_GPLL0_CLK_SRC, 2.5, 0, 0),
|
||||||
|
F(300000000, P_GCC_GPU_GPLL0_CLK_SRC, 2, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 gpu_cc_hub_clk_src = {
|
||||||
|
.cmd_rcgr = 0x117c,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = gpu_cc_parent_map_1,
|
||||||
|
.freq_tbl = ftbl_gpu_cc_hub_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_hub_clk_src",
|
||||||
|
.parent_data = gpu_cc_parent_data_1,
|
||||||
|
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
|
||||||
|
.ops = &clk_rcg2_shared_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap_div gpu_cc_hub_ahb_div_clk_src = {
|
||||||
|
.reg = 0x11c0,
|
||||||
|
.shift = 0,
|
||||||
|
.width = 4,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
|
.name = "gpu_cc_hub_ahb_div_clk_src",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_hub_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_regmap_div_ro_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap_div gpu_cc_hub_cx_int_div_clk_src = {
|
||||||
|
.reg = 0x11bc,
|
||||||
|
.shift = 0,
|
||||||
|
.width = 4,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
|
.name = "gpu_cc_hub_cx_int_div_clk_src",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_hub_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_regmap_div_ro_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_ahb_clk = {
|
||||||
|
.halt_reg = 0x1078,
|
||||||
|
.halt_check = BRANCH_HALT_DELAY,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1078,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_ahb_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_hub_ahb_div_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_crc_ahb_clk = {
|
||||||
|
.halt_reg = 0x107c,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x107c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_crc_ahb_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_hub_ahb_div_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||||
|
.halt_reg = 0x1098,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1098,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_cx_gmu_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_gmu_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_aon_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
|
||||||
|
.halt_reg = 0x108c,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x108c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_cx_snoc_dvm_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_cxo_aon_clk = {
|
||||||
|
.halt_reg = 0x1004,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1004,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_cxo_aon_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_cxo_clk = {
|
||||||
|
.halt_reg = 0x109c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x109c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_cxo_clk",
|
||||||
|
.ops = &clk_branch2_aon_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_gx_gmu_clk = {
|
||||||
|
.halt_reg = 0x1064,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1064,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_gx_gmu_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_gmu_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
|
||||||
|
.halt_reg = 0x5000,
|
||||||
|
.halt_check = BRANCH_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x5000,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_hub_aon_clk = {
|
||||||
|
.halt_reg = 0x1178,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1178,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_hub_aon_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_hub_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_aon_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_hub_cx_int_clk = {
|
||||||
|
.halt_reg = 0x1204,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1204,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_hub_cx_int_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&gpu_cc_hub_cx_int_div_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_aon_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = {
|
||||||
|
.halt_reg = 0x802c,
|
||||||
|
.halt_check = BRANCH_HALT_SKIP,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x802c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_mnd1x_0_gfx3d_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_mnd1x_1_gfx3d_clk = {
|
||||||
|
.halt_reg = 0x8030,
|
||||||
|
.halt_check = BRANCH_HALT_SKIP,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x8030,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_mnd1x_1_gfx3d_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch gpu_cc_sleep_clk = {
|
||||||
|
.halt_reg = 0x1090,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x1090,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "gpu_cc_sleep_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc cx_gdsc = {
|
||||||
|
.gdscr = 0x106c,
|
||||||
|
.gds_hw_ctrl = 0x1540,
|
||||||
|
.pd = {
|
||||||
|
.name = "cx_gdsc",
|
||||||
|
},
|
||||||
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
.flags = VOTABLE | RETAIN_FF_ENABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc gx_gdsc = {
|
||||||
|
.gdscr = 0x100c,
|
||||||
|
.clamp_io_ctrl = 0x1508,
|
||||||
|
.pd = {
|
||||||
|
.name = "gx_gdsc",
|
||||||
|
.power_on = gdsc_gx_do_nothing_enable,
|
||||||
|
},
|
||||||
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
.flags = CLAMP_IO | RETAIN_FF_ENABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc *gpu_cc_sc7180_gdscs[] = {
|
||||||
|
[GPU_CC_CX_GDSC] = &cx_gdsc,
|
||||||
|
[GPU_CC_GX_GDSC] = &gx_gdsc,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap *gpu_cc_sc7280_clocks[] = {
|
||||||
|
[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
|
||||||
|
[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
|
||||||
|
[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
|
||||||
|
[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
|
||||||
|
[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
|
||||||
|
[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||||
|
[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
|
||||||
|
[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
|
||||||
|
[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
|
||||||
|
[GPU_CC_HUB_AHB_DIV_CLK_SRC] = &gpu_cc_hub_ahb_div_clk_src.clkr,
|
||||||
|
[GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
|
||||||
|
[GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
|
||||||
|
[GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
|
||||||
|
[GPU_CC_HUB_CX_INT_DIV_CLK_SRC] = &gpu_cc_hub_cx_int_div_clk_src.clkr,
|
||||||
|
[GPU_CC_MND1X_0_GFX3D_CLK] = &gpu_cc_mnd1x_0_gfx3d_clk.clkr,
|
||||||
|
[GPU_CC_MND1X_1_GFX3D_CLK] = &gpu_cc_mnd1x_1_gfx3d_clk.clkr,
|
||||||
|
[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
|
||||||
|
[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
|
||||||
|
[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct regmap_config gpu_cc_sc7280_regmap_config = {
|
||||||
|
.reg_bits = 32,
|
||||||
|
.reg_stride = 4,
|
||||||
|
.val_bits = 32,
|
||||||
|
.max_register = 0x8030,
|
||||||
|
.fast_io = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qcom_cc_desc gpu_cc_sc7280_desc = {
|
||||||
|
.config = &gpu_cc_sc7280_regmap_config,
|
||||||
|
.clks = gpu_cc_sc7280_clocks,
|
||||||
|
.num_clks = ARRAY_SIZE(gpu_cc_sc7280_clocks),
|
||||||
|
.gdscs = gpu_cc_sc7180_gdscs,
|
||||||
|
.num_gdscs = ARRAY_SIZE(gpu_cc_sc7180_gdscs),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id gpu_cc_sc7280_match_table[] = {
|
||||||
|
{ .compatible = "qcom,sc7280-gpucc" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, gpu_cc_sc7280_match_table);
|
||||||
|
|
||||||
|
static int gpu_cc_sc7280_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct regmap *regmap;
|
||||||
|
|
||||||
|
regmap = qcom_cc_map(pdev, &gpu_cc_sc7280_desc);
|
||||||
|
if (IS_ERR(regmap))
|
||||||
|
return PTR_ERR(regmap);
|
||||||
|
|
||||||
|
clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep the clocks always-ON
|
||||||
|
* GPU_CC_CB_CLK, GPUCC_CX_GMU_CLK
|
||||||
|
*/
|
||||||
|
regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
|
||||||
|
regmap_update_bits(regmap, 0x1098, BIT(0), BIT(0));
|
||||||
|
|
||||||
|
return qcom_cc_really_probe(pdev, &gpu_cc_sc7280_desc, regmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver gpu_cc_sc7280_driver = {
|
||||||
|
.probe = gpu_cc_sc7280_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "gpu_cc-sc7280",
|
||||||
|
.of_match_table = gpu_cc_sc7280_match_table,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init gpu_cc_sc7280_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&gpu_cc_sc7280_driver);
|
||||||
|
}
|
||||||
|
subsys_initcall(gpu_cc_sc7280_init);
|
||||||
|
|
||||||
|
static void __exit gpu_cc_sc7280_exit(void)
|
||||||
|
{
|
||||||
|
platform_driver_unregister(&gpu_cc_sc7280_driver);
|
||||||
|
}
|
||||||
|
module_exit(gpu_cc_sc7280_exit);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("QTI GPU_CC SC7280 Driver");
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
@@ -82,6 +82,14 @@ static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src_sc8180x[] = {
|
||||||
|
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||||
|
F(200000000, P_GPLL0_OUT_MAIN_DIV, 1.5, 0, 0),
|
||||||
|
F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
|
||||||
|
F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||||
.cmd_rcgr = 0x1120,
|
.cmd_rcgr = 0x1120,
|
||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
@@ -277,6 +285,7 @@ static const struct qcom_cc_desc gpu_cc_sm8150_desc = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id gpu_cc_sm8150_match_table[] = {
|
static const struct of_device_id gpu_cc_sm8150_match_table[] = {
|
||||||
|
{ .compatible = "qcom,sc8180x-gpucc" },
|
||||||
{ .compatible = "qcom,sm8150-gpucc" },
|
{ .compatible = "qcom,sm8150-gpucc" },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
@@ -290,6 +299,9 @@ static int gpu_cc_sm8150_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(regmap))
|
if (IS_ERR(regmap))
|
||||||
return PTR_ERR(regmap);
|
return PTR_ERR(regmap);
|
||||||
|
|
||||||
|
if (of_device_is_compatible(pdev->dev.of_node, "qcom,sc8180x-gpucc"))
|
||||||
|
gpu_cc_gmu_clk_src.freq_tbl = ftbl_gpu_cc_gmu_clk_src_sc8180x;
|
||||||
|
|
||||||
clk_trion_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
clk_trion_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||||
|
|
||||||
return qcom_cc_really_probe(pdev, &gpu_cc_sm8150_desc, regmap);
|
return qcom_cc_really_probe(pdev, &gpu_cc_sm8150_desc, regmap);
|
||||||
|
|||||||
@@ -251,15 +251,18 @@ static int lpass_gfm_clk_driver_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(cc->base))
|
if (IS_ERR(cc->base))
|
||||||
return PTR_ERR(cc->base);
|
return PTR_ERR(cc->base);
|
||||||
|
|
||||||
pm_runtime_enable(dev);
|
err = devm_pm_runtime_enable(dev);
|
||||||
err = pm_clk_create(dev);
|
|
||||||
if (err)
|
if (err)
|
||||||
goto pm_clk_err;
|
return err;
|
||||||
|
|
||||||
|
err = devm_pm_clk_create(dev);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
err = of_pm_clk_add_clks(dev);
|
err = of_pm_clk_add_clks(dev);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_dbg(dev, "Failed to get lpass core voting clocks\n");
|
dev_dbg(dev, "Failed to get lpass core voting clocks\n");
|
||||||
goto clk_reg_err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < data->onecell_data->num; i++) {
|
for (i = 0; i < data->onecell_data->num; i++) {
|
||||||
@@ -273,22 +276,16 @@ static int lpass_gfm_clk_driver_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
err = devm_clk_hw_register(dev, &data->gfm_clks[i]->hw);
|
err = devm_clk_hw_register(dev, &data->gfm_clks[i]->hw);
|
||||||
if (err)
|
if (err)
|
||||||
goto clk_reg_err;
|
return err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
err = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
||||||
data->onecell_data);
|
data->onecell_data);
|
||||||
if (err)
|
if (err)
|
||||||
goto clk_reg_err;
|
return err;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
clk_reg_err:
|
|
||||||
pm_clk_destroy(dev);
|
|
||||||
pm_clk_err:
|
|
||||||
pm_runtime_disable(dev);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id lpass_gfm_clk_match_table[] = {
|
static const struct of_device_id lpass_gfm_clk_match_table[] = {
|
||||||
|
|||||||
@@ -356,32 +356,18 @@ static const struct qcom_cc_desc lpass_audio_hm_sc7180_desc = {
|
|||||||
.num_gdscs = ARRAY_SIZE(lpass_audio_hm_sc7180_gdscs),
|
.num_gdscs = ARRAY_SIZE(lpass_audio_hm_sc7180_gdscs),
|
||||||
};
|
};
|
||||||
|
|
||||||
static void lpass_pm_runtime_disable(void *data)
|
|
||||||
{
|
|
||||||
pm_runtime_disable(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lpass_pm_clk_destroy(void *data)
|
|
||||||
{
|
|
||||||
pm_clk_destroy(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lpass_create_pm_clks(struct platform_device *pdev)
|
static int lpass_create_pm_clks(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pm_runtime_use_autosuspend(&pdev->dev);
|
pm_runtime_use_autosuspend(&pdev->dev);
|
||||||
pm_runtime_set_autosuspend_delay(&pdev->dev, 500);
|
pm_runtime_set_autosuspend_delay(&pdev->dev, 500);
|
||||||
pm_runtime_enable(&pdev->dev);
|
|
||||||
|
|
||||||
ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_runtime_disable, &pdev->dev);
|
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = pm_clk_create(&pdev->dev);
|
ret = devm_pm_clk_create(&pdev->dev);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_clk_destroy, &pdev->dev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|||||||
2620
drivers/clk/qcom/mmcc-msm8994.c
Normal file
2620
drivers/clk/qcom/mmcc-msm8994.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -73,36 +73,23 @@ static int mss_sc7180_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||||
ret = pm_clk_create(&pdev->dev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto disable_pm_runtime;
|
return ret;
|
||||||
|
|
||||||
|
ret = devm_pm_clk_create(&pdev->dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = pm_clk_add(&pdev->dev, "cfg_ahb");
|
ret = pm_clk_add(&pdev->dev, "cfg_ahb");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "failed to acquire iface clock\n");
|
dev_err(&pdev->dev, "failed to acquire iface clock\n");
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = qcom_cc_probe(pdev, &mss_sc7180_desc);
|
ret = qcom_cc_probe(pdev, &mss_sc7180_desc);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto destroy_pm_clk;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
destroy_pm_clk:
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
|
|
||||||
disable_pm_runtime:
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
static int mss_sc7180_remove(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -119,7 +106,6 @@ MODULE_DEVICE_TABLE(of, mss_sc7180_match_table);
|
|||||||
|
|
||||||
static struct platform_driver mss_sc7180_driver = {
|
static struct platform_driver mss_sc7180_driver = {
|
||||||
.probe = mss_sc7180_probe,
|
.probe = mss_sc7180_probe,
|
||||||
.remove = mss_sc7180_remove,
|
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "sc7180-mss",
|
.name = "sc7180-mss",
|
||||||
.of_match_table = mss_sc7180_match_table,
|
.of_match_table = mss_sc7180_match_table,
|
||||||
|
|||||||
@@ -159,15 +159,18 @@ static int q6sstopcc_qcs404_probe(struct platform_device *pdev)
|
|||||||
const struct qcom_cc_desc *desc;
|
const struct qcom_cc_desc *desc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||||
ret = pm_clk_create(&pdev->dev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto disable_pm_runtime;
|
return ret;
|
||||||
|
|
||||||
|
ret = devm_pm_clk_create(&pdev->dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = pm_clk_add(&pdev->dev, NULL);
|
ret = pm_clk_add(&pdev->dev, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "failed to acquire iface clock\n");
|
dev_err(&pdev->dev, "failed to acquire iface clock\n");
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
q6sstop_regmap_config.name = "q6sstop_tcsr";
|
q6sstop_regmap_config.name = "q6sstop_tcsr";
|
||||||
@@ -175,30 +178,14 @@ static int q6sstopcc_qcs404_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
ret = qcom_cc_probe_by_index(pdev, 1, desc);
|
ret = qcom_cc_probe_by_index(pdev, 1, desc);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
|
|
||||||
q6sstop_regmap_config.name = "q6sstop_cc";
|
q6sstop_regmap_config.name = "q6sstop_cc";
|
||||||
desc = &q6sstop_qcs404_desc;
|
desc = &q6sstop_qcs404_desc;
|
||||||
|
|
||||||
ret = qcom_cc_probe_by_index(pdev, 0, desc);
|
ret = qcom_cc_probe_by_index(pdev, 0, desc);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto destroy_pm_clk;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
destroy_pm_clk:
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
|
|
||||||
disable_pm_runtime:
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
static int q6sstopcc_qcs404_remove(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -209,7 +196,6 @@ static const struct dev_pm_ops q6sstopcc_pm_ops = {
|
|||||||
|
|
||||||
static struct platform_driver q6sstopcc_qcs404_driver = {
|
static struct platform_driver q6sstopcc_qcs404_driver = {
|
||||||
.probe = q6sstopcc_qcs404_probe,
|
.probe = q6sstopcc_qcs404_probe,
|
||||||
.remove = q6sstopcc_qcs404_remove,
|
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "qcs404-q6sstopcc",
|
.name = "qcs404-q6sstopcc",
|
||||||
.of_match_table = q6sstopcc_qcs404_match_table,
|
.of_match_table = q6sstopcc_qcs404_match_table,
|
||||||
|
|||||||
@@ -110,36 +110,23 @@ static int turingcc_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pm_runtime_enable(&pdev->dev);
|
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||||
ret = pm_clk_create(&pdev->dev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto disable_pm_runtime;
|
return ret;
|
||||||
|
|
||||||
|
ret = devm_pm_clk_create(&pdev->dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = pm_clk_add(&pdev->dev, NULL);
|
ret = pm_clk_add(&pdev->dev, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "failed to acquire iface clock\n");
|
dev_err(&pdev->dev, "failed to acquire iface clock\n");
|
||||||
goto destroy_pm_clk;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = qcom_cc_probe(pdev, &turingcc_desc);
|
ret = qcom_cc_probe(pdev, &turingcc_desc);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto destroy_pm_clk;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
destroy_pm_clk:
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
|
|
||||||
disable_pm_runtime:
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
static int turingcc_remove(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
pm_clk_destroy(&pdev->dev);
|
|
||||||
pm_runtime_disable(&pdev->dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -156,7 +143,6 @@ MODULE_DEVICE_TABLE(of, turingcc_match_table);
|
|||||||
|
|
||||||
static struct platform_driver turingcc_driver = {
|
static struct platform_driver turingcc_driver = {
|
||||||
.probe = turingcc_probe,
|
.probe = turingcc_probe,
|
||||||
.remove = turingcc_remove,
|
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "qcs404-turingcc",
|
.name = "qcs404-turingcc",
|
||||||
.of_match_table = turingcc_match_table,
|
.of_match_table = turingcc_match_table,
|
||||||
|
|||||||
325
drivers/clk/qcom/videocc-sc7280.c
Normal file
325
drivers/clk/qcom/videocc-sc7280.c
Normal file
@@ -0,0 +1,325 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/regmap.h>
|
||||||
|
|
||||||
|
#include <dt-bindings/clock/qcom,videocc-sc7280.h>
|
||||||
|
|
||||||
|
#include "clk-alpha-pll.h"
|
||||||
|
#include "clk-branch.h"
|
||||||
|
#include "clk-rcg.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "reset.h"
|
||||||
|
#include "gdsc.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
P_BI_TCXO,
|
||||||
|
P_SLEEP_CLK,
|
||||||
|
P_VIDEO_PLL0_OUT_EVEN,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct pll_vco lucid_vco[] = {
|
||||||
|
{ 249600000, 2000000000, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 400MHz Configuration */
|
||||||
|
static const struct alpha_pll_config video_pll0_config = {
|
||||||
|
.l = 0x14,
|
||||||
|
.alpha = 0xD555,
|
||||||
|
.config_ctl_val = 0x20485699,
|
||||||
|
.config_ctl_hi_val = 0x00002261,
|
||||||
|
.config_ctl_hi1_val = 0x329A299C,
|
||||||
|
.user_ctl_val = 0x00000001,
|
||||||
|
.user_ctl_hi_val = 0x00000805,
|
||||||
|
.user_ctl_hi1_val = 0x00000000,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_alpha_pll video_pll0 = {
|
||||||
|
.offset = 0x0,
|
||||||
|
.vco_table = lucid_vco,
|
||||||
|
.num_vco = ARRAY_SIZE(lucid_vco),
|
||||||
|
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
|
||||||
|
.clkr = {
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_pll0",
|
||||||
|
.parent_data = &(const struct clk_parent_data){
|
||||||
|
.fw_name = "bi_tcxo",
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.ops = &clk_alpha_pll_lucid_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map video_cc_parent_map_0[] = {
|
||||||
|
{ P_BI_TCXO, 0 },
|
||||||
|
{ P_VIDEO_PLL0_OUT_EVEN, 3 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data video_cc_parent_data_0[] = {
|
||||||
|
{ .fw_name = "bi_tcxo" },
|
||||||
|
{ .hw = &video_pll0.clkr.hw },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct parent_map video_cc_parent_map_1[] = {
|
||||||
|
{ P_SLEEP_CLK, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct clk_parent_data video_cc_parent_data_1[] = {
|
||||||
|
{ .fw_name = "sleep_clk" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_video_cc_iris_clk_src[] = {
|
||||||
|
F(133333333, P_VIDEO_PLL0_OUT_EVEN, 3, 0, 0),
|
||||||
|
F(240000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
|
||||||
|
F(335000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
|
||||||
|
F(424000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
|
||||||
|
F(460000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 video_cc_iris_clk_src = {
|
||||||
|
.cmd_rcgr = 0x1000,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = video_cc_parent_map_0,
|
||||||
|
.freq_tbl = ftbl_video_cc_iris_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_iris_clk_src",
|
||||||
|
.parent_data = video_cc_parent_data_0,
|
||||||
|
.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_rcg2_shared_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
|
||||||
|
F(32000, P_SLEEP_CLK, 1, 0, 0),
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_rcg2 video_cc_sleep_clk_src = {
|
||||||
|
.cmd_rcgr = 0x701c,
|
||||||
|
.mnd_width = 0,
|
||||||
|
.hid_width = 5,
|
||||||
|
.parent_map = video_cc_parent_map_1,
|
||||||
|
.freq_tbl = ftbl_video_cc_sleep_clk_src,
|
||||||
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_sleep_clk_src",
|
||||||
|
.parent_data = video_cc_parent_data_1,
|
||||||
|
.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
|
||||||
|
.ops = &clk_rcg2_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_iris_ahb_clk = {
|
||||||
|
.halt_reg = 0x5004,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x5004,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_iris_ahb_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&video_cc_iris_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_mvs0_axi_clk = {
|
||||||
|
.halt_reg = 0x800c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x800c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_mvs0_axi_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_mvs0_core_clk = {
|
||||||
|
.halt_reg = 0x3010,
|
||||||
|
.halt_check = BRANCH_HALT_VOTED,
|
||||||
|
.hwcg_reg = 0x3010,
|
||||||
|
.hwcg_bit = 1,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x3010,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_mvs0_core_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&video_cc_iris_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_mvsc_core_clk = {
|
||||||
|
.halt_reg = 0x2014,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x2014,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_mvsc_core_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&video_cc_iris_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_mvsc_ctl_axi_clk = {
|
||||||
|
.halt_reg = 0x8004,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x8004,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_mvsc_ctl_axi_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_sleep_clk = {
|
||||||
|
.halt_reg = 0x7034,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x7034,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_sleep_clk",
|
||||||
|
.parent_hws = (const struct clk_hw*[]){
|
||||||
|
&video_cc_sleep_clk_src.clkr.hw,
|
||||||
|
},
|
||||||
|
.num_parents = 1,
|
||||||
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_branch video_cc_venus_ahb_clk = {
|
||||||
|
.halt_reg = 0x801c,
|
||||||
|
.halt_check = BRANCH_HALT,
|
||||||
|
.clkr = {
|
||||||
|
.enable_reg = 0x801c,
|
||||||
|
.enable_mask = BIT(0),
|
||||||
|
.hw.init = &(struct clk_init_data){
|
||||||
|
.name = "video_cc_venus_ahb_clk",
|
||||||
|
.ops = &clk_branch2_ops,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc mvs0_gdsc = {
|
||||||
|
.gdscr = 0x3004,
|
||||||
|
.pd = {
|
||||||
|
.name = "mvs0_gdsc",
|
||||||
|
},
|
||||||
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
.flags = HW_CTRL | RETAIN_FF_ENABLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc mvsc_gdsc = {
|
||||||
|
.gdscr = 0x2004,
|
||||||
|
.pd = {
|
||||||
|
.name = "mvsc_gdsc",
|
||||||
|
},
|
||||||
|
.flags = RETAIN_FF_ENABLE,
|
||||||
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk_regmap *video_cc_sc7280_clocks[] = {
|
||||||
|
[VIDEO_CC_IRIS_AHB_CLK] = &video_cc_iris_ahb_clk.clkr,
|
||||||
|
[VIDEO_CC_IRIS_CLK_SRC] = &video_cc_iris_clk_src.clkr,
|
||||||
|
[VIDEO_CC_MVS0_AXI_CLK] = &video_cc_mvs0_axi_clk.clkr,
|
||||||
|
[VIDEO_CC_MVS0_CORE_CLK] = &video_cc_mvs0_core_clk.clkr,
|
||||||
|
[VIDEO_CC_MVSC_CORE_CLK] = &video_cc_mvsc_core_clk.clkr,
|
||||||
|
[VIDEO_CC_MVSC_CTL_AXI_CLK] = &video_cc_mvsc_ctl_axi_clk.clkr,
|
||||||
|
[VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
|
||||||
|
[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
|
||||||
|
[VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr,
|
||||||
|
[VIDEO_PLL0] = &video_pll0.clkr,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gdsc *video_cc_sc7280_gdscs[] = {
|
||||||
|
[MVS0_GDSC] = &mvs0_gdsc,
|
||||||
|
[MVSC_GDSC] = &mvsc_gdsc,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct regmap_config video_cc_sc7280_regmap_config = {
|
||||||
|
.reg_bits = 32,
|
||||||
|
.reg_stride = 4,
|
||||||
|
.val_bits = 32,
|
||||||
|
.max_register = 0xb000,
|
||||||
|
.fast_io = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct qcom_cc_desc video_cc_sc7280_desc = {
|
||||||
|
.config = &video_cc_sc7280_regmap_config,
|
||||||
|
.clks = video_cc_sc7280_clocks,
|
||||||
|
.num_clks = ARRAY_SIZE(video_cc_sc7280_clocks),
|
||||||
|
.gdscs = video_cc_sc7280_gdscs,
|
||||||
|
.num_gdscs = ARRAY_SIZE(video_cc_sc7280_gdscs),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id video_cc_sc7280_match_table[] = {
|
||||||
|
{ .compatible = "qcom,sc7280-videocc" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, video_cc_sc7280_match_table);
|
||||||
|
|
||||||
|
static int video_cc_sc7280_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct regmap *regmap;
|
||||||
|
|
||||||
|
regmap = qcom_cc_map(pdev, &video_cc_sc7280_desc);
|
||||||
|
if (IS_ERR(regmap))
|
||||||
|
return PTR_ERR(regmap);
|
||||||
|
|
||||||
|
clk_lucid_pll_configure(&video_pll0, regmap, &video_pll0_config);
|
||||||
|
|
||||||
|
return qcom_cc_really_probe(pdev, &video_cc_sc7280_desc, regmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver video_cc_sc7280_driver = {
|
||||||
|
.probe = video_cc_sc7280_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "video_cc-sc7280",
|
||||||
|
.of_match_table = video_cc_sc7280_match_table,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init video_cc_sc7280_init(void)
|
||||||
|
{
|
||||||
|
return platform_driver_register(&video_cc_sc7280_driver);
|
||||||
|
}
|
||||||
|
subsys_initcall(video_cc_sc7280_init);
|
||||||
|
|
||||||
|
static void __exit video_cc_sc7280_exit(void)
|
||||||
|
{
|
||||||
|
platform_driver_unregister(&video_cc_sc7280_driver);
|
||||||
|
}
|
||||||
|
module_exit(video_cc_sc7280_exit);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("QTI VIDEO_CC sc7280 Driver");
|
||||||
|
MODULE_LICENSE("GPL v2");
|
||||||
@@ -131,14 +131,7 @@ static int mt7621_gate_ops_init(struct device *dev,
|
|||||||
struct mt7621_gate *sclk)
|
struct mt7621_gate *sclk)
|
||||||
{
|
{
|
||||||
struct clk_init_data init = {
|
struct clk_init_data init = {
|
||||||
/*
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
* Until now no clock driver existed so
|
|
||||||
* these SoC drivers are not prepared
|
|
||||||
* yet for the clock. We don't want kernel to
|
|
||||||
* disable anything so we add CLK_IS_CRITICAL
|
|
||||||
* flag here.
|
|
||||||
*/
|
|
||||||
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
.parent_names = &sclk->parent_name,
|
.parent_names = &sclk->parent_name,
|
||||||
.ops = &mt7621_gate_ops,
|
.ops = &mt7621_gate_ops,
|
||||||
|
|||||||
@@ -153,9 +153,7 @@ config CLK_R8A779A0
|
|||||||
select CLK_RENESAS_CPG_MSSR
|
select CLK_RENESAS_CPG_MSSR
|
||||||
|
|
||||||
config CLK_R9A06G032
|
config CLK_R9A06G032
|
||||||
bool "Renesas R9A06G032 clock driver"
|
bool "RZ/N1D clock support" if COMPILE_TEST
|
||||||
help
|
|
||||||
This is a driver for R9A06G032 clocks
|
|
||||||
|
|
||||||
config CLK_R9A07G044
|
config CLK_R9A07G044
|
||||||
bool "RZ/G2L clock support" if COMPILE_TEST
|
bool "RZ/G2L clock support" if COMPILE_TEST
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ obj-$(CONFIG_CLK_RCAR_CPG_LIB) += rcar-cpg-lib.o
|
|||||||
obj-$(CONFIG_CLK_RCAR_GEN2_CPG) += rcar-gen2-cpg.o
|
obj-$(CONFIG_CLK_RCAR_GEN2_CPG) += rcar-gen2-cpg.o
|
||||||
obj-$(CONFIG_CLK_RCAR_GEN3_CPG) += rcar-gen3-cpg.o
|
obj-$(CONFIG_CLK_RCAR_GEN3_CPG) += rcar-gen3-cpg.o
|
||||||
obj-$(CONFIG_CLK_RCAR_USB2_CLOCK_SEL) += rcar-usb2-clock-sel.o
|
obj-$(CONFIG_CLK_RCAR_USB2_CLOCK_SEL) += rcar-usb2-clock-sel.o
|
||||||
obj-$(CONFIG_CLK_RZG2L) += renesas-rzg2l-cpg.o
|
obj-$(CONFIG_CLK_RZG2L) += rzg2l-cpg.o
|
||||||
|
|
||||||
# Generic
|
# Generic
|
||||||
obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o
|
obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user