mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
Not a ton of stuff happening in the clk framework in this pull request. We got
some more devm helpers and we seem to be going in the direction of "just turn this stuff on already and leave me alone!" with the addition of a devm_clk_bulk_get_all_enable() API. I'm hoping that we can make that into a genpd that drivers attach instead, but this API should help drivers simplify in the meantime. Outside of the devm wrappers, we've got the usual clk driver updates that are dominated by the major phone SoC vendors (Samsung and Qualcomm) and the non-critical driver fixes for things like incorrect topology descriptions and wrong registers or bit fields. More details are below, but I'd say that it looks pretty ordinary. The only thing that really jumps out at me is the Renesas clk driver that's ignoring clks that are assigned to remote processors in DeviceTree. That's a new feature that they're using to avoid marking clks as CLK_IGNORE_UNUSED based on the configuration of the system. Core: - Increase dev_id len for clkdev lookups - Add a devm_clk_bulk_get_all_enable() API to get and enable all clks for a device - Add a devm variant of clk_rate_exclusive_get() New Drivers: - Display, TCSR, GPU, and Camera clock controllers for Qualcomm's X1 Elite SoC - Google GS101 PERIC0 and PERIC1 clock controllers - Exynos850 PDMA clocks - Exynos850 CPU cluster 0 and 1 (CMU_CPUCLK0/CMU_CPUCLK1) clock controllers Removed Drivers: - Remove the unused Qualcomm sc7180 modem clk driver Updates: - Fix some static checker errors in the Hisilicon clk driver - Polarfire MSSPLL hardware has 4 output clocks (the driver supported previously only one output); each of these 4 outputs feed dividers and the output of each divider feed individual hardware blocks (e.g. CAN, Crypto, eMMC); individual hardware block drivers need to control their clocks thus clock driver support was added for all MSSPLL output clocks - Typo fixes in the Qualcomm IPQ5018 GCC driver - Add "qdss_at" clk on Qualcomm IPQ6018, needed for WiFi - Properly terminate frequency tables in different Qualcomm clk drivers - Add MDSS, crypto, and SDCC resets on Qualcomm MSM8953 - Add missing UFS CLKREF clks on Qualcomm SC8180X - Avoid significant delays during boot by adding a softdep on rpmhpd to Qualcomm SDM845 gcc driver - Add QUPv3 RCGS w/ DFS and video resets to Qualcomm SM8150 GCC driver - Fix the custom GPU GX "do-nothing" method in the Qualcomm GDSC driver - Add an external regulator to GX GDSC on Qualcomm SC8280XP GPU clk driver - Switch display, GPU, video, and camera Qualcomm clk drivers to module_platform_driver() - Set a longer delay for Venus resets on many Qualcomm SoCs - Correct the GDSC wait times in the Qualcomm SDM845 display clk driver - Fix clock listing Oops on Amlogic axg - New pll-rate for Rockchip rk3568 - i2s rate improvements for Rockchip rk3399 - Rockchip rk3588 syscon clock fixes and removal of overall clock-number from the rk3588 binding header - A prerequisite for later improvements to the Rockchip rk3588 linked clocks - Minor clean-ups and error handling improvements in both composite-8m and SCU i.MX clock drivers - Fix for SAI_MCLK_SEL definition for i.MX8MP - Register the Samsung CMU MISC clock controller earlier, so the Multi Core Timer clocksource can use it on Google GS101 - Propagate Exynos850 SPI IPCLK rate change to parents, so the SPI will get proper clock rates - Refactor the generic Samsung CPU clock controllers code, preparing it for supporting Exynos850 CPU clocks - Fix some clk kerneldoc warnings - Add Ethernet, SDHI, DMA, and HyperFLASH/QSPI (RPC-IF) clocks on Renesas R-Car V4M - Ignore all clocks which are assigned to a non-Linux system in the Renesas clk driver - Add watchdog clock on Renesas RZ/G3S - Add camera (CRU) clock and reset on Renesas RZ/G2UL - Add support for the Renesas R-Car V4M (R8A779H0) SoC - Convert some clk bindings to YAML so they can be validated -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAmXzUpURHHNib3lkQGtl cm5lbC5vcmcACgkQrQKIl8bklSXEvQ/+K0Llv6Jgs/VJkg086qE7z82KvIQRUasi Rhxtq8P9DS4KYBd1BB0Wwsrh2CyW9ZWUn0unQ1ZtbxCHKE1lweYb4UkafNamRynT cKlXR5wGNtbHUF6Gmdjw+lkuF6pxj3ZcmV47bQyhLMctndWn434sIn3gpv2pTYF2 Q/ZwhhiS2ZQU1hdpgHwe9iIRJ7QcGlWKyhRx9m5QSRIL7eZFiUvBcYNAdoSa1ovr FZOSUAUaxxDu16VrC8mPjaMQ3lDqz8DVSw3i1cDsMdYHbBidzlNLzBH9L+qFgXng cYqYR3dlJ6HuXr9wwwe5X3Pm01VZ6Askl16h9tUnZgtZuSuxMPeWMw2brZZPNFOn L0SvHdLFj4MzyhgXWtQughttzdOwaRP9lNZNZwchMU5aEU0e3GDeBUBeJ0CRAAqD DHRYQW3vDlIG4mhrr54GgQ5XjeHqj9W5OrGU/dWmBp+/e1wB3MB47UJf0GJ7F9kA BNvMFtk9hRJkmqsKY93mWpKOe3su2Fl/1vlhK9Tw5V8h/GzBnEsVDUNRYaRaN+wd gYTEo73T2FJ4OSYncRDeSPXTmKeI2+4sa1XJKx8rasEZNOR2V3DH/8bMXZhjSbzL nZDh+eu0uyS6+xVReE6349ivSPyNDEXO0IbI7yq7jjSYB+LxW49O2xMeoYuNSjtz RxKHQr0skqs= =rRIa -----END PGP SIGNATURE----- Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux Pull clk updates from Stephen Boyd: "Not a ton of stuff happening in the clk framework. We got some more devm helpers and we seem to be going in the direction of "just turn this stuff on already and leave me alone!" with the addition of a devm_clk_bulk_get_all_enable() API. I'm hoping that we can make that into a pmdomain that drivers attach instead, but this API should help drivers simplify in the meantime. Outside of the devm wrappers, we've got the usual clk driver updates that are dominated by the major phone SoC vendors (Samsung and Qualcomm) and the non-critical driver fixes for things like incorrect topology descriptions and wrong registers or bit fields. More details are below, but I'd say that it looks pretty ordinary. The only thing that really jumps out at me is the Renesas clk driver that's ignoring clks that are assigned to remote processors in DeviceTree. That's a new feature that they're using to avoid marking clks as CLK_IGNORE_UNUSED based on the configuration of the system. Core: - Increase dev_id len for clkdev lookups - Add a devm_clk_bulk_get_all_enable() API to get and enable all clks for a device - Add a devm variant of clk_rate_exclusive_get() New Drivers: - Display, TCSR, GPU, and Camera clock controllers for Qualcomm's X1 Elite SoC - Google GS101 PERIC0 and PERIC1 clock controllers - Exynos850 PDMA clocks - Exynos850 CPU cluster 0 and 1 (CMU_CPUCLK0/CMU_CPUCLK1) clock controllers Removed Drivers: - Remove the unused Qualcomm sc7180 modem clk driver Updates: - Fix some static checker errors in the Hisilicon clk driver - Polarfire MSSPLL hardware has 4 output clocks (the driver supported previously only one output); each of these 4 outputs feed dividers and the output of each divider feed individual hardware blocks (e.g. CAN, Crypto, eMMC); individual hardware block drivers need to control their clocks thus clock driver support was added for all MSSPLL output clocks - Typo fixes in the Qualcomm IPQ5018 GCC driver - Add "qdss_at" clk on Qualcomm IPQ6018, needed for WiFi - Properly terminate frequency tables in different Qualcomm clk drivers - Add MDSS, crypto, and SDCC resets on Qualcomm MSM8953 - Add missing UFS CLKREF clks on Qualcomm SC8180X - Avoid significant delays during boot by adding a softdep on rpmhpd to Qualcomm SDM845 gcc driver - Add QUPv3 RCGS w/ DFS and video resets to Qualcomm SM8150 GCC driver - Fix the custom GPU GX "do-nothing" method in the Qualcomm GDSC driver - Add an external regulator to GX GDSC on Qualcomm SC8280XP GPU clk driver - Switch display, GPU, video, and camera Qualcomm clk drivers to module_platform_driver() - Set a longer delay for Venus resets on many Qualcomm SoCs - Correct the GDSC wait times in the Qualcomm SDM845 display clk driver - Fix clock listing Oops on Amlogic axg - New pll-rate for Rockchip rk3568 - i2s rate improvements for Rockchip rk3399 - Rockchip rk3588 syscon clock fixes and removal of overall clock-number from the rk3588 binding header - A prerequisite for later improvements to the Rockchip rk3588 linked clocks - Minor clean-ups and error handling improvements in both composite-8m and SCU i.MX clock drivers - Fix for SAI_MCLK_SEL definition for i.MX8MP - Register the Samsung CMU MISC clock controller earlier, so the Multi Core Timer clocksource can use it on Google GS101 - Propagate Exynos850 SPI IPCLK rate change to parents, so the SPI will get proper clock rates - Refactor the generic Samsung CPU clock controllers code, preparing it for supporting Exynos850 CPU clocks - Fix some clk kerneldoc warnings - Add Ethernet, SDHI, DMA, and HyperFLASH/QSPI (RPC-IF) clocks on Renesas R-Car V4M - Ignore all clocks which are assigned to a non-Linux system in the Renesas clk driver - Add watchdog clock on Renesas RZ/G3S - Add camera (CRU) clock and reset on Renesas RZ/G2UL - Add support for the Renesas R-Car V4M (R8A779H0) SoC - Convert some clk bindings to YAML so they can be validated" * tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (150 commits) clk: zynq: Prevent null pointer dereference caused by kmalloc failure clk: fractional-divider: Use bit operations consistently clk: fractional-divider: Move mask calculations out of lock clk: Fix clk_core_get NULL dereference clk: starfive: jh7110-vout: Convert to platform remove callback returning void clk: starfive: jh7110-isp: Convert to platform remove callback returning void clk: imx: imx8-acm: Convert to platform remove callback returning void clk: qcom: gcc-ipq5018: fix register offset for GCC_UBI0_AXI_ARES reset clk: qcom: gcc-ipq5018: fix 'halt_reg' offset of 'gcc_pcie1_pipe_clk' clk: qcom: gcc-ipq5018: fix 'enable_reg' offset of 'gcc_gmac0_sys_clk' clk: qcom: camcc-x1e80100: Fix missing DT_IFACE enum in x1e80100 camcc clk: qcom: mmcc-msm8974: fix terminating of frequency table arrays clk: qcom: mmcc-apq8084: fix terminating of frequency table arrays clk: qcom: camcc-sc8280xp: fix terminating of frequency table arrays clk: qcom: gcc-ipq9574: fix terminating of frequency table arrays clk: qcom: gcc-ipq8074: fix terminating of frequency table arrays clk: qcom: gcc-ipq6018: fix terminating of frequency table arrays clk: qcom: gcc-ipq5018: fix terminating of frequency table arrays clk: mediatek: clk-mt8173-apmixedsys: Use common error handling code in clk_mt8173_apmixed_probe() clk: Add a devm variant of clk_rate_exclusive_get() ...
This commit is contained in:
commit
6dff52b828
5
CREDITS
5
CREDITS
@ -2960,6 +2960,11 @@ S: 2364 Old Trail Drive
|
||||
S: Reston, Virginia 20191
|
||||
S: USA
|
||||
|
||||
N: Sekhar Nori
|
||||
E: nori.sekhar@gmail.com
|
||||
D: Maintainer of Texas Instruments DaVinci machine support, contributor
|
||||
D: to device drivers relevant to that SoC family.
|
||||
|
||||
N: Fredrik Noring
|
||||
E: noring@nocrew.org
|
||||
W: http://www.lysator.liu.se/~noring/
|
||||
|
@ -1,26 +0,0 @@
|
||||
Mediatek hifsys controller
|
||||
============================
|
||||
|
||||
The Mediatek hifsys controller provides various clocks and reset
|
||||
outputs to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt2701-hifsys", "syscon"
|
||||
- "mediatek,mt7622-hifsys", "syscon"
|
||||
- "mediatek,mt7623-hifsys", "mediatek,mt2701-hifsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
|
||||
The hifsys controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
hifsys: clock-controller@1a000000 {
|
||||
compatible = "mediatek,mt2701-hifsys", "syscon";
|
||||
reg = <0 0x1a000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -1,25 +0,0 @@
|
||||
MediaTek PCIESYS controller
|
||||
============================
|
||||
|
||||
The MediaTek PCIESYS controller provides various clocks to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt7622-pciesys", "syscon"
|
||||
- "mediatek,mt7629-pciesys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
- #reset-cells: Must be 1
|
||||
|
||||
The PCIESYS controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
pciesys: pciesys@1a100800 {
|
||||
compatible = "mediatek,mt7622-pciesys", "syscon";
|
||||
reg = <0 0x1a100800 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -1,25 +0,0 @@
|
||||
MediaTek SSUSBSYS controller
|
||||
============================
|
||||
|
||||
The MediaTek SSUSBSYS controller provides various clocks to the system.
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Should be:
|
||||
- "mediatek,mt7622-ssusbsys", "syscon"
|
||||
- "mediatek,mt7629-ssusbsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
- #reset-cells: Must be 1
|
||||
|
||||
The SSUSBSYS controller uses the common clk binding from
|
||||
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||
|
||||
Example:
|
||||
|
||||
ssusbsys: ssusbsys@1a000000 {
|
||||
compatible = "mediatek,mt7622-ssusbsys", "syscon";
|
||||
reg = <0 0x1a000000 0 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,50 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt2701-hifsys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek HIFSYS clock and reset controller
|
||||
|
||||
description:
|
||||
The MediaTek HIFSYS controller provides various clocks and reset outputs to
|
||||
the system.
|
||||
|
||||
maintainers:
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- mediatek,mt2701-hifsys
|
||||
- mediatek,mt7622-hifsys
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt7623-hifsys
|
||||
- const: mediatek,mt2701-hifsys
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description: The available clocks are defined in dt-bindings/clock/mt*-clk.h
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1a000000 {
|
||||
compatible = "mediatek,mt2701-hifsys";
|
||||
reg = <0x1a000000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt7622-pciesys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek PCIESYS clock and reset controller
|
||||
|
||||
description:
|
||||
The MediaTek PCIESYS controller provides various clocks to the system.
|
||||
|
||||
maintainers:
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt7622-pciesys
|
||||
- mediatek,mt7629-pciesys
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description: The available clocks are defined in dt-bindings/clock/mt*-clk.h
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1a100800 {
|
||||
compatible = "mediatek,mt7622-pciesys";
|
||||
reg = <0x1a100800 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mediatek,mt7622-ssusbsys.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek SSUSBSYS clock and reset controller
|
||||
|
||||
description:
|
||||
The MediaTek SSUSBSYS controller provides various clocks to the system.
|
||||
|
||||
maintainers:
|
||||
- Matthias Brugger <matthias.bgg@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt7622-ssusbsys
|
||||
- mediatek,mt7629-ssusbsys
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
description: The available clocks are defined in dt-bindings/clock/mt*-clk.h
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
clock-controller@1a000000 {
|
||||
compatible = "mediatek,mt7622-ssusbsys";
|
||||
reg = <0x1a000000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
@ -0,0 +1,51 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/mobileye,eyeq5-clk.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mobileye EyeQ5 clock controller
|
||||
|
||||
description:
|
||||
The EyeQ5 clock controller handles 10 read-only PLLs derived from the main
|
||||
crystal clock. It also exposes one divider clock, a child of one of the PLLs.
|
||||
Its registers live in a shared region called OLB.
|
||||
|
||||
maintainers:
|
||||
- Grégory Clement <gregory.clement@bootlin.com>
|
||||
- Théo Lebrun <theo.lebrun@bootlin.com>
|
||||
- Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mobileye,eyeq5-clk
|
||||
|
||||
reg:
|
||||
maxItems: 2
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: plls
|
||||
- const: ospi
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description:
|
||||
Input parent clock to all PLLs. Expected to be the main crystal.
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ref
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- "#clock-cells"
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
@ -53,6 +53,9 @@ properties:
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
vdd-gfx-supply:
|
||||
description: Regulator supply for the VDD_GFX pads
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
@ -74,6 +77,12 @@ required:
|
||||
- '#reset-cells'
|
||||
- '#power-domain-cells'
|
||||
|
||||
# Require that power-domains and vdd-gfx-supply are not both present
|
||||
not:
|
||||
required:
|
||||
- power-domains
|
||||
- vdd-gfx-supply
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
title: Q6SSTOP clock Controller
|
||||
|
||||
maintainers:
|
||||
- Govind Singh <govinds@codeaurora.org>
|
||||
- Bjorn Andersson <andersson@kernel.org>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -1,61 +0,0 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,sc7180-mss.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Modem Clock Controller on SC7180
|
||||
|
||||
maintainers:
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm modem clock control module provides the clocks on SC7180.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,mss-sc7180.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sc7180-mss
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: gcc_mss_mfab_axi clock from GCC
|
||||
- description: gcc_mss_nav_axi clock from GCC
|
||||
- description: gcc_mss_cfg_ahb clock from GCC
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: gcc_mss_mfab_axis
|
||||
- const: gcc_mss_nav_axi
|
||||
- const: cfg_ahb
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- '#clock-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,gcc-sc7180.h>
|
||||
clock-controller@41a8000 {
|
||||
compatible = "qcom,sc7180-mss";
|
||||
reg = <0x041a8000 0x8000>;
|
||||
clocks = <&gcc GCC_MSS_MFAB_AXIS_CLK>,
|
||||
<&gcc GCC_MSS_NAV_AXI_CLK>,
|
||||
<&gcc GCC_MSS_CFG_AHB_CLK>;
|
||||
clock-names = "gcc_mss_mfab_axis",
|
||||
"gcc_mss_nav_axi",
|
||||
"cfg_ahb";
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
...
|
@ -36,6 +36,8 @@ properties:
|
||||
- samsung,exynos850-cmu-aud
|
||||
- samsung,exynos850-cmu-cmgp
|
||||
- samsung,exynos850-cmu-core
|
||||
- samsung,exynos850-cmu-cpucl0
|
||||
- samsung,exynos850-cmu-cpucl1
|
||||
- samsung,exynos850-cmu-dpu
|
||||
- samsung,exynos850-cmu-g3d
|
||||
- samsung,exynos850-cmu-hsi
|
||||
@ -152,6 +154,46 @@ allOf:
|
||||
- const: dout_core_mmc_embd
|
||||
- const: dout_core_sss
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos850-cmu-cpucl0
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: External reference clock (26 MHz)
|
||||
- description: CPUCL0 switch clock (from CMU_TOP)
|
||||
- description: CPUCL0 debug clock (from CMU_TOP)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: oscclk
|
||||
- const: dout_cpucl0_switch
|
||||
- const: dout_cpucl0_dbg
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos850-cmu-cpucl1
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: External reference clock (26 MHz)
|
||||
- description: CPUCL1 switch clock (from CMU_TOP)
|
||||
- description: CPUCL1 debug clock (from CMU_TOP)
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: oscclk
|
||||
- const: dout_cpucl1_switch
|
||||
- const: dout_cpucl1_dbg
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -12,7 +12,7 @@ maintainers:
|
||||
|
||||
description: |
|
||||
FSD clock controller consist of several clock management unit
|
||||
(CMU), which generates clocks for various inteernal SoC blocks.
|
||||
(CMU), which generates clocks for various internal SoC blocks.
|
||||
The root clock comes from external OSC clock (24 MHz).
|
||||
|
||||
All available clocks are defined as preprocessor macros in
|
||||
|
@ -24,7 +24,9 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
items:
|
||||
- description: AHB peripheral clock
|
||||
- description: CAN bus clock
|
||||
|
||||
required:
|
||||
- compatible
|
||||
@ -39,7 +41,7 @@ examples:
|
||||
can@2010c000 {
|
||||
compatible = "microchip,mpfs-can";
|
||||
reg = <0x2010c000 0x1000>;
|
||||
clocks = <&clkcfg 17>;
|
||||
clocks = <&clkcfg 17>, <&clkcfg 37>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <56>;
|
||||
};
|
||||
|
@ -0,0 +1,43 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/reset/mobileye,eyeq5-reset.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mobileye EyeQ5 reset controller
|
||||
|
||||
description:
|
||||
The EyeQ5 reset driver handles three reset domains. Its registers live in a
|
||||
shared region called OLB.
|
||||
|
||||
maintainers:
|
||||
- Grégory Clement <gregory.clement@bootlin.com>
|
||||
- Théo Lebrun <theo.lebrun@bootlin.com>
|
||||
- Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mobileye,eyeq5-reset
|
||||
|
||||
reg:
|
||||
maxItems: 3
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: d0
|
||||
- const: d1
|
||||
- const: d2
|
||||
|
||||
"#reset-cells":
|
||||
const: 2
|
||||
description:
|
||||
The first cell is the domain (0 to 2 inclusive) and the second one is the
|
||||
reset index inside that domain.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
@ -22005,7 +22005,6 @@ F: drivers/i2c/busses/i2c-davinci.c
|
||||
|
||||
TI DAVINCI SERIES CLOCK DRIVER
|
||||
M: David Lechner <david@lechnology.com>
|
||||
R: Sekhar Nori <nsekhar@ti.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/clock/ti/davinci/
|
||||
F: drivers/clk/davinci/
|
||||
|
@ -19,7 +19,7 @@
|
||||
* This includes the gates (configured from aspeed_g6_gates), plus the
|
||||
* explicitly-configured clocks (ASPEED_CLK_HPLL and up).
|
||||
*/
|
||||
#define ASPEED_G6_NUM_CLKS 72
|
||||
#define ASPEED_G6_NUM_CLKS 73
|
||||
|
||||
#define ASPEED_G6_SILICON_REV 0x014
|
||||
#define CHIP_REVISION_ID GENMASK(23, 16)
|
||||
@ -157,7 +157,7 @@ static const struct aspeed_gate_data aspeed_g6_gates[] = {
|
||||
[ASPEED_CLK_GATE_UART11CLK] = { 59, -1, "uart11clk-gate", "uartx", 0 }, /* UART11 */
|
||||
[ASPEED_CLK_GATE_UART12CLK] = { 60, -1, "uart12clk-gate", "uartx", 0 }, /* UART12 */
|
||||
[ASPEED_CLK_GATE_UART13CLK] = { 61, -1, "uart13clk-gate", "uartx", 0 }, /* UART13 */
|
||||
[ASPEED_CLK_GATE_FSICLK] = { 62, 59, "fsiclk-gate", NULL, 0 }, /* FSI */
|
||||
[ASPEED_CLK_GATE_FSICLK] = { 62, 59, "fsiclk-gate", "fsiclk", 0 }, /* FSI */
|
||||
};
|
||||
|
||||
static const struct clk_div_table ast2600_eclk_div_table[] = {
|
||||
@ -821,6 +821,9 @@ static void __init aspeed_g6_cc(struct regmap *map)
|
||||
|
||||
hw = clk_hw_register_fixed_factor(NULL, "i3cclk", "apll", 0, 1, 8);
|
||||
aspeed_g6_clk_data->hws[ASPEED_CLK_I3C] = hw;
|
||||
|
||||
hw = clk_hw_register_fixed_factor(NULL, "fsiclk", "apll", 0, 1, 4);
|
||||
aspeed_g6_clk_data->hws[ASPEED_CLK_FSI] = hw;
|
||||
};
|
||||
|
||||
static void __init aspeed_g6_cc_init(struct device_node *np)
|
||||
|
@ -101,7 +101,6 @@ static void cdce925_pll_find_rate(unsigned long rate,
|
||||
|
||||
if (rate <= parent_rate) {
|
||||
/* Can always deliver parent_rate in bypass mode */
|
||||
rate = parent_rate;
|
||||
*n = 0;
|
||||
*m = 0;
|
||||
} else {
|
||||
|
@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all);
|
||||
|
||||
static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
|
||||
{
|
||||
struct clk_bulk_devres *devres = res;
|
||||
|
||||
clk_bulk_disable_unprepare(devres->num_clks, devres->clks);
|
||||
clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
}
|
||||
|
||||
int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
|
||||
struct clk_bulk_data **clks)
|
||||
{
|
||||
struct clk_bulk_devres *devres;
|
||||
int ret;
|
||||
|
||||
devres = devres_alloc(devm_clk_bulk_release_all_enable,
|
||||
sizeof(*devres), GFP_KERNEL);
|
||||
if (!devres)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = clk_bulk_get_all(dev, &devres->clks);
|
||||
if (ret > 0) {
|
||||
*clks = devres->clks;
|
||||
devres->num_clks = ret;
|
||||
} else {
|
||||
devres_free(devres);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
|
||||
if (!ret) {
|
||||
devres_add(dev, devres);
|
||||
} else {
|
||||
clk_bulk_put_all(devres->num_clks, devres->clks);
|
||||
devres_free(devres);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
|
||||
|
||||
static int devm_clk_match(struct device *dev, void *res, void *data)
|
||||
{
|
||||
struct clk **c = res;
|
||||
|
@ -57,10 +57,22 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long clk_factor_recalc_accuracy(struct clk_hw *hw,
|
||||
unsigned long parent_accuracy)
|
||||
{
|
||||
struct clk_fixed_factor *fix = to_clk_fixed_factor(hw);
|
||||
|
||||
if (fix->flags & CLK_FIXED_FACTOR_FIXED_ACCURACY)
|
||||
return fix->acc;
|
||||
|
||||
return parent_accuracy;
|
||||
}
|
||||
|
||||
const struct clk_ops clk_fixed_factor_ops = {
|
||||
.round_rate = clk_factor_round_rate,
|
||||
.set_rate = clk_factor_set_rate,
|
||||
.recalc_rate = clk_factor_recalc_rate,
|
||||
.recalc_accuracy = clk_factor_recalc_accuracy,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_fixed_factor_ops);
|
||||
|
||||
@ -79,13 +91,12 @@ static void devm_clk_hw_register_fixed_factor_release(struct device *dev, void *
|
||||
static struct clk_hw *
|
||||
__clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
|
||||
const char *name, const char *parent_name,
|
||||
const struct clk_hw *parent_hw, int index,
|
||||
const struct clk_hw *parent_hw, const struct clk_parent_data *pdata,
|
||||
unsigned long flags, unsigned int mult, unsigned int div,
|
||||
bool devm)
|
||||
unsigned long acc, unsigned int fixflags, bool devm)
|
||||
{
|
||||
struct clk_fixed_factor *fix;
|
||||
struct clk_init_data init = { };
|
||||
struct clk_parent_data pdata = { .index = index };
|
||||
struct clk_hw *hw;
|
||||
int ret;
|
||||
|
||||
@ -105,6 +116,8 @@ __clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
|
||||
fix->mult = mult;
|
||||
fix->div = div;
|
||||
fix->hw.init = &init;
|
||||
fix->acc = acc;
|
||||
fix->flags = fixflags;
|
||||
|
||||
init.name = name;
|
||||
init.ops = &clk_fixed_factor_ops;
|
||||
@ -114,7 +127,7 @@ __clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
|
||||
else if (parent_hw)
|
||||
init.parent_hws = &parent_hw;
|
||||
else
|
||||
init.parent_data = &pdata;
|
||||
init.parent_data = pdata;
|
||||
init.num_parents = 1;
|
||||
|
||||
hw = &fix->hw;
|
||||
@ -151,8 +164,10 @@ struct clk_hw *devm_clk_hw_register_fixed_factor_index(struct device *dev,
|
||||
const char *name, unsigned int index, unsigned long flags,
|
||||
unsigned int mult, unsigned int div)
|
||||
{
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, NULL, index,
|
||||
flags, mult, div, true);
|
||||
const struct clk_parent_data pdata = { .index = index };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, NULL, &pdata,
|
||||
flags, mult, div, 0, 0, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_index);
|
||||
|
||||
@ -173,8 +188,10 @@ struct clk_hw *devm_clk_hw_register_fixed_factor_parent_hw(struct device *dev,
|
||||
const char *name, const struct clk_hw *parent_hw,
|
||||
unsigned long flags, unsigned int mult, unsigned int div)
|
||||
{
|
||||
const struct clk_parent_data pdata = { .index = -1 };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, parent_hw,
|
||||
-1, flags, mult, div, true);
|
||||
&pdata, flags, mult, div, 0, 0, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_parent_hw);
|
||||
|
||||
@ -182,9 +199,10 @@ struct clk_hw *clk_hw_register_fixed_factor_parent_hw(struct device *dev,
|
||||
const char *name, const struct clk_hw *parent_hw,
|
||||
unsigned long flags, unsigned int mult, unsigned int div)
|
||||
{
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL,
|
||||
parent_hw, -1, flags, mult, div,
|
||||
false);
|
||||
const struct clk_parent_data pdata = { .index = -1 };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, parent_hw,
|
||||
&pdata, flags, mult, div, 0, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_register_fixed_factor_parent_hw);
|
||||
|
||||
@ -192,11 +210,37 @@ struct clk_hw *clk_hw_register_fixed_factor(struct device *dev,
|
||||
const char *name, const char *parent_name, unsigned long flags,
|
||||
unsigned int mult, unsigned int div)
|
||||
{
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL, -1,
|
||||
flags, mult, div, false);
|
||||
const struct clk_parent_data pdata = { .index = -1 };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL,
|
||||
&pdata, flags, mult, div, 0, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_register_fixed_factor);
|
||||
|
||||
struct clk_hw *clk_hw_register_fixed_factor_fwname(struct device *dev,
|
||||
struct device_node *np, const char *name, const char *fw_name,
|
||||
unsigned long flags, unsigned int mult, unsigned int div)
|
||||
{
|
||||
const struct clk_parent_data pdata = { .index = -1, .fw_name = fw_name };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, np, name, NULL, NULL,
|
||||
&pdata, flags, mult, div, 0, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_register_fixed_factor_fwname);
|
||||
|
||||
struct clk_hw *clk_hw_register_fixed_factor_with_accuracy_fwname(struct device *dev,
|
||||
struct device_node *np, const char *name, const char *fw_name,
|
||||
unsigned long flags, unsigned int mult, unsigned int div,
|
||||
unsigned long acc)
|
||||
{
|
||||
const struct clk_parent_data pdata = { .index = -1, .fw_name = fw_name };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, np, name, NULL, NULL,
|
||||
&pdata, flags, mult, div, acc,
|
||||
CLK_FIXED_FACTOR_FIXED_ACCURACY, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_register_fixed_factor_with_accuracy_fwname);
|
||||
|
||||
struct clk *clk_register_fixed_factor(struct device *dev, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
unsigned int mult, unsigned int div)
|
||||
@ -239,16 +283,43 @@ struct clk_hw *devm_clk_hw_register_fixed_factor(struct device *dev,
|
||||
const char *name, const char *parent_name, unsigned long flags,
|
||||
unsigned int mult, unsigned int div)
|
||||
{
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL, -1,
|
||||
flags, mult, div, true);
|
||||
const struct clk_parent_data pdata = { .index = -1 };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL,
|
||||
&pdata, flags, mult, div, 0, 0, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor);
|
||||
|
||||
struct clk_hw *devm_clk_hw_register_fixed_factor_fwname(struct device *dev,
|
||||
struct device_node *np, const char *name, const char *fw_name,
|
||||
unsigned long flags, unsigned int mult, unsigned int div)
|
||||
{
|
||||
const struct clk_parent_data pdata = { .index = -1, .fw_name = fw_name };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, np, name, NULL, NULL,
|
||||
&pdata, flags, mult, div, 0, 0, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_fwname);
|
||||
|
||||
struct clk_hw *devm_clk_hw_register_fixed_factor_with_accuracy_fwname(struct device *dev,
|
||||
struct device_node *np, const char *name, const char *fw_name,
|
||||
unsigned long flags, unsigned int mult, unsigned int div,
|
||||
unsigned long acc)
|
||||
{
|
||||
const struct clk_parent_data pdata = { .index = -1, .fw_name = fw_name };
|
||||
|
||||
return __clk_hw_register_fixed_factor(dev, np, name, NULL, NULL,
|
||||
&pdata, flags, mult, div, acc,
|
||||
CLK_FIXED_FACTOR_FIXED_ACCURACY, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_with_accuracy_fwname);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node)
|
||||
{
|
||||
struct clk_hw *hw;
|
||||
const char *clk_name = node->name;
|
||||
const struct clk_parent_data pdata = { .index = 0 };
|
||||
u32 div, mult;
|
||||
int ret;
|
||||
|
||||
@ -266,8 +337,8 @@ static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node)
|
||||
|
||||
of_property_read_string(node, "clock-output-names", &clk_name);
|
||||
|
||||
hw = __clk_hw_register_fixed_factor(NULL, node, clk_name, NULL, NULL, 0,
|
||||
0, mult, div, false);
|
||||
hw = __clk_hw_register_fixed_factor(NULL, node, clk_name, NULL, NULL,
|
||||
&pdata, 0, mult, div, 0, 0, false);
|
||||
if (IS_ERR(hw)) {
|
||||
/*
|
||||
* Clear OF_POPULATED flag so that clock registration can be
|
||||
|
@ -140,8 +140,8 @@ void clk_fractional_divider_general_approximation(struct clk_hw *hw,
|
||||
}
|
||||
|
||||
if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) {
|
||||
max_m = 1 << fd->mwidth;
|
||||
max_n = 1 << fd->nwidth;
|
||||
max_m = BIT(fd->mwidth);
|
||||
max_n = BIT(fd->nwidth);
|
||||
} else {
|
||||
max_m = GENMASK(fd->mwidth - 1, 0);
|
||||
max_n = GENMASK(fd->nwidth - 1, 0);
|
||||
@ -182,8 +182,8 @@ static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
u32 val;
|
||||
|
||||
if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) {
|
||||
max_m = 1 << fd->mwidth;
|
||||
max_n = 1 << fd->nwidth;
|
||||
max_m = BIT(fd->mwidth);
|
||||
max_n = BIT(fd->nwidth);
|
||||
} else {
|
||||
max_m = GENMASK(fd->mwidth - 1, 0);
|
||||
max_n = GENMASK(fd->nwidth - 1, 0);
|
||||
@ -195,14 +195,14 @@ static int clk_fd_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
n--;
|
||||
}
|
||||
|
||||
mmask = GENMASK(fd->mwidth - 1, 0) << fd->mshift;
|
||||
nmask = GENMASK(fd->nwidth - 1, 0) << fd->nshift;
|
||||
|
||||
if (fd->lock)
|
||||
spin_lock_irqsave(fd->lock, flags);
|
||||
else
|
||||
__acquire(fd->lock);
|
||||
|
||||
mmask = GENMASK(fd->mwidth - 1, 0) << fd->mshift;
|
||||
nmask = GENMASK(fd->nwidth - 1, 0) << fd->nshift;
|
||||
|
||||
val = clk_fd_readl(fd);
|
||||
val &= ~(mmask | nmask);
|
||||
val |= (m << fd->mshift) | (n << fd->nshift);
|
||||
|
@ -418,6 +418,9 @@ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index)
|
||||
if (IS_ERR(hw))
|
||||
return ERR_CAST(hw);
|
||||
|
||||
if (!hw)
|
||||
return NULL;
|
||||
|
||||
return hw->core;
|
||||
}
|
||||
|
||||
@ -939,6 +942,25 @@ int clk_rate_exclusive_get(struct clk *clk)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_rate_exclusive_get);
|
||||
|
||||
static void devm_clk_rate_exclusive_put(void *data)
|
||||
{
|
||||
struct clk *clk = data;
|
||||
|
||||
clk_rate_exclusive_put(clk);
|
||||
}
|
||||
|
||||
int devm_clk_rate_exclusive_get(struct device *dev, struct clk *clk)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = clk_rate_exclusive_get(clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return devm_add_action_or_reset(dev, devm_clk_rate_exclusive_put, clk);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_clk_rate_exclusive_get);
|
||||
|
||||
static void clk_core_unprepare(struct clk_core *core)
|
||||
{
|
||||
lockdep_assert_held(&prepare_lock);
|
||||
|
@ -144,7 +144,7 @@ void clkdev_add_table(struct clk_lookup *cl, size_t num)
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
|
||||
#define MAX_DEV_ID 20
|
||||
#define MAX_DEV_ID 24
|
||||
#define MAX_CON_ID 16
|
||||
|
||||
struct clk_lookup_alloc {
|
||||
|
@ -130,7 +130,7 @@ static void hi3519_clk_unregister(struct platform_device *pdev)
|
||||
of_clk_del_provider(pdev->dev.of_node);
|
||||
|
||||
hisi_clk_unregister_gate(hi3519_gate_clks,
|
||||
ARRAY_SIZE(hi3519_mux_clks),
|
||||
ARRAY_SIZE(hi3519_gate_clks),
|
||||
crg->clk_data);
|
||||
hisi_clk_unregister_mux(hi3519_mux_clks,
|
||||
ARRAY_SIZE(hi3519_mux_clks),
|
||||
|
@ -461,8 +461,7 @@ static void hisi_clk_register_pll(struct hi3559av100_pll_clock *clks,
|
||||
struct clk_init_data init;
|
||||
int i;
|
||||
|
||||
p_clk = devm_kzalloc(dev, sizeof(*p_clk) * nums, GFP_KERNEL);
|
||||
|
||||
p_clk = devm_kcalloc(dev, nums, sizeof(*p_clk), GFP_KERNEL);
|
||||
if (!p_clk)
|
||||
return;
|
||||
|
||||
@ -491,7 +490,6 @@ static void hisi_clk_register_pll(struct hi3559av100_pll_clock *clks,
|
||||
|
||||
clk = clk_register(NULL, &p_clk->hw);
|
||||
if (IS_ERR(clk)) {
|
||||
devm_kfree(dev, p_clk);
|
||||
dev_err(dev, "%s: failed to register clock %s\n",
|
||||
__func__, clks[i].name);
|
||||
continue;
|
||||
|
@ -212,15 +212,15 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
|
||||
{
|
||||
struct clk_hw *hw = ERR_PTR(-ENOMEM), *mux_hw;
|
||||
struct clk_hw *div_hw, *gate_hw = NULL;
|
||||
struct clk_divider *div = NULL;
|
||||
struct clk_divider *div;
|
||||
struct clk_gate *gate = NULL;
|
||||
struct clk_mux *mux = NULL;
|
||||
struct clk_mux *mux;
|
||||
const struct clk_ops *divider_ops;
|
||||
const struct clk_ops *mux_ops;
|
||||
|
||||
mux = kzalloc(sizeof(*mux), GFP_KERNEL);
|
||||
if (!mux)
|
||||
goto fail;
|
||||
return ERR_CAST(hw);
|
||||
|
||||
mux_hw = &mux->hw;
|
||||
mux->reg = reg;
|
||||
@ -230,7 +230,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
|
||||
|
||||
div = kzalloc(sizeof(*div), GFP_KERNEL);
|
||||
if (!div)
|
||||
goto fail;
|
||||
goto free_mux;
|
||||
|
||||
div_hw = &div->hw;
|
||||
div->reg = reg;
|
||||
@ -260,7 +260,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
|
||||
if (!mcore_booted) {
|
||||
gate = kzalloc(sizeof(*gate), GFP_KERNEL);
|
||||
if (!gate)
|
||||
goto fail;
|
||||
goto free_div;
|
||||
|
||||
gate_hw = &gate->hw;
|
||||
gate->reg = reg;
|
||||
@ -272,13 +272,15 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
|
||||
mux_hw, mux_ops, div_hw,
|
||||
divider_ops, gate_hw, &clk_gate_ops, flags);
|
||||
if (IS_ERR(hw))
|
||||
goto fail;
|
||||
goto free_gate;
|
||||
|
||||
return hw;
|
||||
|
||||
fail:
|
||||
free_gate:
|
||||
kfree(gate);
|
||||
free_div:
|
||||
kfree(div);
|
||||
free_mux:
|
||||
kfree(mux);
|
||||
return ERR_CAST(hw);
|
||||
}
|
||||
|
@ -394,15 +394,13 @@ err_clk_register:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int imx8_acm_clk_remove(struct platform_device *pdev)
|
||||
static void imx8_acm_clk_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct imx8_acm_priv *priv = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
clk_imx_acm_detach_pm_domains(&pdev->dev, &priv->dev_pm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct imx8_acm_soc_data imx8qm_acm_data = {
|
||||
@ -470,7 +468,7 @@ static struct platform_driver imx8_acm_clk_driver = {
|
||||
.pm = &imx8_acm_pm_ops,
|
||||
},
|
||||
.probe = imx8_acm_clk_probe,
|
||||
.remove = imx8_acm_clk_remove,
|
||||
.remove_new = imx8_acm_clk_remove,
|
||||
};
|
||||
module_platform_driver(imx8_acm_clk_driver);
|
||||
|
||||
|
@ -18,7 +18,12 @@
|
||||
|
||||
#define CLKEN0 0x000
|
||||
#define CLKEN1 0x004
|
||||
#define SAI_MCLK_SEL(n) (0x300 + 4 * (n)) /* n in 0..5 */
|
||||
#define SAI1_MCLK_SEL 0x300
|
||||
#define SAI2_MCLK_SEL 0x304
|
||||
#define SAI3_MCLK_SEL 0x308
|
||||
#define SAI5_MCLK_SEL 0x30C
|
||||
#define SAI6_MCLK_SEL 0x310
|
||||
#define SAI7_MCLK_SEL 0x314
|
||||
#define PDM_SEL 0x318
|
||||
#define SAI_PLL_GNRL_CTL 0x400
|
||||
|
||||
@ -95,13 +100,13 @@ static const struct clk_parent_data clk_imx8mp_audiomix_pll_bypass_sels[] = {
|
||||
IMX8MP_CLK_AUDIOMIX_SAI##n##_MCLK1_SEL, {}, \
|
||||
clk_imx8mp_audiomix_sai##n##_mclk1_parents, \
|
||||
ARRAY_SIZE(clk_imx8mp_audiomix_sai##n##_mclk1_parents), \
|
||||
SAI_MCLK_SEL(n), 1, 0 \
|
||||
SAI##n##_MCLK_SEL, 1, 0 \
|
||||
}, { \
|
||||
"sai"__stringify(n)"_mclk2_sel", \
|
||||
IMX8MP_CLK_AUDIOMIX_SAI##n##_MCLK2_SEL, {}, \
|
||||
clk_imx8mp_audiomix_sai_mclk2_parents, \
|
||||
ARRAY_SIZE(clk_imx8mp_audiomix_sai_mclk2_parents), \
|
||||
SAI_MCLK_SEL(n), 4, 1 \
|
||||
SAI##n##_MCLK_SEL, 4, 1 \
|
||||
}, { \
|
||||
"sai"__stringify(n)"_ipg_cg", \
|
||||
IMX8MP_CLK_AUDIOMIX_SAI##n##_IPG, \
|
||||
|
@ -712,17 +712,13 @@ struct clk_hw *imx_clk_scu_alloc_dev(const char *name,
|
||||
}
|
||||
|
||||
ret = platform_device_add_data(pdev, &clk, sizeof(clk));
|
||||
if (ret) {
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
if (ret)
|
||||
goto put_device;
|
||||
|
||||
ret = driver_set_override(&pdev->dev, &pdev->driver_override,
|
||||
"imx-scu-clk", strlen("imx-scu-clk"));
|
||||
if (ret) {
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
if (ret)
|
||||
goto put_device;
|
||||
|
||||
ret = imx_clk_scu_attach_pd(&pdev->dev, rsrc_id);
|
||||
if (ret)
|
||||
@ -730,13 +726,15 @@ struct clk_hw *imx_clk_scu_alloc_dev(const char *name,
|
||||
name, ret);
|
||||
|
||||
ret = platform_device_add(pdev);
|
||||
if (ret) {
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
if (ret)
|
||||
goto put_device;
|
||||
|
||||
/* For API backwards compatiblilty, simply return NULL for success */
|
||||
return NULL;
|
||||
|
||||
put_device:
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
void imx_clk_scu_unregister(void)
|
||||
|
@ -272,7 +272,7 @@ static const struct clk_ops sci_clk_ops = {
|
||||
};
|
||||
|
||||
/**
|
||||
* _sci_clk_get - Gets a handle for an SCI clock
|
||||
* _sci_clk_build - Gets a handle for an SCI clock
|
||||
* @provider: Handle to SCI clock provider
|
||||
* @sci_clk: Handle to the SCI clock to populate
|
||||
*
|
||||
@ -516,6 +516,7 @@ static int ti_sci_scan_clocks_from_dt(struct sci_clk_provider *provider)
|
||||
struct sci_clk *sci_clk, *prev;
|
||||
int num_clks = 0;
|
||||
int num_parents;
|
||||
bool state;
|
||||
int clk_id;
|
||||
const char * const clk_names[] = {
|
||||
"clocks", "assigned-clocks", "assigned-clock-parents", NULL
|
||||
@ -586,6 +587,15 @@ static int ti_sci_scan_clocks_from_dt(struct sci_clk_provider *provider)
|
||||
clk_id = args.args[1] + 1;
|
||||
|
||||
while (num_parents--) {
|
||||
/* Check if this clock id is valid */
|
||||
ret = provider->ops->is_auto(provider->sci,
|
||||
sci_clk->dev_id, clk_id, &state);
|
||||
|
||||
if (ret) {
|
||||
clk_id++;
|
||||
continue;
|
||||
}
|
||||
|
||||
sci_clk = devm_kzalloc(dev,
|
||||
sizeof(*sci_clk),
|
||||
GFP_KERNEL);
|
||||
|
@ -127,7 +127,6 @@ static void clk_mt7622_apmixed_remove(struct platform_device *pdev)
|
||||
of_clk_del_provider(node);
|
||||
mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
|
||||
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
|
||||
mtk_free_clk_data(clk_data);
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7622_apmixed[] = {
|
||||
|
@ -357,8 +357,9 @@ static const struct mtk_mux top_muxes[] = {
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
||||
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15,
|
||||
0x1C0, 21),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel", sgm_reg_parents,
|
||||
0x050, 0x054, 0x058, 16, 1, 23, 0x1C0, 22),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel", sgm_reg_parents,
|
||||
0x050, 0x054, 0x058, 16, 1, 23, 0x1C0, 22,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP97B_SEL, "eip97b_sel", eip97b_parents,
|
||||
0x050, 0x054, 0x058, 24, 3, 31, 0x1C0, 23),
|
||||
/* CLK_CFG_6 */
|
||||
|
@ -14,6 +14,10 @@
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
#include <dt-bindings/clock/mediatek,mt7988-clk.h>
|
||||
#include <dt-bindings/reset/mediatek,mt7988-resets.h>
|
||||
|
||||
#define MT7988_INFRA_RST0_SET_OFFSET 0x70
|
||||
#define MT7988_INFRA_RST1_SET_OFFSET 0x80
|
||||
|
||||
static DEFINE_SPINLOCK(mt7988_clk_lock);
|
||||
|
||||
@ -249,12 +253,31 @@ static const struct mtk_gate infra_clks[] = {
|
||||
GATE_INFRA3(CLK_INFRA_133M_PCIE_CK_P3, "infra_133m_pcie_ck_p3", "sysaxi_sel", 31),
|
||||
};
|
||||
|
||||
static u16 infra_rst_ofs[] = {
|
||||
MT7988_INFRA_RST0_SET_OFFSET,
|
||||
MT7988_INFRA_RST1_SET_OFFSET,
|
||||
};
|
||||
|
||||
static u16 infra_idx_map[] = {
|
||||
[MT7988_INFRA_RST0_PEXTP_MAC_SWRST] = 0 * RST_NR_PER_BANK + 6,
|
||||
[MT7988_INFRA_RST1_THERM_CTRL_SWRST] = 1 * RST_NR_PER_BANK + 9,
|
||||
};
|
||||
|
||||
static struct mtk_clk_rst_desc infra_rst_desc = {
|
||||
.version = MTK_RST_SET_CLR,
|
||||
.rst_bank_ofs = infra_rst_ofs,
|
||||
.rst_bank_nr = ARRAY_SIZE(infra_rst_ofs),
|
||||
.rst_idx_map = infra_idx_map,
|
||||
.rst_idx_map_nr = ARRAY_SIZE(infra_idx_map),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc infra_desc = {
|
||||
.clks = infra_clks,
|
||||
.num_clks = ARRAY_SIZE(infra_clks),
|
||||
.mux_clks = infra_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(infra_muxes),
|
||||
.clk_lock = &mt7988_clk_lock,
|
||||
.rst_desc = &infra_rst_desc,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7988_infracfg[] = {
|
||||
|
@ -59,7 +59,7 @@ static int clk_mt8135_apmixed_probe(struct platform_device *pdev)
|
||||
|
||||
ret = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto free_clk_data;
|
||||
|
||||
ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (ret)
|
||||
@ -69,6 +69,8 @@ static int clk_mt8135_apmixed_probe(struct platform_device *pdev)
|
||||
|
||||
unregister_plls:
|
||||
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
|
||||
free_clk_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -152,8 +152,8 @@ static int clk_mt8173_apmixed_probe(struct platform_device *pdev)
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
||||
if (IS_ERR_OR_NULL(clk_data)) {
|
||||
iounmap(base);
|
||||
return -ENOMEM;
|
||||
r = -ENOMEM;
|
||||
goto unmap_io;
|
||||
}
|
||||
|
||||
fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs));
|
||||
@ -188,6 +188,7 @@ unregister_plls:
|
||||
ARRAY_SIZE(pllfhs), clk_data);
|
||||
free_clk_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
unmap_io:
|
||||
iounmap(base);
|
||||
return r;
|
||||
}
|
||||
|
@ -790,7 +790,7 @@ static const struct mtk_gate infra_clks[] = {
|
||||
/* infra_sspm_26m_self is main clock in co-processor, should not be closed in Linux. */
|
||||
GATE_INFRA3_FLAGS(CLK_INFRA_SSPM_26M_SELF, "infra_sspm_26m_self", "f_f26m_ck", 3, CLK_IS_CRITICAL),
|
||||
/* infra_sspm_32k_self is main clock in co-processor, should not be closed in Linux. */
|
||||
GATE_INFRA3_FLAGS(CLK_INFRA_SSPM_32K_SELF, "infra_sspm_32k_self", "f_f26m_ck", 4, CLK_IS_CRITICAL),
|
||||
GATE_INFRA3_FLAGS(CLK_INFRA_SSPM_32K_SELF, "infra_sspm_32k_self", "clk32k", 4, CLK_IS_CRITICAL),
|
||||
GATE_INFRA3(CLK_INFRA_UFS_AXI, "infra_ufs_axi", "axi_sel", 5),
|
||||
GATE_INFRA3(CLK_INFRA_I2C6, "infra_i2c6", "i2c_sel", 6),
|
||||
GATE_INFRA3(CLK_INFRA_AP_MSDC0, "infra_ap_msdc0", "msdc50_hclk_sel", 7),
|
||||
|
@ -2142,7 +2142,9 @@ static struct clk_regmap *const axg_clk_regmaps[] = {
|
||||
&axg_vclk_input,
|
||||
&axg_vclk2_input,
|
||||
&axg_vclk_div,
|
||||
&axg_vclk_div1,
|
||||
&axg_vclk2_div,
|
||||
&axg_vclk2_div1,
|
||||
&axg_vclk_div2_en,
|
||||
&axg_vclk_div4_en,
|
||||
&axg_vclk_div6_en,
|
||||
|
@ -15,7 +15,8 @@
|
||||
|
||||
/* address offset of control registers */
|
||||
#define REG_MSSPLL_REF_CR 0x08u
|
||||
#define REG_MSSPLL_POSTDIV_CR 0x10u
|
||||
#define REG_MSSPLL_POSTDIV01_CR 0x10u
|
||||
#define REG_MSSPLL_POSTDIV23_CR 0x14u
|
||||
#define REG_MSSPLL_SSCG_2_CR 0x2Cu
|
||||
#define REG_CLOCK_CONFIG_CR 0x08u
|
||||
#define REG_RTC_CLOCK_CR 0x0Cu
|
||||
@ -26,10 +27,18 @@
|
||||
#define MSSPLL_FBDIV_WIDTH 0x0Cu
|
||||
#define MSSPLL_REFDIV_SHIFT 0x08u
|
||||
#define MSSPLL_REFDIV_WIDTH 0x06u
|
||||
#define MSSPLL_POSTDIV_SHIFT 0x08u
|
||||
#define MSSPLL_POSTDIV02_SHIFT 0x08u
|
||||
#define MSSPLL_POSTDIV13_SHIFT 0x18u
|
||||
#define MSSPLL_POSTDIV_WIDTH 0x07u
|
||||
#define MSSPLL_FIXED_DIV 4u
|
||||
|
||||
/*
|
||||
* This clock ID is defined here, rather than the binding headers, as it is an
|
||||
* internal clock only, and therefore has no consumers in other peripheral
|
||||
* blocks.
|
||||
*/
|
||||
#define CLK_MSSPLL_INTERNAL 38u
|
||||
|
||||
struct mpfs_clock_data {
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
@ -39,17 +48,27 @@ struct mpfs_clock_data {
|
||||
|
||||
struct mpfs_msspll_hw_clock {
|
||||
void __iomem *base;
|
||||
struct clk_hw hw;
|
||||
struct clk_init_data init;
|
||||
unsigned int id;
|
||||
u32 reg_offset;
|
||||
u32 shift;
|
||||
u32 width;
|
||||
u32 flags;
|
||||
struct clk_hw hw;
|
||||
struct clk_init_data init;
|
||||
};
|
||||
|
||||
#define to_mpfs_msspll_clk(_hw) container_of(_hw, struct mpfs_msspll_hw_clock, hw)
|
||||
|
||||
struct mpfs_msspll_out_hw_clock {
|
||||
void __iomem *base;
|
||||
struct clk_divider output;
|
||||
struct clk_init_data init;
|
||||
unsigned int id;
|
||||
u32 reg_offset;
|
||||
};
|
||||
|
||||
#define to_mpfs_msspll_out_clk(_hw) container_of(_hw, struct mpfs_msspll_out_hw_clock, hw)
|
||||
|
||||
struct mpfs_cfg_hw_clock {
|
||||
struct clk_divider cfg;
|
||||
struct clk_init_data init;
|
||||
@ -93,93 +112,40 @@ static const struct clk_div_table mpfs_div_rtcref_table[] = {
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
/*
|
||||
* MSS PLL internal clock
|
||||
*/
|
||||
|
||||
static unsigned long mpfs_clk_msspll_recalc_rate(struct clk_hw *hw, unsigned long prate)
|
||||
{
|
||||
struct mpfs_msspll_hw_clock *msspll_hw = to_mpfs_msspll_clk(hw);
|
||||
void __iomem *mult_addr = msspll_hw->base + msspll_hw->reg_offset;
|
||||
void __iomem *ref_div_addr = msspll_hw->base + REG_MSSPLL_REF_CR;
|
||||
void __iomem *postdiv_addr = msspll_hw->base + REG_MSSPLL_POSTDIV_CR;
|
||||
u32 mult, ref_div, postdiv;
|
||||
|
||||
mult = readl_relaxed(mult_addr) >> MSSPLL_FBDIV_SHIFT;
|
||||
mult &= clk_div_mask(MSSPLL_FBDIV_WIDTH);
|
||||
ref_div = readl_relaxed(ref_div_addr) >> MSSPLL_REFDIV_SHIFT;
|
||||
ref_div &= clk_div_mask(MSSPLL_REFDIV_WIDTH);
|
||||
postdiv = readl_relaxed(postdiv_addr) >> MSSPLL_POSTDIV_SHIFT;
|
||||
postdiv &= clk_div_mask(MSSPLL_POSTDIV_WIDTH);
|
||||
|
||||
return prate * mult / (ref_div * MSSPLL_FIXED_DIV * postdiv);
|
||||
}
|
||||
|
||||
static long mpfs_clk_msspll_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate)
|
||||
{
|
||||
struct mpfs_msspll_hw_clock *msspll_hw = to_mpfs_msspll_clk(hw);
|
||||
void __iomem *mult_addr = msspll_hw->base + msspll_hw->reg_offset;
|
||||
void __iomem *ref_div_addr = msspll_hw->base + REG_MSSPLL_REF_CR;
|
||||
u32 mult, ref_div;
|
||||
unsigned long rate_before_ctrl;
|
||||
|
||||
mult = readl_relaxed(mult_addr) >> MSSPLL_FBDIV_SHIFT;
|
||||
mult &= clk_div_mask(MSSPLL_FBDIV_WIDTH);
|
||||
ref_div = readl_relaxed(ref_div_addr) >> MSSPLL_REFDIV_SHIFT;
|
||||
ref_div &= clk_div_mask(MSSPLL_REFDIV_WIDTH);
|
||||
|
||||
rate_before_ctrl = rate * (ref_div * MSSPLL_FIXED_DIV) / mult;
|
||||
|
||||
return divider_round_rate(hw, rate_before_ctrl, prate, NULL, MSSPLL_POSTDIV_WIDTH,
|
||||
msspll_hw->flags);
|
||||
}
|
||||
|
||||
static int mpfs_clk_msspll_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long prate)
|
||||
{
|
||||
struct mpfs_msspll_hw_clock *msspll_hw = to_mpfs_msspll_clk(hw);
|
||||
void __iomem *mult_addr = msspll_hw->base + msspll_hw->reg_offset;
|
||||
void __iomem *ref_div_addr = msspll_hw->base + REG_MSSPLL_REF_CR;
|
||||
void __iomem *postdiv_addr = msspll_hw->base + REG_MSSPLL_POSTDIV_CR;
|
||||
u32 mult, ref_div, postdiv;
|
||||
int divider_setting;
|
||||
unsigned long rate_before_ctrl, flags;
|
||||
|
||||
mult = readl_relaxed(mult_addr) >> MSSPLL_FBDIV_SHIFT;
|
||||
mult &= clk_div_mask(MSSPLL_FBDIV_WIDTH);
|
||||
ref_div = readl_relaxed(ref_div_addr) >> MSSPLL_REFDIV_SHIFT;
|
||||
ref_div &= clk_div_mask(MSSPLL_REFDIV_WIDTH);
|
||||
|
||||
rate_before_ctrl = rate * (ref_div * MSSPLL_FIXED_DIV) / mult;
|
||||
divider_setting = divider_get_val(rate_before_ctrl, prate, NULL, MSSPLL_POSTDIV_WIDTH,
|
||||
msspll_hw->flags);
|
||||
|
||||
if (divider_setting < 0)
|
||||
return divider_setting;
|
||||
|
||||
spin_lock_irqsave(&mpfs_clk_lock, flags);
|
||||
|
||||
postdiv = readl_relaxed(postdiv_addr);
|
||||
postdiv &= ~(clk_div_mask(MSSPLL_POSTDIV_WIDTH) << MSSPLL_POSTDIV_SHIFT);
|
||||
writel_relaxed(postdiv, postdiv_addr);
|
||||
|
||||
spin_unlock_irqrestore(&mpfs_clk_lock, flags);
|
||||
|
||||
return 0;
|
||||
return prate * mult / (ref_div * MSSPLL_FIXED_DIV);
|
||||
}
|
||||
|
||||
static const struct clk_ops mpfs_clk_msspll_ops = {
|
||||
.recalc_rate = mpfs_clk_msspll_recalc_rate,
|
||||
.round_rate = mpfs_clk_msspll_round_rate,
|
||||
.set_rate = mpfs_clk_msspll_set_rate,
|
||||
};
|
||||
|
||||
#define CLK_PLL(_id, _name, _parent, _shift, _width, _flags, _offset) { \
|
||||
.id = _id, \
|
||||
.flags = _flags, \
|
||||
.shift = _shift, \
|
||||
.width = _width, \
|
||||
.reg_offset = _offset, \
|
||||
.flags = _flags, \
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA(_name, _parent, &mpfs_clk_msspll_ops, 0), \
|
||||
}
|
||||
|
||||
static struct mpfs_msspll_hw_clock mpfs_msspll_clks[] = {
|
||||
CLK_PLL(CLK_MSSPLL, "clk_msspll", mpfs_ext_ref, MSSPLL_FBDIV_SHIFT,
|
||||
CLK_PLL(CLK_MSSPLL_INTERNAL, "clk_msspll_internal", mpfs_ext_ref, MSSPLL_FBDIV_SHIFT,
|
||||
MSSPLL_FBDIV_WIDTH, 0, REG_MSSPLL_SSCG_2_CR),
|
||||
};
|
||||
|
||||
@ -196,7 +162,7 @@ static int mpfs_clk_register_mssplls(struct device *dev, struct mpfs_msspll_hw_c
|
||||
ret = devm_clk_hw_register(dev, &msspll_hw->hw);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to register msspll id: %d\n",
|
||||
CLK_MSSPLL);
|
||||
CLK_MSSPLL_INTERNAL);
|
||||
|
||||
data->hw_data.hws[msspll_hw->id] = &msspll_hw->hw;
|
||||
}
|
||||
@ -204,6 +170,54 @@ static int mpfs_clk_register_mssplls(struct device *dev, struct mpfs_msspll_hw_c
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* MSS PLL output clocks
|
||||
*/
|
||||
|
||||
#define CLK_PLL_OUT(_id, _name, _parent, _flags, _shift, _width, _offset) { \
|
||||
.id = _id, \
|
||||
.output.shift = _shift, \
|
||||
.output.width = _width, \
|
||||
.output.table = NULL, \
|
||||
.reg_offset = _offset, \
|
||||
.output.flags = _flags, \
|
||||
.output.hw.init = CLK_HW_INIT(_name, _parent, &clk_divider_ops, 0), \
|
||||
.output.lock = &mpfs_clk_lock, \
|
||||
}
|
||||
|
||||
static struct mpfs_msspll_out_hw_clock mpfs_msspll_out_clks[] = {
|
||||
CLK_PLL_OUT(CLK_MSSPLL0, "clk_msspll", "clk_msspll_internal", CLK_DIVIDER_ONE_BASED,
|
||||
MSSPLL_POSTDIV02_SHIFT, MSSPLL_POSTDIV_WIDTH, REG_MSSPLL_POSTDIV01_CR),
|
||||
CLK_PLL_OUT(CLK_MSSPLL1, "clk_msspll1", "clk_msspll_internal", CLK_DIVIDER_ONE_BASED,
|
||||
MSSPLL_POSTDIV13_SHIFT, MSSPLL_POSTDIV_WIDTH, REG_MSSPLL_POSTDIV01_CR),
|
||||
CLK_PLL_OUT(CLK_MSSPLL2, "clk_msspll2", "clk_msspll_internal", CLK_DIVIDER_ONE_BASED,
|
||||
MSSPLL_POSTDIV02_SHIFT, MSSPLL_POSTDIV_WIDTH, REG_MSSPLL_POSTDIV23_CR),
|
||||
CLK_PLL_OUT(CLK_MSSPLL3, "clk_msspll3", "clk_msspll_internal", CLK_DIVIDER_ONE_BASED,
|
||||
MSSPLL_POSTDIV13_SHIFT, MSSPLL_POSTDIV_WIDTH, REG_MSSPLL_POSTDIV23_CR),
|
||||
};
|
||||
|
||||
static int mpfs_clk_register_msspll_outs(struct device *dev,
|
||||
struct mpfs_msspll_out_hw_clock *msspll_out_hws,
|
||||
unsigned int num_clks, struct mpfs_clock_data *data)
|
||||
{
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < num_clks; i++) {
|
||||
struct mpfs_msspll_out_hw_clock *msspll_out_hw = &msspll_out_hws[i];
|
||||
|
||||
msspll_out_hw->output.reg = data->msspll_base + msspll_out_hw->reg_offset;
|
||||
ret = devm_clk_hw_register(dev, &msspll_out_hw->output.hw);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to register msspll out id: %d\n",
|
||||
msspll_out_hw->id);
|
||||
|
||||
data->hw_data.hws[msspll_out_hw->id] = &msspll_out_hw->output.hw;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* "CFG" clocks
|
||||
*/
|
||||
@ -442,8 +456,8 @@ static int mpfs_clk_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
|
||||
/* CLK_RESERVED is not part of clock arrays, so add 1 */
|
||||
num_clks = ARRAY_SIZE(mpfs_msspll_clks) + ARRAY_SIZE(mpfs_cfg_clks)
|
||||
+ ARRAY_SIZE(mpfs_periph_clks) + 1;
|
||||
num_clks = ARRAY_SIZE(mpfs_msspll_clks) + ARRAY_SIZE(mpfs_msspll_out_clks)
|
||||
+ ARRAY_SIZE(mpfs_cfg_clks) + ARRAY_SIZE(mpfs_periph_clks) + 1;
|
||||
|
||||
clk_data = devm_kzalloc(dev, struct_size(clk_data, hw_data.hws, num_clks), GFP_KERNEL);
|
||||
if (!clk_data)
|
||||
@ -466,6 +480,12 @@ static int mpfs_clk_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = mpfs_clk_register_msspll_outs(dev, mpfs_msspll_out_clks,
|
||||
ARRAY_SIZE(mpfs_msspll_out_clks),
|
||||
clk_data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = mpfs_clk_register_cfgs(dev, mpfs_cfg_clks, ARRAY_SIZE(mpfs_cfg_clks), clk_data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -20,6 +20,24 @@ menuconfig COMMON_CLK_QCOM
|
||||
|
||||
if COMMON_CLK_QCOM
|
||||
|
||||
config CLK_X1E80100_CAMCC
|
||||
tristate "X1E80100 Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select CLK_X1E80100_GCC
|
||||
help
|
||||
Support for the camera clock controller on X1E80100 devices.
|
||||
Say Y if you want to support camera devices and camera functionality.
|
||||
|
||||
config CLK_X1E80100_DISPCC
|
||||
tristate "X1E80100 Display Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select CLK_X1E80100_GCC
|
||||
help
|
||||
Support for the two display clock controllers on Qualcomm
|
||||
Technologies, Inc. X1E80100 devices.
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config CLK_X1E80100_GCC
|
||||
tristate "X1E80100 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
@ -30,6 +48,23 @@ config CLK_X1E80100_GCC
|
||||
Say Y if you want to use peripheral devices such as UART, SPI, I2C,
|
||||
USB, UFS, SD/eMMC, PCIe, etc.
|
||||
|
||||
config CLK_X1E80100_GPUCC
|
||||
tristate "X1E80100 Graphics Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select CLK_X1E80100_GCC
|
||||
help
|
||||
Support for the graphics clock controller on X1E80100 devices.
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config CLK_X1E80100_TCSRCC
|
||||
tristate "X1E80100 TCSR Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the TCSR clock controller on X1E80100 devices.
|
||||
Say Y if you want to use peripheral devices such as SD/UFS.
|
||||
|
||||
config QCOM_A53PLL
|
||||
tristate "MSM8916 A53 PLL"
|
||||
help
|
||||
@ -600,16 +635,6 @@ config SC_LPASS_CORECC_7280
|
||||
Say Y if you want to use LPASS clocks and power domains of the LPASS
|
||||
core clock controller.
|
||||
|
||||
config SC_MSS_7180
|
||||
tristate "SC7180 Modem Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select SC_GCC_7180
|
||||
help
|
||||
Support for the Modem Subsystem clock controller on Qualcomm
|
||||
Technologies, Inc on SC7180 devices.
|
||||
Say Y if you want to use the Modem branch clocks of the Modem
|
||||
subsystem clock controller to reset the MSS subsystem.
|
||||
|
||||
config SC_VIDEOCC_7180
|
||||
tristate "SC7180 Video Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
@ -21,7 +21,11 @@ clk-qcom-$(CONFIG_QCOM_GDSC) += gdsc.o
|
||||
obj-$(CONFIG_APQ_GCC_8084) += gcc-apq8084.o
|
||||
obj-$(CONFIG_APQ_MMCC_8084) += mmcc-apq8084.o
|
||||
obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o
|
||||
obj-$(CONFIG_CLK_X1E80100_CAMCC) += camcc-x1e80100.o
|
||||
obj-$(CONFIG_CLK_X1E80100_DISPCC) += dispcc-x1e80100.o
|
||||
obj-$(CONFIG_CLK_X1E80100_GCC) += gcc-x1e80100.o
|
||||
obj-$(CONFIG_CLK_X1E80100_GPUCC) += gpucc-x1e80100.o
|
||||
obj-$(CONFIG_CLK_X1E80100_TCSRCC) += tcsrcc-x1e80100.o
|
||||
obj-$(CONFIG_IPQ_APSS_PLL) += apss-ipq-pll.o
|
||||
obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o
|
||||
obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o
|
||||
@ -87,7 +91,6 @@ obj-$(CONFIG_SC_LPASSCC_7280) += lpasscc-sc7280.o
|
||||
obj-$(CONFIG_SC_LPASSCC_8280XP) += lpasscc-sc8280xp.o
|
||||
obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
|
||||
obj-$(CONFIG_SC_LPASS_CORECC_7280) += lpasscorecc-sc7280.o lpassaudiocc-sc7280.o
|
||||
obj-$(CONFIG_SC_MSS_7180) += mss-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
|
||||
|
@ -1703,17 +1703,7 @@ static struct platform_driver cam_cc_sc7180_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init cam_cc_sc7180_init(void)
|
||||
{
|
||||
return platform_driver_register(&cam_cc_sc7180_driver);
|
||||
}
|
||||
subsys_initcall(cam_cc_sc7180_init);
|
||||
|
||||
static void __exit cam_cc_sc7180_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&cam_cc_sc7180_driver);
|
||||
}
|
||||
module_exit(cam_cc_sc7180_exit);
|
||||
module_platform_driver(cam_cc_sc7180_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI CAM_CC SC7180 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -2468,17 +2468,7 @@ static struct platform_driver cam_cc_sc7280_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init cam_cc_sc7280_init(void)
|
||||
{
|
||||
return platform_driver_register(&cam_cc_sc7280_driver);
|
||||
}
|
||||
subsys_initcall(cam_cc_sc7280_init);
|
||||
|
||||
static void __exit cam_cc_sc7280_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&cam_cc_sc7280_driver);
|
||||
}
|
||||
module_exit(cam_cc_sc7280_exit);
|
||||
module_platform_driver(cam_cc_sc7280_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI CAM_CC SC7280 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -630,6 +630,7 @@ static const struct freq_tbl ftbl_camcc_bps_clk_src[] = {
|
||||
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_bps_clk_src = {
|
||||
@ -654,6 +655,7 @@ static const struct freq_tbl ftbl_camcc_camnoc_axi_clk_src[] = {
|
||||
F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0),
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_camnoc_axi_clk_src = {
|
||||
@ -673,6 +675,7 @@ static struct clk_rcg2 camcc_camnoc_axi_clk_src = {
|
||||
static const struct freq_tbl ftbl_camcc_cci_0_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(37500000, P_CAMCC_PLL0_OUT_EVEN, 16, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_cci_0_clk_src = {
|
||||
@ -735,6 +738,7 @@ static const struct freq_tbl ftbl_camcc_cphy_rx_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(240000000, P_CAMCC_PLL0_OUT_EVEN, 2.5, 0, 0),
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_cphy_rx_clk_src = {
|
||||
@ -754,6 +758,7 @@ static struct clk_rcg2 camcc_cphy_rx_clk_src = {
|
||||
static const struct freq_tbl ftbl_camcc_csi0phytimer_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_csi0phytimer_clk_src = {
|
||||
@ -818,6 +823,7 @@ static const struct freq_tbl ftbl_camcc_fast_ahb_clk_src[] = {
|
||||
F(200000000, P_CAMCC_PLL0_OUT_EVEN, 3, 0, 0),
|
||||
F(300000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0),
|
||||
F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_fast_ahb_clk_src = {
|
||||
@ -838,6 +844,7 @@ static const struct freq_tbl ftbl_camcc_icp_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_icp_clk_src = {
|
||||
@ -860,6 +867,7 @@ static const struct freq_tbl ftbl_camcc_ife_0_clk_src[] = {
|
||||
F(558000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
|
||||
F(637000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
|
||||
F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_0_clk_src = {
|
||||
@ -883,6 +891,7 @@ static const struct freq_tbl ftbl_camcc_ife_0_csid_clk_src[] = {
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_0_csid_clk_src = {
|
||||
@ -905,6 +914,7 @@ static const struct freq_tbl ftbl_camcc_ife_1_clk_src[] = {
|
||||
F(558000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
|
||||
F(637000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
|
||||
F(760000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_1_clk_src = {
|
||||
@ -941,6 +951,7 @@ static const struct freq_tbl ftbl_camcc_ife_2_clk_src[] = {
|
||||
F(558000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0),
|
||||
F(637000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0),
|
||||
F(760000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_2_clk_src = {
|
||||
@ -962,6 +973,7 @@ static const struct freq_tbl ftbl_camcc_ife_2_csid_clk_src[] = {
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_2_csid_clk_src = {
|
||||
@ -984,6 +996,7 @@ static const struct freq_tbl ftbl_camcc_ife_3_clk_src[] = {
|
||||
F(558000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0),
|
||||
F(637000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0),
|
||||
F(760000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_3_clk_src = {
|
||||
@ -1020,6 +1033,7 @@ static const struct freq_tbl ftbl_camcc_ife_lite_0_clk_src[] = {
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ife_lite_0_clk_src = {
|
||||
@ -1140,6 +1154,7 @@ static const struct freq_tbl ftbl_camcc_ipe_0_clk_src[] = {
|
||||
F(475000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
|
||||
F(520000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_ipe_0_clk_src = {
|
||||
@ -1163,6 +1178,7 @@ static const struct freq_tbl ftbl_camcc_jpeg_clk_src[] = {
|
||||
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
|
||||
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
|
||||
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_jpeg_clk_src = {
|
||||
@ -1184,6 +1200,7 @@ static const struct freq_tbl ftbl_camcc_lrme_clk_src[] = {
|
||||
F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
|
||||
F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0),
|
||||
F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_lrme_clk_src = {
|
||||
@ -1204,6 +1221,7 @@ static const struct freq_tbl ftbl_camcc_mclk0_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(24000000, P_CAMCC_PLL2_OUT_EARLY, 10, 1, 4),
|
||||
F(64000000, P_CAMCC_PLL2_OUT_EARLY, 15, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_mclk0_clk_src = {
|
||||
@ -1320,6 +1338,7 @@ static struct clk_rcg2 camcc_mclk7_clk_src = {
|
||||
|
||||
static const struct freq_tbl ftbl_camcc_sleep_clk_src[] = {
|
||||
F(32000, P_SLEEP_CLK, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_sleep_clk_src = {
|
||||
@ -1339,6 +1358,7 @@ static struct clk_rcg2 camcc_sleep_clk_src = {
|
||||
static const struct freq_tbl ftbl_camcc_slow_ahb_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(80000000, P_CAMCC_PLL7_OUT_EVEN, 6, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_slow_ahb_clk_src = {
|
||||
@ -1357,6 +1377,7 @@ static struct clk_rcg2 camcc_slow_ahb_clk_src = {
|
||||
|
||||
static const struct freq_tbl ftbl_camcc_xo_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 camcc_xo_clk_src = {
|
||||
@ -3010,10 +3031,8 @@ static int camcc_sc8280xp_probe(struct platform_device *pdev)
|
||||
clk_lucid_pll_configure(&camcc_pll6, regmap, &camcc_pll6_config);
|
||||
clk_lucid_pll_configure(&camcc_pll7, regmap, &camcc_pll7_config);
|
||||
|
||||
/*
|
||||
* Keep camcc_gdsc_clk always enabled:
|
||||
*/
|
||||
regmap_update_bits(regmap, 0xc1e4, BIT(0), 1);
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0xc1e4); /* CAMCC_GDSC_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &camcc_sc8280xp_desc, regmap);
|
||||
if (ret)
|
||||
|
@ -1746,17 +1746,7 @@ static struct platform_driver cam_cc_sdm845_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init cam_cc_sdm845_init(void)
|
||||
{
|
||||
return platform_driver_register(&cam_cc_sdm845_driver);
|
||||
}
|
||||
subsys_initcall(cam_cc_sdm845_init);
|
||||
|
||||
static void __exit cam_cc_sdm845_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&cam_cc_sdm845_driver);
|
||||
}
|
||||
module_exit(cam_cc_sdm845_exit);
|
||||
module_platform_driver(cam_cc_sdm845_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI CAM_CC SDM845 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1890,17 +1890,7 @@ static struct platform_driver camcc_sm6350_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init camcc_sm6350_init(void)
|
||||
{
|
||||
return platform_driver_register(&camcc_sm6350_driver);
|
||||
}
|
||||
subsys_initcall(camcc_sm6350_init);
|
||||
|
||||
static void __exit camcc_sm6350_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&camcc_sm6350_driver);
|
||||
}
|
||||
module_exit(camcc_sm6350_exit);
|
||||
module_platform_driver(camcc_sm6350_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI CAMCC SM6350 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -3536,13 +3536,9 @@ static int cam_cc_sm8550_probe(struct platform_device *pdev)
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll11, regmap, &cam_cc_pll11_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll12, regmap, &cam_cc_pll12_config);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* cam_cc_gdsc_clk
|
||||
* cam_cc_sleep_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x1419c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x142cc, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x1419c); /* CAM_CC_GDSC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x142cc); /* CAM_CC_SLEEP_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &cam_cc_sm8550_desc, regmap);
|
||||
|
||||
|
2487
drivers/clk/qcom/camcc-x1e80100.c
Normal file
2487
drivers/clk/qcom/camcc-x1e80100.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -52,6 +52,7 @@
|
||||
#define PLL_CONFIG_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL])
|
||||
#define PLL_CONFIG_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U])
|
||||
#define PLL_CONFIG_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U1])
|
||||
#define PLL_CONFIG_CTL_U2(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U2])
|
||||
#define PLL_TEST_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL])
|
||||
#define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U])
|
||||
#define PLL_TEST_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1])
|
||||
@ -228,6 +229,21 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
|
||||
[PLL_OFF_ALPHA_VAL] = 0x24,
|
||||
[PLL_OFF_ALPHA_VAL_U] = 0x28,
|
||||
},
|
||||
[CLK_ALPHA_PLL_TYPE_ZONDA_OLE] = {
|
||||
[PLL_OFF_L_VAL] = 0x04,
|
||||
[PLL_OFF_ALPHA_VAL] = 0x08,
|
||||
[PLL_OFF_USER_CTL] = 0x0c,
|
||||
[PLL_OFF_USER_CTL_U] = 0x10,
|
||||
[PLL_OFF_CONFIG_CTL] = 0x14,
|
||||
[PLL_OFF_CONFIG_CTL_U] = 0x18,
|
||||
[PLL_OFF_CONFIG_CTL_U1] = 0x1c,
|
||||
[PLL_OFF_CONFIG_CTL_U2] = 0x20,
|
||||
[PLL_OFF_TEST_CTL] = 0x24,
|
||||
[PLL_OFF_TEST_CTL_U] = 0x28,
|
||||
[PLL_OFF_TEST_CTL_U1] = 0x2c,
|
||||
[PLL_OFF_OPMODE] = 0x30,
|
||||
[PLL_OFF_STATUS] = 0x3c,
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
|
||||
|
||||
|
@ -21,6 +21,7 @@ enum {
|
||||
CLK_ALPHA_PLL_TYPE_LUCID = CLK_ALPHA_PLL_TYPE_TRION,
|
||||
CLK_ALPHA_PLL_TYPE_AGERA,
|
||||
CLK_ALPHA_PLL_TYPE_ZONDA,
|
||||
CLK_ALPHA_PLL_TYPE_ZONDA_OLE,
|
||||
CLK_ALPHA_PLL_TYPE_LUCID_EVO,
|
||||
CLK_ALPHA_PLL_TYPE_LUCID_OLE,
|
||||
CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
|
||||
@ -42,6 +43,7 @@ enum {
|
||||
PLL_OFF_CONFIG_CTL,
|
||||
PLL_OFF_CONFIG_CTL_U,
|
||||
PLL_OFF_CONFIG_CTL_U1,
|
||||
PLL_OFF_CONFIG_CTL_U2,
|
||||
PLL_OFF_TEST_CTL,
|
||||
PLL_OFF_TEST_CTL_U,
|
||||
PLL_OFF_TEST_CTL_U1,
|
||||
@ -119,6 +121,7 @@ struct alpha_pll_config {
|
||||
u32 config_ctl_val;
|
||||
u32 config_ctl_hi_val;
|
||||
u32 config_ctl_hi1_val;
|
||||
u32 config_ctl_hi2_val;
|
||||
u32 user_ctl_val;
|
||||
u32 user_ctl_hi_val;
|
||||
u32 user_ctl_hi1_val;
|
||||
@ -173,6 +176,7 @@ extern const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops;
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_zonda_ops;
|
||||
#define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_ops
|
||||
#define clk_alpha_pll_zonda_ole_ops clk_alpha_pll_zonda_ops
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_lucid_evo_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops;
|
||||
|
@ -64,6 +64,7 @@ struct clk_mem_branch {
|
||||
#define CBCR_FORCE_MEM_PERIPH_OFF BIT(12)
|
||||
#define CBCR_WAKEUP GENMASK(11, 8)
|
||||
#define CBCR_SLEEP GENMASK(7, 4)
|
||||
#define CBCR_CLOCK_ENABLE BIT(0)
|
||||
|
||||
static inline void qcom_branch_set_force_mem_core(struct regmap *regmap,
|
||||
struct clk_branch clk, bool on)
|
||||
@ -98,6 +99,11 @@ static inline void qcom_branch_set_sleep(struct regmap *regmap, struct clk_branc
|
||||
FIELD_PREP(CBCR_SLEEP, val));
|
||||
}
|
||||
|
||||
static inline void qcom_branch_set_clk_en(struct regmap *regmap, u32 cbcr)
|
||||
{
|
||||
regmap_update_bits(regmap, cbcr, CBCR_CLOCK_ENABLE, CBCR_CLOCK_ENABLE);
|
||||
}
|
||||
|
||||
extern const struct clk_ops clk_branch_ops;
|
||||
extern const struct clk_ops clk_branch2_ops;
|
||||
extern const struct clk_ops clk_branch_simple_ops;
|
||||
|
@ -519,8 +519,8 @@ static int disp_cc_qcm2290_probe(struct platform_device *pdev)
|
||||
|
||||
clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
|
||||
|
||||
/* Keep DISP_CC_XO_CLK always-ON */
|
||||
regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x604c); /* DISP_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_qcm2290_desc, regmap);
|
||||
if (ret) {
|
||||
@ -539,17 +539,7 @@ static struct platform_driver disp_cc_qcm2290_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_qcm2290_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_qcm2290_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_qcm2290_init);
|
||||
|
||||
static void __exit disp_cc_qcm2290_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_qcm2290_driver);
|
||||
}
|
||||
module_exit(disp_cc_qcm2290_exit);
|
||||
module_platform_driver(disp_cc_qcm2290_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISP_CC qcm2290 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -724,17 +724,7 @@ static struct platform_driver disp_cc_sc7180_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sc7180_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sc7180_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sc7180_init);
|
||||
|
||||
static void __exit disp_cc_sc7180_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sc7180_driver);
|
||||
}
|
||||
module_exit(disp_cc_sc7180_exit);
|
||||
module_platform_driver(disp_cc_sc7180_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISP_CC SC7180 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -878,11 +878,8 @@ static int disp_cc_sc7280_probe(struct platform_device *pdev)
|
||||
|
||||
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));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x5008); /* DISP_CC_XO_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &disp_cc_sc7280_desc, regmap);
|
||||
}
|
||||
@ -895,17 +892,7 @@ static struct platform_driver disp_cc_sc7280_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
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_platform_driver(disp_cc_sc7280_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISP_CC sc7280 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -3178,8 +3178,8 @@ static int disp_cc_sc8280xp_probe(struct platform_device *pdev)
|
||||
goto out_pm_runtime_put;
|
||||
}
|
||||
|
||||
/* DISP_CC_XO_CLK always-on */
|
||||
regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x605c); /* DISP_CC_XO_CLK */
|
||||
|
||||
out_pm_runtime_put:
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
@ -3202,17 +3202,7 @@ static struct platform_driver disp_cc_sc8280xp_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sc8280xp_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sc8280xp_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sc8280xp_init);
|
||||
|
||||
static void __exit disp_cc_sc8280xp_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sc8280xp_driver);
|
||||
}
|
||||
module_exit(disp_cc_sc8280xp_exit);
|
||||
module_platform_driver(disp_cc_sc8280xp_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Qualcomm SC8280XP dispcc driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -759,6 +759,8 @@ static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||
|
||||
static struct gdsc mdss_gdsc = {
|
||||
.gdscr = 0x3000,
|
||||
.en_few_wait_val = 0x6,
|
||||
.en_rest_wait_val = 0x5,
|
||||
.pd = {
|
||||
.name = "mdss_gdsc",
|
||||
},
|
||||
@ -872,17 +874,7 @@ static struct platform_driver disp_cc_sdm845_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sdm845_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sdm845_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sdm845_init);
|
||||
|
||||
static void __exit disp_cc_sdm845_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sdm845_driver);
|
||||
}
|
||||
module_exit(disp_cc_sdm845_exit);
|
||||
module_platform_driver(disp_cc_sdm845_driver);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("QTI DISPCC SDM845 Driver");
|
||||
|
@ -583,8 +583,8 @@ static int disp_cc_sm6115_probe(struct platform_device *pdev)
|
||||
|
||||
clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
|
||||
|
||||
/* Keep DISP_CC_XO_CLK always-ON */
|
||||
regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x604c); /* DISP_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_sm6115_desc, regmap);
|
||||
if (ret) {
|
||||
|
@ -693,17 +693,7 @@ static struct platform_driver disp_cc_sm6125_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm6125_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm6125_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm6125_init);
|
||||
|
||||
static void __exit disp_cc_sm6125_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm6125_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm6125_exit);
|
||||
module_platform_driver(disp_cc_sm6125_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC SM6125 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -781,17 +781,7 @@ static struct platform_driver disp_cc_sm6350_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm6350_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm6350_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm6350_init);
|
||||
|
||||
static void __exit disp_cc_sm6350_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm6350_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm6350_exit);
|
||||
module_platform_driver(disp_cc_sm6350_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISP_CC SM6350 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -594,17 +594,7 @@ static struct platform_driver disp_cc_sm6375_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm6375_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm6375_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm6375_init);
|
||||
|
||||
static void __exit disp_cc_sm6375_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm6375_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm6375_exit);
|
||||
module_platform_driver(disp_cc_sm6375_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC SM6375 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -39,11 +39,11 @@ enum {
|
||||
P_DSI1_PHY_PLL_OUT_DSICLK,
|
||||
};
|
||||
|
||||
static struct pll_vco vco_table[] = {
|
||||
static const struct pll_vco vco_table[] = {
|
||||
{ 249600000, 2000000000, 0 },
|
||||
};
|
||||
|
||||
static struct pll_vco lucid_5lpe_vco[] = {
|
||||
static const struct pll_vco lucid_5lpe_vco[] = {
|
||||
{ 249600000, 1750000000, 0 },
|
||||
};
|
||||
|
||||
@ -214,7 +214,7 @@ static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_3,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb_clk_src",
|
||||
.parent_data = disp_cc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||
@ -233,7 +233,7 @@ static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const 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),
|
||||
@ -247,7 +247,7 @@ static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||
@ -262,7 +262,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_aux1_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_aux1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
@ -277,7 +277,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_aux_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
@ -291,7 +291,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_link1_clk_src = {
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
@ -304,7 +304,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
@ -317,7 +317,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_pixel1_clk_src = {
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
@ -330,7 +330,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_pixel2_clk_src = {
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel2_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
@ -343,7 +343,7 @@ static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
@ -357,7 +357,7 @@ static struct clk_rcg2 disp_cc_mdss_edp_aux_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_edp_aux_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
@ -372,7 +372,7 @@ static struct clk_rcg2 disp_cc_mdss_edp_gtc_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_7,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_edp_gtc_clk_src",
|
||||
.parent_data = disp_cc_parent_data_7,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_7),
|
||||
@ -386,7 +386,7 @@ static struct clk_rcg2 disp_cc_mdss_edp_link_clk_src = {
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_4,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_edp_link_clk_src",
|
||||
.parent_data = disp_cc_parent_data_4,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
|
||||
@ -400,7 +400,7 @@ static struct clk_rcg2 disp_cc_mdss_edp_pixel_clk_src = {
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_4,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_edp_pixel_clk_src",
|
||||
.parent_data = disp_cc_parent_data_4,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
|
||||
@ -414,7 +414,7 @@ static struct clk_branch disp_cc_mdss_edp_aux_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2078,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -432,7 +432,7 @@ static struct clk_branch disp_cc_mdss_edp_gtc_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x207c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_edp_gtc_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_edp_gtc_clk_src.clkr.hw,
|
||||
@ -450,7 +450,7 @@ static struct clk_branch disp_cc_mdss_edp_link_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2070,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -466,7 +466,7 @@ static struct clk_regmap_div disp_cc_mdss_edp_link_div_clk_src = {
|
||||
.reg = 0x2288,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.clkr.hw.init = &(const 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,
|
||||
@ -482,7 +482,7 @@ static struct clk_branch disp_cc_mdss_edp_link_intf_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2074,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -500,7 +500,7 @@ static struct clk_branch disp_cc_mdss_edp_pixel_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x206c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -518,7 +518,7 @@ static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const 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),
|
||||
@ -533,7 +533,7 @@ static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_esc1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||
@ -560,7 +560,7 @@ static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_5,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_clk_src",
|
||||
.parent_data = disp_cc_parent_data_5,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
|
||||
@ -574,7 +574,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
|
||||
.mnd_width = 8,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_6,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const 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),
|
||||
@ -588,7 +588,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
|
||||
.mnd_width = 8,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_6,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_6,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
|
||||
@ -612,7 +612,7 @@ static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_5,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rot_clk_src",
|
||||
.parent_data = disp_cc_parent_data_5,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
|
||||
@ -627,7 +627,7 @@ static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_vsync_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
@ -640,7 +640,7 @@ static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
|
||||
.reg = 0x2128,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.clkr.hw.init = &(const 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,
|
||||
@ -655,7 +655,7 @@ static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
|
||||
.reg = 0x2144,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte1_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_byte1_clk_src.clkr.hw,
|
||||
@ -665,12 +665,11 @@ static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_dp_link1_div_clk_src = {
|
||||
.reg = 0x2224,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link1_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_dp_link1_clk_src.clkr.hw,
|
||||
@ -680,12 +679,11 @@ static struct clk_regmap_div disp_cc_mdss_dp_link1_div_clk_src = {
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
|
||||
.reg = 0x2190,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(struct clk_init_data) {
|
||||
.clkr.hw.init = &(const 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,
|
||||
@ -701,7 +699,7 @@ static struct clk_branch disp_cc_mdss_ahb_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2080,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
@ -719,7 +717,7 @@ static struct clk_branch disp_cc_mdss_byte0_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2028,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
@ -737,7 +735,7 @@ static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x202c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -755,7 +753,7 @@ static struct clk_branch disp_cc_mdss_byte1_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2030,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_byte1_clk_src.clkr.hw,
|
||||
@ -773,7 +771,7 @@ static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2034,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte1_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_byte1_div_clk_src.clkr.hw,
|
||||
@ -791,7 +789,7 @@ static struct clk_branch disp_cc_mdss_dp_aux1_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2068,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_aux1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_dp_aux1_clk_src.clkr.hw,
|
||||
@ -809,7 +807,7 @@ static struct clk_branch disp_cc_mdss_dp_aux_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2054,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -827,7 +825,7 @@ static struct clk_branch disp_cc_mdss_dp_link1_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x205c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_dp_link1_clk_src.clkr.hw,
|
||||
@ -845,7 +843,7 @@ static struct clk_branch disp_cc_mdss_dp_link1_intf_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2060,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link1_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_dp_link1_div_clk_src.clkr.hw,
|
||||
@ -862,7 +860,7 @@ static struct clk_branch disp_cc_mdss_dp_link_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2040,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -880,7 +878,7 @@ static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2044,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -897,7 +895,7 @@ static struct clk_branch disp_cc_mdss_dp_pixel1_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2050,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_dp_pixel1_clk_src.clkr.hw,
|
||||
@ -915,7 +913,7 @@ static struct clk_branch disp_cc_mdss_dp_pixel2_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2058,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel2_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_dp_pixel2_clk_src.clkr.hw,
|
||||
@ -933,7 +931,7 @@ static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x204c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -951,7 +949,7 @@ static struct clk_branch disp_cc_mdss_esc0_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2038,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_esc0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_esc0_clk_src.clkr.hw,
|
||||
@ -969,7 +967,7 @@ static struct clk_branch disp_cc_mdss_esc1_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x203c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_esc1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_esc1_clk_src.clkr.hw,
|
||||
@ -987,7 +985,7 @@ static struct clk_branch disp_cc_mdss_mdp_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x200c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
@ -1005,7 +1003,7 @@ static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x201c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -1022,7 +1020,7 @@ static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x4004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -1040,7 +1038,7 @@ static struct clk_branch disp_cc_mdss_pclk0_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_pclk0_clk_src.clkr.hw,
|
||||
@ -1058,7 +1056,7 @@ static struct clk_branch disp_cc_mdss_pclk1_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_pclk1_clk_src.clkr.hw,
|
||||
@ -1076,7 +1074,7 @@ static struct clk_branch disp_cc_mdss_rot_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2014,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rot_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_rot_clk_src.clkr.hw,
|
||||
@ -1094,7 +1092,7 @@ static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x400c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -1112,7 +1110,7 @@ static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x4008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const 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,
|
||||
@ -1130,7 +1128,7 @@ static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||
.clkr = {
|
||||
.enable_reg = 0x2024,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_vsync_clk",
|
||||
.parent_hws = (const struct clk_hw*[]){
|
||||
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
@ -1365,8 +1363,8 @@ static int disp_cc_sm8250_probe(struct platform_device *pdev)
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, 0x8000, 0x10, 0x10);
|
||||
|
||||
/* DISP_CC_XO_CLK always-on */
|
||||
regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x605c); /* DISP_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8250_desc, regmap);
|
||||
|
||||
@ -1383,17 +1381,7 @@ static struct platform_driver disp_cc_sm8250_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm8250_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm8250_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm8250_init);
|
||||
|
||||
static void __exit disp_cc_sm8250_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm8250_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm8250_exit);
|
||||
module_platform_driver(disp_cc_sm8250_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC SM8250 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1787,11 +1787,8 @@ static int disp_cc_sm8450_probe(struct platform_device *pdev)
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* disp_cc_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0xe05c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0xe05c); /* DISP_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8450_desc, regmap);
|
||||
if (ret)
|
||||
@ -1815,17 +1812,7 @@ static struct platform_driver disp_cc_sm8450_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm8450_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm8450_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm8450_init);
|
||||
|
||||
static void __exit disp_cc_sm8450_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm8450_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm8450_exit);
|
||||
module_platform_driver(disp_cc_sm8450_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC SM8450 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1780,11 +1780,8 @@ static int disp_cc_sm8550_probe(struct platform_device *pdev)
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* disp_cc_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0xe054, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0xe054); /* DISP_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8550_desc, regmap);
|
||||
if (ret)
|
||||
@ -1808,17 +1805,7 @@ static struct platform_driver disp_cc_sm8550_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm8550_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm8550_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm8550_init);
|
||||
|
||||
static void __exit disp_cc_sm8550_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm8550_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm8550_exit);
|
||||
module_platform_driver(disp_cc_sm8550_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC SM8550 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1777,8 +1777,8 @@ static int disp_cc_sm8650_probe(struct platform_device *pdev)
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
|
||||
|
||||
/* Keep clocks always enabled */
|
||||
regmap_update_bits(regmap, 0xe054, BIT(0), BIT(0)); /* disp_cc_xo_clk */
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0xe054); /* DISP_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8650_desc, regmap);
|
||||
if (ret)
|
||||
@ -1802,17 +1802,7 @@ static struct platform_driver disp_cc_sm8650_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init disp_cc_sm8650_init(void)
|
||||
{
|
||||
return platform_driver_register(&disp_cc_sm8650_driver);
|
||||
}
|
||||
subsys_initcall(disp_cc_sm8650_init);
|
||||
|
||||
static void __exit disp_cc_sm8650_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&disp_cc_sm8650_driver);
|
||||
}
|
||||
module_exit(disp_cc_sm8650_exit);
|
||||
module_platform_driver(disp_cc_sm8650_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC SM8650 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
1718
drivers/clk/qcom/dispcc-x1e80100.c
Normal file
1718
drivers/clk/qcom/dispcc-x1e80100.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -857,6 +857,7 @@ static struct clk_rcg2 lpass_sway_clk_src = {
|
||||
|
||||
static const struct freq_tbl ftbl_pcie0_aux_clk_src[] = {
|
||||
F(2000000, P_XO, 12, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 pcie0_aux_clk_src = {
|
||||
@ -1099,6 +1100,7 @@ static const struct freq_tbl ftbl_qpic_io_macro_clk_src[] = {
|
||||
F(100000000, P_GPLL0, 8, 0, 0),
|
||||
F(200000000, P_GPLL0, 4, 0, 0),
|
||||
F(320000000, P_GPLL0, 2.5, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 qpic_io_macro_clk_src = {
|
||||
@ -1194,6 +1196,7 @@ static struct clk_rcg2 ubi0_axi_clk_src = {
|
||||
static const struct freq_tbl ftbl_ubi0_core_clk_src[] = {
|
||||
F(850000000, P_UBI32_PLL, 1, 0, 0),
|
||||
F(1000000000, P_UBI32_PLL, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 ubi0_core_clk_src = {
|
||||
@ -1754,7 +1757,7 @@ static struct clk_branch gcc_gmac0_sys_clk = {
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.halt_bit = 31,
|
||||
.clkr = {
|
||||
.enable_reg = 0x683190,
|
||||
.enable_reg = 0x68190,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "gcc_gmac0_sys_clk",
|
||||
@ -2180,7 +2183,7 @@ static struct clk_branch gcc_pcie1_axi_s_clk = {
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_pcie1_pipe_clk = {
|
||||
.halt_reg = 8,
|
||||
.halt_reg = 0x76018,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.halt_bit = 31,
|
||||
.clkr = {
|
||||
@ -3632,7 +3635,7 @@ static const struct qcom_reset_map gcc_ipq5018_resets[] = {
|
||||
[GCC_SYSTEM_NOC_BCR] = { 0x26000, 0 },
|
||||
[GCC_TCSR_BCR] = { 0x28000, 0 },
|
||||
[GCC_TLMM_BCR] = { 0x34000, 0 },
|
||||
[GCC_UBI0_AXI_ARES] = { 0x680},
|
||||
[GCC_UBI0_AXI_ARES] = { 0x68010, 0 },
|
||||
[GCC_UBI0_AHB_ARES] = { 0x68010, 1 },
|
||||
[GCC_UBI0_NC_AXI_ARES] = { 0x68010, 2 },
|
||||
[GCC_UBI0_DBG_ARES] = { 0x68010, 3 },
|
||||
|
@ -1554,6 +1554,7 @@ static struct clk_regmap_div nss_ubi0_div_clk_src = {
|
||||
|
||||
static const struct freq_tbl ftbl_pcie_aux_clk_src[] = {
|
||||
F(24000000, P_XO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gcc_xo_gpll0_core_pi_sleep_clk[] = {
|
||||
@ -1734,6 +1735,7 @@ static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = {
|
||||
F(160000000, P_GPLL0, 5, 0, 0),
|
||||
F(216000000, P_GPLL6, 5, 0, 0),
|
||||
F(308570000, P_GPLL6, 3.5, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gcc_xo_gpll0_gpll6_gpll0_div2[] = {
|
||||
@ -3522,6 +3524,22 @@ static struct clk_branch gcc_prng_ahb_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qdss_at_clk = {
|
||||
.halt_reg = 0x29024,
|
||||
.clkr = {
|
||||
.enable_reg = 0x29024,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qdss_at_clk",
|
||||
.parent_hws = (const struct clk_hw *[]){
|
||||
&qdss_at_clk_src.clkr.hw },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_qdss_dap_clk = {
|
||||
.halt_reg = 0x29084,
|
||||
.clkr = {
|
||||
@ -4361,6 +4379,7 @@ static struct clk_regmap *gcc_ipq6018_clks[] = {
|
||||
[GCC_SYS_NOC_PCIE0_AXI_CLK] = &gcc_sys_noc_pcie0_axi_clk.clkr,
|
||||
[GCC_PCIE0_PIPE_CLK] = &gcc_pcie0_pipe_clk.clkr,
|
||||
[GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
|
||||
[GCC_QDSS_AT_CLK] = &gcc_qdss_at_clk.clkr,
|
||||
[GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
|
||||
[GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
|
||||
[GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,
|
||||
|
@ -644,6 +644,7 @@ static struct clk_rcg2 pcie0_axi_clk_src = {
|
||||
|
||||
static const struct freq_tbl ftbl_pcie_aux_clk_src[] = {
|
||||
F(19200000, P_XO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gcc_xo_gpll0_sleep_clk[] = {
|
||||
@ -795,6 +796,7 @@ static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = {
|
||||
F(19200000, P_XO, 1, 0, 0),
|
||||
F(160000000, P_GPLL0, 5, 0, 0),
|
||||
F(308570000, P_GPLL6, 3.5, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gcc_xo_gpll0_gpll6_gpll0_div2[] = {
|
||||
|
@ -2082,6 +2082,7 @@ static struct clk_branch gcc_sdcc1_apps_clk = {
|
||||
static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = {
|
||||
F(150000000, P_GPLL4, 8, 0, 0),
|
||||
F(300000000, P_GPLL4, 4, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 sdcc1_ice_core_clk_src = {
|
||||
|
@ -4171,6 +4171,10 @@ static const struct qcom_reset_map gcc_msm8953_resets[] = {
|
||||
[GCC_USB3PHY_PHY_BCR] = { 0x3f03c },
|
||||
[GCC_USB3_PHY_BCR] = { 0x3f034 },
|
||||
[GCC_USB_30_BCR] = { 0x3f070 },
|
||||
[GCC_MDSS_BCR] = { 0x4d074 },
|
||||
[GCC_CRYPTO_BCR] = { 0x16000 },
|
||||
[GCC_SDCC1_BCR] = { 0x42000 },
|
||||
[GCC_SDCC2_BCR] = { 0x43000 },
|
||||
};
|
||||
|
||||
static const struct regmap_config gcc_msm8953_regmap_config = {
|
||||
|
@ -4662,8 +4662,8 @@ static const struct qcom_reset_map gcc_sa8775p_resets[] = {
|
||||
[GCC_USB3UNIPHY_PHY_MP0_BCR] = { 0x5c020 },
|
||||
[GCC_USB3UNIPHY_PHY_MP1_BCR] = { 0x5c024 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x76000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x34014, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x3401c, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x34014, .bit = 2, .udelay = 400 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x3401c, .bit = 2, .udelay = 400 },
|
||||
[GCC_VIDEO_BCR] = { 0x34000 },
|
||||
};
|
||||
|
||||
@ -4742,21 +4742,16 @@ static int gcc_sa8775p_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GCC_CAMERA_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_DISP1_AHB_CLK,
|
||||
* GCC_DISP1_XO_CLK, GCC_DISP_AHB_CLK, GCC_DISP_XO_CLK,
|
||||
* GCC_GPU_CFG_AHB_CLK, GCC_VIDEO_AHB_CLK, GCC_VIDEO_XO_CLK.
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x32020, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xc7004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xc7018, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x33004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x33018, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x7d004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x34004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x34024, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32020); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xc7004); /* GCC_DISP1_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xc7018); /* GCC_DISP1_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x33004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x33018); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x7d004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x34004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x34024); /* GCC_VIDEO_XO_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gcc_sa8775p_desc, regmap);
|
||||
}
|
||||
|
@ -2443,19 +2443,15 @@ static int gcc_sc7180_probe(struct platform_device *pdev)
|
||||
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
|
||||
regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK,
|
||||
* GCC_DISP_AHB_CLK, GCC_GPU_CFG_AHB_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b02c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b030, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x48004); /* GCC_CPUSS_GNOC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b008); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b00c); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b02c); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b028); /* GCC_VIDEO_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b030); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
|
||||
ARRAY_SIZE(gcc_dfs_clocks));
|
||||
|
@ -3453,18 +3453,14 @@ static int gcc_sc7280_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GCC_CAMERA_AHB_CLK/XO_CLK, GCC_DISP_AHB_CLK/XO_CLK
|
||||
* GCC_VIDEO_AHB_CLK/XO_CLK, GCC_GPU_CFG_AHB_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x2701C, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28014, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x26004);/* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x26028);/* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27004);/* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x2701c);/* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x28004);/* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x28014);/* GCC_VIDEO_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004);/* GCC_GPU_CFG_AHB_CLK */
|
||||
regmap_update_bits(regmap, 0x7100C, BIT(13), BIT(13));
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
|
||||
|
@ -3347,6 +3347,19 @@ static struct clk_branch gcc_ufs_card_2_unipro_core_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_card_clkref_en = {
|
||||
.halt_reg = 0x8c004,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8c004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gcc_ufs_card_clkref_en",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_card_ahb_clk = {
|
||||
.halt_reg = 0x75014,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -3561,6 +3574,19 @@ static struct clk_branch gcc_ufs_card_unipro_core_hw_ctl_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_mem_clkref_en = {
|
||||
.halt_reg = 0x8c000,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8c000,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gcc_ufs_mem_clkref_en",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_ufs_phy_ahb_clk = {
|
||||
.halt_reg = 0x77014,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@ -4413,6 +4439,7 @@ static struct clk_regmap *gcc_sc8180x_clocks[] = {
|
||||
[GCC_UFS_CARD_2_TX_SYMBOL_0_CLK] = &gcc_ufs_card_2_tx_symbol_0_clk.clkr,
|
||||
[GCC_UFS_CARD_2_UNIPRO_CORE_CLK] = &gcc_ufs_card_2_unipro_core_clk.clkr,
|
||||
[GCC_UFS_CARD_2_UNIPRO_CORE_CLK_SRC] = &gcc_ufs_card_2_unipro_core_clk_src.clkr,
|
||||
[GCC_UFS_CARD_CLKREF_EN] = &gcc_ufs_card_clkref_en.clkr,
|
||||
[GCC_UFS_CARD_AHB_CLK] = &gcc_ufs_card_ahb_clk.clkr,
|
||||
[GCC_UFS_CARD_AXI_CLK] = &gcc_ufs_card_axi_clk.clkr,
|
||||
[GCC_UFS_CARD_AXI_CLK_SRC] = &gcc_ufs_card_axi_clk_src.clkr,
|
||||
@ -4429,6 +4456,7 @@ static struct clk_regmap *gcc_sc8180x_clocks[] = {
|
||||
[GCC_UFS_CARD_UNIPRO_CORE_CLK] = &gcc_ufs_card_unipro_core_clk.clkr,
|
||||
[GCC_UFS_CARD_UNIPRO_CORE_CLK_SRC] = &gcc_ufs_card_unipro_core_clk_src.clkr,
|
||||
[GCC_UFS_CARD_UNIPRO_CORE_HW_CTL_CLK] = &gcc_ufs_card_unipro_core_hw_ctl_clk.clkr,
|
||||
[GCC_UFS_MEM_CLKREF_EN] = &gcc_ufs_mem_clkref_en.clkr,
|
||||
[GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
|
||||
[GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr,
|
||||
[GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr,
|
||||
@ -4528,9 +4556,9 @@ static const struct qcom_reset_map gcc_sc8180x_resets[] = {
|
||||
[GCC_USB30_PRIM_BCR] = { 0xf000 },
|
||||
[GCC_USB30_SEC_BCR] = { 0x10000 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
|
||||
[GCC_VIDEO_AXIC_CLK_BCR] = { 0xb02c, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_BCR] = { 0xb024, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_BCR] = { 0xb028, 2 },
|
||||
[GCC_VIDEO_AXIC_CLK_BCR] = { .reg = 0xb02c, .bit = 2, .udelay = 150 },
|
||||
[GCC_VIDEO_AXI0_CLK_BCR] = { .reg = 0xb024, .bit = 2, .udelay = 150 },
|
||||
[GCC_VIDEO_AXI1_CLK_BCR] = { .reg = 0xb028, .bit = 2, .udelay = 150 },
|
||||
};
|
||||
|
||||
static struct gdsc *gcc_sc8180x_gdscs[] = {
|
||||
@ -4579,23 +4607,17 @@ static int gcc_sc8180x_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
/*
|
||||
* Enable the following always-on clocks:
|
||||
* GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, GCC_DISP_AHB_CLK,
|
||||
* GCC_VIDEO_XO_CLK, GCC_CAMERA_XO_CLK, GCC_DISP_XO_CLK,
|
||||
* GCC_CPUSS_GNOC_CLK, GCC_CPUSS_DVM_BUS_CLK, GCC_NPU_CFG_AHB_CLK and
|
||||
* GCC_GPU_CFG_AHB_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0xb004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xb008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xb00c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xb040, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xb044, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xb048, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x48190, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x4d004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0xb004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xb008); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xb00c); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xb040); /* GCC_VIDEO_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xb044); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xb048); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x48004); /* GCC_CPUSS_GNOC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x48190); /* GCC_CPUSS_DVM_BUS_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x4d004); /* GCC_NPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
|
||||
/* Disable the GPLL0 active input to NPU and GPU via MISC registers */
|
||||
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
|
||||
|
@ -7448,8 +7448,8 @@ static const struct qcom_reset_map gcc_sc8280xp_resets[] = {
|
||||
[GCC_USB4PHY_PHY_PRIM_BCR] = { 0x4a004 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
|
||||
[GCC_VIDEO_BCR] = { 0x28000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x28010, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x28018, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x28010, .bit = 2, .udelay = 400 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x28018, .bit = 2, .udelay = 400 },
|
||||
};
|
||||
|
||||
static struct gdsc *gcc_sc8280xp_gdscs[] = {
|
||||
@ -7543,21 +7543,16 @@ static int gcc_sc8280xp_probe(struct platform_device *pdev)
|
||||
goto err_put_rpm;
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GCC_CAMERA_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_DISP_AHB_CLK,
|
||||
* GCC_DISP_XO_CLK, GCC_GPU_CFG_AHB_CLK, GCC_VIDEO_AHB_CLK,
|
||||
* GCC_VIDEO_XO_CLK, GCC_DISP1_AHB_CLK, GCC_DISP1_XO_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x26020, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x27028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xbb004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0xbb028, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x26020); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27028); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x28004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x28028); /* GCC_VIDEO_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xbb004); /* GCC_DISP1_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0xbb028); /* GCC_DISP1_XO_CLK */
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ARRAY_SIZE(gcc_dfs_clocks));
|
||||
if (ret)
|
||||
|
@ -4037,3 +4037,4 @@ module_exit(gcc_sdm845_exit);
|
||||
MODULE_DESCRIPTION("QTI GCC SDM845 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:gcc-sdm845");
|
||||
MODULE_SOFTDEP("pre: rpmhpd");
|
||||
|
@ -1611,14 +1611,10 @@ static int gcc_sdx55_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON as they are critical to the functioning
|
||||
* of the system:
|
||||
* GCC_SYS_NOC_CPUSS_AHB_CLK, GCC_CPUSS_AHB_CLK, GCC_CPUSS_GNOC_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21));
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x6d008); /* GCC_SYS_NOC_CPUSS_AHB_CLK */
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21)); /* GCC_CPUSS_AHB_CLK */
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22)); /* GCC_CPUSS_GNOC_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gcc_sdx55_desc, regmap);
|
||||
}
|
||||
|
@ -1574,14 +1574,11 @@ static int gcc_sdx65_probe(struct platform_device *pdev)
|
||||
regmap = qcom_cc_map(pdev, &gcc_sdx65_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
/*
|
||||
* Keep the clocks always-ON as they are critical to the functioning
|
||||
* of the system:
|
||||
* GCC_SYS_NOC_CPUSS_AHB_CLK, GCC_CPUSS_AHB_CLK, GCC_CPUSS_GNOC_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21));
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22));
|
||||
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x6d008); /* GCC_SYS_NOC_CPUSS_AHB_CLK */
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21)); /* GCC_CPUSS_AHB_CLK */
|
||||
regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22)); /* GCC_CPUSS_GNOC_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gcc_sdx65_desc, regmap);
|
||||
}
|
||||
|
@ -2936,13 +2936,9 @@ static int gcc_sdx75_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* gcc_ahb_pcie_link_clk
|
||||
* gcc_xo_pcie_link_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x3e004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x3e008, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x3e004); /* GCC_AHB_PCIE_LINK_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x3e008); /* GCC_XO_PCIE_LINK_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gcc_sdx75_desc, regmap);
|
||||
}
|
||||
|
@ -2791,8 +2791,8 @@ static const struct qcom_reset_map gcc_sm4450_resets[] = {
|
||||
[GCC_VENUS_BCR] = { 0xb601c },
|
||||
[GCC_VIDEO_BCR] = { 0x42000 },
|
||||
[GCC_VIDEO_VENUS_BCR] = { 0xb6000 },
|
||||
[GCC_VENUS_CTL_AXI_CLK_ARES] = { 0x4201c, 2 },
|
||||
[GCC_VIDEO_VENUS_CTL_CLK_ARES] = { 0xb6038, 2 },
|
||||
[GCC_VENUS_CTL_AXI_CLK_ARES] = { .reg = 0x4201c, .bit = 2, .udelay = 400 },
|
||||
[GCC_VIDEO_VENUS_CTL_CLK_ARES] = { .reg = 0xb6038, .bit = 2, .udelay = 400 },
|
||||
};
|
||||
|
||||
static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
|
||||
@ -2849,25 +2849,15 @@ static int gcc_sm4450_probe(struct platform_device *pdev)
|
||||
|
||||
qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* gcc_camera_ahb_clk
|
||||
* gcc_camera_sleep_clk
|
||||
* gcc_camera_xo_clk
|
||||
* gcc_disp_ahb_clk
|
||||
* gcc_disp_xo_clk
|
||||
* gcc_gpu_cfg_ahb_clk
|
||||
* gcc_video_ahb_clk
|
||||
* gcc_video_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x36004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x36018, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x3601c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x37004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x37014, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x81004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x42004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x42018, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x36004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x36018); /* GCC_CAMERA_SLEEP_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x3601c); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x37004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x37014); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x81004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x42004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x42018); /* GCC_VIDEO_XO_CLK */
|
||||
|
||||
regmap_update_bits(regmap, 0x4201c, BIT(21), BIT(21));
|
||||
|
||||
|
@ -3882,13 +3882,10 @@ static int gcc_sm6375_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Keep the following clocks always on:
|
||||
* GCC_CAMERA_XO_CLK, GCC_CPUSS_GNOC_CLK, GCC_DISP_XO_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x17028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x2b004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x1702c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x17028); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x2b004); /* GCC_CPUSS_GNOC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x1702c); /* GCC_DISP_XO_CLK */
|
||||
|
||||
clk_lucid_pll_configure(&gpll10, regmap, &gpll10_config);
|
||||
clk_lucid_pll_configure(&gpll11, regmap, &gpll11_config);
|
||||
|
@ -2918,7 +2918,7 @@ static const struct qcom_reset_map gcc_sm7150_resets[] = {
|
||||
[GCC_USB3_PHY_PRIM_BCR] = { 0x50000 },
|
||||
[GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
|
||||
[GCC_QUSB2PHY_PRIM_BCR] = { 0x26000 },
|
||||
[GCC_VIDEO_AXI_CLK_BCR] = { 0xb01c, 2 },
|
||||
[GCC_VIDEO_AXI_CLK_BCR] = { .reg = 0xb01c, .bit = 2, .udelay = 150 },
|
||||
};
|
||||
|
||||
static const struct clk_rcg_dfs_data gcc_sm7150_dfs_desc[] = {
|
||||
@ -3002,20 +3002,15 @@ static int gcc_sm7150_probe(struct platform_device *pdev)
|
||||
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
|
||||
regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
|
||||
|
||||
/*
|
||||
* Keep the critical clocks always-ON
|
||||
* GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK,
|
||||
* GCC_DISP_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_VIDEO_XO_CLK,
|
||||
* GCC_DISP_XO_CLK, GCC_GPU_CFG_AHB_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b02c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b030, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x48004); /* GCC_CPUSS_GNOC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b008); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b00c); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b02c); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b028); /* GCC_VIDEO_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b030); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_sm7150_dfs_desc,
|
||||
ARRAY_SIZE(gcc_sm7150_dfs_desc));
|
||||
|
@ -453,19 +453,29 @@ static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s0_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
|
||||
.cmd_rcgr = 0x17148,
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s0_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s1_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
|
||||
@ -474,13 +484,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s1_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s2_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
|
||||
@ -489,13 +501,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s2_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s3_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
|
||||
@ -504,13 +518,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s3_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s4_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
|
||||
@ -519,13 +535,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s4_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s5_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
|
||||
@ -534,13 +552,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s5_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s6_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s6_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = {
|
||||
@ -549,13 +569,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s6_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s6_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap0_s7_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap0_s7_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = {
|
||||
@ -564,13 +586,15 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap0_s7_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap0_s7_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap1_s0_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
|
||||
@ -579,13 +603,15 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s0_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap1_s1_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
|
||||
@ -594,13 +620,15 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s1_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap1_s2_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
|
||||
@ -609,13 +637,15 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s2_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap1_s3_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
|
||||
@ -624,13 +654,15 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s3_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap1_s4_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
|
||||
@ -639,13 +671,15 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s4_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap1_s5_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
|
||||
@ -654,13 +688,15 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap1_s5_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap2_s0_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = {
|
||||
@ -669,13 +705,15 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap2_s0_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap2_s0_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap2_s1_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = {
|
||||
@ -684,13 +722,15 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap2_s1_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap2_s1_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap2_s2_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = {
|
||||
@ -699,13 +739,15 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap2_s2_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap2_s2_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap2_s3_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = {
|
||||
@ -714,13 +756,15 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap2_s3_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap2_s3_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap2_s4_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = {
|
||||
@ -729,13 +773,15 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap2_s4_clk_src",
|
||||
.clkr.hw.init = &gcc_qupv3_wrap2_s4_clk_src_init,
|
||||
};
|
||||
|
||||
static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = {
|
||||
.name = "gcc_qupv3_wrap2_s5_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = {
|
||||
@ -744,13 +790,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = {
|
||||
.hid_width = 5,
|
||||
.parent_map = gcc_parent_map_0,
|
||||
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "gcc_qupv3_wrap2_s5_clk_src",
|
||||
.parent_data = gcc_parents_0,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
.clkr.hw.init = &gcc_qupv3_wrap2_s5_clk_src_init,
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
|
||||
@ -3738,6 +3778,9 @@ static const struct qcom_reset_map gcc_sm8150_resets[] = {
|
||||
[GCC_USB30_PRIM_BCR] = { 0xf000 },
|
||||
[GCC_USB30_SEC_BCR] = { 0x10000 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
|
||||
[GCC_VIDEO_AXIC_CLK_BCR] = { 0xb02c, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_BCR] = { 0xb024, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_BCR] = { 0xb028, 2 },
|
||||
};
|
||||
|
||||
static struct gdsc *gcc_sm8150_gdscs[] = {
|
||||
@ -3750,6 +3793,29 @@ static struct gdsc *gcc_sm8150_gdscs[] = {
|
||||
[USB30_SEC_GDSC] = &usb30_sec_gdsc,
|
||||
};
|
||||
|
||||
static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s6_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap0_s7_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap2_s0_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap2_s1_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap2_s2_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap2_s3_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap2_s4_clk_src),
|
||||
DEFINE_RCG_DFS(gcc_qupv3_wrap2_s5_clk_src),
|
||||
};
|
||||
|
||||
static const struct regmap_config gcc_sm8150_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
@ -3777,6 +3843,7 @@ MODULE_DEVICE_TABLE(of, gcc_sm8150_match_table);
|
||||
static int gcc_sm8150_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gcc_sm8150_desc);
|
||||
if (IS_ERR(regmap))
|
||||
@ -3786,6 +3853,11 @@ static int gcc_sm8150_probe(struct platform_device *pdev)
|
||||
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
|
||||
regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
|
||||
ARRAY_SIZE(gcc_dfs_clocks));
|
||||
if (ret)
|
||||
dev_err_probe(&pdev->dev, ret, "Failed to register with DFS!\n");
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gcc_sm8150_desc, regmap);
|
||||
}
|
||||
|
||||
|
@ -3576,8 +3576,8 @@ static const struct qcom_reset_map gcc_sm8250_resets[] = {
|
||||
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
|
||||
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0xb024, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0xb028, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0xb024, .bit = 2, .udelay = 150 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0xb028, .bit = 2, .udelay = 150 },
|
||||
};
|
||||
|
||||
static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
|
||||
@ -3643,18 +3643,13 @@ static int gcc_sm8250_probe(struct platform_device *pdev)
|
||||
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
|
||||
regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, GCC_DISP_AHB_CLK,
|
||||
* GCC_CPUSS_DVM_BUS_CLK, GCC_GPU_CFG_AHB_CLK,
|
||||
* GCC_SYS_NOC_CPUSS_AHB_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x4818c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x52000, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b008); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x0b00c); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x4818c); /* GCC_CPUSS_DVM_BUS_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x52000); /* GCC_SYS_NOC_CPUSS_AHB_CLK */
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
|
||||
ARRAY_SIZE(gcc_dfs_clocks));
|
||||
|
@ -3743,8 +3743,8 @@ static const struct qcom_reset_map gcc_sm8350_resets[] = {
|
||||
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
|
||||
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x28010, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x28018, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x28010, .bit = 2, .udelay = 400 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x28018, .bit = 2, .udelay = 400 },
|
||||
[GCC_VIDEO_BCR] = { 0x28000 },
|
||||
};
|
||||
|
||||
@ -3806,18 +3806,14 @@ static int gcc_sm8350_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep the critical clock always-On
|
||||
* GCC_CAMERA_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_DISP_AHB_CLK, GCC_DISP_XO_CLK,
|
||||
* GCC_GPU_CFG_AHB_CLK, GCC_VIDEO_AHB_CLK, GCC_VIDEO_XO_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x26018, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x2701c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x28020, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x26018); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x2701c); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x28004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x28020); /* GCC_VIDEO_XO_CLK */
|
||||
|
||||
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ARRAY_SIZE(gcc_dfs_clocks));
|
||||
if (ret)
|
||||
|
@ -3202,8 +3202,8 @@ static const struct qcom_reset_map gcc_sm8450_resets[] = {
|
||||
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x60004 },
|
||||
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x60010 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x7a000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x42018, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x42020, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x42018, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x42020, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_BCR] = { 0x42000 },
|
||||
};
|
||||
|
||||
@ -3280,19 +3280,14 @@ static int gcc_sm8450_probe(struct platform_device *pdev)
|
||||
/* FORCE_MEM_CORE_ON for ufs phy ice core clocks */
|
||||
regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14));
|
||||
|
||||
/*
|
||||
* Keep the critical clock always-On
|
||||
* gcc_camera_ahb_clk, gcc_camera_xo_clk, gcc_disp_ahb_clk,
|
||||
* gcc_disp_xo_clk, gcc_gpu_cfg_ahb_clk, gcc_video_ahb_clk,
|
||||
* gcc_video_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x36004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x36020, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x37004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x3701c, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x81004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x42004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x42028, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x36004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x36020); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x37004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x3701c); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x81004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x42004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x42028); /* GCC_VIDEO_XO_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gcc_sm8450_desc, regmap);
|
||||
}
|
||||
|
@ -3276,8 +3276,8 @@ static const struct qcom_reset_map gcc_sm8550_resets[] = {
|
||||
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
|
||||
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
|
||||
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x32018, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x32024, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x32018, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x32024, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_BCR] = { 0x32000 },
|
||||
};
|
||||
|
||||
@ -3352,19 +3352,14 @@ static int gcc_sm8550_probe(struct platform_device *pdev)
|
||||
/* FORCE_MEM_CORE_ON for ufs phy ice core clocks */
|
||||
regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14));
|
||||
|
||||
/*
|
||||
* Keep the critical clock always-On
|
||||
* gcc_camera_ahb_clk, gcc_camera_xo_clk, gcc_disp_ahb_clk,
|
||||
* gcc_disp_xo_clk, gcc_gpu_cfg_ahb_clk, gcc_video_ahb_clk,
|
||||
* gcc_video_xo_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x27018, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x32030, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32030); /* GCC_VIDEO_XO_CLK */
|
||||
|
||||
/* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */
|
||||
regmap_write(regmap, 0x52024, 0x0);
|
||||
|
@ -3734,8 +3734,8 @@ static const struct qcom_reset_map gcc_sm8650_resets[] = {
|
||||
[GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
|
||||
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
|
||||
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x32018, 2 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x32024, 2 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x32018, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x32024, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_BCR] = { 0x32000 },
|
||||
};
|
||||
|
||||
@ -3808,14 +3808,14 @@ static int gcc_sm8650_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Keep the critical clock always-On */
|
||||
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); /* gcc_camera_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0)); /* gcc_camera_xo_clk */
|
||||
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); /* gcc_disp_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x27018, BIT(0), BIT(0)); /* gcc_disp_xo_clk */
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0)); /* gcc_gpu_cfg_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0)); /* gcc_video_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x32030, BIT(0), BIT(0)); /* gcc_video_xo_clk */
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32030); /* GCC_VIDEO_XO_CLK */
|
||||
|
||||
qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true);
|
||||
|
||||
|
@ -6769,14 +6769,14 @@ static int gcc_x1e80100_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Keep the critical clock always-On */
|
||||
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); /* gcc_camera_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0)); /* gcc_camera_xo_clk */
|
||||
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); /* gcc_disp_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x27018, BIT(0), BIT(0)); /* gcc_disp_xo_clk */
|
||||
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0)); /* gcc_video_ahb_clk */
|
||||
regmap_update_bits(regmap, 0x32030, BIT(0), BIT(0)); /* gcc_video_xo_clk */
|
||||
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0)); /* gcc_gpu_cfg_ahb_clk */
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x32030); /* GCC_VIDEO_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
|
||||
|
||||
/* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */
|
||||
regmap_write(regmap, 0x52224, 0x0);
|
||||
|
@ -557,7 +557,15 @@ void gdsc_unregister(struct gdsc_desc *desc)
|
||||
*/
|
||||
int gdsc_gx_do_nothing_enable(struct generic_pm_domain *domain)
|
||||
{
|
||||
/* Do nothing but give genpd the impression that we were successful */
|
||||
return 0;
|
||||
struct gdsc *sc = domain_to_gdsc(domain);
|
||||
int ret = 0;
|
||||
|
||||
/* Enable the parent supply, when controlled through the regulator framework. */
|
||||
if (sc->rsupply)
|
||||
ret = regulator_enable(sc->rsupply);
|
||||
|
||||
/* Do nothing with the GDSC itself */
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gdsc_gx_do_nothing_enable);
|
||||
|
@ -609,17 +609,7 @@ static struct platform_driver gpu_cc_sa8775p_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sa8775p_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sa8775p_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sa8775p_init);
|
||||
|
||||
static void __exit gpu_cc_sa8775p_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sa8775p_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sa8775p_exit);
|
||||
module_platform_driver(gpu_cc_sa8775p_driver);
|
||||
|
||||
MODULE_DESCRIPTION("SA8775P GPUCC driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -252,17 +252,7 @@ static struct platform_driver gpu_cc_sc7180_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sc7180_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sc7180_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sc7180_init);
|
||||
|
||||
static void __exit gpu_cc_sc7180_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sc7180_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sc7180_exit);
|
||||
module_platform_driver(gpu_cc_sc7180_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC SC7180 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -457,12 +457,9 @@ static int gpu_cc_sc7280_probe(struct platform_device *pdev)
|
||||
|
||||
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));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x1170); /* GPU_CC_CB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x1098); /* GPUCC_CX_GMU_CLK */
|
||||
regmap_update_bits(regmap, 0x1098, BIT(13), BIT(13));
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_sc7280_desc, regmap);
|
||||
@ -476,17 +473,7 @@ static struct platform_driver gpu_cc_sc7280_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
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_platform_driver(gpu_cc_sc7280_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC SC7280 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -399,6 +399,7 @@ static struct gdsc gx_gdsc = {
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = CLAMP_IO | RETAIN_FF_ENABLE,
|
||||
.supply = "vdd-gfx",
|
||||
};
|
||||
|
||||
static struct gdsc *gpu_cc_sc8280xp_gdscs[] = {
|
||||
@ -444,12 +445,9 @@ static int gpu_cc_sc8280xp_probe(struct platform_device *pdev)
|
||||
clk_lucid_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
|
||||
clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||
|
||||
/*
|
||||
* Keep the clocks always-ON
|
||||
* GPU_CC_CB_CLK, GPU_CC_CXO_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x109c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x1170); /* GPU_CC_CB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x109c); /* GPU_CC_CXO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(pdev, &gpu_cc_sc8280xp_desc, regmap);
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
@ -203,17 +203,7 @@ static struct platform_driver gpu_cc_sdm845_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sdm845_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sdm845_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sdm845_init);
|
||||
|
||||
static void __exit gpu_cc_sdm845_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sdm845_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sdm845_exit);
|
||||
module_platform_driver(gpu_cc_sdm845_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPUCC SDM845 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -315,17 +315,7 @@ static struct platform_driver gpu_cc_sm8150_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sm8150_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sm8150_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sm8150_init);
|
||||
|
||||
static void __exit gpu_cc_sm8150_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sm8150_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sm8150_exit);
|
||||
module_platform_driver(gpu_cc_sm8150_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPUCC SM8150 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -331,17 +331,7 @@ static struct platform_driver gpu_cc_sm8250_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sm8250_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sm8250_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sm8250_init);
|
||||
|
||||
static void __exit gpu_cc_sm8250_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sm8250_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sm8250_exit);
|
||||
module_platform_driver(gpu_cc_sm8250_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC SM8250 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -621,17 +621,7 @@ static struct platform_driver gpu_cc_sm8350_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sm8350_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sm8350_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sm8350_init);
|
||||
|
||||
static void __exit gpu_cc_sm8350_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sm8350_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sm8350_exit);
|
||||
module_platform_driver(gpu_cc_sm8350_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC SM8350 Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -575,13 +575,9 @@ static int gpu_cc_sm8550_probe(struct platform_device *pdev)
|
||||
clk_lucid_ole_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||
|
||||
/*
|
||||
* Keep clocks always enabled:
|
||||
* gpu_cc_cxo_aon_clk
|
||||
* gpu_cc_demet_clk
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x9004, BIT(0), BIT(0));
|
||||
regmap_update_bits(regmap, 0x900c, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x9004); /* GPU_CC_CXO_AON_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x900c); /* GPU_CC_DEMET_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_sm8550_desc, regmap);
|
||||
}
|
||||
@ -594,17 +590,7 @@ static struct platform_driver gpu_cc_sm8550_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init gpu_cc_sm8550_init(void)
|
||||
{
|
||||
return platform_driver_register(&gpu_cc_sm8550_driver);
|
||||
}
|
||||
subsys_initcall(gpu_cc_sm8550_init);
|
||||
|
||||
static void __exit gpu_cc_sm8550_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&gpu_cc_sm8550_driver);
|
||||
}
|
||||
module_exit(gpu_cc_sm8550_exit);
|
||||
module_platform_driver(gpu_cc_sm8550_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPUCC SM8550 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
656
drivers/clk/qcom/gpucc-x1e80100.c
Normal file
656
drivers/clk/qcom/gpucc-x1e80100.c
Normal file
@ -0,0 +1,656 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,x1e80100-gpucc.h>
|
||||
#include <dt-bindings/reset/qcom,x1e80100-gpucc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "gdsc.h"
|
||||
#include "reset.h"
|
||||
|
||||
enum {
|
||||
DT_BI_TCXO,
|
||||
DT_GPLL0_OUT_MAIN,
|
||||
DT_GPLL0_OUT_MAIN_DIV,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_GPLL0_OUT_MAIN,
|
||||
P_GPLL0_OUT_MAIN_DIV,
|
||||
P_GPU_CC_PLL0_OUT_MAIN,
|
||||
P_GPU_CC_PLL1_OUT_MAIN,
|
||||
};
|
||||
|
||||
static const struct pll_vco lucid_ole_vco[] = {
|
||||
{ 249600000, 2300000000, 0 },
|
||||
};
|
||||
|
||||
static const struct pll_vco zonda_ole_vco[] = {
|
||||
{ 700000000, 3600000000, 0 },
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x29,
|
||||
.alpha = 0xa000,
|
||||
.config_ctl_val = 0x08240800,
|
||||
.config_ctl_hi_val = 0x05008001,
|
||||
.config_ctl_hi1_val = 0x00000000,
|
||||
.config_ctl_hi2_val = 0x00000000,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x02000000,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = zonda_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(zonda_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA_OLE],
|
||||
.clkr = {
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_pll0",
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_zonda_ole_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.l = 0x16,
|
||||
.alpha = 0xeaaa,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00182261,
|
||||
.config_ctl_hi1_val = 0x82aa299c,
|
||||
.test_ctl_val = 0x00000000,
|
||||
.test_ctl_hi_val = 0x00000003,
|
||||
.test_ctl_hi1_val = 0x00009000,
|
||||
.test_ctl_hi2_val = 0x00000034,
|
||||
.user_ctl_val = 0x00000000,
|
||||
.user_ctl_hi_val = 0x00000005,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
.clkr = {
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_pll1",
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_evo_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_0[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
{ P_GPLL0_OUT_MAIN_DIV, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_2[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_3[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_3[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = {
|
||||
F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_ff_clk_src = {
|
||||
.cmd_rcgr = 0x9474,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_gpu_cc_ff_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_ff_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(220000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
|
||||
F(550000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||
.cmd_rcgr = 0x9318,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gmu_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_hub_clk_src = {
|
||||
.cmd_rcgr = 0x93ec,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_gpu_cc_ff_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_xo_clk_src = {
|
||||
.cmd_rcgr = 0x9010,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_3,
|
||||
.freq_tbl = NULL,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_xo_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_3),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gpu_cc_demet_div_clk_src = {
|
||||
.reg = 0x9054,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_demet_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_xo_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_xo_div_clk_src = {
|
||||
.reg = 0x9050,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_xo_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_xo_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 = 0x911c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x911c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_ahb_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_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_crc_ahb_clk = {
|
||||
.halt_reg = 0x9120,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9120,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_crc_ahb_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_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_ff_clk = {
|
||||
.halt_reg = 0x914c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x914c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cx_ff_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_ff_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 = 0x913c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x913c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const 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_cxo_aon_clk = {
|
||||
.halt_reg = 0x9004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cxo_aon_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_clk = {
|
||||
.halt_reg = 0x9144,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9144,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cxo_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_demet_clk = {
|
||||
.halt_reg = 0x900c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x900c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_demet_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_demet_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_aon_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_freq_measure_clk = {
|
||||
.halt_reg = 0x9008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_freq_measure_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_xo_div_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 = 0x7000,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x7000,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gmu_clk = {
|
||||
.halt_reg = 0x90bc,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90bc,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const 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_gx_vsense_clk = {
|
||||
.halt_reg = 0x90b0,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90b0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gx_vsense_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_hub_aon_clk = {
|
||||
.halt_reg = 0x93e8,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x93e8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const 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 = 0x9148,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9148,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_cx_int_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_memnoc_gfx_clk = {
|
||||
.halt_reg = 0x9150,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9150,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_memnoc_gfx_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = {
|
||||
.halt_reg = 0x9288,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9288,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const 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 = 0x928c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x928c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const 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 = 0x9134,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9134,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_sleep_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc gpu_cx_gdsc = {
|
||||
.gdscr = 0x9108,
|
||||
.gds_hw_ctrl = 0x953c,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0xf,
|
||||
.pd = {
|
||||
.name = "gpu_cx_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = VOTABLE | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc gpu_gx_gdsc = {
|
||||
.gdscr = 0x905c,
|
||||
.clamp_io_ctrl = 0x9504,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0xf,
|
||||
.pd = {
|
||||
.name = "gpu_gx_gdsc",
|
||||
.power_on = gdsc_gx_do_nothing_enable,
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = CLAMP_IO | AON_RESET | SW_RESET | POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct clk_regmap *gpu_cc_x1e80100_clocks[] = {
|
||||
[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
|
||||
[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
|
||||
[GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr,
|
||||
[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
|
||||
[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
|
||||
[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||
[GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr,
|
||||
[GPU_CC_DEMET_DIV_CLK_SRC] = &gpu_cc_demet_div_clk_src.clkr,
|
||||
[GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr,
|
||||
[GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_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_GX_VSENSE_CLK] = &gpu_cc_gx_vsense_clk.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_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.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,
|
||||
[GPU_CC_XO_CLK_SRC] = &gpu_cc_xo_clk_src.clkr,
|
||||
[GPU_CC_XO_DIV_CLK_SRC] = &gpu_cc_xo_div_clk_src.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map gpu_cc_x1e80100_resets[] = {
|
||||
[GPUCC_GPU_CC_XO_BCR] = { 0x9000 },
|
||||
[GPUCC_GPU_CC_GX_BCR] = { 0x9058 },
|
||||
[GPUCC_GPU_CC_CX_BCR] = { 0x9104 },
|
||||
[GPUCC_GPU_CC_GFX3D_AON_BCR] = { 0x9198 },
|
||||
[GPUCC_GPU_CC_ACD_BCR] = { 0x9358 },
|
||||
[GPUCC_GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
|
||||
[GPUCC_GPU_CC_FF_BCR] = { 0x9470 },
|
||||
[GPUCC_GPU_CC_GMU_BCR] = { 0x9314 },
|
||||
[GPUCC_GPU_CC_CB_BCR] = { 0x93a0 },
|
||||
};
|
||||
|
||||
static struct gdsc *gpu_cc_x1e80100_gdscs[] = {
|
||||
[GPU_CX_GDSC] = &gpu_cx_gdsc,
|
||||
[GPU_GX_GDSC] = &gpu_gx_gdsc,
|
||||
};
|
||||
|
||||
static const struct regmap_config gpu_cc_x1e80100_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x9988,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gpu_cc_x1e80100_desc = {
|
||||
.config = &gpu_cc_x1e80100_regmap_config,
|
||||
.clks = gpu_cc_x1e80100_clocks,
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_x1e80100_clocks),
|
||||
.resets = gpu_cc_x1e80100_resets,
|
||||
.num_resets = ARRAY_SIZE(gpu_cc_x1e80100_resets),
|
||||
.gdscs = gpu_cc_x1e80100_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(gpu_cc_x1e80100_gdscs),
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_x1e80100_match_table[] = {
|
||||
{ .compatible = "qcom,x1e80100-gpucc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gpu_cc_x1e80100_match_table);
|
||||
|
||||
static int gpu_cc_x1e80100_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &gpu_cc_x1e80100_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk_zonda_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
|
||||
clk_lucid_evo_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
|
||||
|
||||
/* Keep clocks always enabled */
|
||||
qcom_branch_set_clk_en(regmap, 0x93a4); /* GPU_CC_CB_CLK */
|
||||
|
||||
return qcom_cc_really_probe(pdev, &gpu_cc_x1e80100_desc, regmap);
|
||||
}
|
||||
|
||||
static struct platform_driver gpu_cc_x1e80100_driver = {
|
||||
.probe = gpu_cc_x1e80100_probe,
|
||||
.driver = {
|
||||
.name = "gpucc-x1e80100",
|
||||
.of_match_table = gpu_cc_x1e80100_match_table,
|
||||
},
|
||||
};
|
||||
module_platform_driver(gpu_cc_x1e80100_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU Clock Controller X1E80100 Driver");
|
||||
MODULE_LICENSE("GPL");
|
@ -401,11 +401,8 @@ static int lpass_core_cc_sc7180_probe(struct platform_device *pdev)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep the CLK always-ON
|
||||
* LPASS_AUDIO_CORE_SYSNOC_SWAY_CORE_CLK
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x24000, BIT(0), BIT(0));
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x24000); /* LPASS_AUDIO_CORE_SYSNOC_SWAY_CORE_CLK */
|
||||
|
||||
/* PLL settings */
|
||||
regmap_write(regmap, 0x1008, 0x20);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user