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:
Linus Torvalds 2024-03-15 11:48:01 -07:00
commit 6dff52b828
158 changed files with 8599 additions and 1676 deletions

View File

@ -2960,6 +2960,11 @@ S: 2364 Old Trail Drive
S: Reston, Virginia 20191 S: Reston, Virginia 20191
S: USA 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 N: Fredrik Noring
E: noring@nocrew.org E: noring@nocrew.org
W: http://www.lysator.liu.se/~noring/ W: http://www.lysator.liu.se/~noring/

View File

@ -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>;
};

View File

@ -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>;
};

View File

@ -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>;
};

View File

@ -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>;
};

View File

@ -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>;
};

View File

@ -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>;
};

View File

@ -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

View File

@ -53,6 +53,9 @@ properties:
power-domains: power-domains:
maxItems: 1 maxItems: 1
vdd-gfx-supply:
description: Regulator supply for the VDD_GFX pads
'#clock-cells': '#clock-cells':
const: 1 const: 1
@ -74,6 +77,12 @@ required:
- '#reset-cells' - '#reset-cells'
- '#power-domain-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 additionalProperties: false
examples: examples:

View File

@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Q6SSTOP clock Controller title: Q6SSTOP clock Controller
maintainers: maintainers:
- Govind Singh <govinds@codeaurora.org> - Bjorn Andersson <andersson@kernel.org>
properties: properties:
compatible: compatible:

View File

@ -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>;
};
...

View File

@ -36,6 +36,8 @@ properties:
- samsung,exynos850-cmu-aud - samsung,exynos850-cmu-aud
- samsung,exynos850-cmu-cmgp - samsung,exynos850-cmu-cmgp
- samsung,exynos850-cmu-core - samsung,exynos850-cmu-core
- samsung,exynos850-cmu-cpucl0
- samsung,exynos850-cmu-cpucl1
- samsung,exynos850-cmu-dpu - samsung,exynos850-cmu-dpu
- samsung,exynos850-cmu-g3d - samsung,exynos850-cmu-g3d
- samsung,exynos850-cmu-hsi - samsung,exynos850-cmu-hsi
@ -152,6 +154,46 @@ allOf:
- const: dout_core_mmc_embd - const: dout_core_mmc_embd
- const: dout_core_sss - 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: - if:
properties: properties:
compatible: compatible:

View File

@ -12,7 +12,7 @@ maintainers:
description: | description: |
FSD clock controller consist of several clock management unit 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). The root clock comes from external OSC clock (24 MHz).
All available clocks are defined as preprocessor macros in All available clocks are defined as preprocessor macros in

View File

@ -24,7 +24,9 @@ properties:
maxItems: 1 maxItems: 1
clocks: clocks:
maxItems: 1 items:
- description: AHB peripheral clock
- description: CAN bus clock
required: required:
- compatible - compatible
@ -39,7 +41,7 @@ examples:
can@2010c000 { can@2010c000 {
compatible = "microchip,mpfs-can"; compatible = "microchip,mpfs-can";
reg = <0x2010c000 0x1000>; reg = <0x2010c000 0x1000>;
clocks = <&clkcfg 17>; clocks = <&clkcfg 17>, <&clkcfg 37>;
interrupt-parent = <&plic>; interrupt-parent = <&plic>;
interrupts = <56>; interrupts = <56>;
}; };

View File

@ -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

View File

@ -22005,7 +22005,6 @@ F: drivers/i2c/busses/i2c-davinci.c
TI DAVINCI SERIES CLOCK DRIVER TI DAVINCI SERIES CLOCK DRIVER
M: David Lechner <david@lechnology.com> M: David Lechner <david@lechnology.com>
R: Sekhar Nori <nsekhar@ti.com>
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/clock/ti/davinci/ F: Documentation/devicetree/bindings/clock/ti/davinci/
F: drivers/clk/davinci/ F: drivers/clk/davinci/

View File

@ -19,7 +19,7 @@
* This includes the gates (configured from aspeed_g6_gates), plus the * This includes the gates (configured from aspeed_g6_gates), plus the
* explicitly-configured clocks (ASPEED_CLK_HPLL and up). * 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 ASPEED_G6_SILICON_REV 0x014
#define CHIP_REVISION_ID GENMASK(23, 16) #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_UART11CLK] = { 59, -1, "uart11clk-gate", "uartx", 0 }, /* UART11 */
[ASPEED_CLK_GATE_UART12CLK] = { 60, -1, "uart12clk-gate", "uartx", 0 }, /* UART12 */ [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_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[] = { 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); hw = clk_hw_register_fixed_factor(NULL, "i3cclk", "apll", 0, 1, 8);
aspeed_g6_clk_data->hws[ASPEED_CLK_I3C] = hw; 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) static void __init aspeed_g6_cc_init(struct device_node *np)

View File

@ -101,7 +101,6 @@ static void cdce925_pll_find_rate(unsigned long rate,
if (rate <= parent_rate) { if (rate <= parent_rate) {
/* Can always deliver parent_rate in bypass mode */ /* Can always deliver parent_rate in bypass mode */
rate = parent_rate;
*n = 0; *n = 0;
*m = 0; *m = 0;
} else { } else {

View File

@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
} }
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all); 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) static int devm_clk_match(struct device *dev, void *res, void *data)
{ {
struct clk **c = res; struct clk **c = res;

View File

@ -57,10 +57,22 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long rate,
return 0; 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 = { const struct clk_ops clk_fixed_factor_ops = {
.round_rate = clk_factor_round_rate, .round_rate = clk_factor_round_rate,
.set_rate = clk_factor_set_rate, .set_rate = clk_factor_set_rate,
.recalc_rate = clk_factor_recalc_rate, .recalc_rate = clk_factor_recalc_rate,
.recalc_accuracy = clk_factor_recalc_accuracy,
}; };
EXPORT_SYMBOL_GPL(clk_fixed_factor_ops); 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 * static struct clk_hw *
__clk_hw_register_fixed_factor(struct device *dev, struct device_node *np, __clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
const char *name, const char *parent_name, 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, 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_fixed_factor *fix;
struct clk_init_data init = { }; struct clk_init_data init = { };
struct clk_parent_data pdata = { .index = index };
struct clk_hw *hw; struct clk_hw *hw;
int ret; int ret;
@ -105,6 +116,8 @@ __clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
fix->mult = mult; fix->mult = mult;
fix->div = div; fix->div = div;
fix->hw.init = &init; fix->hw.init = &init;
fix->acc = acc;
fix->flags = fixflags;
init.name = name; init.name = name;
init.ops = &clk_fixed_factor_ops; 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) else if (parent_hw)
init.parent_hws = &parent_hw; init.parent_hws = &parent_hw;
else else
init.parent_data = &pdata; init.parent_data = pdata;
init.num_parents = 1; init.num_parents = 1;
hw = &fix->hw; 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, const char *name, unsigned int index, unsigned long flags,
unsigned int mult, unsigned int div) unsigned int mult, unsigned int div)
{ {
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, NULL, index, const struct clk_parent_data pdata = { .index = index };
flags, mult, div, true);
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); 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, const char *name, const struct clk_hw *parent_hw,
unsigned long flags, unsigned int mult, unsigned int div) 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, 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); 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, const char *name, const struct clk_hw *parent_hw,
unsigned long flags, unsigned int mult, unsigned int div) unsigned long flags, unsigned int mult, unsigned int div)
{ {
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, const struct clk_parent_data pdata = { .index = -1 };
parent_hw, -1, flags, mult, div,
false); 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); 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, const char *name, const char *parent_name, unsigned long flags,
unsigned int mult, unsigned int div) unsigned int mult, unsigned int div)
{ {
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL, -1, const struct clk_parent_data pdata = { .index = -1 };
flags, mult, div, false);
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); 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, struct clk *clk_register_fixed_factor(struct device *dev, const char *name,
const char *parent_name, unsigned long flags, const char *parent_name, unsigned long flags,
unsigned int mult, unsigned int div) 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, const char *name, const char *parent_name, unsigned long flags,
unsigned int mult, unsigned int div) unsigned int mult, unsigned int div)
{ {
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL, -1, const struct clk_parent_data pdata = { .index = -1 };
flags, mult, div, true);
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); 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 #ifdef CONFIG_OF
static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node) static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node)
{ {
struct clk_hw *hw; struct clk_hw *hw;
const char *clk_name = node->name; const char *clk_name = node->name;
const struct clk_parent_data pdata = { .index = 0 };
u32 div, mult; u32 div, mult;
int ret; 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); of_property_read_string(node, "clock-output-names", &clk_name);
hw = __clk_hw_register_fixed_factor(NULL, node, clk_name, NULL, NULL, 0, hw = __clk_hw_register_fixed_factor(NULL, node, clk_name, NULL, NULL,
0, mult, div, false); &pdata, 0, mult, div, 0, 0, false);
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
/* /*
* Clear OF_POPULATED flag so that clock registration can be * Clear OF_POPULATED flag so that clock registration can be

View File

@ -140,8 +140,8 @@ void clk_fractional_divider_general_approximation(struct clk_hw *hw,
} }
if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) {
max_m = 1 << fd->mwidth; max_m = BIT(fd->mwidth);
max_n = 1 << fd->nwidth; max_n = BIT(fd->nwidth);
} else { } else {
max_m = GENMASK(fd->mwidth - 1, 0); max_m = GENMASK(fd->mwidth - 1, 0);
max_n = GENMASK(fd->nwidth - 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; u32 val;
if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) { if (fd->flags & CLK_FRAC_DIVIDER_ZERO_BASED) {
max_m = 1 << fd->mwidth; max_m = BIT(fd->mwidth);
max_n = 1 << fd->nwidth; max_n = BIT(fd->nwidth);
} else { } else {
max_m = GENMASK(fd->mwidth - 1, 0); max_m = GENMASK(fd->mwidth - 1, 0);
max_n = GENMASK(fd->nwidth - 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--; n--;
} }
mmask = GENMASK(fd->mwidth - 1, 0) << fd->mshift;
nmask = GENMASK(fd->nwidth - 1, 0) << fd->nshift;
if (fd->lock) if (fd->lock)
spin_lock_irqsave(fd->lock, flags); spin_lock_irqsave(fd->lock, flags);
else else
__acquire(fd->lock); __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 = clk_fd_readl(fd);
val &= ~(mmask | nmask); val &= ~(mmask | nmask);
val |= (m << fd->mshift) | (n << fd->nshift); val |= (m << fd->mshift) | (n << fd->nshift);

View File

@ -418,6 +418,9 @@ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index)
if (IS_ERR(hw)) if (IS_ERR(hw))
return ERR_CAST(hw); return ERR_CAST(hw);
if (!hw)
return NULL;
return hw->core; return hw->core;
} }
@ -939,6 +942,25 @@ int clk_rate_exclusive_get(struct clk *clk)
} }
EXPORT_SYMBOL_GPL(clk_rate_exclusive_get); 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) static void clk_core_unprepare(struct clk_core *core)
{ {
lockdep_assert_held(&prepare_lock); lockdep_assert_held(&prepare_lock);

View File

@ -144,7 +144,7 @@ void clkdev_add_table(struct clk_lookup *cl, size_t num)
mutex_unlock(&clocks_mutex); mutex_unlock(&clocks_mutex);
} }
#define MAX_DEV_ID 20 #define MAX_DEV_ID 24
#define MAX_CON_ID 16 #define MAX_CON_ID 16
struct clk_lookup_alloc { struct clk_lookup_alloc {

View File

@ -130,7 +130,7 @@ static void hi3519_clk_unregister(struct platform_device *pdev)
of_clk_del_provider(pdev->dev.of_node); of_clk_del_provider(pdev->dev.of_node);
hisi_clk_unregister_gate(hi3519_gate_clks, hisi_clk_unregister_gate(hi3519_gate_clks,
ARRAY_SIZE(hi3519_mux_clks), ARRAY_SIZE(hi3519_gate_clks),
crg->clk_data); crg->clk_data);
hisi_clk_unregister_mux(hi3519_mux_clks, hisi_clk_unregister_mux(hi3519_mux_clks,
ARRAY_SIZE(hi3519_mux_clks), ARRAY_SIZE(hi3519_mux_clks),

View File

@ -461,8 +461,7 @@ static void hisi_clk_register_pll(struct hi3559av100_pll_clock *clks,
struct clk_init_data init; struct clk_init_data init;
int i; 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) if (!p_clk)
return; return;
@ -491,7 +490,6 @@ static void hisi_clk_register_pll(struct hi3559av100_pll_clock *clks,
clk = clk_register(NULL, &p_clk->hw); clk = clk_register(NULL, &p_clk->hw);
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
devm_kfree(dev, p_clk);
dev_err(dev, "%s: failed to register clock %s\n", dev_err(dev, "%s: failed to register clock %s\n",
__func__, clks[i].name); __func__, clks[i].name);
continue; continue;

View File

@ -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 *hw = ERR_PTR(-ENOMEM), *mux_hw;
struct clk_hw *div_hw, *gate_hw = NULL; struct clk_hw *div_hw, *gate_hw = NULL;
struct clk_divider *div = NULL; struct clk_divider *div;
struct clk_gate *gate = NULL; struct clk_gate *gate = NULL;
struct clk_mux *mux = NULL; struct clk_mux *mux;
const struct clk_ops *divider_ops; const struct clk_ops *divider_ops;
const struct clk_ops *mux_ops; const struct clk_ops *mux_ops;
mux = kzalloc(sizeof(*mux), GFP_KERNEL); mux = kzalloc(sizeof(*mux), GFP_KERNEL);
if (!mux) if (!mux)
goto fail; return ERR_CAST(hw);
mux_hw = &mux->hw; mux_hw = &mux->hw;
mux->reg = reg; mux->reg = reg;
@ -230,7 +230,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
div = kzalloc(sizeof(*div), GFP_KERNEL); div = kzalloc(sizeof(*div), GFP_KERNEL);
if (!div) if (!div)
goto fail; goto free_mux;
div_hw = &div->hw; div_hw = &div->hw;
div->reg = reg; div->reg = reg;
@ -260,7 +260,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
if (!mcore_booted) { if (!mcore_booted) {
gate = kzalloc(sizeof(*gate), GFP_KERNEL); gate = kzalloc(sizeof(*gate), GFP_KERNEL);
if (!gate) if (!gate)
goto fail; goto free_div;
gate_hw = &gate->hw; gate_hw = &gate->hw;
gate->reg = reg; gate->reg = reg;
@ -272,13 +272,15 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,
mux_hw, mux_ops, div_hw, mux_hw, mux_ops, div_hw,
divider_ops, gate_hw, &clk_gate_ops, flags); divider_ops, gate_hw, &clk_gate_ops, flags);
if (IS_ERR(hw)) if (IS_ERR(hw))
goto fail; goto free_gate;
return hw; return hw;
fail: free_gate:
kfree(gate); kfree(gate);
free_div:
kfree(div); kfree(div);
free_mux:
kfree(mux); kfree(mux);
return ERR_CAST(hw); return ERR_CAST(hw);
} }

View File

@ -394,15 +394,13 @@ err_clk_register:
return ret; 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); struct imx8_acm_priv *priv = dev_get_drvdata(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
clk_imx_acm_detach_pm_domains(&pdev->dev, &priv->dev_pm); clk_imx_acm_detach_pm_domains(&pdev->dev, &priv->dev_pm);
return 0;
} }
static const struct imx8_acm_soc_data imx8qm_acm_data = { 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, .pm = &imx8_acm_pm_ops,
}, },
.probe = imx8_acm_clk_probe, .probe = imx8_acm_clk_probe,
.remove = imx8_acm_clk_remove, .remove_new = imx8_acm_clk_remove,
}; };
module_platform_driver(imx8_acm_clk_driver); module_platform_driver(imx8_acm_clk_driver);

View File

@ -18,7 +18,12 @@
#define CLKEN0 0x000 #define CLKEN0 0x000
#define CLKEN1 0x004 #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 PDM_SEL 0x318
#define SAI_PLL_GNRL_CTL 0x400 #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, {}, \ IMX8MP_CLK_AUDIOMIX_SAI##n##_MCLK1_SEL, {}, \
clk_imx8mp_audiomix_sai##n##_mclk1_parents, \ clk_imx8mp_audiomix_sai##n##_mclk1_parents, \
ARRAY_SIZE(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", \ "sai"__stringify(n)"_mclk2_sel", \
IMX8MP_CLK_AUDIOMIX_SAI##n##_MCLK2_SEL, {}, \ IMX8MP_CLK_AUDIOMIX_SAI##n##_MCLK2_SEL, {}, \
clk_imx8mp_audiomix_sai_mclk2_parents, \ clk_imx8mp_audiomix_sai_mclk2_parents, \
ARRAY_SIZE(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", \ "sai"__stringify(n)"_ipg_cg", \
IMX8MP_CLK_AUDIOMIX_SAI##n##_IPG, \ IMX8MP_CLK_AUDIOMIX_SAI##n##_IPG, \

View File

@ -712,17 +712,13 @@ struct clk_hw *imx_clk_scu_alloc_dev(const char *name,
} }
ret = platform_device_add_data(pdev, &clk, sizeof(clk)); ret = platform_device_add_data(pdev, &clk, sizeof(clk));
if (ret) { if (ret)
platform_device_put(pdev); goto put_device;
return ERR_PTR(ret);
}
ret = driver_set_override(&pdev->dev, &pdev->driver_override, ret = driver_set_override(&pdev->dev, &pdev->driver_override,
"imx-scu-clk", strlen("imx-scu-clk")); "imx-scu-clk", strlen("imx-scu-clk"));
if (ret) { if (ret)
platform_device_put(pdev); goto put_device;
return ERR_PTR(ret);
}
ret = imx_clk_scu_attach_pd(&pdev->dev, rsrc_id); ret = imx_clk_scu_attach_pd(&pdev->dev, rsrc_id);
if (ret) if (ret)
@ -730,13 +726,15 @@ struct clk_hw *imx_clk_scu_alloc_dev(const char *name,
name, ret); name, ret);
ret = platform_device_add(pdev); ret = platform_device_add(pdev);
if (ret) { if (ret)
platform_device_put(pdev); goto put_device;
return ERR_PTR(ret);
}
/* For API backwards compatiblilty, simply return NULL for success */ /* For API backwards compatiblilty, simply return NULL for success */
return NULL; return NULL;
put_device:
platform_device_put(pdev);
return ERR_PTR(ret);
} }
void imx_clk_scu_unregister(void) void imx_clk_scu_unregister(void)

View File

@ -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 * @provider: Handle to SCI clock provider
* @sci_clk: Handle to the SCI clock to populate * @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; struct sci_clk *sci_clk, *prev;
int num_clks = 0; int num_clks = 0;
int num_parents; int num_parents;
bool state;
int clk_id; int clk_id;
const char * const clk_names[] = { const char * const clk_names[] = {
"clocks", "assigned-clocks", "assigned-clock-parents", NULL "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; clk_id = args.args[1] + 1;
while (num_parents--) { 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, sci_clk = devm_kzalloc(dev,
sizeof(*sci_clk), sizeof(*sci_clk),
GFP_KERNEL); GFP_KERNEL);

View File

@ -127,7 +127,6 @@ static void clk_mt7622_apmixed_remove(struct platform_device *pdev)
of_clk_del_provider(node); of_clk_del_provider(node);
mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data); mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), 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[] = { static const struct of_device_id of_match_clk_mt7622_apmixed[] = {

View File

@ -357,8 +357,9 @@ static const struct mtk_mux top_muxes[] = {
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel", MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel",
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15, sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15,
0x1C0, 21), 0x1C0, 21),
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel", sgm_reg_parents, 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), 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, MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP97B_SEL, "eip97b_sel", eip97b_parents,
0x050, 0x054, 0x058, 24, 3, 31, 0x1C0, 23), 0x050, 0x054, 0x058, 24, 3, 31, 0x1C0, 23),
/* CLK_CFG_6 */ /* CLK_CFG_6 */

View File

@ -14,6 +14,10 @@
#include "clk-gate.h" #include "clk-gate.h"
#include "clk-mux.h" #include "clk-mux.h"
#include <dt-bindings/clock/mediatek,mt7988-clk.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); 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), 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 = { static const struct mtk_clk_desc infra_desc = {
.clks = infra_clks, .clks = infra_clks,
.num_clks = ARRAY_SIZE(infra_clks), .num_clks = ARRAY_SIZE(infra_clks),
.mux_clks = infra_muxes, .mux_clks = infra_muxes,
.num_mux_clks = ARRAY_SIZE(infra_muxes), .num_mux_clks = ARRAY_SIZE(infra_muxes),
.clk_lock = &mt7988_clk_lock, .clk_lock = &mt7988_clk_lock,
.rst_desc = &infra_rst_desc,
}; };
static const struct of_device_id of_match_clk_mt7988_infracfg[] = { static const struct of_device_id of_match_clk_mt7988_infracfg[] = {

View File

@ -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); ret = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
if (ret) if (ret)
return ret; goto free_clk_data;
ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data); ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
if (ret) if (ret)
@ -69,6 +69,8 @@ static int clk_mt8135_apmixed_probe(struct platform_device *pdev)
unregister_plls: unregister_plls:
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data); mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
free_clk_data:
mtk_free_clk_data(clk_data);
return ret; return ret;
} }

View File

@ -152,8 +152,8 @@ static int clk_mt8173_apmixed_probe(struct platform_device *pdev)
clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK); clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
if (IS_ERR_OR_NULL(clk_data)) { if (IS_ERR_OR_NULL(clk_data)) {
iounmap(base); r = -ENOMEM;
return -ENOMEM; goto unmap_io;
} }
fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs)); fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs));
@ -188,6 +188,7 @@ unregister_plls:
ARRAY_SIZE(pllfhs), clk_data); ARRAY_SIZE(pllfhs), clk_data);
free_clk_data: free_clk_data:
mtk_free_clk_data(clk_data); mtk_free_clk_data(clk_data);
unmap_io:
iounmap(base); iounmap(base);
return r; return r;
} }

View File

@ -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. */ /* 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), 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. */ /* 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_UFS_AXI, "infra_ufs_axi", "axi_sel", 5),
GATE_INFRA3(CLK_INFRA_I2C6, "infra_i2c6", "i2c_sel", 6), GATE_INFRA3(CLK_INFRA_I2C6, "infra_i2c6", "i2c_sel", 6),
GATE_INFRA3(CLK_INFRA_AP_MSDC0, "infra_ap_msdc0", "msdc50_hclk_sel", 7), GATE_INFRA3(CLK_INFRA_AP_MSDC0, "infra_ap_msdc0", "msdc50_hclk_sel", 7),

View File

@ -2142,7 +2142,9 @@ static struct clk_regmap *const axg_clk_regmaps[] = {
&axg_vclk_input, &axg_vclk_input,
&axg_vclk2_input, &axg_vclk2_input,
&axg_vclk_div, &axg_vclk_div,
&axg_vclk_div1,
&axg_vclk2_div, &axg_vclk2_div,
&axg_vclk2_div1,
&axg_vclk_div2_en, &axg_vclk_div2_en,
&axg_vclk_div4_en, &axg_vclk_div4_en,
&axg_vclk_div6_en, &axg_vclk_div6_en,

View File

@ -15,7 +15,8 @@
/* address offset of control registers */ /* address offset of control registers */
#define REG_MSSPLL_REF_CR 0x08u #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_MSSPLL_SSCG_2_CR 0x2Cu
#define REG_CLOCK_CONFIG_CR 0x08u #define REG_CLOCK_CONFIG_CR 0x08u
#define REG_RTC_CLOCK_CR 0x0Cu #define REG_RTC_CLOCK_CR 0x0Cu
@ -26,10 +27,18 @@
#define MSSPLL_FBDIV_WIDTH 0x0Cu #define MSSPLL_FBDIV_WIDTH 0x0Cu
#define MSSPLL_REFDIV_SHIFT 0x08u #define MSSPLL_REFDIV_SHIFT 0x08u
#define MSSPLL_REFDIV_WIDTH 0x06u #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_POSTDIV_WIDTH 0x07u
#define MSSPLL_FIXED_DIV 4u #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 mpfs_clock_data {
struct device *dev; struct device *dev;
void __iomem *base; void __iomem *base;
@ -39,17 +48,27 @@ struct mpfs_clock_data {
struct mpfs_msspll_hw_clock { struct mpfs_msspll_hw_clock {
void __iomem *base; void __iomem *base;
struct clk_hw hw;
struct clk_init_data init;
unsigned int id; unsigned int id;
u32 reg_offset; u32 reg_offset;
u32 shift; u32 shift;
u32 width; u32 width;
u32 flags; 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) #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 mpfs_cfg_hw_clock {
struct clk_divider cfg; struct clk_divider cfg;
struct clk_init_data init; struct clk_init_data init;
@ -93,93 +112,40 @@ static const struct clk_div_table mpfs_div_rtcref_table[] = {
{ 0, 0 } { 0, 0 }
}; };
/*
* MSS PLL internal clock
*/
static unsigned long mpfs_clk_msspll_recalc_rate(struct clk_hw *hw, unsigned long prate) 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); 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 *mult_addr = msspll_hw->base + msspll_hw->reg_offset;
void __iomem *ref_div_addr = msspll_hw->base + REG_MSSPLL_REF_CR; void __iomem *ref_div_addr = msspll_hw->base + REG_MSSPLL_REF_CR;
u32 mult, ref_div; u32 mult, ref_div;
unsigned long rate_before_ctrl;
mult = readl_relaxed(mult_addr) >> MSSPLL_FBDIV_SHIFT; mult = readl_relaxed(mult_addr) >> MSSPLL_FBDIV_SHIFT;
mult &= clk_div_mask(MSSPLL_FBDIV_WIDTH); mult &= clk_div_mask(MSSPLL_FBDIV_WIDTH);
ref_div = readl_relaxed(ref_div_addr) >> MSSPLL_REFDIV_SHIFT; ref_div = readl_relaxed(ref_div_addr) >> MSSPLL_REFDIV_SHIFT;
ref_div &= clk_div_mask(MSSPLL_REFDIV_WIDTH); ref_div &= clk_div_mask(MSSPLL_REFDIV_WIDTH);
rate_before_ctrl = rate * (ref_div * MSSPLL_FIXED_DIV) / mult; return prate * mult / (ref_div * MSSPLL_FIXED_DIV);
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;
} }
static const struct clk_ops mpfs_clk_msspll_ops = { static const struct clk_ops mpfs_clk_msspll_ops = {
.recalc_rate = mpfs_clk_msspll_recalc_rate, .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) { \ #define CLK_PLL(_id, _name, _parent, _shift, _width, _flags, _offset) { \
.id = _id, \ .id = _id, \
.flags = _flags, \
.shift = _shift, \ .shift = _shift, \
.width = _width, \ .width = _width, \
.reg_offset = _offset, \ .reg_offset = _offset, \
.flags = _flags, \
.hw.init = CLK_HW_INIT_PARENTS_DATA(_name, _parent, &mpfs_clk_msspll_ops, 0), \ .hw.init = CLK_HW_INIT_PARENTS_DATA(_name, _parent, &mpfs_clk_msspll_ops, 0), \
} }
static struct mpfs_msspll_hw_clock mpfs_msspll_clks[] = { 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), 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); ret = devm_clk_hw_register(dev, &msspll_hw->hw);
if (ret) if (ret)
return dev_err_probe(dev, ret, "failed to register msspll id: %d\n", 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; 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; 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 * "CFG" clocks
*/ */
@ -442,8 +456,8 @@ static int mpfs_clk_probe(struct platform_device *pdev)
int ret; int ret;
/* CLK_RESERVED is not part of clock arrays, so add 1 */ /* CLK_RESERVED is not part of clock arrays, so add 1 */
num_clks = ARRAY_SIZE(mpfs_msspll_clks) + ARRAY_SIZE(mpfs_cfg_clks) num_clks = ARRAY_SIZE(mpfs_msspll_clks) + ARRAY_SIZE(mpfs_msspll_out_clks)
+ ARRAY_SIZE(mpfs_periph_clks) + 1; + 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); clk_data = devm_kzalloc(dev, struct_size(clk_data, hw_data.hws, num_clks), GFP_KERNEL);
if (!clk_data) if (!clk_data)
@ -466,6 +480,12 @@ static int mpfs_clk_probe(struct platform_device *pdev)
if (ret) if (ret)
return 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); ret = mpfs_clk_register_cfgs(dev, mpfs_cfg_clks, ARRAY_SIZE(mpfs_cfg_clks), clk_data);
if (ret) if (ret)
return ret; return ret;

View File

@ -20,6 +20,24 @@ menuconfig COMMON_CLK_QCOM
if 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 config CLK_X1E80100_GCC
tristate "X1E80100 Global Clock Controller" tristate "X1E80100 Global Clock Controller"
depends on ARM64 || COMPILE_TEST 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, Say Y if you want to use peripheral devices such as UART, SPI, I2C,
USB, UFS, SD/eMMC, PCIe, etc. 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 config QCOM_A53PLL
tristate "MSM8916 A53 PLL" tristate "MSM8916 A53 PLL"
help 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 Say Y if you want to use LPASS clocks and power domains of the LPASS
core clock controller. 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 config SC_VIDEOCC_7180
tristate "SC7180 Video Clock Controller" tristate "SC7180 Video Clock Controller"
depends on ARM64 || COMPILE_TEST depends on ARM64 || COMPILE_TEST

View File

@ -21,7 +21,11 @@ clk-qcom-$(CONFIG_QCOM_GDSC) += gdsc.o
obj-$(CONFIG_APQ_GCC_8084) += gcc-apq8084.o obj-$(CONFIG_APQ_GCC_8084) += gcc-apq8084.o
obj-$(CONFIG_APQ_MMCC_8084) += mmcc-apq8084.o obj-$(CONFIG_APQ_MMCC_8084) += mmcc-apq8084.o
obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.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_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_PLL) += apss-ipq-pll.o
obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o
obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.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_LPASSCC_8280XP) += lpasscc-sc8280xp.o
obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.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_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_7180) += videocc-sc7180.o
obj-$(CONFIG_SC_VIDEOCC_7280) += videocc-sc7280.o obj-$(CONFIG_SC_VIDEOCC_7280) += videocc-sc7280.o
obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o

View File

@ -1703,17 +1703,7 @@ static struct platform_driver cam_cc_sc7180_driver = {
}, },
}; };
static int __init cam_cc_sc7180_init(void) module_platform_driver(cam_cc_sc7180_driver);
{
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_DESCRIPTION("QTI CAM_CC SC7180 Driver"); MODULE_DESCRIPTION("QTI CAM_CC SC7180 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -2468,17 +2468,7 @@ static struct platform_driver cam_cc_sc7280_driver = {
}, },
}; };
static int __init cam_cc_sc7280_init(void) module_platform_driver(cam_cc_sc7280_driver);
{
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_DESCRIPTION("QTI CAM_CC SC7280 Driver"); MODULE_DESCRIPTION("QTI CAM_CC SC7280 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -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(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0), F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_bps_clk_src = { 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(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0),
F(400000000, P_CAMCC_PLL0_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), F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_camnoc_axi_clk_src = { 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[] = { static const struct freq_tbl ftbl_camcc_cci_0_clk_src[] = {
F(19200000, P_BI_TCXO, 1, 0, 0), F(19200000, P_BI_TCXO, 1, 0, 0),
F(37500000, P_CAMCC_PLL0_OUT_EVEN, 16, 0, 0), F(37500000, P_CAMCC_PLL0_OUT_EVEN, 16, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_cci_0_clk_src = { 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(19200000, P_BI_TCXO, 1, 0, 0),
F(240000000, P_CAMCC_PLL0_OUT_EVEN, 2.5, 0, 0), F(240000000, P_CAMCC_PLL0_OUT_EVEN, 2.5, 0, 0),
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_cphy_rx_clk_src = { 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[] = { static const struct freq_tbl ftbl_camcc_csi0phytimer_clk_src[] = {
F(19200000, P_BI_TCXO, 1, 0, 0), F(19200000, P_BI_TCXO, 1, 0, 0),
F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0), F(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_csi0phytimer_clk_src = { 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(200000000, P_CAMCC_PLL0_OUT_EVEN, 3, 0, 0),
F(300000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0), F(300000000, P_CAMCC_PLL0_OUT_MAIN, 4, 0, 0),
F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0), F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_fast_ahb_clk_src = { 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(19200000, P_BI_TCXO, 1, 0, 0),
F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0), F(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_icp_clk_src = { 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(558000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
F(637000000, 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), F(760000000, P_CAMCC_PLL3_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_0_clk_src = { 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(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_0_csid_clk_src = { 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(558000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
F(637000000, 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), F(760000000, P_CAMCC_PLL4_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_1_clk_src = { 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(558000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0),
F(637000000, 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), F(760000000, P_CAMCC_PLL5_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_2_clk_src = { 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(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_2_csid_clk_src = { 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(558000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0),
F(637000000, 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), F(760000000, P_CAMCC_PLL6_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_3_clk_src = { 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(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ife_lite_0_clk_src = { 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(475000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
F(520000000, 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), F(600000000, P_CAMCC_PLL1_OUT_EVEN, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_ipe_0_clk_src = { 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(400000000, P_CAMCC_PLL0_OUT_ODD, 1, 0, 0),
F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0), F(480000000, P_CAMCC_PLL7_OUT_EVEN, 1, 0, 0),
F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0), F(600000000, P_CAMCC_PLL0_OUT_MAIN, 2, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_jpeg_clk_src = { 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(300000000, P_CAMCC_PLL0_OUT_EVEN, 2, 0, 0),
F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0), F(320000000, P_CAMCC_PLL7_OUT_ODD, 1, 0, 0),
F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0), F(400000000, P_CAMCC_PLL0_OUT_MAIN, 3, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_lrme_clk_src = { 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(19200000, P_BI_TCXO, 1, 0, 0),
F(24000000, P_CAMCC_PLL2_OUT_EARLY, 10, 1, 4), F(24000000, P_CAMCC_PLL2_OUT_EARLY, 10, 1, 4),
F(64000000, P_CAMCC_PLL2_OUT_EARLY, 15, 0, 0), F(64000000, P_CAMCC_PLL2_OUT_EARLY, 15, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_mclk0_clk_src = { 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[] = { static const struct freq_tbl ftbl_camcc_sleep_clk_src[] = {
F(32000, P_SLEEP_CLK, 1, 0, 0), F(32000, P_SLEEP_CLK, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_sleep_clk_src = { 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[] = { static const struct freq_tbl ftbl_camcc_slow_ahb_clk_src[] = {
F(19200000, P_BI_TCXO, 1, 0, 0), F(19200000, P_BI_TCXO, 1, 0, 0),
F(80000000, P_CAMCC_PLL7_OUT_EVEN, 6, 0, 0), F(80000000, P_CAMCC_PLL7_OUT_EVEN, 6, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_slow_ahb_clk_src = { 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[] = { static const struct freq_tbl ftbl_camcc_xo_clk_src[] = {
F(19200000, P_BI_TCXO, 1, 0, 0), F(19200000, P_BI_TCXO, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 camcc_xo_clk_src = { 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_pll6, regmap, &camcc_pll6_config);
clk_lucid_pll_configure(&camcc_pll7, regmap, &camcc_pll7_config); clk_lucid_pll_configure(&camcc_pll7, regmap, &camcc_pll7_config);
/* /* Keep some clocks always-on */
* Keep camcc_gdsc_clk always enabled: qcom_branch_set_clk_en(regmap, 0xc1e4); /* CAMCC_GDSC_CLK */
*/
regmap_update_bits(regmap, 0xc1e4, BIT(0), 1);
ret = qcom_cc_really_probe(pdev, &camcc_sc8280xp_desc, regmap); ret = qcom_cc_really_probe(pdev, &camcc_sc8280xp_desc, regmap);
if (ret) if (ret)

View File

@ -1746,17 +1746,7 @@ static struct platform_driver cam_cc_sdm845_driver = {
}, },
}; };
static int __init cam_cc_sdm845_init(void) module_platform_driver(cam_cc_sdm845_driver);
{
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_DESCRIPTION("QTI CAM_CC SDM845 Driver"); MODULE_DESCRIPTION("QTI CAM_CC SDM845 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -1890,17 +1890,7 @@ static struct platform_driver camcc_sm6350_driver = {
}, },
}; };
static int __init camcc_sm6350_init(void) module_platform_driver(camcc_sm6350_driver);
{
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_DESCRIPTION("QTI CAMCC SM6350 Driver"); MODULE_DESCRIPTION("QTI CAMCC SM6350 Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -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_pll11, regmap, &cam_cc_pll11_config);
clk_lucid_ole_pll_configure(&cam_cc_pll12, regmap, &cam_cc_pll12_config); clk_lucid_ole_pll_configure(&cam_cc_pll12, regmap, &cam_cc_pll12_config);
/* /* Keep some clocks always-on */
* Keep clocks always enabled: qcom_branch_set_clk_en(regmap, 0x1419c); /* CAM_CC_GDSC_CLK */
* cam_cc_gdsc_clk qcom_branch_set_clk_en(regmap, 0x142cc); /* CAM_CC_SLEEP_CLK */
* cam_cc_sleep_clk
*/
regmap_update_bits(regmap, 0x1419c, BIT(0), BIT(0));
regmap_update_bits(regmap, 0x142cc, BIT(0), BIT(0));
ret = qcom_cc_really_probe(pdev, &cam_cc_sm8550_desc, regmap); ret = qcom_cc_really_probe(pdev, &cam_cc_sm8550_desc, regmap);

File diff suppressed because it is too large Load Diff

View File

@ -52,6 +52,7 @@
#define PLL_CONFIG_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL]) #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_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_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(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_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]) #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] = 0x24,
[PLL_OFF_ALPHA_VAL_U] = 0x28, [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); EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);

View File

@ -21,6 +21,7 @@ enum {
CLK_ALPHA_PLL_TYPE_LUCID = CLK_ALPHA_PLL_TYPE_TRION, CLK_ALPHA_PLL_TYPE_LUCID = CLK_ALPHA_PLL_TYPE_TRION,
CLK_ALPHA_PLL_TYPE_AGERA, CLK_ALPHA_PLL_TYPE_AGERA,
CLK_ALPHA_PLL_TYPE_ZONDA, CLK_ALPHA_PLL_TYPE_ZONDA,
CLK_ALPHA_PLL_TYPE_ZONDA_OLE,
CLK_ALPHA_PLL_TYPE_LUCID_EVO, CLK_ALPHA_PLL_TYPE_LUCID_EVO,
CLK_ALPHA_PLL_TYPE_LUCID_OLE, CLK_ALPHA_PLL_TYPE_LUCID_OLE,
CLK_ALPHA_PLL_TYPE_RIVIAN_EVO, CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
@ -42,6 +43,7 @@ enum {
PLL_OFF_CONFIG_CTL, PLL_OFF_CONFIG_CTL,
PLL_OFF_CONFIG_CTL_U, PLL_OFF_CONFIG_CTL_U,
PLL_OFF_CONFIG_CTL_U1, PLL_OFF_CONFIG_CTL_U1,
PLL_OFF_CONFIG_CTL_U2,
PLL_OFF_TEST_CTL, PLL_OFF_TEST_CTL,
PLL_OFF_TEST_CTL_U, PLL_OFF_TEST_CTL_U,
PLL_OFF_TEST_CTL_U1, PLL_OFF_TEST_CTL_U1,
@ -119,6 +121,7 @@ struct alpha_pll_config {
u32 config_ctl_val; u32 config_ctl_val;
u32 config_ctl_hi_val; u32 config_ctl_hi_val;
u32 config_ctl_hi1_val; u32 config_ctl_hi1_val;
u32 config_ctl_hi2_val;
u32 user_ctl_val; u32 user_ctl_val;
u32 user_ctl_hi_val; u32 user_ctl_hi_val;
u32 user_ctl_hi1_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; 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_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_lucid_evo_ops;
extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops; extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops;

View File

@ -64,6 +64,7 @@ struct clk_mem_branch {
#define CBCR_FORCE_MEM_PERIPH_OFF BIT(12) #define CBCR_FORCE_MEM_PERIPH_OFF BIT(12)
#define CBCR_WAKEUP GENMASK(11, 8) #define CBCR_WAKEUP GENMASK(11, 8)
#define CBCR_SLEEP GENMASK(7, 4) #define CBCR_SLEEP GENMASK(7, 4)
#define CBCR_CLOCK_ENABLE BIT(0)
static inline void qcom_branch_set_force_mem_core(struct regmap *regmap, static inline void qcom_branch_set_force_mem_core(struct regmap *regmap,
struct clk_branch clk, bool on) 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)); 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_branch_ops;
extern const struct clk_ops clk_branch2_ops; extern const struct clk_ops clk_branch2_ops;
extern const struct clk_ops clk_branch_simple_ops; extern const struct clk_ops clk_branch_simple_ops;

View File

@ -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); clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
/* Keep DISP_CC_XO_CLK always-ON */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x604c); /* DISP_CC_XO_CLK */
ret = qcom_cc_really_probe(pdev, &disp_cc_qcm2290_desc, regmap); ret = qcom_cc_really_probe(pdev, &disp_cc_qcm2290_desc, regmap);
if (ret) { if (ret) {
@ -539,17 +539,7 @@ static struct platform_driver disp_cc_qcm2290_driver = {
}, },
}; };
static int __init disp_cc_qcm2290_init(void) module_platform_driver(disp_cc_qcm2290_driver);
{
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_DESCRIPTION("QTI DISP_CC qcm2290 Driver"); MODULE_DESCRIPTION("QTI DISP_CC qcm2290 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -724,17 +724,7 @@ static struct platform_driver disp_cc_sc7180_driver = {
}, },
}; };
static int __init disp_cc_sc7180_init(void) module_platform_driver(disp_cc_sc7180_driver);
{
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_DESCRIPTION("QTI DISP_CC SC7180 Driver"); MODULE_DESCRIPTION("QTI DISP_CC SC7180 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -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); clk_lucid_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x5008); /* DISP_CC_XO_CLK */
* DISP_CC_XO_CLK
*/
regmap_update_bits(regmap, 0x5008, BIT(0), BIT(0));
return qcom_cc_really_probe(pdev, &disp_cc_sc7280_desc, regmap); 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) module_platform_driver(disp_cc_sc7280_driver);
{
return platform_driver_register(&disp_cc_sc7280_driver);
}
subsys_initcall(disp_cc_sc7280_init);
static void __exit disp_cc_sc7280_exit(void)
{
platform_driver_unregister(&disp_cc_sc7280_driver);
}
module_exit(disp_cc_sc7280_exit);
MODULE_DESCRIPTION("QTI DISP_CC sc7280 Driver"); MODULE_DESCRIPTION("QTI DISP_CC sc7280 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -3178,8 +3178,8 @@ static int disp_cc_sc8280xp_probe(struct platform_device *pdev)
goto out_pm_runtime_put; goto out_pm_runtime_put;
} }
/* DISP_CC_XO_CLK always-on */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x605c); /* DISP_CC_XO_CLK */
out_pm_runtime_put: out_pm_runtime_put:
pm_runtime_put_sync(&pdev->dev); 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) module_platform_driver(disp_cc_sc8280xp_driver);
{
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_DESCRIPTION("Qualcomm SC8280XP dispcc driver"); MODULE_DESCRIPTION("Qualcomm SC8280XP dispcc driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -759,6 +759,8 @@ static struct clk_branch disp_cc_mdss_vsync_clk = {
static struct gdsc mdss_gdsc = { static struct gdsc mdss_gdsc = {
.gdscr = 0x3000, .gdscr = 0x3000,
.en_few_wait_val = 0x6,
.en_rest_wait_val = 0x5,
.pd = { .pd = {
.name = "mdss_gdsc", .name = "mdss_gdsc",
}, },
@ -872,17 +874,7 @@ static struct platform_driver disp_cc_sdm845_driver = {
}, },
}; };
static int __init disp_cc_sdm845_init(void) module_platform_driver(disp_cc_sdm845_driver);
{
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_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("QTI DISPCC SDM845 Driver"); MODULE_DESCRIPTION("QTI DISPCC SDM845 Driver");

View File

@ -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); clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
/* Keep DISP_CC_XO_CLK always-ON */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x604c); /* DISP_CC_XO_CLK */
ret = qcom_cc_really_probe(pdev, &disp_cc_sm6115_desc, regmap); ret = qcom_cc_really_probe(pdev, &disp_cc_sm6115_desc, regmap);
if (ret) { if (ret) {

View File

@ -693,17 +693,7 @@ static struct platform_driver disp_cc_sm6125_driver = {
}, },
}; };
static int __init disp_cc_sm6125_init(void) module_platform_driver(disp_cc_sm6125_driver);
{
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_DESCRIPTION("QTI DISPCC SM6125 Driver"); MODULE_DESCRIPTION("QTI DISPCC SM6125 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -781,17 +781,7 @@ static struct platform_driver disp_cc_sm6350_driver = {
}, },
}; };
static int __init disp_cc_sm6350_init(void) module_platform_driver(disp_cc_sm6350_driver);
{
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_DESCRIPTION("QTI DISP_CC SM6350 Driver"); MODULE_DESCRIPTION("QTI DISP_CC SM6350 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -594,17 +594,7 @@ static struct platform_driver disp_cc_sm6375_driver = {
}, },
}; };
static int __init disp_cc_sm6375_init(void) module_platform_driver(disp_cc_sm6375_driver);
{
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_DESCRIPTION("QTI DISPCC SM6375 Driver"); MODULE_DESCRIPTION("QTI DISPCC SM6375 Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -39,11 +39,11 @@ enum {
P_DSI1_PHY_PLL_OUT_DSICLK, P_DSI1_PHY_PLL_OUT_DSICLK,
}; };
static struct pll_vco vco_table[] = { static const struct pll_vco vco_table[] = {
{ 249600000, 2000000000, 0 }, { 249600000, 2000000000, 0 },
}; };
static struct pll_vco lucid_5lpe_vco[] = { static const struct pll_vco lucid_5lpe_vco[] = {
{ 249600000, 1750000000, 0 }, { 249600000, 1750000000, 0 },
}; };
@ -214,7 +214,7 @@ static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_3, .parent_map = disp_cc_parent_map_3,
.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, .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", .name = "disp_cc_mdss_ahb_clk_src",
.parent_data = disp_cc_parent_data_3, .parent_data = disp_cc_parent_data_3,
.num_parents = ARRAY_SIZE(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, .mnd_width = 0,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_2, .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", .name = "disp_cc_mdss_byte0_clk_src",
.parent_data = disp_cc_parent_data_2, .parent_data = disp_cc_parent_data_2,
.num_parents = ARRAY_SIZE(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, .mnd_width = 0,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_2, .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", .name = "disp_cc_mdss_byte1_clk_src",
.parent_data = disp_cc_parent_data_2, .parent_data = disp_cc_parent_data_2,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_1, .parent_map = disp_cc_parent_map_1,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_dp_aux1_clk_src",
.parent_data = disp_cc_parent_data_1, .parent_data = disp_cc_parent_data_1,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_1, .parent_map = disp_cc_parent_map_1,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_dp_aux_clk_src",
.parent_data = disp_cc_parent_data_1, .parent_data = disp_cc_parent_data_1,
.num_parents = ARRAY_SIZE(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, .mnd_width = 0,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_0, .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", .name = "disp_cc_mdss_dp_link1_clk_src",
.parent_data = disp_cc_parent_data_0, .parent_data = disp_cc_parent_data_0,
.num_parents = ARRAY_SIZE(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, .mnd_width = 0,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_0, .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", .name = "disp_cc_mdss_dp_link_clk_src",
.parent_data = disp_cc_parent_data_0, .parent_data = disp_cc_parent_data_0,
.num_parents = ARRAY_SIZE(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, .mnd_width = 16,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_0, .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", .name = "disp_cc_mdss_dp_pixel1_clk_src",
.parent_data = disp_cc_parent_data_0, .parent_data = disp_cc_parent_data_0,
.num_parents = ARRAY_SIZE(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, .mnd_width = 16,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_0, .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", .name = "disp_cc_mdss_dp_pixel2_clk_src",
.parent_data = disp_cc_parent_data_0, .parent_data = disp_cc_parent_data_0,
.num_parents = ARRAY_SIZE(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, .mnd_width = 16,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_0, .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", .name = "disp_cc_mdss_dp_pixel_clk_src",
.parent_data = disp_cc_parent_data_0, .parent_data = disp_cc_parent_data_0,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_1, .parent_map = disp_cc_parent_map_1,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_edp_aux_clk_src",
.parent_data = disp_cc_parent_data_1, .parent_data = disp_cc_parent_data_1,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_7, .parent_map = disp_cc_parent_map_7,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_edp_gtc_clk_src",
.parent_data = disp_cc_parent_data_7, .parent_data = disp_cc_parent_data_7,
.num_parents = ARRAY_SIZE(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, .mnd_width = 0,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_4, .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", .name = "disp_cc_mdss_edp_link_clk_src",
.parent_data = disp_cc_parent_data_4, .parent_data = disp_cc_parent_data_4,
.num_parents = ARRAY_SIZE(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, .mnd_width = 16,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_4, .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", .name = "disp_cc_mdss_edp_pixel_clk_src",
.parent_data = disp_cc_parent_data_4, .parent_data = disp_cc_parent_data_4,
.num_parents = ARRAY_SIZE(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 = { .clkr = {
.enable_reg = 0x2078, .enable_reg = 0x2078,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_edp_aux_clk", .name = "disp_cc_mdss_edp_aux_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_edp_aux_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x207c, .enable_reg = 0x207c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_edp_gtc_clk", .name = "disp_cc_mdss_edp_gtc_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_edp_gtc_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2070, .enable_reg = 0x2070,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_edp_link_clk", .name = "disp_cc_mdss_edp_link_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_edp_link_clk_src.clkr.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, .reg = 0x2288,
.shift = 0, .shift = 0,
.width = 2, .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", .name = "disp_cc_mdss_edp_link_div_clk_src",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_edp_link_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2074, .enable_reg = 0x2074,
.enable_mask = BIT(0), .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", .name = "disp_cc_mdss_edp_link_intf_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_edp_link_div_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x206c, .enable_reg = 0x206c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_edp_pixel_clk", .name = "disp_cc_mdss_edp_pixel_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_edp_pixel_clk_src.clkr.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, .hid_width = 5,
.parent_map = disp_cc_parent_map_2, .parent_map = disp_cc_parent_map_2,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_esc0_clk_src",
.parent_data = disp_cc_parent_data_2, .parent_data = disp_cc_parent_data_2,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_2, .parent_map = disp_cc_parent_map_2,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_esc1_clk_src",
.parent_data = disp_cc_parent_data_2, .parent_data = disp_cc_parent_data_2,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_5, .parent_map = disp_cc_parent_map_5,
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, .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", .name = "disp_cc_mdss_mdp_clk_src",
.parent_data = disp_cc_parent_data_5, .parent_data = disp_cc_parent_data_5,
.num_parents = ARRAY_SIZE(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, .mnd_width = 8,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_6, .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", .name = "disp_cc_mdss_pclk0_clk_src",
.parent_data = disp_cc_parent_data_6, .parent_data = disp_cc_parent_data_6,
.num_parents = ARRAY_SIZE(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, .mnd_width = 8,
.hid_width = 5, .hid_width = 5,
.parent_map = disp_cc_parent_map_6, .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", .name = "disp_cc_mdss_pclk1_clk_src",
.parent_data = disp_cc_parent_data_6, .parent_data = disp_cc_parent_data_6,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_5, .parent_map = disp_cc_parent_map_5,
.freq_tbl = ftbl_disp_cc_mdss_rot_clk_src, .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", .name = "disp_cc_mdss_rot_clk_src",
.parent_data = disp_cc_parent_data_5, .parent_data = disp_cc_parent_data_5,
.num_parents = ARRAY_SIZE(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, .hid_width = 5,
.parent_map = disp_cc_parent_map_1, .parent_map = disp_cc_parent_map_1,
.freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src, .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", .name = "disp_cc_mdss_vsync_clk_src",
.parent_data = disp_cc_parent_data_1, .parent_data = disp_cc_parent_data_1,
.num_parents = ARRAY_SIZE(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, .reg = 0x2128,
.shift = 0, .shift = 0,
.width = 2, .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", .name = "disp_cc_mdss_byte0_div_clk_src",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_byte0_clk_src.clkr.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, .reg = 0x2144,
.shift = 0, .shift = 0,
.width = 2, .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", .name = "disp_cc_mdss_byte1_div_clk_src",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_byte1_clk_src.clkr.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 = { static struct clk_regmap_div disp_cc_mdss_dp_link1_div_clk_src = {
.reg = 0x2224, .reg = 0x2224,
.shift = 0, .shift = 0,
.width = 2, .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", .name = "disp_cc_mdss_dp_link1_div_clk_src",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_link1_clk_src.clkr.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 = { static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
.reg = 0x2190, .reg = 0x2190,
.shift = 0, .shift = 0,
.width = 2, .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", .name = "disp_cc_mdss_dp_link_div_clk_src",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_link_clk_src.clkr.hw, &disp_cc_mdss_dp_link_clk_src.clkr.hw,
@ -701,7 +699,7 @@ static struct clk_branch disp_cc_mdss_ahb_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2080, .enable_reg = 0x2080,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_ahb_clk", .name = "disp_cc_mdss_ahb_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_ahb_clk_src.clkr.hw, &disp_cc_mdss_ahb_clk_src.clkr.hw,
@ -719,7 +717,7 @@ static struct clk_branch disp_cc_mdss_byte0_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2028, .enable_reg = 0x2028,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_byte0_clk", .name = "disp_cc_mdss_byte0_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_byte0_clk_src.clkr.hw, &disp_cc_mdss_byte0_clk_src.clkr.hw,
@ -737,7 +735,7 @@ static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
.clkr = { .clkr = {
.enable_reg = 0x202c, .enable_reg = 0x202c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_byte0_intf_clk", .name = "disp_cc_mdss_byte0_intf_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_byte0_div_clk_src.clkr.hw, &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
@ -755,7 +753,7 @@ static struct clk_branch disp_cc_mdss_byte1_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2030, .enable_reg = 0x2030,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_byte1_clk", .name = "disp_cc_mdss_byte1_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_byte1_clk_src.clkr.hw, &disp_cc_mdss_byte1_clk_src.clkr.hw,
@ -773,7 +771,7 @@ static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2034, .enable_reg = 0x2034,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_byte1_intf_clk", .name = "disp_cc_mdss_byte1_intf_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_byte1_div_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2068, .enable_reg = 0x2068,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_aux1_clk", .name = "disp_cc_mdss_dp_aux1_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_aux1_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2054, .enable_reg = 0x2054,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_aux_clk", .name = "disp_cc_mdss_dp_aux_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_aux_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x205c, .enable_reg = 0x205c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_link1_clk", .name = "disp_cc_mdss_dp_link1_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_link1_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2060, .enable_reg = 0x2060,
.enable_mask = BIT(0), .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", .name = "disp_cc_mdss_dp_link1_intf_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_link1_div_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2040, .enable_reg = 0x2040,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_link_clk", .name = "disp_cc_mdss_dp_link_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_link_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2044, .enable_reg = 0x2044,
.enable_mask = BIT(0), .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", .name = "disp_cc_mdss_dp_link_intf_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_link_div_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2050, .enable_reg = 0x2050,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_pixel1_clk", .name = "disp_cc_mdss_dp_pixel1_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_pixel1_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x2058, .enable_reg = 0x2058,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_pixel2_clk", .name = "disp_cc_mdss_dp_pixel2_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_pixel2_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x204c, .enable_reg = 0x204c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_dp_pixel_clk", .name = "disp_cc_mdss_dp_pixel_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_dp_pixel_clk_src.clkr.hw, &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
@ -951,7 +949,7 @@ static struct clk_branch disp_cc_mdss_esc0_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2038, .enable_reg = 0x2038,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_esc0_clk", .name = "disp_cc_mdss_esc0_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_esc0_clk_src.clkr.hw, &disp_cc_mdss_esc0_clk_src.clkr.hw,
@ -969,7 +967,7 @@ static struct clk_branch disp_cc_mdss_esc1_clk = {
.clkr = { .clkr = {
.enable_reg = 0x203c, .enable_reg = 0x203c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_esc1_clk", .name = "disp_cc_mdss_esc1_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_esc1_clk_src.clkr.hw, &disp_cc_mdss_esc1_clk_src.clkr.hw,
@ -987,7 +985,7 @@ static struct clk_branch disp_cc_mdss_mdp_clk = {
.clkr = { .clkr = {
.enable_reg = 0x200c, .enable_reg = 0x200c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_mdp_clk", .name = "disp_cc_mdss_mdp_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_mdp_clk_src.clkr.hw, &disp_cc_mdss_mdp_clk_src.clkr.hw,
@ -1005,7 +1003,7 @@ static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
.clkr = { .clkr = {
.enable_reg = 0x201c, .enable_reg = 0x201c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_mdp_lut_clk", .name = "disp_cc_mdss_mdp_lut_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_mdp_clk_src.clkr.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 = { .clkr = {
.enable_reg = 0x4004, .enable_reg = 0x4004,
.enable_mask = BIT(0), .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", .name = "disp_cc_mdss_non_gdsc_ahb_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_ahb_clk_src.clkr.hw, &disp_cc_mdss_ahb_clk_src.clkr.hw,
@ -1040,7 +1038,7 @@ static struct clk_branch disp_cc_mdss_pclk0_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2004, .enable_reg = 0x2004,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_pclk0_clk", .name = "disp_cc_mdss_pclk0_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_pclk0_clk_src.clkr.hw, &disp_cc_mdss_pclk0_clk_src.clkr.hw,
@ -1058,7 +1056,7 @@ static struct clk_branch disp_cc_mdss_pclk1_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2008, .enable_reg = 0x2008,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_pclk1_clk", .name = "disp_cc_mdss_pclk1_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_pclk1_clk_src.clkr.hw, &disp_cc_mdss_pclk1_clk_src.clkr.hw,
@ -1076,7 +1074,7 @@ static struct clk_branch disp_cc_mdss_rot_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2014, .enable_reg = 0x2014,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_rot_clk", .name = "disp_cc_mdss_rot_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_rot_clk_src.clkr.hw, &disp_cc_mdss_rot_clk_src.clkr.hw,
@ -1094,7 +1092,7 @@ static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
.clkr = { .clkr = {
.enable_reg = 0x400c, .enable_reg = 0x400c,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_rscc_ahb_clk", .name = "disp_cc_mdss_rscc_ahb_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_ahb_clk_src.clkr.hw, &disp_cc_mdss_ahb_clk_src.clkr.hw,
@ -1112,7 +1110,7 @@ static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
.clkr = { .clkr = {
.enable_reg = 0x4008, .enable_reg = 0x4008,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_rscc_vsync_clk", .name = "disp_cc_mdss_rscc_vsync_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_vsync_clk_src.clkr.hw, &disp_cc_mdss_vsync_clk_src.clkr.hw,
@ -1130,7 +1128,7 @@ static struct clk_branch disp_cc_mdss_vsync_clk = {
.clkr = { .clkr = {
.enable_reg = 0x2024, .enable_reg = 0x2024,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data){ .hw.init = &(const struct clk_init_data) {
.name = "disp_cc_mdss_vsync_clk", .name = "disp_cc_mdss_vsync_clk",
.parent_hws = (const struct clk_hw*[]){ .parent_hws = (const struct clk_hw*[]){
&disp_cc_mdss_vsync_clk_src.clkr.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 */ /* Enable clock gating for MDP clocks */
regmap_update_bits(regmap, 0x8000, 0x10, 0x10); regmap_update_bits(regmap, 0x8000, 0x10, 0x10);
/* DISP_CC_XO_CLK always-on */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x605c); /* DISP_CC_XO_CLK */
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8250_desc, regmap); 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) module_platform_driver(disp_cc_sm8250_driver);
{
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_DESCRIPTION("QTI DISPCC SM8250 Driver"); MODULE_DESCRIPTION("QTI DISPCC SM8250 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -1787,11 +1787,8 @@ static int disp_cc_sm8450_probe(struct platform_device *pdev)
/* Enable clock gating for MDP clocks */ /* Enable clock gating for MDP clocks */
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10); regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
/* /* Keep some clocks always-on */
* Keep clocks always enabled: qcom_branch_set_clk_en(regmap, 0xe05c); /* DISP_CC_XO_CLK */
* disp_cc_xo_clk
*/
regmap_update_bits(regmap, 0xe05c, BIT(0), BIT(0));
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8450_desc, regmap); ret = qcom_cc_really_probe(pdev, &disp_cc_sm8450_desc, regmap);
if (ret) if (ret)
@ -1815,17 +1812,7 @@ static struct platform_driver disp_cc_sm8450_driver = {
}, },
}; };
static int __init disp_cc_sm8450_init(void) module_platform_driver(disp_cc_sm8450_driver);
{
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_DESCRIPTION("QTI DISPCC SM8450 Driver"); MODULE_DESCRIPTION("QTI DISPCC SM8450 Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -1780,11 +1780,8 @@ static int disp_cc_sm8550_probe(struct platform_device *pdev)
/* Enable clock gating for MDP clocks */ /* Enable clock gating for MDP clocks */
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10); regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
/* /* Keep some clocks always-on */
* Keep clocks always enabled: qcom_branch_set_clk_en(regmap, 0xe054); /* DISP_CC_XO_CLK */
* disp_cc_xo_clk
*/
regmap_update_bits(regmap, 0xe054, BIT(0), BIT(0));
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8550_desc, regmap); ret = qcom_cc_really_probe(pdev, &disp_cc_sm8550_desc, regmap);
if (ret) if (ret)
@ -1808,17 +1805,7 @@ static struct platform_driver disp_cc_sm8550_driver = {
}, },
}; };
static int __init disp_cc_sm8550_init(void) module_platform_driver(disp_cc_sm8550_driver);
{
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_DESCRIPTION("QTI DISPCC SM8550 Driver"); MODULE_DESCRIPTION("QTI DISPCC SM8550 Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -1777,8 +1777,8 @@ static int disp_cc_sm8650_probe(struct platform_device *pdev)
/* Enable clock gating for MDP clocks */ /* Enable clock gating for MDP clocks */
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10); regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
/* Keep clocks always enabled */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0xe054, BIT(0), BIT(0)); /* disp_cc_xo_clk */ qcom_branch_set_clk_en(regmap, 0xe054); /* DISP_CC_XO_CLK */
ret = qcom_cc_really_probe(pdev, &disp_cc_sm8650_desc, regmap); ret = qcom_cc_really_probe(pdev, &disp_cc_sm8650_desc, regmap);
if (ret) if (ret)
@ -1802,17 +1802,7 @@ static struct platform_driver disp_cc_sm8650_driver = {
}, },
}; };
static int __init disp_cc_sm8650_init(void) module_platform_driver(disp_cc_sm8650_driver);
{
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_DESCRIPTION("QTI DISPCC SM8650 Driver"); MODULE_DESCRIPTION("QTI DISPCC SM8650 Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

File diff suppressed because it is too large Load Diff

View File

@ -857,6 +857,7 @@ static struct clk_rcg2 lpass_sway_clk_src = {
static const struct freq_tbl ftbl_pcie0_aux_clk_src[] = { static const struct freq_tbl ftbl_pcie0_aux_clk_src[] = {
F(2000000, P_XO, 12, 0, 0), F(2000000, P_XO, 12, 0, 0),
{ }
}; };
static struct clk_rcg2 pcie0_aux_clk_src = { 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(100000000, P_GPLL0, 8, 0, 0),
F(200000000, P_GPLL0, 4, 0, 0), F(200000000, P_GPLL0, 4, 0, 0),
F(320000000, P_GPLL0, 2.5, 0, 0), F(320000000, P_GPLL0, 2.5, 0, 0),
{ }
}; };
static struct clk_rcg2 qpic_io_macro_clk_src = { 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[] = { static const struct freq_tbl ftbl_ubi0_core_clk_src[] = {
F(850000000, P_UBI32_PLL, 1, 0, 0), F(850000000, P_UBI32_PLL, 1, 0, 0),
F(1000000000, P_UBI32_PLL, 1, 0, 0), F(1000000000, P_UBI32_PLL, 1, 0, 0),
{ }
}; };
static struct clk_rcg2 ubi0_core_clk_src = { 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_check = BRANCH_HALT_DELAY,
.halt_bit = 31, .halt_bit = 31,
.clkr = { .clkr = {
.enable_reg = 0x683190, .enable_reg = 0x68190,
.enable_mask = BIT(0), .enable_mask = BIT(0),
.hw.init = &(struct clk_init_data) { .hw.init = &(struct clk_init_data) {
.name = "gcc_gmac0_sys_clk", .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 = { static struct clk_branch gcc_pcie1_pipe_clk = {
.halt_reg = 8, .halt_reg = 0x76018,
.halt_check = BRANCH_HALT_DELAY, .halt_check = BRANCH_HALT_DELAY,
.halt_bit = 31, .halt_bit = 31,
.clkr = { .clkr = {
@ -3632,7 +3635,7 @@ static const struct qcom_reset_map gcc_ipq5018_resets[] = {
[GCC_SYSTEM_NOC_BCR] = { 0x26000, 0 }, [GCC_SYSTEM_NOC_BCR] = { 0x26000, 0 },
[GCC_TCSR_BCR] = { 0x28000, 0 }, [GCC_TCSR_BCR] = { 0x28000, 0 },
[GCC_TLMM_BCR] = { 0x34000, 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_AHB_ARES] = { 0x68010, 1 },
[GCC_UBI0_NC_AXI_ARES] = { 0x68010, 2 }, [GCC_UBI0_NC_AXI_ARES] = { 0x68010, 2 },
[GCC_UBI0_DBG_ARES] = { 0x68010, 3 }, [GCC_UBI0_DBG_ARES] = { 0x68010, 3 },

View File

@ -1554,6 +1554,7 @@ static struct clk_regmap_div nss_ubi0_div_clk_src = {
static const struct freq_tbl ftbl_pcie_aux_clk_src[] = { static const struct freq_tbl ftbl_pcie_aux_clk_src[] = {
F(24000000, P_XO, 1, 0, 0), F(24000000, P_XO, 1, 0, 0),
{ }
}; };
static const struct clk_parent_data gcc_xo_gpll0_core_pi_sleep_clk[] = { 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(160000000, P_GPLL0, 5, 0, 0),
F(216000000, P_GPLL6, 5, 0, 0), F(216000000, P_GPLL6, 5, 0, 0),
F(308570000, P_GPLL6, 3.5, 0, 0), F(308570000, P_GPLL6, 3.5, 0, 0),
{ }
}; };
static const struct clk_parent_data gcc_xo_gpll0_gpll6_gpll0_div2[] = { 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 = { static struct clk_branch gcc_qdss_dap_clk = {
.halt_reg = 0x29084, .halt_reg = 0x29084,
.clkr = { .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_SYS_NOC_PCIE0_AXI_CLK] = &gcc_sys_noc_pcie0_axi_clk.clkr,
[GCC_PCIE0_PIPE_CLK] = &gcc_pcie0_pipe_clk.clkr, [GCC_PCIE0_PIPE_CLK] = &gcc_pcie0_pipe_clk.clkr,
[GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_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_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
[GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr, [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
[GCC_QPIC_CLK] = &gcc_qpic_clk.clkr, [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,

View File

@ -644,6 +644,7 @@ static struct clk_rcg2 pcie0_axi_clk_src = {
static const struct freq_tbl ftbl_pcie_aux_clk_src[] = { static const struct freq_tbl ftbl_pcie_aux_clk_src[] = {
F(19200000, P_XO, 1, 0, 0), F(19200000, P_XO, 1, 0, 0),
{ }
}; };
static const struct clk_parent_data gcc_xo_gpll0_sleep_clk[] = { 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(19200000, P_XO, 1, 0, 0),
F(160000000, P_GPLL0, 5, 0, 0), F(160000000, P_GPLL0, 5, 0, 0),
F(308570000, P_GPLL6, 3.5, 0, 0), F(308570000, P_GPLL6, 3.5, 0, 0),
{ }
}; };
static const struct clk_parent_data gcc_xo_gpll0_gpll6_gpll0_div2[] = { static const struct clk_parent_data gcc_xo_gpll0_gpll6_gpll0_div2[] = {

View File

@ -2082,6 +2082,7 @@ static struct clk_branch gcc_sdcc1_apps_clk = {
static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = { static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = {
F(150000000, P_GPLL4, 8, 0, 0), F(150000000, P_GPLL4, 8, 0, 0),
F(300000000, P_GPLL4, 4, 0, 0), F(300000000, P_GPLL4, 4, 0, 0),
{ }
}; };
static struct clk_rcg2 sdcc1_ice_core_clk_src = { static struct clk_rcg2 sdcc1_ice_core_clk_src = {

View File

@ -4171,6 +4171,10 @@ static const struct qcom_reset_map gcc_msm8953_resets[] = {
[GCC_USB3PHY_PHY_BCR] = { 0x3f03c }, [GCC_USB3PHY_PHY_BCR] = { 0x3f03c },
[GCC_USB3_PHY_BCR] = { 0x3f034 }, [GCC_USB3_PHY_BCR] = { 0x3f034 },
[GCC_USB_30_BCR] = { 0x3f070 }, [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 = { static const struct regmap_config gcc_msm8953_regmap_config = {

View File

@ -4662,8 +4662,8 @@ static const struct qcom_reset_map gcc_sa8775p_resets[] = {
[GCC_USB3UNIPHY_PHY_MP0_BCR] = { 0x5c020 }, [GCC_USB3UNIPHY_PHY_MP0_BCR] = { 0x5c020 },
[GCC_USB3UNIPHY_PHY_MP1_BCR] = { 0x5c024 }, [GCC_USB3UNIPHY_PHY_MP1_BCR] = { 0x5c024 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x76000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x76000 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x34014, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x34014, .bit = 2, .udelay = 400 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x3401c, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x3401c, .bit = 2, .udelay = 400 },
[GCC_VIDEO_BCR] = { 0x34000 }, [GCC_VIDEO_BCR] = { 0x34000 },
}; };
@ -4742,21 +4742,16 @@ static int gcc_sa8775p_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_CAMERA_AHB_CLK */
* GCC_CAMERA_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_DISP1_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x32020); /* GCC_CAMERA_XO_CLK */
* GCC_DISP1_XO_CLK, GCC_DISP_AHB_CLK, GCC_DISP_XO_CLK, qcom_branch_set_clk_en(regmap, 0xc7004); /* GCC_DISP1_AHB_CLK */
* GCC_GPU_CFG_AHB_CLK, GCC_VIDEO_AHB_CLK, GCC_VIDEO_XO_CLK. qcom_branch_set_clk_en(regmap, 0xc7018); /* GCC_DISP1_XO_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x33004); /* GCC_DISP_AHB_CLK */
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x33018); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x32020, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x7d004); /* GCC_GPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0xc7004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x34004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0xc7018, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x34024); /* GCC_VIDEO_XO_CLK */
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));
return qcom_cc_really_probe(pdev, &gcc_sa8775p_desc, regmap); return qcom_cc_really_probe(pdev, &gcc_sa8775p_desc, regmap);
} }

View File

@ -2443,19 +2443,15 @@ static int gcc_sc7180_probe(struct platform_device *pdev)
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3); regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
regmap_update_bits(regmap, 0x71028, 0x3, 0x3); regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x48004); /* GCC_CPUSS_GNOC_CLK */
* GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x0b004); /* GCC_VIDEO_AHB_CLK */
* GCC_DISP_AHB_CLK, GCC_GPU_CFG_AHB_CLK qcom_branch_set_clk_en(regmap, 0x0b008); /* GCC_CAMERA_AHB_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x0b00c); /* GCC_DISP_AHB_CLK */
regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x0b02c); /* GCC_CAMERA_XO_CLK */
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x0b028); /* GCC_VIDEO_XO_CLK */
regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x0b030); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
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));
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
ARRAY_SIZE(gcc_dfs_clocks)); ARRAY_SIZE(gcc_dfs_clocks));

View File

@ -3453,18 +3453,14 @@ static int gcc_sc7280_probe(struct platform_device *pdev)
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_ERR(regmap); return PTR_ERR(regmap);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x26004);/* GCC_CAMERA_AHB_CLK */
* GCC_CAMERA_AHB_CLK/XO_CLK, GCC_DISP_AHB_CLK/XO_CLK qcom_branch_set_clk_en(regmap, 0x26028);/* GCC_CAMERA_XO_CLK */
* GCC_VIDEO_AHB_CLK/XO_CLK, GCC_GPU_CFG_AHB_CLK qcom_branch_set_clk_en(regmap, 0x27004);/* GCC_DISP_AHB_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x2701c);/* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x28004);/* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x28014);/* GCC_VIDEO_XO_CLK */
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x71004);/* GCC_GPU_CFG_AHB_CLK */
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));
regmap_update_bits(regmap, 0x7100C, BIT(13), BIT(13)); regmap_update_bits(regmap, 0x7100C, BIT(13), BIT(13));
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,

View File

@ -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 = { static struct clk_branch gcc_ufs_card_ahb_clk = {
.halt_reg = 0x75014, .halt_reg = 0x75014,
.halt_check = BRANCH_HALT, .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 = { static struct clk_branch gcc_ufs_phy_ahb_clk = {
.halt_reg = 0x77014, .halt_reg = 0x77014,
.halt_check = BRANCH_HALT, .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_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] = &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_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_AHB_CLK] = &gcc_ufs_card_ahb_clk.clkr,
[GCC_UFS_CARD_AXI_CLK] = &gcc_ufs_card_axi_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, [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] = &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_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_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_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
[GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_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, [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_PRIM_BCR] = { 0xf000 },
[GCC_USB30_SEC_BCR] = { 0x10000 }, [GCC_USB30_SEC_BCR] = { 0x10000 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
[GCC_VIDEO_AXIC_CLK_BCR] = { 0xb02c, 2 }, [GCC_VIDEO_AXIC_CLK_BCR] = { .reg = 0xb02c, .bit = 2, .udelay = 150 },
[GCC_VIDEO_AXI0_CLK_BCR] = { 0xb024, 2 }, [GCC_VIDEO_AXI0_CLK_BCR] = { .reg = 0xb024, .bit = 2, .udelay = 150 },
[GCC_VIDEO_AXI1_CLK_BCR] = { 0xb028, 2 }, [GCC_VIDEO_AXI1_CLK_BCR] = { .reg = 0xb028, .bit = 2, .udelay = 150 },
}; };
static struct gdsc *gcc_sc8180x_gdscs[] = { static struct gdsc *gcc_sc8180x_gdscs[] = {
@ -4579,23 +4607,17 @@ static int gcc_sc8180x_probe(struct platform_device *pdev)
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_ERR(regmap); return PTR_ERR(regmap);
/* /* Keep some clocks always-on */
* Enable the following always-on clocks: qcom_branch_set_clk_en(regmap, 0xb004); /* GCC_VIDEO_AHB_CLK */
* GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, GCC_DISP_AHB_CLK, qcom_branch_set_clk_en(regmap, 0xb008); /* GCC_CAMERA_AHB_CLK */
* GCC_VIDEO_XO_CLK, GCC_CAMERA_XO_CLK, GCC_DISP_XO_CLK, qcom_branch_set_clk_en(regmap, 0xb00c); /* GCC_DISP_AHB_CLK */
* GCC_CPUSS_GNOC_CLK, GCC_CPUSS_DVM_BUS_CLK, GCC_NPU_CFG_AHB_CLK and qcom_branch_set_clk_en(regmap, 0xb040); /* GCC_VIDEO_XO_CLK */
* GCC_GPU_CFG_AHB_CLK qcom_branch_set_clk_en(regmap, 0xb044); /* GCC_CAMERA_XO_CLK */
*/ qcom_branch_set_clk_en(regmap, 0xb048); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0xb004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x48004); /* GCC_CPUSS_GNOC_CLK */
regmap_update_bits(regmap, 0xb008, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x48190); /* GCC_CPUSS_DVM_BUS_CLK */
regmap_update_bits(regmap, 0xb00c, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x4d004); /* GCC_NPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0xb040, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
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));
/* Disable the GPLL0 active input to NPU and GPU via MISC registers */ /* Disable the GPLL0 active input to NPU and GPU via MISC registers */
regmap_update_bits(regmap, 0x4d110, 0x3, 0x3); regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);

View File

@ -7448,8 +7448,8 @@ static const struct qcom_reset_map gcc_sc8280xp_resets[] = {
[GCC_USB4PHY_PHY_PRIM_BCR] = { 0x4a004 }, [GCC_USB4PHY_PHY_PRIM_BCR] = { 0x4a004 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
[GCC_VIDEO_BCR] = { 0x28000 }, [GCC_VIDEO_BCR] = { 0x28000 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x28010, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x28010, .bit = 2, .udelay = 400 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x28018, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x28018, .bit = 2, .udelay = 400 },
}; };
static struct gdsc *gcc_sc8280xp_gdscs[] = { static struct gdsc *gcc_sc8280xp_gdscs[] = {
@ -7543,21 +7543,16 @@ static int gcc_sc8280xp_probe(struct platform_device *pdev)
goto err_put_rpm; goto err_put_rpm;
} }
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
* GCC_CAMERA_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_DISP_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x26020); /* GCC_CAMERA_XO_CLK */
* GCC_DISP_XO_CLK, GCC_GPU_CFG_AHB_CLK, GCC_VIDEO_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
* GCC_VIDEO_XO_CLK, GCC_DISP1_AHB_CLK, GCC_DISP1_XO_CLK qcom_branch_set_clk_en(regmap, 0x27028); /* GCC_DISP_XO_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x28004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x26020, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x28028); /* GCC_VIDEO_XO_CLK */
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0xbb004); /* GCC_DISP1_AHB_CLK */
regmap_update_bits(regmap, 0x27028, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0xbb028); /* GCC_DISP1_XO_CLK */
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));
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ARRAY_SIZE(gcc_dfs_clocks)); ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ARRAY_SIZE(gcc_dfs_clocks));
if (ret) if (ret)

View File

@ -4037,3 +4037,4 @@ module_exit(gcc_sdm845_exit);
MODULE_DESCRIPTION("QTI GCC SDM845 Driver"); MODULE_DESCRIPTION("QTI GCC SDM845 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:gcc-sdm845"); MODULE_ALIAS("platform:gcc-sdm845");
MODULE_SOFTDEP("pre: rpmhpd");

View File

@ -1611,14 +1611,10 @@ static int gcc_sdx55_probe(struct platform_device *pdev)
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_ERR(regmap); return PTR_ERR(regmap);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON as they are critical to the functioning qcom_branch_set_clk_en(regmap, 0x6d008); /* GCC_SYS_NOC_CPUSS_AHB_CLK */
* of the system: regmap_update_bits(regmap, 0x6d008, BIT(21), BIT(21)); /* GCC_CPUSS_AHB_CLK */
* GCC_SYS_NOC_CPUSS_AHB_CLK, GCC_CPUSS_AHB_CLK, GCC_CPUSS_GNOC_CLK regmap_update_bits(regmap, 0x6d008, BIT(22), BIT(22)); /* 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));
return qcom_cc_really_probe(pdev, &gcc_sdx55_desc, regmap); return qcom_cc_really_probe(pdev, &gcc_sdx55_desc, regmap);
} }

View File

@ -1574,14 +1574,11 @@ static int gcc_sdx65_probe(struct platform_device *pdev)
regmap = qcom_cc_map(pdev, &gcc_sdx65_desc); regmap = qcom_cc_map(pdev, &gcc_sdx65_desc);
if (IS_ERR(regmap)) if (IS_ERR(regmap))
return PTR_ERR(regmap); return PTR_ERR(regmap);
/*
* Keep the clocks always-ON as they are critical to the functioning /* Keep some clocks always-on */
* of the system: qcom_branch_set_clk_en(regmap, 0x6d008); /* GCC_SYS_NOC_CPUSS_AHB_CLK */
* GCC_SYS_NOC_CPUSS_AHB_CLK, GCC_CPUSS_AHB_CLK, GCC_CPUSS_GNOC_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 */
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));
return qcom_cc_really_probe(pdev, &gcc_sdx65_desc, regmap); return qcom_cc_really_probe(pdev, &gcc_sdx65_desc, regmap);
} }

View File

@ -2936,13 +2936,9 @@ static int gcc_sdx75_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
/* /* Keep some clocks always-on */
* Keep clocks always enabled: qcom_branch_set_clk_en(regmap, 0x3e004); /* GCC_AHB_PCIE_LINK_CLK */
* gcc_ahb_pcie_link_clk qcom_branch_set_clk_en(regmap, 0x3e008); /* GCC_XO_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));
return qcom_cc_really_probe(pdev, &gcc_sdx75_desc, regmap); return qcom_cc_really_probe(pdev, &gcc_sdx75_desc, regmap);
} }

View File

@ -2791,8 +2791,8 @@ static const struct qcom_reset_map gcc_sm4450_resets[] = {
[GCC_VENUS_BCR] = { 0xb601c }, [GCC_VENUS_BCR] = { 0xb601c },
[GCC_VIDEO_BCR] = { 0x42000 }, [GCC_VIDEO_BCR] = { 0x42000 },
[GCC_VIDEO_VENUS_BCR] = { 0xb6000 }, [GCC_VIDEO_VENUS_BCR] = { 0xb6000 },
[GCC_VENUS_CTL_AXI_CLK_ARES] = { 0x4201c, 2 }, [GCC_VENUS_CTL_AXI_CLK_ARES] = { .reg = 0x4201c, .bit = 2, .udelay = 400 },
[GCC_VIDEO_VENUS_CTL_CLK_ARES] = { 0xb6038, 2 }, [GCC_VIDEO_VENUS_CTL_CLK_ARES] = { .reg = 0xb6038, .bit = 2, .udelay = 400 },
}; };
static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 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); qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true);
/* /* Keep some clocks always-on */
* Keep clocks always enabled: qcom_branch_set_clk_en(regmap, 0x36004); /* GCC_CAMERA_AHB_CLK */
* gcc_camera_ahb_clk qcom_branch_set_clk_en(regmap, 0x36018); /* GCC_CAMERA_SLEEP_CLK */
* gcc_camera_sleep_clk qcom_branch_set_clk_en(regmap, 0x3601c); /* GCC_CAMERA_XO_CLK */
* gcc_camera_xo_clk qcom_branch_set_clk_en(regmap, 0x37004); /* GCC_DISP_AHB_CLK */
* gcc_disp_ahb_clk qcom_branch_set_clk_en(regmap, 0x37014); /* GCC_DISP_XO_CLK */
* gcc_disp_xo_clk qcom_branch_set_clk_en(regmap, 0x81004); /* GCC_GPU_CFG_AHB_CLK */
* gcc_gpu_cfg_ahb_clk qcom_branch_set_clk_en(regmap, 0x42004); /* GCC_VIDEO_AHB_CLK */
* gcc_video_ahb_clk qcom_branch_set_clk_en(regmap, 0x42018); /* GCC_VIDEO_XO_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));
regmap_update_bits(regmap, 0x4201c, BIT(21), BIT(21)); regmap_update_bits(regmap, 0x4201c, BIT(21), BIT(21));

View File

@ -3882,13 +3882,10 @@ static int gcc_sm6375_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
/* /* Keep some clocks always-on */
* Keep the following clocks always on: qcom_branch_set_clk_en(regmap, 0x17028); /* GCC_CAMERA_XO_CLK */
* GCC_CAMERA_XO_CLK, GCC_CPUSS_GNOC_CLK, GCC_DISP_XO_CLK qcom_branch_set_clk_en(regmap, 0x2b004); /* GCC_CPUSS_GNOC_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x1702c); /* 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));
clk_lucid_pll_configure(&gpll10, regmap, &gpll10_config); clk_lucid_pll_configure(&gpll10, regmap, &gpll10_config);
clk_lucid_pll_configure(&gpll11, regmap, &gpll11_config); clk_lucid_pll_configure(&gpll11, regmap, &gpll11_config);

View File

@ -2918,7 +2918,7 @@ static const struct qcom_reset_map gcc_sm7150_resets[] = {
[GCC_USB3_PHY_PRIM_BCR] = { 0x50000 }, [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 },
[GCC_USB3_PHY_SEC_BCR] = { 0x5000c }, [GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
[GCC_QUSB2PHY_PRIM_BCR] = { 0x26000 }, [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[] = { 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, 0x4d110, 0x3, 0x3);
regmap_update_bits(regmap, 0x71028, 0x3, 0x3); regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
/* /* Keep some clocks always-on */
* Keep the critical clocks always-ON qcom_branch_set_clk_en(regmap, 0x48004); /* GCC_CPUSS_GNOC_CLK */
* GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x0b004); /* GCC_VIDEO_AHB_CLK */
* GCC_DISP_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_VIDEO_XO_CLK, qcom_branch_set_clk_en(regmap, 0x0b008); /* GCC_CAMERA_AHB_CLK */
* GCC_DISP_XO_CLK, GCC_GPU_CFG_AHB_CLK qcom_branch_set_clk_en(regmap, 0x0b00c); /* GCC_DISP_AHB_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x0b02c); /* GCC_CAMERA_XO_CLK */
regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x0b028); /* GCC_VIDEO_XO_CLK */
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x0b030); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
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));
ret = qcom_cc_register_rcg_dfs(regmap, gcc_sm7150_dfs_desc, ret = qcom_cc_register_rcg_dfs(regmap, gcc_sm7150_dfs_desc,
ARRAY_SIZE(gcc_sm7150_dfs_desc)); ARRAY_SIZE(gcc_sm7150_dfs_desc));

View File

@ -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 = { static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
.cmd_rcgr = 0x17148, .cmd_rcgr = 0x17148,
.mnd_width = 16, .mnd_width = 16,
.hid_width = 5, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s1_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s2_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s3_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s4_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s5_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s6_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s6_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap0_s7_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap0_s7_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap1_s0_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap1_s1_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap1_s2_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap1_s3_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap1_s4_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap1_s5_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap2_s0_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap2_s1_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap2_s2_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap2_s3_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap2_s4_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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), static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = {
.flags = CLK_SET_RATE_PARENT, .name = "gcc_qupv3_wrap2_s5_clk_src",
.ops = &clk_rcg2_ops, .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 = { 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, .hid_width = 5,
.parent_map = gcc_parent_map_0, .parent_map = gcc_parent_map_0,
.freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
.clkr.hw.init = &(struct clk_init_data){ .clkr.hw.init = &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 const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 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_PRIM_BCR] = { 0xf000 },
[GCC_USB30_SEC_BCR] = { 0x10000 }, [GCC_USB30_SEC_BCR] = { 0x10000 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, [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[] = { static struct gdsc *gcc_sm8150_gdscs[] = {
@ -3750,6 +3793,29 @@ static struct gdsc *gcc_sm8150_gdscs[] = {
[USB30_SEC_GDSC] = &usb30_sec_gdsc, [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 = { static const struct regmap_config gcc_sm8150_regmap_config = {
.reg_bits = 32, .reg_bits = 32,
.reg_stride = 4, .reg_stride = 4,
@ -3777,6 +3843,7 @@ MODULE_DEVICE_TABLE(of, gcc_sm8150_match_table);
static int gcc_sm8150_probe(struct platform_device *pdev) static int gcc_sm8150_probe(struct platform_device *pdev)
{ {
struct regmap *regmap; struct regmap *regmap;
int ret;
regmap = qcom_cc_map(pdev, &gcc_sm8150_desc); regmap = qcom_cc_map(pdev, &gcc_sm8150_desc);
if (IS_ERR(regmap)) 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, 0x4d110, 0x3, 0x3);
regmap_update_bits(regmap, 0x71028, 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); return qcom_cc_really_probe(pdev, &gcc_sm8150_desc, regmap);
} }

View File

@ -3576,8 +3576,8 @@ static const struct qcom_reset_map gcc_sm8250_resets[] = {
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0xb024, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { 0xb024, .bit = 2, .udelay = 150 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0xb028, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { 0xb028, .bit = 2, .udelay = 150 },
}; };
static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 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, 0x4d110, 0x3, 0x3);
regmap_update_bits(regmap, 0x71028, 0x3, 0x3); regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x0b004); /* GCC_VIDEO_AHB_CLK */
* GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK, GCC_DISP_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x0b008); /* GCC_CAMERA_AHB_CLK */
* GCC_CPUSS_DVM_BUS_CLK, GCC_GPU_CFG_AHB_CLK, qcom_branch_set_clk_en(regmap, 0x0b00c); /* GCC_DISP_AHB_CLK */
* GCC_SYS_NOC_CPUSS_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 */
regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x52000); /* GCC_SYS_NOC_CPUSS_AHB_CLK */
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));
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
ARRAY_SIZE(gcc_dfs_clocks)); ARRAY_SIZE(gcc_dfs_clocks));

View File

@ -3743,8 +3743,8 @@ static const struct qcom_reset_map gcc_sm8350_resets[] = {
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x28010, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x28010, .bit = 2, .udelay = 400 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x28018, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x28018, .bit = 2, .udelay = 400 },
[GCC_VIDEO_BCR] = { 0x28000 }, [GCC_VIDEO_BCR] = { 0x28000 },
}; };
@ -3806,18 +3806,14 @@ static int gcc_sm8350_probe(struct platform_device *pdev)
return PTR_ERR(regmap); return PTR_ERR(regmap);
} }
/* /* Keep some clocks always-on */
* Keep the critical clock always-On qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
* GCC_CAMERA_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_DISP_AHB_CLK, GCC_DISP_XO_CLK, qcom_branch_set_clk_en(regmap, 0x26018); /* GCC_CAMERA_XO_CLK */
* GCC_GPU_CFG_AHB_CLK, GCC_VIDEO_AHB_CLK, GCC_VIDEO_XO_CLK qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x2701c); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0x26018, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x28004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x28020); /* GCC_VIDEO_XO_CLK */
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));
ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ARRAY_SIZE(gcc_dfs_clocks)); ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, ARRAY_SIZE(gcc_dfs_clocks));
if (ret) if (ret)

View File

@ -3202,8 +3202,8 @@ static const struct qcom_reset_map gcc_sm8450_resets[] = {
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x60004 }, [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x60004 },
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x60010 }, [GCC_USB3PHY_PHY_SEC_BCR] = { 0x60010 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x7a000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x7a000 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x42018, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x42018, .bit = 2, .udelay = 1000 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x42020, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x42020, .bit = 2, .udelay = 1000 },
[GCC_VIDEO_BCR] = { 0x42000 }, [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 */ /* 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)); regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14));
/* /* Keep some clocks always-on */
* Keep the critical clock always-On qcom_branch_set_clk_en(regmap, 0x36004); /* GCC_CAMERA_AHB_CLK */
* gcc_camera_ahb_clk, gcc_camera_xo_clk, gcc_disp_ahb_clk, qcom_branch_set_clk_en(regmap, 0x36020); /* GCC_CAMERA_XO_CLK */
* gcc_disp_xo_clk, gcc_gpu_cfg_ahb_clk, gcc_video_ahb_clk, qcom_branch_set_clk_en(regmap, 0x37004); /* GCC_DISP_AHB_CLK */
* gcc_video_xo_clk qcom_branch_set_clk_en(regmap, 0x3701c); /* GCC_DISP_XO_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x81004); /* GCC_GPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0x36004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x42004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x36020, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x42028); /* GCC_VIDEO_XO_CLK */
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));
return qcom_cc_really_probe(pdev, &gcc_sm8450_desc, regmap); return qcom_cc_really_probe(pdev, &gcc_sm8450_desc, regmap);
} }

View File

@ -3276,8 +3276,8 @@ static const struct qcom_reset_map gcc_sm8550_resets[] = {
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
[GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x32018, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x32018, .bit = 2, .udelay = 1000 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x32024, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x32024, .bit = 2, .udelay = 1000 },
[GCC_VIDEO_BCR] = { 0x32000 }, [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 */ /* 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)); regmap_update_bits(regmap, gcc_ufs_phy_ice_core_clk.halt_reg, BIT(14), BIT(14));
/* /* Keep some clocks always-on */
* Keep the critical clock always-On qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
* gcc_camera_ahb_clk, gcc_camera_xo_clk, gcc_disp_ahb_clk, qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */
* gcc_disp_xo_clk, gcc_gpu_cfg_ahb_clk, gcc_video_ahb_clk, qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
* gcc_video_xo_clk qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */
*/ qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0)); qcom_branch_set_clk_en(regmap, 0x32030); /* GCC_VIDEO_XO_CLK */
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));
/* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */ /* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */
regmap_write(regmap, 0x52024, 0x0); regmap_write(regmap, 0x52024, 0x0);

View File

@ -3734,8 +3734,8 @@ static const struct qcom_reset_map gcc_sm8650_resets[] = {
[GCC_USB3_PHY_SEC_BCR] = { 0x5000c }, [GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
[GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 },
[GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 },
[GCC_VIDEO_AXI0_CLK_ARES] = { 0x32018, 2 }, [GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x32018, .bit = 2, .udelay = 1000 },
[GCC_VIDEO_AXI1_CLK_ARES] = { 0x32024, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x32024, .bit = 2, .udelay = 1000 },
[GCC_VIDEO_BCR] = { 0x32000 }, [GCC_VIDEO_BCR] = { 0x32000 },
}; };
@ -3808,14 +3808,14 @@ static int gcc_sm8650_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
/* Keep the critical clock always-On */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); /* gcc_camera_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0)); /* gcc_camera_xo_clk */ qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); /* gcc_disp_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
regmap_update_bits(regmap, 0x27018, BIT(0), BIT(0)); /* gcc_disp_xo_clk */ qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0)); /* gcc_gpu_cfg_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0)); /* gcc_video_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x32030, BIT(0), BIT(0)); /* gcc_video_xo_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); qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true);

View File

@ -6769,14 +6769,14 @@ static int gcc_x1e80100_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
/* Keep the critical clock always-On */ /* Keep some clocks always-on */
regmap_update_bits(regmap, 0x26004, BIT(0), BIT(0)); /* gcc_camera_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x26004); /* GCC_CAMERA_AHB_CLK */
regmap_update_bits(regmap, 0x26028, BIT(0), BIT(0)); /* gcc_camera_xo_clk */ qcom_branch_set_clk_en(regmap, 0x26028); /* GCC_CAMERA_XO_CLK */
regmap_update_bits(regmap, 0x27004, BIT(0), BIT(0)); /* gcc_disp_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x27004); /* GCC_DISP_AHB_CLK */
regmap_update_bits(regmap, 0x27018, BIT(0), BIT(0)); /* gcc_disp_xo_clk */ qcom_branch_set_clk_en(regmap, 0x27018); /* GCC_DISP_XO_CLK */
regmap_update_bits(regmap, 0x32004, BIT(0), BIT(0)); /* gcc_video_ahb_clk */ qcom_branch_set_clk_en(regmap, 0x32004); /* GCC_VIDEO_AHB_CLK */
regmap_update_bits(regmap, 0x32030, BIT(0), BIT(0)); /* gcc_video_xo_clk */ qcom_branch_set_clk_en(regmap, 0x32030); /* GCC_VIDEO_XO_CLK */
regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0)); /* gcc_gpu_cfg_ahb_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. */ /* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */
regmap_write(regmap, 0x52224, 0x0); regmap_write(regmap, 0x52224, 0x0);

View File

@ -557,7 +557,15 @@ void gdsc_unregister(struct gdsc_desc *desc)
*/ */
int gdsc_gx_do_nothing_enable(struct generic_pm_domain *domain) int gdsc_gx_do_nothing_enable(struct generic_pm_domain *domain)
{ {
/* Do nothing but give genpd the impression that we were successful */ struct gdsc *sc = domain_to_gdsc(domain);
return 0; 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); EXPORT_SYMBOL_GPL(gdsc_gx_do_nothing_enable);

View File

@ -609,17 +609,7 @@ static struct platform_driver gpu_cc_sa8775p_driver = {
}, },
}; };
static int __init gpu_cc_sa8775p_init(void) module_platform_driver(gpu_cc_sa8775p_driver);
{
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_DESCRIPTION("SA8775P GPUCC driver"); MODULE_DESCRIPTION("SA8775P GPUCC driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -252,17 +252,7 @@ static struct platform_driver gpu_cc_sc7180_driver = {
}, },
}; };
static int __init gpu_cc_sc7180_init(void) module_platform_driver(gpu_cc_sc7180_driver);
{
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_DESCRIPTION("QTI GPU_CC SC7180 Driver"); MODULE_DESCRIPTION("QTI GPU_CC SC7180 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -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); clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x1170); /* GPU_CC_CB_CLK */
* GPU_CC_CB_CLK, GPUCC_CX_GMU_CLK qcom_branch_set_clk_en(regmap, 0x1098); /* GPUCC_CX_GMU_CLK */
*/
regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
regmap_update_bits(regmap, 0x1098, BIT(0), BIT(0));
regmap_update_bits(regmap, 0x1098, BIT(13), BIT(13)); regmap_update_bits(regmap, 0x1098, BIT(13), BIT(13));
return qcom_cc_really_probe(pdev, &gpu_cc_sc7280_desc, regmap); 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) module_platform_driver(gpu_cc_sc7280_driver);
{
return platform_driver_register(&gpu_cc_sc7280_driver);
}
subsys_initcall(gpu_cc_sc7280_init);
static void __exit gpu_cc_sc7280_exit(void)
{
platform_driver_unregister(&gpu_cc_sc7280_driver);
}
module_exit(gpu_cc_sc7280_exit);
MODULE_DESCRIPTION("QTI GPU_CC SC7280 Driver"); MODULE_DESCRIPTION("QTI GPU_CC SC7280 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -399,6 +399,7 @@ static struct gdsc gx_gdsc = {
}, },
.pwrsts = PWRSTS_OFF_ON, .pwrsts = PWRSTS_OFF_ON,
.flags = CLAMP_IO | RETAIN_FF_ENABLE, .flags = CLAMP_IO | RETAIN_FF_ENABLE,
.supply = "vdd-gfx",
}; };
static struct gdsc *gpu_cc_sc8280xp_gdscs[] = { 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_pll0, regmap, &gpu_cc_pll0_config);
clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config); clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
/* /* Keep some clocks always-on */
* Keep the clocks always-ON qcom_branch_set_clk_en(regmap, 0x1170); /* GPU_CC_CB_CLK */
* GPU_CC_CB_CLK, GPU_CC_CXO_CLK qcom_branch_set_clk_en(regmap, 0x109c); /* GPU_CC_CXO_CLK */
*/
regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
regmap_update_bits(regmap, 0x109c, BIT(0), BIT(0));
ret = qcom_cc_really_probe(pdev, &gpu_cc_sc8280xp_desc, regmap); ret = qcom_cc_really_probe(pdev, &gpu_cc_sc8280xp_desc, regmap);
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);

View File

@ -203,17 +203,7 @@ static struct platform_driver gpu_cc_sdm845_driver = {
}, },
}; };
static int __init gpu_cc_sdm845_init(void) module_platform_driver(gpu_cc_sdm845_driver);
{
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_DESCRIPTION("QTI GPUCC SDM845 Driver"); MODULE_DESCRIPTION("QTI GPUCC SDM845 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -315,17 +315,7 @@ static struct platform_driver gpu_cc_sm8150_driver = {
}, },
}; };
static int __init gpu_cc_sm8150_init(void) module_platform_driver(gpu_cc_sm8150_driver);
{
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_DESCRIPTION("QTI GPUCC SM8150 Driver"); MODULE_DESCRIPTION("QTI GPUCC SM8150 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -331,17 +331,7 @@ static struct platform_driver gpu_cc_sm8250_driver = {
}, },
}; };
static int __init gpu_cc_sm8250_init(void) module_platform_driver(gpu_cc_sm8250_driver);
{
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_DESCRIPTION("QTI GPU_CC SM8250 Driver"); MODULE_DESCRIPTION("QTI GPU_CC SM8250 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -621,17 +621,7 @@ static struct platform_driver gpu_cc_sm8350_driver = {
}, },
}; };
static int __init gpu_cc_sm8350_init(void) module_platform_driver(gpu_cc_sm8350_driver);
{
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_DESCRIPTION("QTI GPU_CC SM8350 Driver"); MODULE_DESCRIPTION("QTI GPU_CC SM8350 Driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");

View File

@ -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_pll0, regmap, &gpu_cc_pll0_config);
clk_lucid_ole_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config); clk_lucid_ole_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
/* /* Keep some clocks always-on */
* Keep clocks always enabled: qcom_branch_set_clk_en(regmap, 0x9004); /* GPU_CC_CXO_AON_CLK */
* gpu_cc_cxo_aon_clk qcom_branch_set_clk_en(regmap, 0x900c); /* GPU_CC_DEMET_CLK */
* gpu_cc_demet_clk
*/
regmap_update_bits(regmap, 0x9004, BIT(0), BIT(0));
regmap_update_bits(regmap, 0x900c, BIT(0), BIT(0));
return qcom_cc_really_probe(pdev, &gpu_cc_sm8550_desc, regmap); 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) module_platform_driver(gpu_cc_sm8550_driver);
{
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_DESCRIPTION("QTI GPUCC SM8550 Driver"); MODULE_DESCRIPTION("QTI GPUCC SM8550 Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View 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");

View File

@ -401,11 +401,8 @@ static int lpass_core_cc_sc7180_probe(struct platform_device *pdev)
goto exit; goto exit;
} }
/* /* Keep some clocks always-on */
* Keep the CLK always-ON qcom_branch_set_clk_en(regmap, 0x24000); /* LPASS_AUDIO_CORE_SYSNOC_SWAY_CORE_CLK */
* LPASS_AUDIO_CORE_SYSNOC_SWAY_CORE_CLK
*/
regmap_update_bits(regmap, 0x24000, BIT(0), BIT(0));
/* PLL settings */ /* PLL settings */
regmap_write(regmap, 0x1008, 0x20); regmap_write(regmap, 0x1008, 0x20);

Some files were not shown because too many files have changed in this diff Show More