mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:04:43 +01:00
Merge branches 'clk-rockchip', 'clk-thead', 'clk-microchip', 'clk-imx' and 'clk-qcom' into clk-next
* clk-rockchip: clk: rockchip: rk3568: Add PLL rate for 132MHz * clk-thead: clk: thead: th1520-ap: Describe mux clocks with clk_mux clk: thead: th1520-ap: Correctly refer the parent of osc_12m clk: thead: Mark essential bus clocks as CLK_IGNORE_UNUSED * clk-microchip: clk: at91: sam9x7: update pll clk ranges * clk-imx: MAINTAINERS: Update i.MX Clock Entry clk: imx95-blk-ctl: Add clock for i.MX94 LVDS/Display CSR clk: imx95-blk-ctl: Rename lvds and displaymix csr blk clk: imx95-blk-ctl: Fix synchronous abort dt-bindings: clock: Add support for i.MX94 LVDS/DISPLAY CSR clk: imx: Fix an out-of-bounds access in dispmix_csr_clk_dev_data * clk-qcom: (65 commits) dt-bindings: clock: qcom,sm4450-dispcc: Reference qcom,gcc.yaml dt-bindings: clock: qcom,sm4450-camcc: Reference qcom,gcc.yaml dt-bindings: clock: qcom,mmcc: Reference qcom,gcc.yaml dt-bindings: clock: qcom,sm8150-camcc: Reference qcom,gcc.yaml dt-bindings: clock: qcom: Remove double colon from description clk: qcom: Add Video Clock controller (VIDEOCC) driver for Milos dt-bindings: clock: qcom: document the Milos Video Clock Controller clk: qcom: Add Graphics Clock controller (GPUCC) driver for Milos dt-bindings: clock: qcom: document the Milos GPU Clock Controller clk: qcom: Add Display Clock controller (DISPCC) driver for Milos dt-bindings: clock: qcom: document the Milos Display Clock Controller clk: qcom: Add Camera Clock controller (CAMCC) driver for Milos dt-bindings: clock: qcom: document the Milos Camera Clock Controller clk: qcom: Add Global Clock controller (GCC) driver for Milos dt-bindings: clock: qcom: document the Milos Global Clock Controller clk: qcom: common: Add support to register rcg dfs in qcom_cc_really_probe clk: qcom: gcc-x1e80100: Add missing video resets dt-bindings: clock: qcom,x1e80100-gcc: Add missing video resets clk: qcom: videocc-sm8550: Add separate frequency tables for X1E80100 clk: qcom: videocc-sm8550: Allow building without SM8550/SM8560 GCC ...
This commit is contained in:
commit
c30cc9ffc1
80 changed files with 16263 additions and 485 deletions
|
|
@ -13,6 +13,8 @@ properties:
|
|||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- nxp,imx94-display-csr
|
||||
- nxp,imx94-lvds-csr
|
||||
- nxp,imx95-camera-csr
|
||||
- nxp,imx95-display-csr
|
||||
- nxp,imx95-hsio-blk-ctl
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ description:
|
|||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,ipq5018-cmn-pll
|
||||
- qcom,ipq5424-cmn-pll
|
||||
- qcom,ipq9574-cmn-pll
|
||||
|
||||
reg:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,51 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,milos-camcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Camera Clock & Reset Controller on Milos
|
||||
|
||||
maintainers:
|
||||
- Luca Weiss <luca.weiss@fairphone.com>
|
||||
|
||||
description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and power
|
||||
domains on Milos.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,milos-camcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,milos-camcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: Sleep clock source
|
||||
- description: Camera AHB clock from GCC
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,milos-gcc.h>
|
||||
clock-controller@adb0000 {
|
||||
compatible = "qcom,milos-camcc";
|
||||
reg = <0x0adb0000 0x40000>;
|
||||
clocks = <&bi_tcxo_div2>,
|
||||
<&sleep_clk>,
|
||||
<&gcc GCC_CAMERA_AHB_CLK>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
...
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,milos-dispcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Display Clock & Reset Controller on Milos
|
||||
|
||||
maintainers:
|
||||
- Luca Weiss <luca.weiss@fairphone.com>
|
||||
|
||||
description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on Milos.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,milos-dispcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,milos-dispcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: Sleep clock source
|
||||
- description: Display's AHB clock
|
||||
- description: GPLL0 source from GCC
|
||||
- description: Byte clock from DSI PHY0
|
||||
- description: Pixel clock from DSI PHY0
|
||||
- description: Link clock from DP PHY0
|
||||
- description: VCO DIV clock from DP PHY0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- '#power-domain-cells'
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,milos-gcc.h>
|
||||
#include <dt-bindings/phy/phy-qcom-qmp.h>
|
||||
clock-controller@af00000 {
|
||||
compatible = "qcom,milos-dispcc";
|
||||
reg = <0x0af00000 0x20000>;
|
||||
clocks = <&bi_tcxo_div2>,
|
||||
<&sleep_clk>,
|
||||
<&gcc GCC_DISP_AHB_CLK>,
|
||||
<&gcc GCC_DISP_GPLL0_DIV_CLK_SRC>,
|
||||
<&mdss_dsi0_phy 0>,
|
||||
<&mdss_dsi0_phy 1>,
|
||||
<&usb_dp_qmpphy QMP_USB43DP_DP_LINK_CLK>,
|
||||
<&usb_dp_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
...
|
||||
62
Documentation/devicetree/bindings/clock/qcom,milos-gcc.yaml
Normal file
62
Documentation/devicetree/bindings/clock/qcom,milos-gcc.yaml
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,milos-gcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Global Clock & Reset Controller on Milos
|
||||
|
||||
maintainers:
|
||||
- Luca Weiss <luca.weiss@fairphone.com>
|
||||
|
||||
description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on Milos.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,milos-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,milos-gcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: Sleep clock source
|
||||
- description: PCIE 0 Pipe clock source
|
||||
- description: PCIE 1 Pipe clock source
|
||||
- description: UFS Phy Rx symbol 0 clock source
|
||||
- description: UFS Phy Rx symbol 1 clock source
|
||||
- description: UFS Phy Tx symbol 0 clock source
|
||||
- description: USB3 Phy wrapper pipe clock source
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- '#power-domain-cells'
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
clock-controller@100000 {
|
||||
compatible = "qcom,milos-gcc";
|
||||
reg = <0x00100000 0x1f4200>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&sleep_clk>,
|
||||
<&pcie0_phy>,
|
||||
<&pcie1_phy>,
|
||||
<&ufs_mem_phy 0>,
|
||||
<&ufs_mem_phy 1>,
|
||||
<&ufs_mem_phy 2>,
|
||||
<&usb_1_qmpphy>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
...
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,milos-videocc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Video Clock & Reset Controller on Milos
|
||||
|
||||
maintainers:
|
||||
- Luca Weiss <luca.weiss@fairphone.com>
|
||||
|
||||
description: |
|
||||
Qualcomm video clock control module provides the clocks, resets and power
|
||||
domains on Milos.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,milos-videocc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,milos-videocc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: Board active XO source
|
||||
- description: Sleep clock source
|
||||
- description: Video AHB clock from GCC
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,milos-gcc.h>
|
||||
clock-controller@aaf0000 {
|
||||
compatible = "qcom,milos-videocc";
|
||||
reg = <0x0aaf0000 0x10000>;
|
||||
clocks = <&bi_tcxo_div2>,
|
||||
<&bi_tcxo_ao_div2>,
|
||||
<&sleep_clk>,
|
||||
<&gcc GCC_VIDEO_AHB_CLK>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
|
||||
...
|
||||
|
|
@ -38,36 +38,16 @@ properties:
|
|||
minItems: 7
|
||||
maxItems: 13
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
'#power-domain-cells':
|
||||
const: 1
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
protected-clocks:
|
||||
description:
|
||||
Protected clock specifier list as per common clock binding
|
||||
|
||||
vdd-gfx-supply:
|
||||
description:
|
||||
Regulator supply for the GPU_GX GDSC
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
- '#power-domain-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
|
@ -351,6 +331,8 @@ allOf:
|
|||
- const: dp_link_2x_clk_divsel_five
|
||||
- const: dp_vco_divided_clk_src_mux
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
# Example for MMCC for MSM8960:
|
||||
- |
|
||||
|
|
|
|||
|
|
@ -0,0 +1,55 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,qcs615-dispcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Display Clock & Reset Controller on QCS615
|
||||
|
||||
maintainers:
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on QCS615.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,qcs615-dispcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,qcs615-dispcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: GPLL0 clock source from GCC
|
||||
- description: Byte clock from DSI PHY0
|
||||
- description: Pixel clock from DSI PHY0
|
||||
- description: Pixel clock from DSI PHY1
|
||||
- description: Display port PLL link clock
|
||||
- description: Display port PLL VCO DIV clock
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/clock/qcom,qcs615-gcc.h>
|
||||
clock-controller@af00000 {
|
||||
compatible = "qcom,qcs615-dispcc";
|
||||
reg = <0x0af00000 0x20000>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_DISP_GPLL0_DIV_CLK_SRC>,
|
||||
<&mdss_dsi0_phy 0>,
|
||||
<&mdss_dsi0_phy 1>,
|
||||
<&mdss_dsi1_phy 0>,
|
||||
<&mdss_dp_phy 0>,
|
||||
<&mdss_dp_vco 0>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
...
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,qcs615-gpucc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Graphics Clock & Reset Controller on QCS615
|
||||
|
||||
maintainers:
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm graphics clock control module provides clocks, resets and power
|
||||
domains on QCS615 Qualcomm SoCs.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,qcs615-gpucc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,qcs615-gpucc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: GPLL0 main branch source
|
||||
- description: GPLL0 GPUCC div branch source
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/clock/qcom,qcs615-gcc.h>
|
||||
|
||||
clock-controller@5090000 {
|
||||
compatible = "qcom,qcs615-gpucc";
|
||||
reg = <0x5090000 0x9000>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GPLL0>,
|
||||
<&gcc GCC_GPU_GPLL0_DIV_CLK_SRC>;
|
||||
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
...
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,qcs615-videocc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Video Clock & Reset Controller on QCS615
|
||||
|
||||
maintainers:
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm video clock control module provides clocks, resets and power
|
||||
domains on QCS615 Qualcomm SoCs.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,qcs615-videocc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,qcs615-videocc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: Sleep clock source
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/clock/qcom,qcs615-gcc.h>
|
||||
|
||||
clock-controller@ab00000 {
|
||||
compatible = "qcom,qcs615-videocc";
|
||||
reg = <0xab00000 0x10000>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&sleep_clk>;
|
||||
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
...
|
||||
|
|
@ -17,6 +17,7 @@ description: |
|
|||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,milos-rpmh-clk
|
||||
- qcom,qcs615-rpmh-clk
|
||||
- qcom,qdu1000-rpmh-clk
|
||||
- qcom,sa8775p-rpmh-clk
|
||||
|
|
|
|||
|
|
@ -17,12 +17,14 @@ description: |
|
|||
See also:
|
||||
include/dt-bindings/clock/qcom,qcs8300-camcc.h
|
||||
include/dt-bindings/clock/qcom,sa8775p-camcc.h
|
||||
include/dt-bindings/clock/qcom,sc8280xp-camcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,qcs8300-camcc
|
||||
- qcom,sa8775p-camcc
|
||||
- qcom,sc8280xp-camcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
|
|
@ -35,6 +37,11 @@ properties:
|
|||
maxItems: 1
|
||||
description: MMCX power domain
|
||||
|
||||
required-opps:
|
||||
description:
|
||||
OPP node describing required MMCX performance point.
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
|
|
@ -43,6 +50,14 @@ required:
|
|||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: qcom,sc8280xp-camcc
|
||||
then:
|
||||
required:
|
||||
- required-opps
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,67 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/qcom,sc8180x-camcc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Camera Clock & Reset Controller on SC8180X
|
||||
|
||||
maintainers:
|
||||
- Satya Priya Kakitapalli <quic_skakitap@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and
|
||||
power domains on SC8180X.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,sc8180x-camcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sc8180x-camcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Camera AHB clock from GCC
|
||||
- description: Board XO source
|
||||
- description: Sleep clock source
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
description:
|
||||
A phandle and PM domain specifier for the MMCX power domain.
|
||||
|
||||
required-opps:
|
||||
maxItems: 1
|
||||
description:
|
||||
A phandle to an OPP node describing required MMCX performance point.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- power-domains
|
||||
- required-opps
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,gcc-sc8180x.h>
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/power/qcom-rpmpd.h>
|
||||
clock-controller@ad00000 {
|
||||
compatible = "qcom,sc8180x-camcc";
|
||||
reg = <0x0ad00000 0x20000>;
|
||||
clocks = <&gcc GCC_CAMERA_AHB_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK>,
|
||||
<&sleep_clk>;
|
||||
power-domains = <&rpmhpd SC8180X_MMCX>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
};
|
||||
...
|
||||
|
|
@ -20,32 +20,20 @@ properties:
|
|||
compatible:
|
||||
const: qcom,sm4450-camcc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
- description: Camera AHB clock source from GCC
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
'#power-domain-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
- '#power-domain-cells'
|
||||
|
||||
additionalProperties: false
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
|
|
|||
|
|
@ -20,9 +20,6 @@ properties:
|
|||
compatible:
|
||||
const: qcom,sm4450-dispcc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
|
|
@ -32,24 +29,15 @@ properties:
|
|||
- description: Byte clock from DSI PHY0
|
||||
- description: Pixel clock from DSI PHY0
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
'#power-domain-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
- '#power-domain-cells'
|
||||
|
||||
additionalProperties: false
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
|
|
|||
|
|
@ -8,16 +8,21 @@ title: Qualcomm Camera Clock & Reset Controller on SM6350
|
|||
|
||||
maintainers:
|
||||
- Konrad Dybcio <konradybcio@kernel.org>
|
||||
- Taniya Das <quic_tdas@quicinc.com>
|
||||
|
||||
description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and power
|
||||
domains on SM6350.
|
||||
domains on SM6350 and QCS615 SoC.
|
||||
|
||||
See also: include/dt-bindings/clock/qcom,sm6350-camcc.h
|
||||
See also:
|
||||
include/dt-bindings/clock/qcom,qcs615-camcc.h
|
||||
include/dt-bindings/clock/qcom,sm6350-camcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sm6350-camcc
|
||||
enum:
|
||||
- qcom,qcs615-camcc
|
||||
- qcom,sm6350-camcc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
|
|
|
|||
|
|
@ -19,9 +19,6 @@ properties:
|
|||
compatible:
|
||||
const: qcom,sm8150-camcc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Board XO source
|
||||
|
|
@ -37,26 +34,17 @@ properties:
|
|||
description:
|
||||
A phandle to an OPP node describing required MMCX performance point.
|
||||
|
||||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
'#power-domain-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- power-domains
|
||||
- required-opps
|
||||
- '#clock-cells'
|
||||
- '#reset-cells'
|
||||
- '#power-domain-cells'
|
||||
|
||||
additionalProperties: false
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ description: |
|
|||
domains on SM8450.
|
||||
|
||||
See also:
|
||||
include/dt-bindings/clock/qcom,sc8280xp-camcc.h
|
||||
include/dt-bindings/clock/qcom,sm8450-camcc.h
|
||||
include/dt-bindings/clock/qcom,sm8550-camcc.h
|
||||
include/dt-bindings/clock/qcom,sm8650-camcc.h
|
||||
|
|
@ -23,7 +22,6 @@ description: |
|
|||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sc8280xp-camcc
|
||||
- qcom,sm8450-camcc
|
||||
- qcom,sm8475-camcc
|
||||
- qcom,sm8550-camcc
|
||||
|
|
@ -37,14 +35,18 @@ properties:
|
|||
- description: Sleep clock source
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
description:
|
||||
A phandle and PM domain specifier for the MMCX power domain.
|
||||
Power domains required for the clock controller to operate
|
||||
items:
|
||||
- description: MMCX power domain
|
||||
- description: MXC power domain
|
||||
|
||||
required-opps:
|
||||
maxItems: 1
|
||||
description:
|
||||
A phandle to an OPP node describing required MMCX performance point.
|
||||
OPP nodes that describe required performance points on power domains
|
||||
items:
|
||||
- description: MMCX performance point
|
||||
- description: MXC performance point
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
|
@ -82,8 +84,10 @@ examples:
|
|||
<&rpmhcc RPMH_CXO_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK_A>,
|
||||
<&sleep_clk>;
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>,
|
||||
<&rpmhpd RPMHPD_MXC>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>,
|
||||
<&rpmhpd_opp_low_svs>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ description: |
|
|||
domains on Qualcomm SoCs.
|
||||
|
||||
See also::
|
||||
include/dt-bindings/clock/qcom,milos-gpucc.h
|
||||
include/dt-bindings/clock/qcom,sar2130p-gpucc.h
|
||||
include/dt-bindings/clock/qcom,sm4450-gpucc.h
|
||||
include/dt-bindings/clock/qcom,sm8450-gpucc.h
|
||||
|
|
@ -25,6 +26,7 @@ description: |
|
|||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,milos-gpucc
|
||||
- qcom,sar2130p-gpucc
|
||||
- qcom,sm4450-gpucc
|
||||
- qcom,sm8450-gpucc
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ properties:
|
|||
- qcom,sm8475-videocc
|
||||
- qcom,sm8550-videocc
|
||||
- qcom,sm8650-videocc
|
||||
- qcom,x1e80100-videocc
|
||||
|
||||
clocks:
|
||||
items:
|
||||
|
|
@ -32,14 +33,18 @@ properties:
|
|||
- description: Video AHB clock from GCC
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
description:
|
||||
MMCX power domain.
|
||||
Power domains required for the clock controller to operate
|
||||
items:
|
||||
- description: MMCX power domain
|
||||
- description: MXC power domain
|
||||
|
||||
required-opps:
|
||||
maxItems: 1
|
||||
description:
|
||||
A phandle to an OPP node describing required MMCX performance point.
|
||||
OPP nodes that describe required performance points on power domains
|
||||
items:
|
||||
- description: MMCX performance point
|
||||
- description: MXC performance point
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
|
@ -72,8 +77,10 @@ examples:
|
|||
reg = <0x0aaf0000 0x10000>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_VIDEO_AHB_CLK>;
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>,
|
||||
<&rpmhpd RPMHPD_MXC>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>,
|
||||
<&rpmhpd_opp_low_svs>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#power-domain-cells = <1>;
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ properties:
|
|||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,milos-tcsr
|
||||
- qcom,sar2130p-tcsr
|
||||
- qcom,sm8550-tcsr
|
||||
- qcom,sm8650-tcsr
|
||||
|
|
|
|||
|
|
@ -17955,9 +17955,9 @@ L: linux-clk@vger.kernel.org
|
|||
L: imx@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux.git clk/imx
|
||||
F: Documentation/devicetree/bindings/clock/imx*
|
||||
F: Documentation/devicetree/bindings/clock/*imx*
|
||||
F: drivers/clk/imx/
|
||||
F: include/dt-bindings/clock/imx*
|
||||
F: include/dt-bindings/clock/*imx*
|
||||
|
||||
NXP PF8100/PF8121A/PF8200 PMIC REGULATOR DEVICE DRIVER
|
||||
M: Jagan Teki <jagan@amarulasolutions.com>
|
||||
|
|
|
|||
|
|
@ -61,44 +61,44 @@ static const struct clk_master_layout sam9x7_master_layout = {
|
|||
|
||||
/* Fractional PLL core output range. */
|
||||
static const struct clk_range plla_core_outputs[] = {
|
||||
{ .min = 375000000, .max = 1600000000 },
|
||||
{ .min = 800000000, .max = 1600000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range upll_core_outputs[] = {
|
||||
{ .min = 600000000, .max = 1200000000 },
|
||||
{ .min = 600000000, .max = 960000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range lvdspll_core_outputs[] = {
|
||||
{ .min = 400000000, .max = 800000000 },
|
||||
{ .min = 600000000, .max = 1200000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range audiopll_core_outputs[] = {
|
||||
{ .min = 400000000, .max = 800000000 },
|
||||
{ .min = 600000000, .max = 1200000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range plladiv2_core_outputs[] = {
|
||||
{ .min = 375000000, .max = 1600000000 },
|
||||
{ .min = 800000000, .max = 1600000000 },
|
||||
};
|
||||
|
||||
/* Fractional PLL output range. */
|
||||
static const struct clk_range plla_outputs[] = {
|
||||
{ .min = 732421, .max = 800000000 },
|
||||
{ .min = 400000000, .max = 800000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range upll_outputs[] = {
|
||||
{ .min = 300000000, .max = 600000000 },
|
||||
{ .min = 300000000, .max = 480000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range lvdspll_outputs[] = {
|
||||
{ .min = 10000000, .max = 800000000 },
|
||||
{ .min = 175000000, .max = 550000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range audiopll_outputs[] = {
|
||||
{ .min = 10000000, .max = 800000000 },
|
||||
{ .min = 0, .max = 300000000 },
|
||||
};
|
||||
|
||||
static const struct clk_range plladiv2_outputs[] = {
|
||||
{ .min = 366210, .max = 400000000 },
|
||||
{ .min = 200000000, .max = 400000000 },
|
||||
};
|
||||
|
||||
/* PLL characteristics. */
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright 2024 NXP
|
||||
* Copyright 2024-2025 NXP
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/nxp,imx94-clock.h>
|
||||
#include <dt-bindings/clock/nxp,imx95-clock.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
|
|
@ -156,7 +157,7 @@ static const struct imx95_blk_ctl_dev_data camblk_dev_data = {
|
|||
.clk_reg_offset = 0,
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_clk_dev_data lvds_clk_dev_data[] = {
|
||||
static const struct imx95_blk_ctl_clk_dev_data imx95_lvds_clk_dev_data[] = {
|
||||
[IMX95_CLK_DISPMIX_LVDS_PHY_DIV] = {
|
||||
.name = "ldb_phy_div",
|
||||
.parent_names = (const char *[]){ "ldbpll", },
|
||||
|
|
@ -213,17 +214,21 @@ static const struct imx95_blk_ctl_clk_dev_data lvds_clk_dev_data[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_dev_data lvds_csr_dev_data = {
|
||||
.num_clks = ARRAY_SIZE(lvds_clk_dev_data),
|
||||
.clk_dev_data = lvds_clk_dev_data,
|
||||
static const struct imx95_blk_ctl_dev_data imx95_lvds_csr_dev_data = {
|
||||
.num_clks = ARRAY_SIZE(imx95_lvds_clk_dev_data),
|
||||
.clk_dev_data = imx95_lvds_clk_dev_data,
|
||||
.clk_reg_offset = 0,
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
|
||||
static const char * const imx95_disp_engine_parents[] = {
|
||||
"videopll1", "dsi_pll", "ldb_pll_div7"
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_clk_dev_data imx95_dispmix_csr_clk_dev_data[] = {
|
||||
[IMX95_CLK_DISPMIX_ENG0_SEL] = {
|
||||
.name = "disp_engine0_sel",
|
||||
.parent_names = (const char *[]){"videopll1", "dsi_pll", "ldb_pll_div7", },
|
||||
.num_parents = 4,
|
||||
.parent_names = imx95_disp_engine_parents,
|
||||
.num_parents = ARRAY_SIZE(imx95_disp_engine_parents),
|
||||
.reg = 0,
|
||||
.bit_idx = 0,
|
||||
.bit_width = 2,
|
||||
|
|
@ -232,8 +237,8 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
|
|||
},
|
||||
[IMX95_CLK_DISPMIX_ENG1_SEL] = {
|
||||
.name = "disp_engine1_sel",
|
||||
.parent_names = (const char *[]){"videopll1", "dsi_pll", "ldb_pll_div7", },
|
||||
.num_parents = 4,
|
||||
.parent_names = imx95_disp_engine_parents,
|
||||
.num_parents = ARRAY_SIZE(imx95_disp_engine_parents),
|
||||
.reg = 0,
|
||||
.bit_idx = 2,
|
||||
.bit_width = 2,
|
||||
|
|
@ -242,9 +247,9 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
|
|||
}
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_dev_data dispmix_csr_dev_data = {
|
||||
.num_clks = ARRAY_SIZE(dispmix_csr_clk_dev_data),
|
||||
.clk_dev_data = dispmix_csr_clk_dev_data,
|
||||
static const struct imx95_blk_ctl_dev_data imx95_dispmix_csr_dev_data = {
|
||||
.num_clks = ARRAY_SIZE(imx95_dispmix_csr_clk_dev_data),
|
||||
.clk_dev_data = imx95_dispmix_csr_clk_dev_data,
|
||||
.clk_reg_offset = 0,
|
||||
};
|
||||
|
||||
|
|
@ -296,6 +301,51 @@ static const struct imx95_blk_ctl_dev_data hsio_blk_ctl_dev_data = {
|
|||
.clk_reg_offset = 0,
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_clk_dev_data imx94_lvds_clk_dev_data[] = {
|
||||
[IMX94_CLK_DISPMIX_LVDS_CLK_GATE] = {
|
||||
.name = "lvds_clk_gate",
|
||||
.parent_names = (const char *[]){ "ldbpll", },
|
||||
.num_parents = 1,
|
||||
.reg = 0,
|
||||
.bit_idx = 1,
|
||||
.bit_width = 1,
|
||||
.type = CLK_GATE,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags2 = CLK_GATE_SET_TO_DISABLE,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_dev_data imx94_lvds_csr_dev_data = {
|
||||
.num_clks = ARRAY_SIZE(imx94_lvds_clk_dev_data),
|
||||
.clk_dev_data = imx94_lvds_clk_dev_data,
|
||||
.clk_reg_offset = 0,
|
||||
.rpm_enabled = true,
|
||||
};
|
||||
|
||||
static const char * const imx94_disp_engine_parents[] = {
|
||||
"disppix", "ldb_pll_div7"
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_clk_dev_data imx94_dispmix_csr_clk_dev_data[] = {
|
||||
[IMX94_CLK_DISPMIX_CLK_SEL] = {
|
||||
.name = "disp_clk_sel",
|
||||
.parent_names = imx94_disp_engine_parents,
|
||||
.num_parents = ARRAY_SIZE(imx94_disp_engine_parents),
|
||||
.reg = 0,
|
||||
.bit_idx = 1,
|
||||
.bit_width = 1,
|
||||
.type = CLK_MUX,
|
||||
.flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_dev_data imx94_dispmix_csr_dev_data = {
|
||||
.num_clks = ARRAY_SIZE(imx94_dispmix_csr_clk_dev_data),
|
||||
.clk_dev_data = imx94_dispmix_csr_clk_dev_data,
|
||||
.clk_reg_offset = 0,
|
||||
.rpm_enabled = true,
|
||||
};
|
||||
|
||||
static int imx95_bc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
|
|
@ -338,8 +388,10 @@ static int imx95_bc_probe(struct platform_device *pdev)
|
|||
if (!clk_hw_data)
|
||||
return -ENOMEM;
|
||||
|
||||
if (bc_data->rpm_enabled)
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
if (bc_data->rpm_enabled) {
|
||||
devm_pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_resume_and_get(&pdev->dev);
|
||||
}
|
||||
|
||||
clk_hw_data->num = bc_data->num_clks;
|
||||
hws = clk_hw_data->hws;
|
||||
|
|
@ -379,8 +431,10 @@ static int imx95_bc_probe(struct platform_device *pdev)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
if (pm_runtime_enabled(bc->dev))
|
||||
if (pm_runtime_enabled(bc->dev)) {
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
clk_disable_unprepare(bc->clk_apb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -391,9 +445,6 @@ cleanup:
|
|||
clk_hw_unregister(hws[i]);
|
||||
}
|
||||
|
||||
if (bc_data->rpm_enabled)
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -462,10 +513,12 @@ static const struct dev_pm_ops imx95_bc_pm_ops = {
|
|||
};
|
||||
|
||||
static const struct of_device_id imx95_bc_of_match[] = {
|
||||
{ .compatible = "nxp,imx94-display-csr", .data = &imx94_dispmix_csr_dev_data },
|
||||
{ .compatible = "nxp,imx94-lvds-csr", .data = &imx94_lvds_csr_dev_data },
|
||||
{ .compatible = "nxp,imx95-camera-csr", .data = &camblk_dev_data },
|
||||
{ .compatible = "nxp,imx95-display-master-csr", },
|
||||
{ .compatible = "nxp,imx95-lvds-csr", .data = &lvds_csr_dev_data },
|
||||
{ .compatible = "nxp,imx95-display-csr", .data = &dispmix_csr_dev_data },
|
||||
{ .compatible = "nxp,imx95-display-csr", .data = &imx95_dispmix_csr_dev_data },
|
||||
{ .compatible = "nxp,imx95-lvds-csr", .data = &imx95_lvds_csr_dev_data },
|
||||
{ .compatible = "nxp,imx95-hsio-blk-ctl", .data = &hsio_blk_ctl_dev_data },
|
||||
{ .compatible = "nxp,imx95-vpu-csr", .data = &vpublk_dev_data },
|
||||
{ .compatible = "nxp,imx95-netcmix-blk-ctrl", .data = &netcmix_dev_data},
|
||||
|
|
|
|||
|
|
@ -493,6 +493,25 @@ config QCM_DISPCC_2290
|
|||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config QCS_DISPCC_615
|
||||
tristate "QCS615 Display Clock Controller"
|
||||
select QCM_GCC_615
|
||||
help
|
||||
Support for the display clock controller on Qualcomm Technologies, Inc
|
||||
QCS615 devices.
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config QCS_CAMCC_615
|
||||
tristate "QCS615 Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QCS_GCC_615
|
||||
help
|
||||
Support for the camera clock controller on Qualcomm Technologies, Inc
|
||||
QCS615 devices.
|
||||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config QCS_GCC_404
|
||||
tristate "QCS404 Global Clock Controller"
|
||||
help
|
||||
|
|
@ -529,6 +548,22 @@ config QCS_GCC_615
|
|||
Say Y if you want to use multimedia devices or peripheral
|
||||
devices such as UART, SPI, I2C, USB, SD/eMMC, PCIe etc.
|
||||
|
||||
config QCS_GPUCC_615
|
||||
tristate "QCS615 Graphics clock controller"
|
||||
select QCS_GCC_615
|
||||
help
|
||||
Support for the graphics clock controller on QCS615 devices.
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config QCS_VIDEOCC_615
|
||||
tristate "QCS615 Video Clock Controller"
|
||||
select QCS_GCC_615
|
||||
help
|
||||
Support for the video clock controller on QCS615 devices.
|
||||
Say Y if you want to support video devices and functionality such as
|
||||
video encode and decode.
|
||||
|
||||
config SC_CAMCC_7180
|
||||
tristate "SC7180 Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -549,6 +584,16 @@ config SC_CAMCC_7280
|
|||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config SC_CAMCC_8180X
|
||||
tristate "SC8180X Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select SC_GCC_8180X
|
||||
help
|
||||
Support for the camera clock controller on Qualcomm Technologies, Inc
|
||||
SC8180X devices.
|
||||
Say Y if you want to support camera devices and functionality such as
|
||||
capturing pictures.
|
||||
|
||||
config SC_CAMCC_8280XP
|
||||
tristate "SC8280XP Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -924,6 +969,14 @@ config SM_CAMCC_7150
|
|||
Support for the camera clock controller on SM7150 devices.
|
||||
Say Y if you want to support camera devices and camera functionality.
|
||||
|
||||
config SM_CAMCC_MILOS
|
||||
tristate "Milos Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select SM_GCC_MILOS
|
||||
help
|
||||
Support for the camera clock controller on Milos devices.
|
||||
Say Y if you want to support camera devices and camera functionality.
|
||||
|
||||
config SM_CAMCC_8150
|
||||
tristate "SM8150 Camera Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -1036,6 +1089,16 @@ config SM_DISPCC_6375
|
|||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config SM_DISPCC_MILOS
|
||||
tristate "Milos Display Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
depends on SM_GCC_MILOS
|
||||
help
|
||||
Support for the display clock controller on Qualcomm Technologies, Inc
|
||||
Milos devices.
|
||||
Say Y if you want to support display devices and functionality such as
|
||||
splash screen.
|
||||
|
||||
config SM_DISPCC_8450
|
||||
tristate "SM8450 Display Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -1121,6 +1184,15 @@ config SM_GCC_7150
|
|||
Say Y if you want to use peripheral devices such as UART,
|
||||
SPI, I2C, USB, SD/UFS, PCIe etc.
|
||||
|
||||
config SM_GCC_MILOS
|
||||
tristate "Milos Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the global clock controller on Milos devices.
|
||||
Say Y if you want to use peripheral devices such as UART,
|
||||
SPI, I2C, USB, SD/UFS, PCIe etc.
|
||||
|
||||
config SM_GCC_8150
|
||||
tristate "SM8150 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -1230,6 +1302,15 @@ config SM_GPUCC_6350
|
|||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config SM_GPUCC_MILOS
|
||||
tristate "Milos Graphics Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select SM_GCC_MILOS
|
||||
help
|
||||
Support for the graphics clock controller on Milos devices.
|
||||
Say Y if you want to support graphics controller devices and
|
||||
functionality such as 3D graphics.
|
||||
|
||||
config SM_GPUCC_8150
|
||||
tristate "SM8150 Graphics Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -1329,6 +1410,15 @@ config SA_VIDEOCC_8775P
|
|||
Say Y if you want to support video devices and functionality such as
|
||||
video encode/decode.
|
||||
|
||||
config SM_VIDEOCC_6350
|
||||
tristate "SM6350 Video Clock Controller"
|
||||
select SM_GCC_6350
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the video clock controller on SM6350 devices.
|
||||
Say Y if you want to support video devices and functionality such as
|
||||
video encode and decode.
|
||||
|
||||
config SM_VIDEOCC_7150
|
||||
tristate "SM7150 Video Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -1339,6 +1429,17 @@ config SM_VIDEOCC_7150
|
|||
Say Y if you want to support video devices and functionality such as
|
||||
video encode and decode.
|
||||
|
||||
config SM_VIDEOCC_MILOS
|
||||
tristate "Milos Video Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select SM_GCC_MILOS
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the video clock controller on Qualcomm Technologies, Inc.
|
||||
Milos devices.
|
||||
Say Y if you want to support video devices and functionality such as
|
||||
video encode/decode.
|
||||
|
||||
config SM_VIDEOCC_8150
|
||||
tristate "SM8150 Video Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
|
|
@ -1372,11 +1473,10 @@ config SM_VIDEOCC_8350
|
|||
config SM_VIDEOCC_8550
|
||||
tristate "SM8550 Video Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
depends on SM_GCC_8550 || SM_GCC_8650
|
||||
select QCOM_GDSC
|
||||
help
|
||||
Support for the video clock controller on Qualcomm Technologies, Inc.
|
||||
SM8550 or SM8650 devices.
|
||||
SM8550 or SM8650 or X1E80100 devices.
|
||||
Say Y if you want to support video devices and functionality such as
|
||||
video encode/decode.
|
||||
|
||||
|
|
|
|||
|
|
@ -73,15 +73,20 @@ obj-$(CONFIG_QCOM_CLK_RPMH) += clk-rpmh.o
|
|||
obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o
|
||||
obj-$(CONFIG_QCM_GCC_2290) += gcc-qcm2290.o
|
||||
obj-$(CONFIG_QCM_DISPCC_2290) += dispcc-qcm2290.o
|
||||
obj-$(CONFIG_QCS_DISPCC_615) += dispcc-qcs615.o
|
||||
obj-$(CONFIG_QCS_CAMCC_615) += camcc-qcs615.o
|
||||
obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o
|
||||
obj-$(CONFIG_QCS_GCC_615) += gcc-qcs615.o
|
||||
obj-$(CONFIG_QCS_GCC_8300) += gcc-qcs8300.o
|
||||
obj-$(CONFIG_QCS_GPUCC_615) += gpucc-qcs615.o
|
||||
obj-$(CONFIG_QCS_VIDEOCC_615) += videocc-qcs615.o
|
||||
obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o
|
||||
obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
|
||||
obj-$(CONFIG_QDU_ECPRICC_1000) += ecpricc-qdu1000.o
|
||||
obj-$(CONFIG_QDU_GCC_1000) += gcc-qdu1000.o
|
||||
obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o
|
||||
obj-$(CONFIG_SC_CAMCC_7280) += camcc-sc7280.o
|
||||
obj-$(CONFIG_SC_CAMCC_8180X) += camcc-sc8180x.o
|
||||
obj-$(CONFIG_SC_CAMCC_8280XP) += camcc-sc8280xp.o
|
||||
obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
|
||||
obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o
|
||||
|
|
@ -126,6 +131,7 @@ obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o
|
|||
obj-$(CONFIG_SM_CAMCC_8450) += camcc-sm8450.o
|
||||
obj-$(CONFIG_SM_CAMCC_8550) += camcc-sm8550.o
|
||||
obj-$(CONFIG_SM_CAMCC_8650) += camcc-sm8650.o
|
||||
obj-$(CONFIG_SM_CAMCC_MILOS) += camcc-milos.o
|
||||
obj-$(CONFIG_SM_DISPCC_4450) += dispcc-sm4450.o
|
||||
obj-$(CONFIG_SM_DISPCC_6115) += dispcc-sm6115.o
|
||||
obj-$(CONFIG_SM_DISPCC_6125) += dispcc-sm6125.o
|
||||
|
|
@ -136,6 +142,7 @@ obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
|
|||
obj-$(CONFIG_SM_DISPCC_8450) += dispcc-sm8450.o
|
||||
obj-$(CONFIG_SM_DISPCC_8550) += dispcc-sm8550.o
|
||||
obj-$(CONFIG_SM_DISPCC_8750) += dispcc-sm8750.o
|
||||
obj-$(CONFIG_SM_DISPCC_MILOS) += dispcc-milos.o
|
||||
obj-$(CONFIG_SM_GCC_4450) += gcc-sm4450.o
|
||||
obj-$(CONFIG_SM_GCC_6115) += gcc-sm6115.o
|
||||
obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o
|
||||
|
|
@ -149,6 +156,7 @@ obj-$(CONFIG_SM_GCC_8450) += gcc-sm8450.o
|
|||
obj-$(CONFIG_SM_GCC_8550) += gcc-sm8550.o
|
||||
obj-$(CONFIG_SM_GCC_8650) += gcc-sm8650.o
|
||||
obj-$(CONFIG_SM_GCC_8750) += gcc-sm8750.o
|
||||
obj-$(CONFIG_SM_GCC_MILOS) += gcc-milos.o
|
||||
obj-$(CONFIG_SM_GPUCC_4450) += gpucc-sm4450.o
|
||||
obj-$(CONFIG_SM_GPUCC_6115) += gpucc-sm6115.o
|
||||
obj-$(CONFIG_SM_GPUCC_6125) += gpucc-sm6125.o
|
||||
|
|
@ -160,16 +168,19 @@ obj-$(CONFIG_SM_GPUCC_8350) += gpucc-sm8350.o
|
|||
obj-$(CONFIG_SM_GPUCC_8450) += gpucc-sm8450.o
|
||||
obj-$(CONFIG_SM_GPUCC_8550) += gpucc-sm8550.o
|
||||
obj-$(CONFIG_SM_GPUCC_8650) += gpucc-sm8650.o
|
||||
obj-$(CONFIG_SM_GPUCC_MILOS) += gpucc-milos.o
|
||||
obj-$(CONFIG_SM_LPASSCC_6115) += lpasscc-sm6115.o
|
||||
obj-$(CONFIG_SM_TCSRCC_8550) += tcsrcc-sm8550.o
|
||||
obj-$(CONFIG_SM_TCSRCC_8650) += tcsrcc-sm8650.o
|
||||
obj-$(CONFIG_SM_TCSRCC_8750) += tcsrcc-sm8750.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_6350) += videocc-sm6350.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_7150) += videocc-sm7150.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8250) += videocc-sm8250.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8350) += videocc-sm8350.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8450) += videocc-sm8450.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_8550) += videocc-sm8550.o
|
||||
obj-$(CONFIG_SM_VIDEOCC_MILOS) += videocc-milos.o
|
||||
obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o
|
||||
obj-$(CONFIG_KPSS_XCC) += kpss-xcc.o
|
||||
obj-$(CONFIG_QCOM_HFPLL) += hfpll.o
|
||||
|
|
|
|||
2161
drivers/clk/qcom/camcc-milos.c
Normal file
2161
drivers/clk/qcom/camcc-milos.c
Normal file
File diff suppressed because it is too large
Load diff
1597
drivers/clk/qcom/camcc-qcs615.c
Normal file
1597
drivers/clk/qcom/camcc-qcs615.c
Normal file
File diff suppressed because it is too large
Load diff
2889
drivers/clk/qcom/camcc-sc8180x.c
Normal file
2889
drivers/clk/qcom/camcc-sc8180x.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -86,6 +86,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll0_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &cam_cc_pll0_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -191,6 +192,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll1_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.config = &cam_cc_pll1_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -257,6 +259,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll2_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll2 = {
|
||||
.offset = 0x2000,
|
||||
.config = &cam_cc_pll2_config,
|
||||
.vco_table = rivian_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(rivian_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
|
||||
|
|
@ -296,6 +299,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll3_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll3 = {
|
||||
.offset = 0x3000,
|
||||
.config = &cam_cc_pll3_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -368,6 +372,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll4_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll4 = {
|
||||
.offset = 0x4000,
|
||||
.config = &cam_cc_pll4_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -440,6 +445,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll5_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll5 = {
|
||||
.offset = 0x5000,
|
||||
.config = &cam_cc_pll5_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -512,6 +518,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll6_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll6 = {
|
||||
.offset = 0x6000,
|
||||
.config = &cam_cc_pll6_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -584,6 +591,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll7_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll7 = {
|
||||
.offset = 0x7000,
|
||||
.config = &cam_cc_pll7_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -656,6 +664,7 @@ static const struct alpha_pll_config sm8475_cam_cc_pll8_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll8 = {
|
||||
.offset = 0x8000,
|
||||
.config = &cam_cc_pll8_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -1476,24 +1485,6 @@ static struct clk_rcg2 cam_cc_xo_clk_src = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct clk_branch cam_cc_gdsc_clk = {
|
||||
.halt_reg = 0x1320c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1320c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "cam_cc_gdsc_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&cam_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch cam_cc_bps_ahb_clk = {
|
||||
.halt_reg = 0x1004c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
|
|
@ -2819,7 +2810,6 @@ static struct clk_regmap *cam_cc_sm8450_clocks[] = {
|
|||
[CAM_CC_CSIPHY4_CLK] = &cam_cc_csiphy4_clk.clkr,
|
||||
[CAM_CC_CSIPHY5_CLK] = &cam_cc_csiphy5_clk.clkr,
|
||||
[CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
|
||||
[CAM_CC_GDSC_CLK] = &cam_cc_gdsc_clk.clkr,
|
||||
[CAM_CC_ICP_AHB_CLK] = &cam_cc_icp_ahb_clk.clkr,
|
||||
[CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
|
||||
[CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
|
||||
|
|
@ -2913,6 +2903,22 @@ static const struct qcom_reset_map cam_cc_sm8450_resets[] = {
|
|||
[CAM_CC_SFE_1_BCR] = { 0x13094 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *cam_cc_sm8450_plls[] = {
|
||||
&cam_cc_pll0,
|
||||
&cam_cc_pll1,
|
||||
&cam_cc_pll2,
|
||||
&cam_cc_pll3,
|
||||
&cam_cc_pll4,
|
||||
&cam_cc_pll5,
|
||||
&cam_cc_pll6,
|
||||
&cam_cc_pll7,
|
||||
&cam_cc_pll8,
|
||||
};
|
||||
|
||||
static u32 cam_cc_sm8450_critical_cbcrs[] = {
|
||||
0x1320c, /* CAM_CC_GDSC_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config cam_cc_sm8450_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
|
|
@ -3021,6 +3027,13 @@ static struct gdsc *cam_cc_sm8450_gdscs[] = {
|
|||
[TITAN_TOP_GDSC] = &titan_top_gdsc,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data cam_cc_sm8450_driver_data = {
|
||||
.alpha_plls = cam_cc_sm8450_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(cam_cc_sm8450_plls),
|
||||
.clk_cbcrs = cam_cc_sm8450_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(cam_cc_sm8450_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc cam_cc_sm8450_desc = {
|
||||
.config = &cam_cc_sm8450_regmap_config,
|
||||
.clks = cam_cc_sm8450_clocks,
|
||||
|
|
@ -3029,6 +3042,8 @@ static const struct qcom_cc_desc cam_cc_sm8450_desc = {
|
|||
.num_resets = ARRAY_SIZE(cam_cc_sm8450_resets),
|
||||
.gdscs = cam_cc_sm8450_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(cam_cc_sm8450_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &cam_cc_sm8450_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id cam_cc_sm8450_match_table[] = {
|
||||
|
|
@ -3040,12 +3055,6 @@ MODULE_DEVICE_TABLE(of, cam_cc_sm8450_match_table);
|
|||
|
||||
static int cam_cc_sm8450_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &cam_cc_sm8450_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
if (of_device_is_compatible(pdev->dev.of_node, "qcom,sm8475-camcc")) {
|
||||
/* Update CAMCC PLL0 */
|
||||
cam_cc_pll0.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE];
|
||||
|
|
@ -3092,28 +3101,18 @@ static int cam_cc_sm8450_probe(struct platform_device *pdev)
|
|||
cam_cc_pll8_out_even.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE];
|
||||
cam_cc_pll8_out_even.clkr.hw.init = &sm8475_cam_cc_pll8_out_even_init;
|
||||
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll0, regmap, &sm8475_cam_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll1, regmap, &sm8475_cam_cc_pll1_config);
|
||||
clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &sm8475_cam_cc_pll2_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll3, regmap, &sm8475_cam_cc_pll3_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll4, regmap, &sm8475_cam_cc_pll4_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll5, regmap, &sm8475_cam_cc_pll5_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll6, regmap, &sm8475_cam_cc_pll6_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll7, regmap, &sm8475_cam_cc_pll7_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll8, regmap, &sm8475_cam_cc_pll8_config);
|
||||
} else {
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
|
||||
clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll6, regmap, &cam_cc_pll6_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll7, regmap, &cam_cc_pll7_config);
|
||||
clk_lucid_evo_pll_configure(&cam_cc_pll8, regmap, &cam_cc_pll8_config);
|
||||
cam_cc_pll0.config = &sm8475_cam_cc_pll0_config;
|
||||
cam_cc_pll1.config = &sm8475_cam_cc_pll1_config;
|
||||
cam_cc_pll2.config = &sm8475_cam_cc_pll2_config;
|
||||
cam_cc_pll3.config = &sm8475_cam_cc_pll3_config;
|
||||
cam_cc_pll4.config = &sm8475_cam_cc_pll4_config;
|
||||
cam_cc_pll5.config = &sm8475_cam_cc_pll5_config;
|
||||
cam_cc_pll6.config = &sm8475_cam_cc_pll6_config;
|
||||
cam_cc_pll7.config = &sm8475_cam_cc_pll7_config;
|
||||
cam_cc_pll8.config = &sm8475_cam_cc_pll8_config;
|
||||
}
|
||||
|
||||
return qcom_cc_really_probe(&pdev->dev, &cam_cc_sm8450_desc, regmap);
|
||||
return qcom_cc_probe(pdev, &cam_cc_sm8450_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver cam_cc_sm8450_driver = {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm8550-camcc.h>
|
||||
|
|
@ -74,6 +73,7 @@ static const struct alpha_pll_config cam_cc_pll0_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &cam_cc_pll0_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -151,6 +151,7 @@ static const struct alpha_pll_config cam_cc_pll1_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.config = &cam_cc_pll1_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -201,6 +202,7 @@ static const struct alpha_pll_config cam_cc_pll2_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll2 = {
|
||||
.offset = 0x2000,
|
||||
.config = &cam_cc_pll2_config,
|
||||
.vco_table = rivian_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(rivian_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
|
||||
|
|
@ -232,6 +234,7 @@ static const struct alpha_pll_config cam_cc_pll3_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll3 = {
|
||||
.offset = 0x3000,
|
||||
.config = &cam_cc_pll3_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -286,6 +289,7 @@ static const struct alpha_pll_config cam_cc_pll4_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll4 = {
|
||||
.offset = 0x4000,
|
||||
.config = &cam_cc_pll4_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -340,6 +344,7 @@ static const struct alpha_pll_config cam_cc_pll5_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll5 = {
|
||||
.offset = 0x5000,
|
||||
.config = &cam_cc_pll5_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -394,6 +399,7 @@ static const struct alpha_pll_config cam_cc_pll6_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll6 = {
|
||||
.offset = 0x6000,
|
||||
.config = &cam_cc_pll6_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -448,6 +454,7 @@ static const struct alpha_pll_config cam_cc_pll7_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll7 = {
|
||||
.offset = 0x7000,
|
||||
.config = &cam_cc_pll7_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -502,6 +509,7 @@ static const struct alpha_pll_config cam_cc_pll8_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll8 = {
|
||||
.offset = 0x8000,
|
||||
.config = &cam_cc_pll8_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -556,6 +564,7 @@ static const struct alpha_pll_config cam_cc_pll9_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll9 = {
|
||||
.offset = 0x9000,
|
||||
.config = &cam_cc_pll9_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -610,6 +619,7 @@ static const struct alpha_pll_config cam_cc_pll10_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll10 = {
|
||||
.offset = 0xa000,
|
||||
.config = &cam_cc_pll10_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -664,6 +674,7 @@ static const struct alpha_pll_config cam_cc_pll11_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll11 = {
|
||||
.offset = 0xb000,
|
||||
.config = &cam_cc_pll11_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -718,6 +729,7 @@ static const struct alpha_pll_config cam_cc_pll12_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll12 = {
|
||||
.offset = 0xc000,
|
||||
.config = &cam_cc_pll12_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -3479,6 +3491,27 @@ static const struct qcom_reset_map cam_cc_sm8550_resets[] = {
|
|||
[CAM_CC_SFE_1_BCR] = { 0x133dc },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *cam_cc_sm8550_plls[] = {
|
||||
&cam_cc_pll0,
|
||||
&cam_cc_pll1,
|
||||
&cam_cc_pll2,
|
||||
&cam_cc_pll3,
|
||||
&cam_cc_pll4,
|
||||
&cam_cc_pll5,
|
||||
&cam_cc_pll6,
|
||||
&cam_cc_pll7,
|
||||
&cam_cc_pll8,
|
||||
&cam_cc_pll9,
|
||||
&cam_cc_pll10,
|
||||
&cam_cc_pll11,
|
||||
&cam_cc_pll12,
|
||||
};
|
||||
|
||||
static u32 cam_cc_sm8550_critical_cbcrs[] = {
|
||||
0x1419c, /* CAM_CC_GDSC_CLK */
|
||||
0x142cc, /* CAM_CC_SLEEP_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config cam_cc_sm8550_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
|
|
@ -3487,6 +3520,13 @@ static const struct regmap_config cam_cc_sm8550_regmap_config = {
|
|||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data cam_cc_sm8550_driver_data = {
|
||||
.alpha_plls = cam_cc_sm8550_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(cam_cc_sm8550_plls),
|
||||
.clk_cbcrs = cam_cc_sm8550_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(cam_cc_sm8550_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc cam_cc_sm8550_desc = {
|
||||
.config = &cam_cc_sm8550_regmap_config,
|
||||
.clks = cam_cc_sm8550_clocks,
|
||||
|
|
@ -3495,6 +3535,8 @@ static const struct qcom_cc_desc cam_cc_sm8550_desc = {
|
|||
.num_resets = ARRAY_SIZE(cam_cc_sm8550_resets),
|
||||
.gdscs = cam_cc_sm8550_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(cam_cc_sm8550_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &cam_cc_sm8550_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id cam_cc_sm8550_match_table[] = {
|
||||
|
|
@ -3505,46 +3547,7 @@ MODULE_DEVICE_TABLE(of, cam_cc_sm8550_match_table);
|
|||
|
||||
static int cam_cc_sm8550_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &cam_cc_sm8550_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
pm_runtime_put(&pdev->dev);
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
|
||||
clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll6, regmap, &cam_cc_pll6_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll7, regmap, &cam_cc_pll7_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll8, regmap, &cam_cc_pll8_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll9, regmap, &cam_cc_pll9_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll10, regmap, &cam_cc_pll10_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);
|
||||
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x1419c); /* CAM_CC_GDSC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x142cc); /* CAM_CC_SLEEP_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(&pdev->dev, &cam_cc_sm8550_desc, regmap);
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
return qcom_cc_probe(pdev, &cam_cc_sm8550_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver cam_cc_sm8550_driver = {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm8650-camcc.h>
|
||||
|
|
@ -72,6 +71,7 @@ static const struct alpha_pll_config cam_cc_pll0_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &cam_cc_pll0_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -149,6 +149,7 @@ static const struct alpha_pll_config cam_cc_pll1_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.config = &cam_cc_pll1_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -199,6 +200,7 @@ static const struct alpha_pll_config cam_cc_pll2_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll2 = {
|
||||
.offset = 0x2000,
|
||||
.config = &cam_cc_pll2_config,
|
||||
.vco_table = rivian_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(rivian_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
|
||||
|
|
@ -230,6 +232,7 @@ static const struct alpha_pll_config cam_cc_pll3_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll3 = {
|
||||
.offset = 0x3000,
|
||||
.config = &cam_cc_pll3_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -284,6 +287,7 @@ static const struct alpha_pll_config cam_cc_pll4_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll4 = {
|
||||
.offset = 0x4000,
|
||||
.config = &cam_cc_pll4_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -338,6 +342,7 @@ static const struct alpha_pll_config cam_cc_pll5_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll5 = {
|
||||
.offset = 0x5000,
|
||||
.config = &cam_cc_pll5_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -392,6 +397,7 @@ static const struct alpha_pll_config cam_cc_pll6_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll6 = {
|
||||
.offset = 0x6000,
|
||||
.config = &cam_cc_pll6_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -446,6 +452,7 @@ static const struct alpha_pll_config cam_cc_pll7_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll7 = {
|
||||
.offset = 0x7000,
|
||||
.config = &cam_cc_pll7_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -500,6 +507,7 @@ static const struct alpha_pll_config cam_cc_pll8_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll8 = {
|
||||
.offset = 0x8000,
|
||||
.config = &cam_cc_pll8_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -554,6 +562,7 @@ static const struct alpha_pll_config cam_cc_pll9_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll9 = {
|
||||
.offset = 0x9000,
|
||||
.config = &cam_cc_pll9_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -631,6 +640,7 @@ static const struct alpha_pll_config cam_cc_pll10_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll10 = {
|
||||
.offset = 0xa000,
|
||||
.config = &cam_cc_pll10_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -3509,6 +3519,27 @@ static const struct qcom_reset_map cam_cc_sm8650_resets[] = {
|
|||
[CAM_CC_SFE_2_BCR] = { 0x130f4 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *cam_cc_sm8650_plls[] = {
|
||||
&cam_cc_pll0,
|
||||
&cam_cc_pll1,
|
||||
&cam_cc_pll2,
|
||||
&cam_cc_pll3,
|
||||
&cam_cc_pll4,
|
||||
&cam_cc_pll5,
|
||||
&cam_cc_pll6,
|
||||
&cam_cc_pll7,
|
||||
&cam_cc_pll8,
|
||||
&cam_cc_pll9,
|
||||
&cam_cc_pll10,
|
||||
};
|
||||
|
||||
static u32 cam_cc_sm8650_critical_cbcrs[] = {
|
||||
0x132ec, /* CAM_CC_GDSC_CLK */
|
||||
0x13308, /* CAM_CC_SLEEP_CLK */
|
||||
0x13314, /* CAM_CC_DRV_XO_CLK */
|
||||
0x13318, /* CAM_CC_DRV_AHB_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config cam_cc_sm8650_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
|
|
@ -3517,6 +3548,13 @@ static const struct regmap_config cam_cc_sm8650_regmap_config = {
|
|||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data cam_cc_sm8650_driver_data = {
|
||||
.alpha_plls = cam_cc_sm8650_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(cam_cc_sm8650_plls),
|
||||
.clk_cbcrs = cam_cc_sm8650_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(cam_cc_sm8650_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc cam_cc_sm8650_desc = {
|
||||
.config = &cam_cc_sm8650_regmap_config,
|
||||
.clks = cam_cc_sm8650_clocks,
|
||||
|
|
@ -3525,6 +3563,8 @@ static const struct qcom_cc_desc cam_cc_sm8650_desc = {
|
|||
.num_resets = ARRAY_SIZE(cam_cc_sm8650_resets),
|
||||
.gdscs = cam_cc_sm8650_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(cam_cc_sm8650_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &cam_cc_sm8650_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id cam_cc_sm8650_match_table[] = {
|
||||
|
|
@ -3535,46 +3575,7 @@ MODULE_DEVICE_TABLE(of, cam_cc_sm8650_match_table);
|
|||
|
||||
static int cam_cc_sm8650_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &cam_cc_sm8650_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
pm_runtime_put(&pdev->dev);
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
|
||||
clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll6, regmap, &cam_cc_pll6_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll7, regmap, &cam_cc_pll7_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll8, regmap, &cam_cc_pll8_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll9, regmap, &cam_cc_pll9_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll10, regmap, &cam_cc_pll10_config);
|
||||
|
||||
/* Keep clocks always enabled */
|
||||
qcom_branch_set_clk_en(regmap, 0x13318); /* CAM_CC_DRV_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x13314); /* CAM_CC_DRV_XO_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x132ec); /* CAM_CC_GDSC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x13308); /* CAM_CC_SLEEP_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(&pdev->dev, &cam_cc_sm8650_desc, regmap);
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
return qcom_cc_probe(pdev, &cam_cc_sm8650_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver cam_cc_sm8650_driver = {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,x1e80100-camcc.h>
|
||||
|
|
@ -67,6 +66,7 @@ static const struct alpha_pll_config cam_cc_pll0_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &cam_cc_pll0_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -144,6 +144,7 @@ static const struct alpha_pll_config cam_cc_pll1_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.config = &cam_cc_pll1_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -194,6 +195,7 @@ static const struct alpha_pll_config cam_cc_pll2_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll2 = {
|
||||
.offset = 0x2000,
|
||||
.config = &cam_cc_pll2_config,
|
||||
.vco_table = rivian_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(rivian_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_RIVIAN_EVO],
|
||||
|
|
@ -225,6 +227,7 @@ static const struct alpha_pll_config cam_cc_pll3_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll3 = {
|
||||
.offset = 0x3000,
|
||||
.config = &cam_cc_pll3_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -279,6 +282,7 @@ static const struct alpha_pll_config cam_cc_pll4_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll4 = {
|
||||
.offset = 0x4000,
|
||||
.config = &cam_cc_pll4_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -333,6 +337,7 @@ static const struct alpha_pll_config cam_cc_pll6_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll6 = {
|
||||
.offset = 0x6000,
|
||||
.config = &cam_cc_pll6_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -387,6 +392,7 @@ static const struct alpha_pll_config cam_cc_pll8_config = {
|
|||
|
||||
static struct clk_alpha_pll cam_cc_pll8 = {
|
||||
.offset = 0x8000,
|
||||
.config = &cam_cc_pll8_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -2418,6 +2424,21 @@ static const struct qcom_reset_map cam_cc_x1e80100_resets[] = {
|
|||
[CAM_CC_SFE_0_BCR] = { 0x1327c },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *cam_cc_x1e80100_plls[] = {
|
||||
&cam_cc_pll0,
|
||||
&cam_cc_pll1,
|
||||
&cam_cc_pll2,
|
||||
&cam_cc_pll3,
|
||||
&cam_cc_pll4,
|
||||
&cam_cc_pll6,
|
||||
&cam_cc_pll8,
|
||||
};
|
||||
|
||||
static u32 cam_cc_x1e80100_critical_cbcrs[] = {
|
||||
0x13a9c, /* CAM_CC_GDSC_CLK */
|
||||
0x13ab8, /* CAM_CC_SLEEP_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config cam_cc_x1e80100_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
|
|
@ -2426,6 +2447,13 @@ static const struct regmap_config cam_cc_x1e80100_regmap_config = {
|
|||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data cam_cc_x1e80100_driver_data = {
|
||||
.alpha_plls = cam_cc_x1e80100_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(cam_cc_x1e80100_plls),
|
||||
.clk_cbcrs = cam_cc_x1e80100_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(cam_cc_x1e80100_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc cam_cc_x1e80100_desc = {
|
||||
.config = &cam_cc_x1e80100_regmap_config,
|
||||
.clks = cam_cc_x1e80100_clocks,
|
||||
|
|
@ -2434,6 +2462,8 @@ static const struct qcom_cc_desc cam_cc_x1e80100_desc = {
|
|||
.num_resets = ARRAY_SIZE(cam_cc_x1e80100_resets),
|
||||
.gdscs = cam_cc_x1e80100_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(cam_cc_x1e80100_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &cam_cc_x1e80100_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id cam_cc_x1e80100_match_table[] = {
|
||||
|
|
@ -2444,40 +2474,7 @@ MODULE_DEVICE_TABLE(of, cam_cc_x1e80100_match_table);
|
|||
|
||||
static int cam_cc_x1e80100_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &cam_cc_x1e80100_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
pm_runtime_put(&pdev->dev);
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
|
||||
clk_rivian_evo_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll6, regmap, &cam_cc_pll6_config);
|
||||
clk_lucid_ole_pll_configure(&cam_cc_pll8, regmap, &cam_cc_pll8_config);
|
||||
|
||||
/* Keep clocks always enabled */
|
||||
qcom_branch_set_clk_en(regmap, 0x13a9c); /* CAM_CC_GDSC_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x13ab8); /* CAM_CC_SLEEP_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(&pdev->dev, &cam_cc_x1e80100_desc, regmap);
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
return qcom_cc_probe(pdev, &cam_cc_x1e80100_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver cam_cc_x1e80100_driver = {
|
||||
|
|
|
|||
|
|
@ -63,6 +63,8 @@
|
|||
#define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE])
|
||||
#define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC])
|
||||
|
||||
#define GET_PLL_TYPE(pll) (((pll)->regs - clk_alpha_pll_regs[0]) / PLL_OFF_MAX_REGS)
|
||||
|
||||
const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
|
||||
[CLK_ALPHA_PLL_TYPE_DEFAULT] = {
|
||||
[PLL_OFF_L_VAL] = 0x04,
|
||||
|
|
@ -788,6 +790,29 @@ static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll,
|
|||
return __clk_alpha_pll_update_latch(pll);
|
||||
}
|
||||
|
||||
static void clk_alpha_pll_update_configs(struct clk_alpha_pll *pll, const struct pll_vco *vco,
|
||||
u32 l, u64 alpha, u32 alpha_width, bool alpha_en)
|
||||
{
|
||||
regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
|
||||
|
||||
if (alpha_width > ALPHA_BITWIDTH)
|
||||
alpha <<= alpha_width - ALPHA_BITWIDTH;
|
||||
|
||||
if (alpha_width > 32)
|
||||
regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), upper_32_bits(alpha));
|
||||
|
||||
regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), lower_32_bits(alpha));
|
||||
|
||||
if (vco) {
|
||||
regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
|
||||
PLL_VCO_MASK << PLL_VCO_SHIFT,
|
||||
vco->val << PLL_VCO_SHIFT);
|
||||
}
|
||||
|
||||
if (alpha_en)
|
||||
regmap_set_bits(pll->clkr.regmap, PLL_USER_CTL(pll), PLL_ALPHA_EN);
|
||||
}
|
||||
|
||||
static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long prate,
|
||||
int (*is_enabled)(struct clk_hw *))
|
||||
|
|
@ -805,24 +830,7 @@ static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
|
||||
|
||||
if (alpha_width > ALPHA_BITWIDTH)
|
||||
a <<= alpha_width - ALPHA_BITWIDTH;
|
||||
|
||||
if (alpha_width > 32)
|
||||
regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), a >> 32);
|
||||
|
||||
regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
|
||||
|
||||
if (vco) {
|
||||
regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
|
||||
PLL_VCO_MASK << PLL_VCO_SHIFT,
|
||||
vco->val << PLL_VCO_SHIFT);
|
||||
}
|
||||
|
||||
regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
|
||||
PLL_ALPHA_EN, PLL_ALPHA_EN);
|
||||
clk_alpha_pll_update_configs(pll, vco, l, a, alpha_width, true);
|
||||
|
||||
return clk_alpha_pll_update_latch(pll, is_enabled);
|
||||
}
|
||||
|
|
@ -2960,3 +2968,208 @@ const struct clk_ops clk_alpha_pll_regera_ops = {
|
|||
.set_rate = clk_zonda_pll_set_rate,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(clk_alpha_pll_regera_ops);
|
||||
|
||||
void qcom_clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap)
|
||||
{
|
||||
const struct clk_init_data *init = pll->clkr.hw.init;
|
||||
|
||||
switch (GET_PLL_TYPE(pll)) {
|
||||
case CLK_ALPHA_PLL_TYPE_LUCID_OLE:
|
||||
clk_lucid_ole_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_LUCID_EVO:
|
||||
clk_lucid_evo_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_TAYCAN_ELU:
|
||||
clk_taycan_elu_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_RIVIAN_EVO:
|
||||
clk_rivian_evo_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_TRION:
|
||||
clk_trion_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_HUAYRA_2290:
|
||||
clk_huayra_2290_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_FABIA:
|
||||
clk_fabia_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_AGERA:
|
||||
clk_agera_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_PONGO_ELU:
|
||||
clk_pongo_elu_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_ZONDA:
|
||||
case CLK_ALPHA_PLL_TYPE_ZONDA_OLE:
|
||||
clk_zonda_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_STROMER:
|
||||
case CLK_ALPHA_PLL_TYPE_STROMER_PLUS:
|
||||
clk_stromer_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
case CLK_ALPHA_PLL_TYPE_DEFAULT:
|
||||
case CLK_ALPHA_PLL_TYPE_DEFAULT_EVO:
|
||||
case CLK_ALPHA_PLL_TYPE_HUAYRA:
|
||||
case CLK_ALPHA_PLL_TYPE_HUAYRA_APSS:
|
||||
case CLK_ALPHA_PLL_TYPE_BRAMMO:
|
||||
case CLK_ALPHA_PLL_TYPE_BRAMMO_EVO:
|
||||
clk_alpha_pll_configure(pll, regmap, pll->config);
|
||||
break;
|
||||
default:
|
||||
WARN(1, "%s: invalid pll type\n", init->name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_clk_alpha_pll_configure);
|
||||
|
||||
static int clk_alpha_pll_slew_update(struct clk_alpha_pll *pll)
|
||||
{
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
regmap_set_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE);
|
||||
regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
|
||||
|
||||
ret = wait_for_pll_update(pll);
|
||||
if (ret)
|
||||
return ret;
|
||||
/*
|
||||
* Hardware programming mandates a wait of at least 570ns before polling the LOCK
|
||||
* detect bit. Have a delay of 1us just to be safe.
|
||||
*/
|
||||
udelay(1);
|
||||
|
||||
return wait_for_pll_enable_lock(pll);
|
||||
}
|
||||
|
||||
static int clk_alpha_pll_slew_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
const struct pll_vco *curr_vco, *vco;
|
||||
unsigned long freq_hz;
|
||||
u64 a;
|
||||
u32 l;
|
||||
|
||||
freq_hz = alpha_pll_round_rate(rate, parent_rate, &l, &a, ALPHA_REG_BITWIDTH);
|
||||
if (freq_hz != rate) {
|
||||
pr_err("alpha_pll: Call clk_set_rate with rounded rates!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
curr_vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw));
|
||||
if (!curr_vco) {
|
||||
pr_err("alpha pll: not in a valid vco range\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vco = alpha_pll_find_vco(pll, freq_hz);
|
||||
if (!vco) {
|
||||
pr_err("alpha pll: not in a valid vco range\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Dynamic pll update will not support switching frequencies across
|
||||
* vco ranges. In those cases fall back to normal alpha set rate.
|
||||
*/
|
||||
if (curr_vco->val != vco->val)
|
||||
return clk_alpha_pll_set_rate(hw, rate, parent_rate);
|
||||
|
||||
clk_alpha_pll_update_configs(pll, NULL, l, a, ALPHA_REG_BITWIDTH, false);
|
||||
|
||||
/* Ensure that the write above goes before slewing the PLL */
|
||||
mb();
|
||||
|
||||
if (clk_hw_is_enabled(hw))
|
||||
return clk_alpha_pll_slew_update(pll);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Slewing plls should be bought up at frequency which is in the middle of the
|
||||
* desired VCO range. So after bringing up the pll at calibration freq, set it
|
||||
* back to desired frequency(that was set by previous clk_set_rate).
|
||||
*/
|
||||
static int clk_alpha_pll_calibrate(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
struct clk_hw *parent;
|
||||
const struct pll_vco *vco;
|
||||
unsigned long calibration_freq, freq_hz;
|
||||
u64 a;
|
||||
u32 l;
|
||||
int rc;
|
||||
|
||||
parent = clk_hw_get_parent(hw);
|
||||
if (!parent) {
|
||||
pr_err("alpha pll: no valid parent found\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw));
|
||||
if (!vco) {
|
||||
pr_err("alpha pll: not in a valid vco range\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* As during slewing plls vco_sel won't be allowed to change, vco table
|
||||
* should have only one entry table, i.e. index = 0, find the
|
||||
* calibration frequency.
|
||||
*/
|
||||
calibration_freq = (pll->vco_table[0].min_freq + pll->vco_table[0].max_freq) / 2;
|
||||
|
||||
freq_hz = alpha_pll_round_rate(calibration_freq, clk_hw_get_rate(parent),
|
||||
&l, &a, ALPHA_REG_BITWIDTH);
|
||||
if (freq_hz != calibration_freq) {
|
||||
pr_err("alpha_pll: call clk_set_rate with rounded rates!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
clk_alpha_pll_update_configs(pll, vco, l, a, ALPHA_REG_BITWIDTH, false);
|
||||
|
||||
/* Bringup the pll at calibration frequency */
|
||||
rc = clk_alpha_pll_enable(hw);
|
||||
if (rc) {
|
||||
pr_err("alpha pll calibration failed\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* PLL is already running at calibration frequency.
|
||||
* So slew pll to the previously set frequency.
|
||||
*/
|
||||
freq_hz = alpha_pll_round_rate(clk_hw_get_rate(hw),
|
||||
clk_hw_get_rate(parent), &l, &a, ALPHA_REG_BITWIDTH);
|
||||
|
||||
pr_debug("pll %s: setting back to required rate %lu, freq_hz %ld\n",
|
||||
clk_hw_get_name(hw), clk_hw_get_rate(hw), freq_hz);
|
||||
|
||||
clk_alpha_pll_update_configs(pll, NULL, l, a, ALPHA_REG_BITWIDTH, true);
|
||||
|
||||
return clk_alpha_pll_slew_update(pll);
|
||||
}
|
||||
|
||||
static int clk_alpha_pll_slew_enable(struct clk_hw *hw)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = clk_alpha_pll_calibrate(hw);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return clk_alpha_pll_enable(hw);
|
||||
}
|
||||
|
||||
const struct clk_ops clk_alpha_pll_slew_ops = {
|
||||
.enable = clk_alpha_pll_slew_enable,
|
||||
.disable = clk_alpha_pll_disable,
|
||||
.recalc_rate = clk_alpha_pll_recalc_rate,
|
||||
.round_rate = clk_alpha_pll_round_rate,
|
||||
.set_rate = clk_alpha_pll_slew_set_rate,
|
||||
};
|
||||
EXPORT_SYMBOL(clk_alpha_pll_slew_ops);
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ struct pll_vco {
|
|||
* struct clk_alpha_pll - phase locked loop (PLL)
|
||||
* @offset: base address of registers
|
||||
* @regs: alpha pll register map (see @clk_alpha_pll_regs)
|
||||
* @config: array of pll settings
|
||||
* @vco_table: array of VCO settings
|
||||
* @num_vco: number of VCO settings in @vco_table
|
||||
* @flags: bitmask to indicate features supported by the hardware
|
||||
|
|
@ -90,6 +91,7 @@ struct clk_alpha_pll {
|
|||
u32 offset;
|
||||
const u8 *regs;
|
||||
|
||||
const struct alpha_pll_config *config;
|
||||
const struct pll_vco *vco_table;
|
||||
size_t num_vco;
|
||||
#define SUPPORTS_OFFLINE_REQ BIT(0)
|
||||
|
|
@ -204,6 +206,7 @@ extern const struct clk_ops clk_alpha_pll_rivian_evo_ops;
|
|||
#define clk_alpha_pll_postdiv_rivian_evo_ops clk_alpha_pll_postdiv_fabia_ops
|
||||
|
||||
extern const struct clk_ops clk_alpha_pll_regera_ops;
|
||||
extern const struct clk_ops clk_alpha_pll_slew_ops;
|
||||
|
||||
void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
|
|
@ -237,5 +240,6 @@ void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
|||
const struct alpha_pll_config *config);
|
||||
void clk_regera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
|
||||
const struct alpha_pll_config *config);
|
||||
void qcom_clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -351,15 +351,15 @@ static int clk_rpm_set_rate(struct clk_hw *hw,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static long clk_rpm_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
static int clk_rpm_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
/*
|
||||
* RPM handles rate rounding and we don't have a way to
|
||||
* know what the rate will be, so just return whatever
|
||||
* rate is requested.
|
||||
*/
|
||||
return rate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long clk_rpm_recalc_rate(struct clk_hw *hw,
|
||||
|
|
@ -383,7 +383,7 @@ static const struct clk_ops clk_rpm_xo_ops = {
|
|||
static const struct clk_ops clk_rpm_fixed_ops = {
|
||||
.prepare = clk_rpm_fixed_prepare,
|
||||
.unprepare = clk_rpm_fixed_unprepare,
|
||||
.round_rate = clk_rpm_round_rate,
|
||||
.determine_rate = clk_rpm_determine_rate,
|
||||
.recalc_rate = clk_rpm_recalc_rate,
|
||||
};
|
||||
|
||||
|
|
@ -391,7 +391,7 @@ static const struct clk_ops clk_rpm_ops = {
|
|||
.prepare = clk_rpm_prepare,
|
||||
.unprepare = clk_rpm_unprepare,
|
||||
.set_rate = clk_rpm_set_rate,
|
||||
.round_rate = clk_rpm_round_rate,
|
||||
.determine_rate = clk_rpm_determine_rate,
|
||||
.recalc_rate = clk_rpm_recalc_rate,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -321,10 +321,10 @@ static int clk_rpmh_bcm_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static long clk_rpmh_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
static int clk_rpmh_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
return rate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long clk_rpmh_bcm_recalc_rate(struct clk_hw *hw,
|
||||
|
|
@ -339,7 +339,7 @@ static const struct clk_ops clk_rpmh_bcm_ops = {
|
|||
.prepare = clk_rpmh_bcm_prepare,
|
||||
.unprepare = clk_rpmh_bcm_unprepare,
|
||||
.set_rate = clk_rpmh_bcm_set_rate,
|
||||
.round_rate = clk_rpmh_round_rate,
|
||||
.determine_rate = clk_rpmh_determine_rate,
|
||||
.recalc_rate = clk_rpmh_bcm_recalc_rate,
|
||||
};
|
||||
|
||||
|
|
@ -386,6 +386,8 @@ DEFINE_CLK_RPMH_VRM(clk6, _a2, "clka6", 2);
|
|||
DEFINE_CLK_RPMH_VRM(clk7, _a2, "clka7", 2);
|
||||
DEFINE_CLK_RPMH_VRM(clk8, _a2, "clka8", 2);
|
||||
|
||||
DEFINE_CLK_RPMH_VRM(clk7, _a4, "clka7", 4);
|
||||
|
||||
DEFINE_CLK_RPMH_VRM(div_clk1, _div2, "divclka1", 2);
|
||||
|
||||
DEFINE_CLK_RPMH_BCM(ce, "CE0");
|
||||
|
|
@ -541,6 +543,29 @@ static const struct clk_rpmh_desc clk_rpmh_sc8180x = {
|
|||
.num_clks = ARRAY_SIZE(sc8180x_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *milos_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div4.hw,
|
||||
[RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div4_ao.hw,
|
||||
[RPMH_LN_BB_CLK2] = &clk_rpmh_clk7_a4.hw,
|
||||
[RPMH_LN_BB_CLK2_A] = &clk_rpmh_clk7_a4_ao.hw,
|
||||
/*
|
||||
* RPMH_LN_BB_CLK3(_A) and RPMH_LN_BB_CLK4(_A) are marked as optional
|
||||
* downstream, but do not exist in cmd-db on SM7635, so skip them.
|
||||
*/
|
||||
[RPMH_RF_CLK1] = &clk_rpmh_clk1_a1.hw,
|
||||
[RPMH_RF_CLK1_A] = &clk_rpmh_clk1_a1_ao.hw,
|
||||
[RPMH_RF_CLK2] = &clk_rpmh_clk2_a1.hw,
|
||||
[RPMH_RF_CLK2_A] = &clk_rpmh_clk2_a1_ao.hw,
|
||||
[RPMH_RF_CLK3] = &clk_rpmh_clk3_a1.hw,
|
||||
[RPMH_RF_CLK3_A] = &clk_rpmh_clk3_a1_ao.hw,
|
||||
[RPMH_IPA_CLK] = &clk_rpmh_ipa.hw,
|
||||
};
|
||||
|
||||
static const struct clk_rpmh_desc clk_rpmh_milos = {
|
||||
.clks = milos_rpmh_clocks,
|
||||
.num_clks = ARRAY_SIZE(milos_rpmh_clocks),
|
||||
};
|
||||
|
||||
static struct clk_hw *sm8250_rpmh_clocks[] = {
|
||||
[RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw,
|
||||
[RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw,
|
||||
|
|
@ -943,6 +968,7 @@ static int clk_rpmh_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
static const struct of_device_id clk_rpmh_match_table[] = {
|
||||
{ .compatible = "qcom,milos-rpmh-clk", .data = &clk_rpmh_milos},
|
||||
{ .compatible = "qcom,qcs615-rpmh-clk", .data = &clk_rpmh_qcs615},
|
||||
{ .compatible = "qcom,qdu1000-rpmh-clk", .data = &clk_rpmh_qdu1000},
|
||||
{ .compatible = "qcom,sa8775p-rpmh-clk", .data = &clk_rpmh_sa8775p},
|
||||
|
|
|
|||
|
|
@ -370,15 +370,15 @@ static int clk_smd_rpm_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static long clk_smd_rpm_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
static int clk_smd_rpm_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
/*
|
||||
* RPM handles rate rounding and we don't have a way to
|
||||
* know what the rate will be, so just return whatever
|
||||
* rate is requested.
|
||||
*/
|
||||
return rate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long clk_smd_rpm_recalc_rate(struct clk_hw *hw,
|
||||
|
|
@ -427,7 +427,7 @@ static const struct clk_ops clk_smd_rpm_ops = {
|
|||
.prepare = clk_smd_rpm_prepare,
|
||||
.unprepare = clk_smd_rpm_unprepare,
|
||||
.set_rate = clk_smd_rpm_set_rate,
|
||||
.round_rate = clk_smd_rpm_round_rate,
|
||||
.determine_rate = clk_smd_rpm_determine_rate,
|
||||
.recalc_rate = clk_smd_rpm_recalc_rate,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -112,16 +112,18 @@ static void clk_spmi_pmic_div_disable(struct clk_hw *hw)
|
|||
spin_unlock_irqrestore(&clkdiv->lock, flags);
|
||||
}
|
||||
|
||||
static long clk_spmi_pmic_div_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
static int clk_spmi_pmic_div_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
unsigned int div, div_factor;
|
||||
|
||||
div = DIV_ROUND_UP(*parent_rate, rate);
|
||||
div = DIV_ROUND_UP(req->best_parent_rate, req->rate);
|
||||
div_factor = div_to_div_factor(div);
|
||||
div = div_factor_to_div(div_factor);
|
||||
|
||||
return *parent_rate / div;
|
||||
req->rate = req->best_parent_rate / div;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
|
|
@ -169,7 +171,7 @@ static const struct clk_ops clk_spmi_pmic_div_ops = {
|
|||
.disable = clk_spmi_pmic_div_disable,
|
||||
.set_rate = clk_spmi_pmic_div_set_rate,
|
||||
.recalc_rate = clk_spmi_pmic_div_recalc_rate,
|
||||
.round_rate = clk_spmi_pmic_div_round_rate,
|
||||
.determine_rate = clk_spmi_pmic_div_determine_rate,
|
||||
};
|
||||
|
||||
struct spmi_pmic_div_clk_cc {
|
||||
|
|
|
|||
|
|
@ -9,10 +9,13 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/interconnect-clk.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/reset-controller.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "reset.h"
|
||||
|
|
@ -284,6 +287,40 @@ static int qcom_cc_icc_register(struct device *dev,
|
|||
desc->num_icc_hws, icd);
|
||||
}
|
||||
|
||||
static int qcom_cc_clk_pll_configure(const struct qcom_cc_driver_data *data,
|
||||
struct regmap *regmap)
|
||||
{
|
||||
const struct clk_init_data *init;
|
||||
struct clk_alpha_pll *pll;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < data->num_alpha_plls; i++) {
|
||||
pll = data->alpha_plls[i];
|
||||
init = pll->clkr.hw.init;
|
||||
|
||||
if (!pll->config || !pll->regs) {
|
||||
pr_err("%s: missing pll config or regs\n", init->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
qcom_clk_alpha_pll_configure(pll, regmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void qcom_cc_clk_regs_configure(struct device *dev, const struct qcom_cc_driver_data *data,
|
||||
struct regmap *regmap)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < data->num_clk_cbcrs; i++)
|
||||
qcom_branch_set_clk_en(regmap, data->clk_cbcrs[i]);
|
||||
|
||||
if (data->clk_regs_configure)
|
||||
data->clk_regs_configure(dev, regmap);
|
||||
}
|
||||
|
||||
int qcom_cc_really_probe(struct device *dev,
|
||||
const struct qcom_cc_desc *desc, struct regmap *regmap)
|
||||
{
|
||||
|
|
@ -304,6 +341,24 @@ int qcom_cc_really_probe(struct device *dev,
|
|||
if (ret < 0 && ret != -EEXIST)
|
||||
return ret;
|
||||
|
||||
if (desc->use_rpm) {
|
||||
ret = devm_pm_runtime_enable(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (desc->driver_data) {
|
||||
ret = qcom_cc_clk_pll_configure(desc->driver_data, regmap);
|
||||
if (ret)
|
||||
goto put_rpm;
|
||||
|
||||
qcom_cc_clk_regs_configure(dev, desc->driver_data, regmap);
|
||||
}
|
||||
|
||||
reset = &cc->reset;
|
||||
reset->rcdev.of_node = dev->of_node;
|
||||
reset->rcdev.ops = &qcom_reset_ops;
|
||||
|
|
@ -314,23 +369,35 @@ int qcom_cc_really_probe(struct device *dev,
|
|||
|
||||
ret = devm_reset_controller_register(dev, &reset->rcdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_rpm;
|
||||
|
||||
if (desc->gdscs && desc->num_gdscs) {
|
||||
scd = devm_kzalloc(dev, sizeof(*scd), GFP_KERNEL);
|
||||
if (!scd)
|
||||
return -ENOMEM;
|
||||
if (!scd) {
|
||||
ret = -ENOMEM;
|
||||
goto put_rpm;
|
||||
}
|
||||
scd->dev = dev;
|
||||
scd->scs = desc->gdscs;
|
||||
scd->num = desc->num_gdscs;
|
||||
scd->pd_list = cc->pd_list;
|
||||
ret = gdsc_register(scd, &reset->rcdev, regmap);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_rpm;
|
||||
ret = devm_add_action_or_reset(dev, qcom_cc_gdsc_unregister,
|
||||
scd);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_rpm;
|
||||
}
|
||||
|
||||
if (desc->driver_data &&
|
||||
desc->driver_data->dfs_rcgs &&
|
||||
desc->driver_data->num_dfs_rcgs) {
|
||||
ret = qcom_cc_register_rcg_dfs(regmap,
|
||||
desc->driver_data->dfs_rcgs,
|
||||
desc->driver_data->num_dfs_rcgs);
|
||||
if (ret)
|
||||
goto put_rpm;
|
||||
}
|
||||
|
||||
cc->rclks = rclks;
|
||||
|
|
@ -341,7 +408,7 @@ int qcom_cc_really_probe(struct device *dev,
|
|||
for (i = 0; i < num_clk_hws; i++) {
|
||||
ret = devm_clk_hw_register(dev, clk_hws[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_rpm;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_clks; i++) {
|
||||
|
|
@ -350,14 +417,20 @@ int qcom_cc_really_probe(struct device *dev,
|
|||
|
||||
ret = devm_clk_register_regmap(dev, rclks[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_rpm;
|
||||
}
|
||||
|
||||
ret = devm_of_clk_add_hw_provider(dev, qcom_cc_clk_hw_get, cc);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto put_rpm;
|
||||
|
||||
return qcom_cc_icc_register(dev, desc);
|
||||
ret = qcom_cc_icc_register(dev, desc);
|
||||
|
||||
put_rpm:
|
||||
if (desc->use_rpm)
|
||||
pm_runtime_put(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_cc_really_probe);
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,16 @@ struct qcom_icc_hws_data {
|
|||
int clk_id;
|
||||
};
|
||||
|
||||
struct qcom_cc_driver_data {
|
||||
struct clk_alpha_pll **alpha_plls;
|
||||
size_t num_alpha_plls;
|
||||
u32 *clk_cbcrs;
|
||||
size_t num_clk_cbcrs;
|
||||
const struct clk_rcg_dfs_data *dfs_rcgs;
|
||||
size_t num_dfs_rcgs;
|
||||
void (*clk_regs_configure)(struct device *dev, struct regmap *regmap);
|
||||
};
|
||||
|
||||
struct qcom_cc_desc {
|
||||
const struct regmap_config *config;
|
||||
struct clk_regmap **clks;
|
||||
|
|
@ -38,6 +48,8 @@ struct qcom_cc_desc {
|
|||
const struct qcom_icc_hws_data *icc_hws;
|
||||
size_t num_icc_hws;
|
||||
unsigned int icc_first_node_id;
|
||||
bool use_rpm;
|
||||
struct qcom_cc_driver_data *driver_data;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
974
drivers/clk/qcom/dispcc-milos.c
Normal file
974
drivers/clk/qcom/dispcc-milos.c
Normal file
|
|
@ -0,0 +1,974 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,milos-dispcc.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "reset.h"
|
||||
#include "gdsc.h"
|
||||
|
||||
/* Need to match the order of clocks in DT binding */
|
||||
enum {
|
||||
DT_BI_TCXO,
|
||||
DT_SLEEP_CLK,
|
||||
DT_AHB_CLK,
|
||||
DT_GCC_DISP_GPLL0_CLK,
|
||||
DT_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||
DT_DSI0_PHY_PLL_OUT_DSICLK,
|
||||
DT_DP0_PHY_PLL_LINK_CLK,
|
||||
DT_DP0_PHY_PLL_VCO_DIV_CLK,
|
||||
};
|
||||
|
||||
#define DISP_CC_MISC_CMD 0xF000
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_DISP_CC_PLL0_OUT_EVEN,
|
||||
P_DISP_CC_PLL0_OUT_MAIN,
|
||||
P_DP0_PHY_PLL_LINK_CLK,
|
||||
P_DP0_PHY_PLL_VCO_DIV_CLK,
|
||||
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||
P_DSI0_PHY_PLL_OUT_DSICLK,
|
||||
P_GCC_DISP_GPLL0_CLK,
|
||||
P_SLEEP_CLK,
|
||||
};
|
||||
|
||||
static const struct pll_vco lucid_ole_vco[] = {
|
||||
{ 249600000, 2300000000, 0 },
|
||||
};
|
||||
|
||||
/* 257.142858 MHz Configuration */
|
||||
static const struct alpha_pll_config disp_cc_pll0_config = {
|
||||
.l = 0xd,
|
||||
.alpha = 0x6492,
|
||||
.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 disp_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &disp_cc_pll0_config,
|
||||
.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 = "disp_cc_pll0",
|
||||
.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 disp_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_0[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
|
||||
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
|
||||
{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DP0_PHY_PLL_LINK_CLK, 1 },
|
||||
{ P_DP0_PHY_PLL_VCO_DIV_CLK, 2 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_2[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DP0_PHY_PLL_LINK_CLK },
|
||||
{ .index = DT_DP0_PHY_PLL_VCO_DIV_CLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_3[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GCC_DISP_GPLL0_CLK, 4 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_3[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_GCC_DISP_GPLL0_CLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_4[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DP0_PHY_PLL_LINK_CLK, 1 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_4[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DP0_PHY_PLL_LINK_CLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_5[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_5[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_6[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GCC_DISP_GPLL0_CLK, 4 },
|
||||
{ P_DISP_CC_PLL0_OUT_EVEN, 6 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_6[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||
{ .index = DT_GCC_DISP_GPLL0_CLK },
|
||||
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_7[] = {
|
||||
{ P_SLEEP_CLK, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_7_ao[] = {
|
||||
{ .index = DT_SLEEP_CLK },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(37500000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
|
||||
F(75000000, P_GCC_DISP_GPLL0_CLK, 4, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
|
||||
.cmd_rcgr = 0x8130,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_3,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb_clk_src",
|
||||
.parent_data = disp_cc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
|
||||
.cmd_rcgr = 0x8098,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_dptx0_aux_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = {
|
||||
.cmd_rcgr = 0x8118,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_aux_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
|
||||
.cmd_rcgr = 0x80cc,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_link_clk_src",
|
||||
.parent_data = disp_cc_parent_data_4,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = {
|
||||
.cmd_rcgr = 0x80e8,
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_pixel0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_dp_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = {
|
||||
.cmd_rcgr = 0x8100,
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_pixel1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_dp_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
|
||||
F(9600000, P_BI_TCXO, 2, 0, 0),
|
||||
F(12800000, P_BI_TCXO, 1.5, 0, 0),
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
|
||||
.cmd_rcgr = 0x80b4,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_5,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_esc0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_5,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(342000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(402000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(535000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(600000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(630000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
|
||||
.cmd_rcgr = 0x8068,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_6,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_clk_src",
|
||||
.parent_data = disp_cc_parent_data_6,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
|
||||
.cmd_rcgr = 0x8050,
|
||||
.mnd_width = 8,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_pixel_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
|
||||
.cmd_rcgr = 0x8080,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_vsync_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
|
||||
F(32000, P_SLEEP_CLK, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_sleep_clk_src = {
|
||||
.cmd_rcgr = 0xe054,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_7,
|
||||
.freq_tbl = ftbl_disp_cc_sleep_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_sleep_clk_src",
|
||||
.parent_data = disp_cc_parent_data_7_ao,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_7_ao),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_xo_clk_src = {
|
||||
.cmd_rcgr = 0xe034,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_aux_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_xo_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
|
||||
.reg = 0x80b0,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = {
|
||||
.reg = 0x80e4,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_link_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_accu_clk = {
|
||||
.halt_reg = 0xe050,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0xe050,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_accu_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_ahb1_clk = {
|
||||
.halt_reg = 0xa020,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xa020,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_ahb_clk = {
|
||||
.halt_reg = 0x804c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x804c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_byte0_clk = {
|
||||
.halt_reg = 0x8024,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8024,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
|
||||
.halt_reg = 0x8028,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8028,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_byte0_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_aux_clk = {
|
||||
.halt_reg = 0x8048,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8048,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_aux_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_aux_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_crypto_clk = {
|
||||
.halt_reg = 0x803c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x803c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_crypto_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_link_clk = {
|
||||
.halt_reg = 0x8030,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8030,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_link_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = {
|
||||
.halt_reg = 0x8038,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8038,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_link_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = {
|
||||
.halt_reg = 0x8040,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8040,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_pixel0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = {
|
||||
.halt_reg = 0x8044,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8044,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_pixel1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = {
|
||||
.halt_reg = 0x8034,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8034,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_esc0_clk = {
|
||||
.halt_reg = 0x802c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x802c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_esc0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_esc0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp1_clk = {
|
||||
.halt_reg = 0xa004,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xa004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_clk = {
|
||||
.halt_reg = 0x8008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_lut1_clk = {
|
||||
.halt_reg = 0xa010,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xa010,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_lut1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
|
||||
.halt_reg = 0x8014,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8014,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_lut_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
|
||||
.halt_reg = 0xc004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0xc004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_non_gdsc_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_pclk0_clk = {
|
||||
.halt_reg = 0x8004,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_pclk0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
|
||||
.halt_reg = 0xc00c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xc00c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rscc_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
|
||||
.halt_reg = 0xc008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xc008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rscc_vsync_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_vsync1_clk = {
|
||||
.halt_reg = 0xa01c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xa01c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_vsync1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||
.halt_reg = 0x8020,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8020,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_vsync_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc disp_cc_mdss_core_gdsc = {
|
||||
.gdscr = 0x9000,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0xf,
|
||||
.pd = {
|
||||
.name = "disp_cc_mdss_core_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc disp_cc_mdss_core_int2_gdsc = {
|
||||
.gdscr = 0xb000,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0xf,
|
||||
.pd = {
|
||||
.name = "disp_cc_mdss_core_int2_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct clk_regmap *disp_cc_milos_clocks[] = {
|
||||
[DISP_CC_MDSS_ACCU_CLK] = &disp_cc_mdss_accu_clk.clkr,
|
||||
[DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr,
|
||||
[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_CRYPTO_CLK] = &disp_cc_mdss_dptx0_crypto_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] =
|
||||
&disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr,
|
||||
[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
|
||||
[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr,
|
||||
[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
|
||||
[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
|
||||
[DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr,
|
||||
[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
|
||||
[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
|
||||
[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
|
||||
[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
|
||||
[DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
|
||||
[DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map disp_cc_milos_resets[] = {
|
||||
[DISP_CC_MDSS_CORE_BCR] = { 0x8000 },
|
||||
[DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 },
|
||||
[DISP_CC_MDSS_RSCC_BCR] = { 0xc000 },
|
||||
};
|
||||
|
||||
static struct gdsc *disp_cc_milos_gdscs[] = {
|
||||
[DISP_CC_MDSS_CORE_GDSC] = &disp_cc_mdss_core_gdsc,
|
||||
[DISP_CC_MDSS_CORE_INT2_GDSC] = &disp_cc_mdss_core_int2_gdsc,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *disp_cc_milos_plls[] = {
|
||||
&disp_cc_pll0,
|
||||
};
|
||||
|
||||
static u32 disp_cc_milos_critical_cbcrs[] = {
|
||||
0xe06c, /* DISP_CC_SLEEP_CLK */
|
||||
0xe04c, /* DISP_CC_XO_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config disp_cc_milos_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x11008,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static void disp_cc_milos_clk_regs_configure(struct device *dev, struct regmap *regmap)
|
||||
{
|
||||
/* Enable clock gating for MDP clocks */
|
||||
regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
|
||||
}
|
||||
|
||||
|
||||
static struct qcom_cc_driver_data disp_cc_milos_driver_data = {
|
||||
.alpha_plls = disp_cc_milos_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(disp_cc_milos_plls),
|
||||
.clk_cbcrs = disp_cc_milos_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(disp_cc_milos_critical_cbcrs),
|
||||
.clk_regs_configure = disp_cc_milos_clk_regs_configure,
|
||||
};
|
||||
|
||||
static struct qcom_cc_desc disp_cc_milos_desc = {
|
||||
.config = &disp_cc_milos_regmap_config,
|
||||
.clks = disp_cc_milos_clocks,
|
||||
.num_clks = ARRAY_SIZE(disp_cc_milos_clocks),
|
||||
.resets = disp_cc_milos_resets,
|
||||
.num_resets = ARRAY_SIZE(disp_cc_milos_resets),
|
||||
.gdscs = disp_cc_milos_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(disp_cc_milos_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &disp_cc_milos_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id disp_cc_milos_match_table[] = {
|
||||
{ .compatible = "qcom,milos-dispcc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, disp_cc_milos_match_table);
|
||||
|
||||
static int disp_cc_milos_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &disp_cc_milos_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver disp_cc_milos_driver = {
|
||||
.probe = disp_cc_milos_probe,
|
||||
.driver = {
|
||||
.name = "disp_cc-milos",
|
||||
.of_match_table = disp_cc_milos_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(disp_cc_milos_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISP_CC Milos Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
792
drivers/clk/qcom/dispcc-qcs615.c
Normal file
792
drivers/clk/qcom/dispcc-qcs615.c
Normal file
|
|
@ -0,0 +1,792 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,qcs615-dispcc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "common.h"
|
||||
#include "gdsc.h"
|
||||
#include "reset.h"
|
||||
|
||||
enum {
|
||||
DT_BI_TCXO,
|
||||
DT_GPLL0,
|
||||
DT_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||
DT_DSI0_PHY_PLL_OUT_DSICLK,
|
||||
DT_DSI1_PHY_PLL_OUT_DSICLK,
|
||||
DT_DP_PHY_PLL_LINK_CLK,
|
||||
DT_DP_PHY_PLL_VCO_DIV_CLK,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_DISP_CC_PLL0_OUT_MAIN,
|
||||
P_DP_PHY_PLL_LINK_CLK,
|
||||
P_DP_PHY_PLL_VCO_DIV_CLK,
|
||||
P_DSI0_PHY_PLL_OUT_BYTECLK,
|
||||
P_DSI0_PHY_PLL_OUT_DSICLK,
|
||||
P_DSI1_PHY_PLL_OUT_DSICLK,
|
||||
P_GPLL0_OUT_MAIN,
|
||||
};
|
||||
|
||||
static const struct pll_vco disp_cc_pll_vco[] = {
|
||||
{ 500000000, 1000000000, 2 },
|
||||
};
|
||||
|
||||
/* 576MHz configuration VCO - 2 */
|
||||
static struct alpha_pll_config disp_cc_pll0_config = {
|
||||
.l = 0x1e,
|
||||
.vco_val = BIT(21),
|
||||
.vco_mask = GENMASK(21, 20),
|
||||
.main_output_mask = BIT(0),
|
||||
.config_ctl_val = 0x4001055b,
|
||||
.test_ctl_hi_val = 0x1,
|
||||
.test_ctl_hi_mask = 0x1,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll disp_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &disp_cc_pll0_config,
|
||||
.vco_table = disp_cc_pll_vco,
|
||||
.num_vco = ARRAY_SIZE(disp_cc_pll_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
|
||||
.clkr = {
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_pll0",
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_slew_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DP_PHY_PLL_LINK_CLK, 1 },
|
||||
{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_0[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DP_PHY_PLL_LINK_CLK },
|
||||
{ .index = DT_DP_PHY_PLL_VCO_DIV_CLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_2[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_2[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_3[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DISP_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GPLL0_OUT_MAIN, 4 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_3[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &disp_cc_pll0.clkr.hw },
|
||||
{ .index = DT_GPLL0 },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_4[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPLL0_OUT_MAIN, 4 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_4[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_GPLL0 },
|
||||
};
|
||||
|
||||
static const struct parent_map disp_cc_parent_map_5[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
|
||||
{ P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data disp_cc_parent_data_5[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
|
||||
{ .index = DT_DSI1_PHY_PLL_OUT_DSICLK },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(37500000, P_GPLL0_OUT_MAIN, 8, 0, 0),
|
||||
F(75000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
|
||||
.cmd_rcgr = 0x2170,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_4,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb_clk_src",
|
||||
.parent_data = disp_cc_parent_data_4,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
|
||||
.cmd_rcgr = 0x20c0,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux1_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
|
||||
.cmd_rcgr = 0x2158,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_dp_aux_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
|
||||
.cmd_rcgr = 0x2110,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_crypto_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
|
||||
.cmd_rcgr = 0x20f4,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dp_pixel1_clk_src = {
|
||||
.cmd_rcgr = 0x2140,
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_dp_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
|
||||
.cmd_rcgr = 0x2128,
|
||||
.mnd_width = 16,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_0,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel_clk_src",
|
||||
.parent_data = disp_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_dp_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
|
||||
.cmd_rcgr = 0x20dc,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_esc0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_2,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(307000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
|
||||
.cmd_rcgr = 0x2078,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_3,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_clk_src",
|
||||
.parent_data = disp_cc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
|
||||
.cmd_rcgr = 0x2060,
|
||||
.mnd_width = 8,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_5,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_5,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_pixel_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
|
||||
.cmd_rcgr = 0x2090,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_3,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rot_clk_src",
|
||||
.parent_data = disp_cc_parent_data_3,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
|
||||
.cmd_rcgr = 0x20a8,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = disp_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src,
|
||||
.clkr.hw.init = &(struct clk_init_data){
|
||||
.name = "disp_cc_mdss_vsync_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
|
||||
.reg = 0x20d8,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
|
||||
.reg = 0x210c,
|
||||
.shift = 0,
|
||||
.width = 2,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_link_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_ahb_clk = {
|
||||
.halt_reg = 0x2048,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2048,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_byte0_clk = {
|
||||
.halt_reg = 0x2024,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2024,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
|
||||
.halt_reg = 0x2028,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2028,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_byte0_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_byte0_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dp_aux_clk = {
|
||||
.halt_reg = 0x2044,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2044,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_aux_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_aux_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
|
||||
.halt_reg = 0x2038,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2038,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_crypto_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dp_link_clk = {
|
||||
.halt_reg = 0x2030,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2030,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_link_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
|
||||
.halt_reg = 0x2034,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2034,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_link_intf_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dp_pixel1_clk = {
|
||||
.halt_reg = 0x2040,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2040,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel1_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_pixel1_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
|
||||
.halt_reg = 0x203c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x203c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_dp_pixel_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_esc0_clk = {
|
||||
.halt_reg = 0x202c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x202c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_esc0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_esc0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_clk = {
|
||||
.halt_reg = 0x2008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
|
||||
.halt_reg = 0x2018,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2018,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_mdp_lut_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_mdp_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
|
||||
.halt_reg = 0x4004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x4004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_non_gdsc_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_pclk0_clk = {
|
||||
.halt_reg = 0x2004,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_pclk0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_pclk0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rot_clk = {
|
||||
.halt_reg = 0x2010,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2010,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rot_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_rot_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
|
||||
.halt_reg = 0x400c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x400c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rscc_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_ahb_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
|
||||
.halt_reg = 0x4008,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x4008,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_rscc_vsync_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||
.halt_reg = 0x2020,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2020,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "disp_cc_mdss_vsync_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&disp_cc_mdss_vsync_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc mdss_core_gdsc = {
|
||||
.gdscr = 0x3000,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0xf,
|
||||
.pd = {
|
||||
.name = "mdss_core_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = HW_CTRL | POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct clk_regmap *disp_cc_qcs615_clocks[] = {
|
||||
[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
|
||||
[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dp_link_div_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_PIXEL1_CLK] = &disp_cc_mdss_dp_pixel1_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_PIXEL1_CLK_SRC] = &disp_cc_mdss_dp_pixel1_clk_src.clkr,
|
||||
[DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
|
||||
[DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
|
||||
[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
|
||||
[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
|
||||
[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
|
||||
[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
|
||||
[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
|
||||
[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
|
||||
[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
|
||||
[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
|
||||
[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
|
||||
[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
|
||||
[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
|
||||
[DISP_CC_PLL0] = &disp_cc_pll0.clkr,
|
||||
};
|
||||
|
||||
static struct gdsc *disp_cc_qcs615_gdscs[] = {
|
||||
[MDSS_CORE_GDSC] = &mdss_core_gdsc,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *disp_cc_qcs615_plls[] = {
|
||||
&disp_cc_pll0,
|
||||
};
|
||||
|
||||
static u32 disp_cc_qcs615_critical_cbcrs[] = {
|
||||
0x6054, /* DISP_CC_XO_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config disp_cc_qcs615_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x10000,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data disp_cc_qcs615_driver_data = {
|
||||
.alpha_plls = disp_cc_qcs615_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(disp_cc_qcs615_plls),
|
||||
.clk_cbcrs = disp_cc_qcs615_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(disp_cc_qcs615_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc disp_cc_qcs615_desc = {
|
||||
.config = &disp_cc_qcs615_regmap_config,
|
||||
.clks = disp_cc_qcs615_clocks,
|
||||
.num_clks = ARRAY_SIZE(disp_cc_qcs615_clocks),
|
||||
.gdscs = disp_cc_qcs615_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(disp_cc_qcs615_gdscs),
|
||||
.driver_data = &disp_cc_qcs615_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id disp_cc_qcs615_match_table[] = {
|
||||
{ .compatible = "qcom,qcs615-dispcc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, disp_cc_qcs615_match_table);
|
||||
|
||||
static int disp_cc_qcs615_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &disp_cc_qcs615_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver disp_cc_qcs615_driver = {
|
||||
.probe = disp_cc_qcs615_probe,
|
||||
.driver = {
|
||||
.name = "dispcc-qcs615",
|
||||
.of_match_table = disp_cc_qcs615_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(disp_cc_qcs615_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI DISPCC QCS615 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -393,7 +393,7 @@ static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
|
|||
.name = "disp_cc_mdss_byte0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
|
@ -408,7 +408,7 @@ static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
|
|||
.name = "disp_cc_mdss_byte1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_byte2_ops,
|
||||
},
|
||||
};
|
||||
|
|
@ -712,7 +712,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
|
|||
.name = "disp_cc_mdss_pclk0_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_pixel_ops,
|
||||
},
|
||||
};
|
||||
|
|
@ -727,7 +727,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
|
|||
.name = "disp_cc_mdss_pclk1_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_pixel_ops,
|
||||
},
|
||||
};
|
||||
|
|
@ -742,7 +742,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk2_clk_src = {
|
|||
.name = "disp_cc_mdss_pclk2_clk_src",
|
||||
.parent_data = disp_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_pixel_ops,
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -125,21 +125,23 @@ static const struct clk_fepll_vco gcc_fepll_vco = {
|
|||
* It looks up the frequency table and returns the next higher frequency
|
||||
* supported in hardware.
|
||||
*/
|
||||
static long clk_cpu_div_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *p_rate)
|
||||
static int clk_cpu_div_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
struct clk_fepll *pll = to_clk_fepll(hw);
|
||||
struct clk_hw *p_hw;
|
||||
const struct freq_tbl *f;
|
||||
|
||||
f = qcom_find_freq(pll->freq_tbl, rate);
|
||||
f = qcom_find_freq(pll->freq_tbl, req->rate);
|
||||
if (!f)
|
||||
return -EINVAL;
|
||||
|
||||
p_hw = clk_hw_get_parent_by_index(hw, f->src);
|
||||
*p_rate = clk_hw_get_rate(p_hw);
|
||||
req->best_parent_rate = clk_hw_get_rate(p_hw);
|
||||
|
||||
return f->freq;
|
||||
req->rate = f->freq;
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -205,7 +207,7 @@ clk_cpu_div_recalc_rate(struct clk_hw *hw,
|
|||
};
|
||||
|
||||
static const struct clk_ops clk_regmap_cpu_div_ops = {
|
||||
.round_rate = clk_cpu_div_round_rate,
|
||||
.determine_rate = clk_cpu_div_determine_rate,
|
||||
.set_rate = clk_cpu_div_set_rate,
|
||||
.recalc_rate = clk_cpu_div_recalc_rate,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1371,7 +1371,7 @@ static struct clk_branch gcc_xo_clk = {
|
|||
&gcc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
|
|
@ -3660,7 +3660,7 @@ static const struct qcom_reset_map gcc_ipq5018_resets[] = {
|
|||
[GCC_WCSS_AXI_S_ARES] = { 0x59008, 6 },
|
||||
[GCC_WCSS_Q6_BCR] = { 0x18004, 0 },
|
||||
[GCC_WCSSAON_RESET] = { 0x59010, 0},
|
||||
[GCC_GEPHY_MISC_ARES] = { 0x56004, 0 },
|
||||
[GCC_GEPHY_MISC_ARES] = { 0x56004, .bitmask = GENMASK(3, 0) },
|
||||
};
|
||||
|
||||
static const struct of_device_id gcc_ipq5018_match_table[] = {
|
||||
|
|
|
|||
|
|
@ -1895,10 +1895,10 @@ static const struct freq_conf ftbl_nss_port6_tx_clk_src_125[] = {
|
|||
static const struct freq_multi_tbl ftbl_nss_port6_tx_clk_src[] = {
|
||||
FMS(19200000, P_XO, 1, 0, 0),
|
||||
FM(25000000, ftbl_nss_port6_tx_clk_src_25),
|
||||
FMS(78125000, P_UNIPHY1_RX, 4, 0, 0),
|
||||
FMS(78125000, P_UNIPHY2_TX, 4, 0, 0),
|
||||
FM(125000000, ftbl_nss_port6_tx_clk_src_125),
|
||||
FMS(156250000, P_UNIPHY1_RX, 2, 0, 0),
|
||||
FMS(312500000, P_UNIPHY1_RX, 1, 0, 0),
|
||||
FMS(156250000, P_UNIPHY2_TX, 2, 0, 0),
|
||||
FMS(312500000, P_UNIPHY2_TX, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
3225
drivers/clk/qcom/gcc-milos.c
Normal file
3225
drivers/clk/qcom/gcc-milos.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -2720,6 +2720,7 @@ static struct gdsc gcc_vcodec0_gdsc = {
|
|||
.pd = {
|
||||
.name = "gcc_vcodec0",
|
||||
},
|
||||
.flags = HW_CTRL_TRIGGER,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -6674,6 +6674,8 @@ static const struct qcom_reset_map gcc_x1e80100_resets[] = {
|
|||
[GCC_USB_1_PHY_BCR] = { 0x2a020 },
|
||||
[GCC_USB_2_PHY_BCR] = { 0xa3020 },
|
||||
[GCC_VIDEO_BCR] = { 0x32000 },
|
||||
[GCC_VIDEO_AXI0_CLK_ARES] = { .reg = 0x32018, .bit = 2, .udelay = 1000 },
|
||||
[GCC_VIDEO_AXI1_CLK_ARES] = { .reg = 0x32024, .bit = 2, .udelay = 1000 },
|
||||
};
|
||||
|
||||
static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
|
||||
|
|
|
|||
562
drivers/clk/qcom/gpucc-milos.c
Normal file
562
drivers/clk/qcom/gpucc-milos.c
Normal file
|
|
@ -0,0 +1,562 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#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,milos-gpucc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "common.h"
|
||||
#include "gdsc.h"
|
||||
#include "reset.h"
|
||||
|
||||
/* Need to match the order of clocks in DT binding */
|
||||
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_EVEN,
|
||||
P_GPU_CC_PLL0_OUT_MAIN,
|
||||
P_GPU_CC_PLL0_OUT_ODD,
|
||||
};
|
||||
|
||||
static const struct pll_vco lucid_ole_vco[] = {
|
||||
{ 249600000, 2300000000, 0 },
|
||||
};
|
||||
|
||||
/* 700.0 MHz Configuration */
|
||||
static const struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x24,
|
||||
.alpha = 0x7555,
|
||||
.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 = 0x00000400,
|
||||
.user_ctl_hi_val = 0x00000005,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &gpu_cc_pll0_config,
|
||||
.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_pll0",
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_lucid_evo_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct clk_div_table post_div_table_gpu_cc_pll0_out_even[] = {
|
||||
{ 0x1, 2 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll_postdiv gpu_cc_pll0_out_even = {
|
||||
.offset = 0x0,
|
||||
.post_div_shift = 10,
|
||||
.post_div_table = post_div_table_gpu_cc_pll0_out_even,
|
||||
.num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll0_out_even),
|
||||
.width = 4,
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_pll0_out_even",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_pll0.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_alpha_pll_postdiv_lucid_ole_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_PLL0_OUT_EVEN, 2 },
|
||||
{ P_GPU_CC_PLL0_OUT_ODD, 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_pll0_out_even.clkr.hw },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
{ .index = DT_GPLL0_OUT_MAIN_DIV },
|
||||
};
|
||||
|
||||
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_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(350000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(650000000, P_GPU_CC_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(687500000, P_GPU_CC_PLL0_OUT_EVEN, 1, 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 const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
|
||||
F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
|
||||
F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
|
||||
F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_hub_clk_src = {
|
||||
.cmd_rcgr = 0x93ec,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_gpu_cc_hub_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div gpu_cc_hub_div_clk_src = {
|
||||
.reg = 0x942c,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_hub_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_hub_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_ahb_clk = {
|
||||
.halt_reg = 0x90bc,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90bc,
|
||||
.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_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_accu_shift_clk = {
|
||||
.halt_reg = 0x910c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x910c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cx_accu_shift_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_ff_clk = {
|
||||
.halt_reg = 0x90ec,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90ec,
|
||||
.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 = 0x90d4,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90d4,
|
||||
.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_clk = {
|
||||
.halt_reg = 0x90e4,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90e4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cxo_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_dpm_clk = {
|
||||
.halt_reg = 0x9110,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9110,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_dpm_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_freq_measure_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_freq_measure_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_accu_shift_clk = {
|
||||
.halt_reg = 0x9070,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9070,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gx_accu_shift_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_acd_ahb_ff_clk = {
|
||||
.halt_reg = 0x9068,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9068,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gx_acd_ahb_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_gx_gmu_clk = {
|
||||
.halt_reg = 0x9060,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9060,
|
||||
.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_rcg_ahb_ff_clk = {
|
||||
.halt_reg = 0x906c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x906c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gx_rcg_ahb_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_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_hub_aon_clk = {
|
||||
.halt_reg = 0x93e8,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.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 = 0x90e8,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90e8,
|
||||
.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 = 0x90f4,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x90f4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_memnoc_gfx_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc gpu_cc_cx_gdsc = {
|
||||
.gdscr = 0x9080,
|
||||
.gds_hw_ctrl = 0x9094,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x8,
|
||||
.pd = {
|
||||
.name = "gpu_cc_cx_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = RETAIN_FF_ENABLE | VOTABLE,
|
||||
};
|
||||
|
||||
static struct clk_regmap *gpu_cc_milos_clocks[] = {
|
||||
[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
|
||||
[GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_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_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||
[GPU_CC_DPM_CLK] = &gpu_cc_dpm_clk.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_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr,
|
||||
[GPU_CC_GX_ACD_AHB_FF_CLK] = &gpu_cc_gx_acd_ahb_ff_clk.clkr,
|
||||
[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
|
||||
[GPU_CC_GX_RCG_AHB_FF_CLK] = &gpu_cc_gx_rcg_ahb_ff_clk.clkr,
|
||||
[GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_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_HUB_DIV_CLK_SRC] = &gpu_cc_hub_div_clk_src.clkr,
|
||||
[GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
|
||||
[GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
|
||||
[GPU_CC_PLL0_OUT_EVEN] = &gpu_cc_pll0_out_even.clkr,
|
||||
};
|
||||
|
||||
static struct gdsc *gpu_cc_milos_gdscs[] = {
|
||||
[GPU_CC_CX_GDSC] = &gpu_cc_cx_gdsc,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map gpu_cc_milos_resets[] = {
|
||||
[GPU_CC_CB_BCR] = { 0x93a0 },
|
||||
[GPU_CC_CX_BCR] = { 0x907c },
|
||||
[GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
|
||||
[GPU_CC_FF_BCR] = { 0x9470 },
|
||||
[GPU_CC_GMU_BCR] = { 0x9314 },
|
||||
[GPU_CC_GX_BCR] = { 0x905c },
|
||||
[GPU_CC_RBCPR_BCR] = { 0x91e0 },
|
||||
[GPU_CC_XO_BCR] = { 0x9000 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *gpu_cc_milos_plls[] = {
|
||||
&gpu_cc_pll0,
|
||||
};
|
||||
|
||||
static u32 gpu_cc_milos_critical_cbcrs[] = {
|
||||
0x93a4, /* GPU_CC_CB_CLK */
|
||||
0x9008, /* GPU_CC_CXO_AON_CLK */
|
||||
0x9010, /* GPU_CC_DEMET_CLK */
|
||||
0x9064, /* GPU_CC_GX_AHB_FF_CLK */
|
||||
0x93a8, /* GPU_CC_RSCC_HUB_AON_CLK */
|
||||
0x9004, /* GPU_CC_RSCC_XO_AON_CLK */
|
||||
0x90cc, /* GPU_CC_SLEEP_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config gpu_cc_milos_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x95e8,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data gpu_cc_milos_driver_data = {
|
||||
.alpha_plls = gpu_cc_milos_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(gpu_cc_milos_plls),
|
||||
.clk_cbcrs = gpu_cc_milos_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(gpu_cc_milos_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gpu_cc_milos_desc = {
|
||||
.config = &gpu_cc_milos_regmap_config,
|
||||
.clks = gpu_cc_milos_clocks,
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_milos_clocks),
|
||||
.resets = gpu_cc_milos_resets,
|
||||
.num_resets = ARRAY_SIZE(gpu_cc_milos_resets),
|
||||
.gdscs = gpu_cc_milos_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(gpu_cc_milos_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &gpu_cc_milos_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_milos_match_table[] = {
|
||||
{ .compatible = "qcom,milos-gpucc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gpu_cc_milos_match_table);
|
||||
|
||||
static int gpu_cc_milos_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &gpu_cc_milos_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver gpu_cc_milos_driver = {
|
||||
.probe = gpu_cc_milos_probe,
|
||||
.driver = {
|
||||
.name = "gpu_cc-milos",
|
||||
.of_match_table = gpu_cc_milos_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(gpu_cc_milos_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPU_CC Milos Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
531
drivers/clk/qcom/gpucc-qcs615.c
Normal file
531
drivers/clk/qcom/gpucc-qcs615.c
Normal file
|
|
@ -0,0 +1,531 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,qcs615-gpucc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "common.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_2X_CLK,
|
||||
P_CRC_DIV_PLL0_OUT_AUX2,
|
||||
P_GPU_CC_PLL0_OUT_MAIN,
|
||||
P_GPU_CC_PLL1_OUT_AUX,
|
||||
P_CRC_DIV_PLL1_OUT_AUX2,
|
||||
P_GPU_CC_PLL1_OUT_MAIN,
|
||||
};
|
||||
|
||||
static const struct pll_vco gpu_cc_pll0_vco[] = {
|
||||
{ 1000000000, 2100000000, 0 },
|
||||
};
|
||||
|
||||
static struct pll_vco gpu_cc_pll1_vco[] = {
|
||||
{ 500000000, 1000000000, 2 },
|
||||
};
|
||||
|
||||
/* 1020MHz configuration VCO - 0 */
|
||||
static struct alpha_pll_config gpu_cc_pll0_config = {
|
||||
.l = 0x35,
|
||||
.config_ctl_val = 0x4001055b,
|
||||
.test_ctl_hi_val = 0x1,
|
||||
.test_ctl_hi_mask = 0x1,
|
||||
.alpha_hi = 0x20,
|
||||
.alpha = 0x00,
|
||||
.alpha_en_mask = BIT(24),
|
||||
.vco_val = 0x0,
|
||||
.vco_mask = GENMASK(21, 20),
|
||||
.aux2_output_mask = BIT(2),
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &gpu_cc_pll0_config,
|
||||
.vco_table = gpu_cc_pll0_vco,
|
||||
.num_vco = ARRAY_SIZE(gpu_cc_pll0_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
|
||||
.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_slew_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/* 930MHz configuration VCO - 2 */
|
||||
static struct alpha_pll_config gpu_cc_pll1_config = {
|
||||
.l = 0x30,
|
||||
.config_ctl_val = 0x4001055b,
|
||||
.test_ctl_hi_val = 0x1,
|
||||
.test_ctl_hi_mask = 0x1,
|
||||
.alpha_hi = 0x70,
|
||||
.alpha = 0x00,
|
||||
.alpha_en_mask = BIT(24),
|
||||
.vco_val = BIT(21),
|
||||
.vco_mask = GENMASK(21, 20),
|
||||
.aux2_output_mask = BIT(2),
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll gpu_cc_pll1 = {
|
||||
.offset = 0x100,
|
||||
.config = &gpu_cc_pll1_config,
|
||||
.vco_table = gpu_cc_pll1_vco,
|
||||
.num_vco = ARRAY_SIZE(gpu_cc_pll1_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
|
||||
.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_slew_ops,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
/* Clock Ramp Controller */
|
||||
static struct clk_fixed_factor crc_div_pll0 = {
|
||||
.mult = 1,
|
||||
.div = 2,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "crc_div_pll0",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_pll0.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
},
|
||||
};
|
||||
|
||||
/* Clock Ramp Controller */
|
||||
static struct clk_fixed_factor crc_div_pll1 = {
|
||||
.mult = 1,
|
||||
.div = 2,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "crc_div_pll1",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &gpu_cc_pll1.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map gpu_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_OUT_MAIN, 1 },
|
||||
{ P_GPU_CC_PLL1_OUT_MAIN, 3 },
|
||||
{ P_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 },
|
||||
{ .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_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_GPU_CC_PLL0_2X_CLK, 1 },
|
||||
{ P_CRC_DIV_PLL0_OUT_AUX2, 2 },
|
||||
{ P_GPU_CC_PLL1_OUT_AUX, 3 },
|
||||
{ P_CRC_DIV_PLL1_OUT_AUX2, 4 },
|
||||
{ P_GPLL0_OUT_MAIN, 5 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data gpu_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &gpu_cc_pll0.clkr.hw },
|
||||
{ .hw = &crc_div_pll0.hw },
|
||||
{ .hw = &gpu_cc_pll1.clkr.hw },
|
||||
{ .hw = &crc_div_pll1.hw },
|
||||
{ .index = DT_GPLL0_OUT_MAIN },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
|
||||
F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gmu_clk_src = {
|
||||
.cmd_rcgr = 0x1120,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_gpu_cc_gmu_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gmu_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = {
|
||||
F(290000000, P_CRC_DIV_PLL1_OUT_AUX2, 1, 0, 0),
|
||||
F(350000000, P_CRC_DIV_PLL1_OUT_AUX2, 1, 0, 0),
|
||||
F(435000000, P_CRC_DIV_PLL1_OUT_AUX2, 1, 0, 0),
|
||||
F(500000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
F(550000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
F(650000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
F(700000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
F(745000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
F(845000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
F(895000000, P_CRC_DIV_PLL0_OUT_AUX2, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = {
|
||||
.cmd_rcgr = 0x101c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = gpu_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gx_gfx3d_clk_src",
|
||||
.parent_data = gpu_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_crc_ahb_clk = {
|
||||
.halt_reg = 0x107c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x107c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_crc_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gfx3d_clk = {
|
||||
.halt_reg = 0x10a4,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x10a4,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cx_gfx3d_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_gx_gfx3d_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gfx3d_slv_clk = {
|
||||
.halt_reg = 0x10a8,
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
.enable_reg = 0x10a8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cx_gfx3d_slv_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_gx_gfx3d_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_gmu_clk = {
|
||||
.halt_reg = 0x1098,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1098,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(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_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
|
||||
.halt_reg = 0x108c,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x108c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cx_snoc_dvm_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_aon_clk = {
|
||||
.halt_reg = 0x1004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gpu_cc_cxo_aon_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_cxo_clk = {
|
||||
.halt_reg = 0x109c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x109c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_cxo_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gfx3d_clk = {
|
||||
.halt_reg = 0x1054,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1054,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_gx_gfx3d_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&gpu_cc_gx_gfx3d_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gpu_cc_gx_gmu_clk = {
|
||||
.halt_reg = 0x1064,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1064,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(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_hlos1_vote_gpu_smmu_clk = {
|
||||
.halt_reg = 0x5000,
|
||||
.halt_check = BRANCH_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5000,
|
||||
.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_sleep_clk = {
|
||||
.halt_reg = 0x1090,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1090,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gpu_cc_sleep_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_hw *gpu_cc_qcs615_hws[] = {
|
||||
[CRC_DIV_PLL0] = &crc_div_pll0.hw,
|
||||
[CRC_DIV_PLL1] = &crc_div_pll1.hw,
|
||||
};
|
||||
|
||||
static struct gdsc cx_gdsc = {
|
||||
.gdscr = 0x106c,
|
||||
.gds_hw_ctrl = 0x1540,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x8,
|
||||
.pd = {
|
||||
.name = "cx_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct gdsc gx_gdsc = {
|
||||
.gdscr = 0x100c,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x2,
|
||||
.pd = {
|
||||
.name = "gx_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct clk_regmap *gpu_cc_qcs615_clocks[] = {
|
||||
[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
|
||||
[GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr,
|
||||
[GPU_CC_CX_GFX3D_SLV_CLK] = &gpu_cc_cx_gfx3d_slv_clk.clkr,
|
||||
[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
|
||||
[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
|
||||
[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
|
||||
[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
|
||||
[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
|
||||
[GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
|
||||
[GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_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_PLL0] = &gpu_cc_pll0.clkr,
|
||||
[GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
|
||||
[GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
|
||||
};
|
||||
|
||||
static struct gdsc *gpu_cc_qcs615_gdscs[] = {
|
||||
[CX_GDSC] = &cx_gdsc,
|
||||
[GX_GDSC] = &gx_gdsc,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map gpu_cc_qcs615_resets[] = {
|
||||
[GPU_CC_CX_BCR] = { 0x1068 },
|
||||
[GPU_CC_GFX3D_AON_BCR] = { 0x10a0 },
|
||||
[GPU_CC_GMU_BCR] = { 0x111c },
|
||||
[GPU_CC_GX_BCR] = { 0x1008 },
|
||||
[GPU_CC_XO_BCR] = { 0x1000 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *gpu_cc_qcs615_plls[] = {
|
||||
&gpu_cc_pll0,
|
||||
&gpu_cc_pll1,
|
||||
};
|
||||
|
||||
static u32 gpu_cc_qcs615_critical_cbcrs[] = {
|
||||
0x1078, /* GPU_CC_AHB_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config gpu_cc_qcs615_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x7008,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static void clk_qcs615_regs_crc_configure(struct device *dev, struct regmap *regmap)
|
||||
{
|
||||
/* Recommended WAKEUP/SLEEP settings for the gpu_cc_cx_gmu_clk */
|
||||
regmap_update_bits(regmap, gpu_cc_cx_gmu_clk.clkr.enable_reg, 0xff0, 0xff0);
|
||||
|
||||
/*
|
||||
* After POR, Clock Ramp Controller(CRC) will be in bypass mode.
|
||||
* Software needs to do the following operation to enable the CRC
|
||||
* for GFX3D clock and divide the input clock by div by 2.
|
||||
*/
|
||||
regmap_update_bits(regmap, 0x1028, 0x00015011, 0x00015011);
|
||||
regmap_update_bits(regmap, 0x1024, 0x00800000, 0x00800000);
|
||||
}
|
||||
|
||||
static struct qcom_cc_driver_data gpu_cc_qcs615_driver_data = {
|
||||
.alpha_plls = gpu_cc_qcs615_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(gpu_cc_qcs615_plls),
|
||||
.clk_cbcrs = gpu_cc_qcs615_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(gpu_cc_qcs615_critical_cbcrs),
|
||||
.clk_regs_configure = clk_qcs615_regs_crc_configure,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gpu_cc_qcs615_desc = {
|
||||
.config = &gpu_cc_qcs615_regmap_config,
|
||||
.clks = gpu_cc_qcs615_clocks,
|
||||
.num_clks = ARRAY_SIZE(gpu_cc_qcs615_clocks),
|
||||
.clk_hws = gpu_cc_qcs615_hws,
|
||||
.num_clk_hws = ARRAY_SIZE(gpu_cc_qcs615_hws),
|
||||
.resets = gpu_cc_qcs615_resets,
|
||||
.num_resets = ARRAY_SIZE(gpu_cc_qcs615_resets),
|
||||
.gdscs = gpu_cc_qcs615_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(gpu_cc_qcs615_gdscs),
|
||||
.driver_data = &gpu_cc_qcs615_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id gpu_cc_qcs615_match_table[] = {
|
||||
{ .compatible = "qcom,qcs615-gpucc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, gpu_cc_qcs615_match_table);
|
||||
|
||||
static int gpu_cc_qcs615_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &gpu_cc_qcs615_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver gpu_cc_qcs615_driver = {
|
||||
.probe = gpu_cc_qcs615_probe,
|
||||
.driver = {
|
||||
.name = "gpucc-qcs615",
|
||||
.of_match_table = gpu_cc_qcs615_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(gpu_cc_qcs615_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI GPUCC QCS615 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -16,6 +16,10 @@
|
|||
* are supplied to GCC (24 MHZ as XO and 32 KHZ as sleep clock), and to PCS
|
||||
* with 31.25 MHZ.
|
||||
*
|
||||
* On the IPQ5424 SoC, there is an output clock from CMN PLL to PPE at 375 MHZ,
|
||||
* and an output clock to NSS (network subsystem) at 300 MHZ. The other output
|
||||
* clocks from CMN PLL on IPQ5424 are the same as IPQ9574.
|
||||
*
|
||||
* +---------+
|
||||
* | GCC |
|
||||
* +--+---+--+
|
||||
|
|
@ -46,6 +50,8 @@
|
|||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,ipq-cmn-pll.h>
|
||||
#include <dt-bindings/clock/qcom,ipq5018-cmn-pll.h>
|
||||
#include <dt-bindings/clock/qcom,ipq5424-cmn-pll.h>
|
||||
|
||||
#define CMN_PLL_REFCLK_SRC_SELECTION 0x28
|
||||
#define CMN_PLL_REFCLK_SRC_DIV GENMASK(9, 8)
|
||||
|
|
@ -105,6 +111,26 @@ static const struct regmap_config ipq_cmn_pll_regmap_config = {
|
|||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct cmn_pll_fixed_output_clk ipq5018_output_clks[] = {
|
||||
CLK_PLL_OUTPUT(IPQ5018_XO_24MHZ_CLK, "xo-24mhz", 24000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5018_SLEEP_32KHZ_CLK, "sleep-32khz", 32000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5018_ETH_50MHZ_CLK, "eth-50mhz", 50000000UL),
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static const struct cmn_pll_fixed_output_clk ipq5424_output_clks[] = {
|
||||
CLK_PLL_OUTPUT(IPQ5424_XO_24MHZ_CLK, "xo-24mhz", 24000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_SLEEP_32KHZ_CLK, "sleep-32khz", 32000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_PCS_31P25MHZ_CLK, "pcs-31p25mhz", 31250000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_NSS_300MHZ_CLK, "nss-300mhz", 300000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_PPE_375MHZ_CLK, "ppe-375mhz", 375000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_ETH0_50MHZ_CLK, "eth0-50mhz", 50000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_ETH1_50MHZ_CLK, "eth1-50mhz", 50000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_ETH2_50MHZ_CLK, "eth2-50mhz", 50000000UL),
|
||||
CLK_PLL_OUTPUT(IPQ5424_ETH_25MHZ_CLK, "eth-25mhz", 25000000UL),
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static const struct cmn_pll_fixed_output_clk ipq9574_output_clks[] = {
|
||||
CLK_PLL_OUTPUT(XO_24MHZ_CLK, "xo-24mhz", 24000000UL),
|
||||
CLK_PLL_OUTPUT(SLEEP_32KHZ_CLK, "sleep-32khz", 32000UL),
|
||||
|
|
@ -115,6 +141,7 @@ static const struct cmn_pll_fixed_output_clk ipq9574_output_clks[] = {
|
|||
CLK_PLL_OUTPUT(ETH1_50MHZ_CLK, "eth1-50mhz", 50000000UL),
|
||||
CLK_PLL_OUTPUT(ETH2_50MHZ_CLK, "eth2-50mhz", 50000000UL),
|
||||
CLK_PLL_OUTPUT(ETH_25MHZ_CLK, "eth-25mhz", 25000000UL),
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -297,7 +324,7 @@ static struct clk_hw *ipq_cmn_pll_clk_hw_register(struct platform_device *pdev)
|
|||
|
||||
static int ipq_cmn_pll_register_clks(struct platform_device *pdev)
|
||||
{
|
||||
const struct cmn_pll_fixed_output_clk *fixed_clk;
|
||||
const struct cmn_pll_fixed_output_clk *p, *fixed_clk;
|
||||
struct clk_hw_onecell_data *hw_data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct clk_hw *cmn_pll_hw;
|
||||
|
|
@ -305,8 +332,13 @@ static int ipq_cmn_pll_register_clks(struct platform_device *pdev)
|
|||
struct clk_hw *hw;
|
||||
int ret, i;
|
||||
|
||||
fixed_clk = ipq9574_output_clks;
|
||||
num_clks = ARRAY_SIZE(ipq9574_output_clks);
|
||||
fixed_clk = device_get_match_data(dev);
|
||||
if (!fixed_clk)
|
||||
return -EINVAL;
|
||||
|
||||
num_clks = 0;
|
||||
for (p = fixed_clk; p->name; p++)
|
||||
num_clks++;
|
||||
|
||||
hw_data = devm_kzalloc(dev, struct_size(hw_data, hws, num_clks + 1),
|
||||
GFP_KERNEL);
|
||||
|
|
@ -375,11 +407,11 @@ static int ipq_cmn_pll_clk_probe(struct platform_device *pdev)
|
|||
*/
|
||||
ret = pm_clk_add(dev, "ahb");
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Fail to add AHB clock\n");
|
||||
return dev_err_probe(dev, ret, "Failed to add AHB clock\n");
|
||||
|
||||
ret = pm_clk_add(dev, "sys");
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Fail to add SYS clock\n");
|
||||
return dev_err_probe(dev, ret, "Failed to add SYS clock\n");
|
||||
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret)
|
||||
|
|
@ -390,7 +422,7 @@ static int ipq_cmn_pll_clk_probe(struct platform_device *pdev)
|
|||
pm_runtime_put(dev);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret,
|
||||
"Fail to register CMN PLL clocks\n");
|
||||
"Failed to register CMN PLL clocks\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -415,7 +447,9 @@ static const struct dev_pm_ops ipq_cmn_pll_pm_ops = {
|
|||
};
|
||||
|
||||
static const struct of_device_id ipq_cmn_pll_clk_ids[] = {
|
||||
{ .compatible = "qcom,ipq9574-cmn-pll", },
|
||||
{ .compatible = "qcom,ipq5018-cmn-pll", .data = &ipq5018_output_clks },
|
||||
{ .compatible = "qcom,ipq5424-cmn-pll", .data = &ipq5424_output_clks },
|
||||
{ .compatible = "qcom,ipq9574-cmn-pll", .data = &ipq9574_output_clks },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ipq_cmn_pll_clk_ids);
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ static const struct qcom_cc_desc tcsr_cc_sm8650_desc = {
|
|||
};
|
||||
|
||||
static const struct of_device_id tcsr_cc_sm8650_match_table[] = {
|
||||
{ .compatible = "qcom,milos-tcsr" },
|
||||
{ .compatible = "qcom,sm8650-tcsr" },
|
||||
{ }
|
||||
};
|
||||
|
|
@ -155,6 +156,13 @@ MODULE_DEVICE_TABLE(of, tcsr_cc_sm8650_match_table);
|
|||
|
||||
static int tcsr_cc_sm8650_probe(struct platform_device *pdev)
|
||||
{
|
||||
if (of_device_is_compatible(pdev->dev.of_node, "qcom,milos-tcsr")) {
|
||||
tcsr_ufs_clkref_en.halt_reg = 0x31118;
|
||||
tcsr_ufs_clkref_en.clkr.enable_reg = 0x31118;
|
||||
tcsr_cc_sm8650_clocks[TCSR_USB2_CLKREF_EN] = NULL;
|
||||
tcsr_cc_sm8650_clocks[TCSR_USB3_CLKREF_EN] = NULL;
|
||||
}
|
||||
|
||||
return qcom_cc_probe(pdev, &tcsr_cc_sm8650_desc);
|
||||
}
|
||||
|
||||
|
|
|
|||
403
drivers/clk/qcom/videocc-milos.c
Normal file
403
drivers/clk/qcom/videocc-milos.c
Normal file
|
|
@ -0,0 +1,403 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#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,milos-videocc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "common.h"
|
||||
#include "gdsc.h"
|
||||
#include "reset.h"
|
||||
|
||||
/* Need to match the order of clocks in DT binding */
|
||||
enum {
|
||||
DT_BI_TCXO,
|
||||
DT_BI_TCXO_AO,
|
||||
DT_SLEEP_CLK,
|
||||
DT_IFACE,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_SLEEP_CLK,
|
||||
P_VIDEO_CC_PLL0_OUT_MAIN,
|
||||
};
|
||||
|
||||
static const struct pll_vco lucid_ole_vco[] = {
|
||||
{ 249600000, 2300000000, 0 },
|
||||
};
|
||||
|
||||
/* 604.8 MHz Configuration */
|
||||
static const struct alpha_pll_config video_cc_pll0_config = {
|
||||
.l = 0x1f,
|
||||
.alpha = 0x8000,
|
||||
.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 video_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &video_cc_pll0_config,
|
||||
.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 = "video_cc_pll0",
|
||||
.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 video_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_0[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_0_ao[] = {
|
||||
{ .index = DT_BI_TCXO_AO },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_VIDEO_CC_PLL0_OUT_MAIN, 1 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &video_cc_pll0.clkr.hw },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_2[] = {
|
||||
{ P_SLEEP_CLK, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_2_ao[] = {
|
||||
{ .index = DT_SLEEP_CLK },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_ahb_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_ahb_clk_src = {
|
||||
.cmd_rcgr = 0x8030,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_video_cc_ahb_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_ahb_clk_src",
|
||||
.parent_data = video_cc_parent_data_0_ao,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_0_ao),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_mvs0_clk_src[] = {
|
||||
F(604800000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(720000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1014000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1098000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1332000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1656000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_mvs0_clk_src = {
|
||||
.cmd_rcgr = 0x8000,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_video_cc_mvs0_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_clk_src",
|
||||
.parent_data = video_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
|
||||
F(32000, P_SLEEP_CLK, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_sleep_clk_src = {
|
||||
.cmd_rcgr = 0x8128,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_2,
|
||||
.freq_tbl = ftbl_video_cc_sleep_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_sleep_clk_src",
|
||||
.parent_data = video_cc_parent_data_2_ao,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_2_ao),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_xo_clk_src = {
|
||||
.cmd_rcgr = 0x810c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_video_cc_ahb_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_xo_clk_src",
|
||||
.parent_data = video_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div video_cc_mvs0_div_clk_src = {
|
||||
.reg = 0x80c4,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_mvs0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_regmap_div video_cc_mvs0c_div2_div_clk_src = {
|
||||
.reg = 0x8070,
|
||||
.shift = 0,
|
||||
.width = 4,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0c_div2_div_clk_src",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_mvs0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ro_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0_clk = {
|
||||
.halt_reg = 0x80b8,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0x80b8,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x80b8,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_mvs0_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0_shift_clk = {
|
||||
.halt_reg = 0x8144,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0x8144,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8144,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_shift_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0c_clk = {
|
||||
.halt_reg = 0x8064,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8064,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0c_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_mvs0c_div2_div_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0c_shift_clk = {
|
||||
.halt_reg = 0x8148,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0x8148,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8148,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0c_shift_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_xo_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc video_cc_mvs0c_gdsc = {
|
||||
.gdscr = 0x804c,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x6,
|
||||
.pd = {
|
||||
.name = "video_cc_mvs0c_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc video_cc_mvs0_gdsc = {
|
||||
.gdscr = 0x80a4,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x6,
|
||||
.pd = {
|
||||
.name = "video_cc_mvs0_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.parent = &video_cc_mvs0c_gdsc.pd,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | HW_CTRL_TRIGGER,
|
||||
};
|
||||
|
||||
static struct clk_regmap *video_cc_milos_clocks[] = {
|
||||
[VIDEO_CC_AHB_CLK_SRC] = &video_cc_ahb_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_CLK] = &video_cc_mvs0_clk.clkr,
|
||||
[VIDEO_CC_MVS0_CLK_SRC] = &video_cc_mvs0_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_DIV_CLK_SRC] = &video_cc_mvs0_div_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_SHIFT_CLK] = &video_cc_mvs0_shift_clk.clkr,
|
||||
[VIDEO_CC_MVS0C_CLK] = &video_cc_mvs0c_clk.clkr,
|
||||
[VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC] = &video_cc_mvs0c_div2_div_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0C_SHIFT_CLK] = &video_cc_mvs0c_shift_clk.clkr,
|
||||
[VIDEO_CC_PLL0] = &video_cc_pll0.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
|
||||
[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr,
|
||||
};
|
||||
|
||||
static struct gdsc *video_cc_milos_gdscs[] = {
|
||||
[VIDEO_CC_MVS0C_GDSC] = &video_cc_mvs0c_gdsc,
|
||||
[VIDEO_CC_MVS0_GDSC] = &video_cc_mvs0_gdsc,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map video_cc_milos_resets[] = {
|
||||
[VIDEO_CC_INTERFACE_BCR] = { 0x80f0 },
|
||||
[VIDEO_CC_MVS0_BCR] = { 0x80a0 },
|
||||
[VIDEO_CC_MVS0C_CLK_ARES] = { 0x8064, 2 },
|
||||
[VIDEO_CC_MVS0C_BCR] = { 0x8048 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *video_cc_milos_plls[] = {
|
||||
&video_cc_pll0,
|
||||
};
|
||||
|
||||
static u32 video_cc_milos_critical_cbcrs[] = {
|
||||
0x80f4, /* VIDEO_CC_AHB_CLK */
|
||||
0x8140, /* VIDEO_CC_SLEEP_CLK */
|
||||
0x8124, /* VIDEO_CC_XO_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config video_cc_milos_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x9f50,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data video_cc_milos_driver_data = {
|
||||
.alpha_plls = video_cc_milos_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(video_cc_milos_plls),
|
||||
.clk_cbcrs = video_cc_milos_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(video_cc_milos_critical_cbcrs),
|
||||
};
|
||||
|
||||
static struct qcom_cc_desc video_cc_milos_desc = {
|
||||
.config = &video_cc_milos_regmap_config,
|
||||
.clks = video_cc_milos_clocks,
|
||||
.num_clks = ARRAY_SIZE(video_cc_milos_clocks),
|
||||
.resets = video_cc_milos_resets,
|
||||
.num_resets = ARRAY_SIZE(video_cc_milos_resets),
|
||||
.gdscs = video_cc_milos_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(video_cc_milos_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &video_cc_milos_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_milos_match_table[] = {
|
||||
{ .compatible = "qcom,milos-videocc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, video_cc_milos_match_table);
|
||||
|
||||
static int video_cc_milos_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &video_cc_milos_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_milos_driver = {
|
||||
.probe = video_cc_milos_probe,
|
||||
.driver = {
|
||||
.name = "video_cc-milos",
|
||||
.of_match_table = video_cc_milos_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(video_cc_milos_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI VIDEO_CC Milos Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
338
drivers/clk/qcom/videocc-qcs615.c
Normal file
338
drivers/clk/qcom/videocc-qcs615.c
Normal file
|
|
@ -0,0 +1,338 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,qcs615-videocc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-pll.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
#include "common.h"
|
||||
#include "gdsc.h"
|
||||
#include "reset.h"
|
||||
|
||||
enum {
|
||||
DT_BI_TCXO,
|
||||
DT_SLEEP_CLK,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_SLEEP_CLK,
|
||||
P_VIDEO_PLL0_OUT_AUX,
|
||||
P_VIDEO_PLL0_OUT_AUX2,
|
||||
P_VIDEO_PLL0_OUT_MAIN,
|
||||
};
|
||||
|
||||
static const struct pll_vco video_cc_pll0_vco[] = {
|
||||
{ 500000000, 1000000000, 2 },
|
||||
};
|
||||
|
||||
/* 600MHz configuration VCO - 2 */
|
||||
static struct alpha_pll_config video_pll0_config = {
|
||||
.l = 0x1f,
|
||||
.alpha_hi = 0x40,
|
||||
.alpha = 0x00,
|
||||
.alpha_en_mask = BIT(24),
|
||||
.vco_val = BIT(21),
|
||||
.vco_mask = GENMASK(21, 20),
|
||||
.main_output_mask = BIT(0),
|
||||
.config_ctl_val = 0x4001055b,
|
||||
.test_ctl_hi_val = 0x1,
|
||||
.test_ctl_hi_mask = 0x1,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll video_pll0 = {
|
||||
.offset = 0x42c,
|
||||
.config = &video_pll0_config,
|
||||
.vco_table = video_cc_pll0_vco,
|
||||
.num_vco = ARRAY_SIZE(video_cc_pll0_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
|
||||
.clkr = {
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_pll0",
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_slew_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_0[] = {
|
||||
{ P_SLEEP_CLK, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_0_ao[] = {
|
||||
{ .index = DT_SLEEP_CLK },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_1[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_VIDEO_PLL0_OUT_MAIN, 1 },
|
||||
{ P_VIDEO_PLL0_OUT_AUX, 2 },
|
||||
{ P_VIDEO_PLL0_OUT_AUX2, 3 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_1[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &video_pll0.clkr.hw },
|
||||
{ .hw = &video_pll0.clkr.hw },
|
||||
{ .hw = &video_pll0.clkr.hw },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
|
||||
F(32000, P_SLEEP_CLK, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_sleep_clk_src = {
|
||||
.cmd_rcgr = 0xaf8,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_video_cc_sleep_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_sleep_clk_src",
|
||||
.parent_data = video_cc_parent_data_0_ao,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_0_ao),
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_venus_clk_src[] = {
|
||||
F(19200000, P_BI_TCXO, 1, 0, 0),
|
||||
F(133333333, P_VIDEO_PLL0_OUT_MAIN, 4.5, 0, 0),
|
||||
F(240000000, P_VIDEO_PLL0_OUT_MAIN, 2.5, 0, 0),
|
||||
F(300000000, P_VIDEO_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
F(380000000, P_VIDEO_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
F(410000000, P_VIDEO_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
F(460000000, P_VIDEO_PLL0_OUT_MAIN, 2, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_venus_clk_src = {
|
||||
.cmd_rcgr = 0x7f0,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_video_cc_venus_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_venus_clk_src",
|
||||
.parent_data = video_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_sleep_clk = {
|
||||
.halt_reg = 0xb18,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0xb18,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "video_cc_sleep_clk",
|
||||
.parent_data = &(const struct clk_parent_data){
|
||||
.hw = &video_cc_sleep_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_vcodec0_axi_clk = {
|
||||
.halt_reg = 0x8f0,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8f0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_vcodec0_axi_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_vcodec0_core_clk = {
|
||||
.halt_reg = 0x890,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x890,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_vcodec0_core_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_venus_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_venus_ahb_clk = {
|
||||
.halt_reg = 0x9b0,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x9b0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_venus_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_venus_ctl_axi_clk = {
|
||||
.halt_reg = 0x8d0,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8d0,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_venus_ctl_axi_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_venus_ctl_core_clk = {
|
||||
.halt_reg = 0x850,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x850,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_venus_ctl_core_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_venus_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc vcodec0_gdsc = {
|
||||
.gdscr = 0x874,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x6,
|
||||
.pd = {
|
||||
.name = "vcodec0_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct gdsc venus_gdsc = {
|
||||
.gdscr = 0x814,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x6,
|
||||
.pd = {
|
||||
.name = "venus_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = POLL_CFG_GDSCR,
|
||||
};
|
||||
|
||||
static struct clk_regmap *video_cc_qcs615_clocks[] = {
|
||||
[VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
|
||||
[VIDEO_CC_VCODEC0_AXI_CLK] = &video_cc_vcodec0_axi_clk.clkr,
|
||||
[VIDEO_CC_VCODEC0_CORE_CLK] = &video_cc_vcodec0_core_clk.clkr,
|
||||
[VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr,
|
||||
[VIDEO_CC_VENUS_CLK_SRC] = &video_cc_venus_clk_src.clkr,
|
||||
[VIDEO_CC_VENUS_CTL_AXI_CLK] = &video_cc_venus_ctl_axi_clk.clkr,
|
||||
[VIDEO_CC_VENUS_CTL_CORE_CLK] = &video_cc_venus_ctl_core_clk.clkr,
|
||||
[VIDEO_PLL0] = &video_pll0.clkr,
|
||||
};
|
||||
|
||||
static struct gdsc *video_cc_qcs615_gdscs[] = {
|
||||
[VCODEC0_GDSC] = &vcodec0_gdsc,
|
||||
[VENUS_GDSC] = &venus_gdsc,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map video_cc_qcs615_resets[] = {
|
||||
[VIDEO_CC_INTERFACE_BCR] = { 0x8b0 },
|
||||
[VIDEO_CC_VCODEC0_BCR] = { 0x870 },
|
||||
[VIDEO_CC_VENUS_BCR] = { 0x810 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *video_cc_qcs615_plls[] = {
|
||||
&video_pll0,
|
||||
};
|
||||
|
||||
static u32 video_cc_qcs615_critical_cbcrs[] = {
|
||||
0xab8, /* VIDEO_CC_XO_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config video_cc_qcs615_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0xb94,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data video_cc_qcs615_driver_data = {
|
||||
.alpha_plls = video_cc_qcs615_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(video_cc_qcs615_plls),
|
||||
.clk_cbcrs = video_cc_qcs615_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(video_cc_qcs615_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_qcs615_desc = {
|
||||
.config = &video_cc_qcs615_regmap_config,
|
||||
.clks = video_cc_qcs615_clocks,
|
||||
.num_clks = ARRAY_SIZE(video_cc_qcs615_clocks),
|
||||
.resets = video_cc_qcs615_resets,
|
||||
.num_resets = ARRAY_SIZE(video_cc_qcs615_resets),
|
||||
.gdscs = video_cc_qcs615_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(video_cc_qcs615_gdscs),
|
||||
.driver_data = &video_cc_qcs615_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_qcs615_match_table[] = {
|
||||
{ .compatible = "qcom,qcs615-videocc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, video_cc_qcs615_match_table);
|
||||
|
||||
static int video_cc_qcs615_probe(struct platform_device *pdev)
|
||||
{
|
||||
return qcom_cc_probe(pdev, &video_cc_qcs615_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_qcs615_driver = {
|
||||
.probe = video_cc_qcs615_probe,
|
||||
.driver = {
|
||||
.name = "videocc-qcs615",
|
||||
.of_match_table = video_cc_qcs615_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(video_cc_qcs615_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI VIDEOCC QCS615 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -166,7 +166,7 @@ static struct gdsc vcodec0_gdsc = {
|
|||
.pd = {
|
||||
.name = "vcodec0_gdsc",
|
||||
},
|
||||
.flags = HW_CTRL,
|
||||
.flags = HW_CTRL_TRIGGER,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ static struct gdsc vcodec0_gdsc = {
|
|||
},
|
||||
.cxcs = (unsigned int []){ 0x890, 0x930 },
|
||||
.cxc_count = 2,
|
||||
.flags = HW_CTRL | POLL_CFG_GDSCR,
|
||||
.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
@ -271,7 +271,7 @@ static struct gdsc vcodec1_gdsc = {
|
|||
},
|
||||
.cxcs = (unsigned int []){ 0x8d0, 0x950 },
|
||||
.cxc_count = 2,
|
||||
.flags = HW_CTRL | POLL_CFG_GDSCR,
|
||||
.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
|
|||
355
drivers/clk/qcom/videocc-sm6350.c
Normal file
355
drivers/clk/qcom/videocc-sm6350.c
Normal file
|
|
@ -0,0 +1,355 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm6350-videocc.h>
|
||||
|
||||
#include "clk-alpha-pll.h"
|
||||
#include "clk-branch.h"
|
||||
#include "clk-rcg.h"
|
||||
#include "clk-regmap.h"
|
||||
#include "common.h"
|
||||
#include "gdsc.h"
|
||||
|
||||
enum {
|
||||
DT_IFACE,
|
||||
DT_BI_TCXO,
|
||||
DT_SLEEP_CLK,
|
||||
};
|
||||
|
||||
enum {
|
||||
P_BI_TCXO,
|
||||
P_CHIP_SLEEP_CLK,
|
||||
P_VIDEO_PLL0_OUT_EVEN,
|
||||
};
|
||||
|
||||
static const struct pll_vco fabia_vco[] = {
|
||||
{ 125000000, 1000000000, 1 },
|
||||
};
|
||||
|
||||
/* 600 MHz */
|
||||
static const struct alpha_pll_config video_pll0_config = {
|
||||
.l = 0x1f,
|
||||
.alpha = 0x4000,
|
||||
.config_ctl_val = 0x20485699,
|
||||
.config_ctl_hi_val = 0x00002067,
|
||||
.test_ctl_val = 0x40000000,
|
||||
.test_ctl_hi_val = 0x00000002,
|
||||
.user_ctl_val = 0x00000101,
|
||||
.user_ctl_hi_val = 0x00004005,
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll video_pll0 = {
|
||||
.offset = 0x0,
|
||||
.vco_table = fabia_vco,
|
||||
.num_vco = ARRAY_SIZE(fabia_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
|
||||
.clkr = {
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_pll0",
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.index = DT_BI_TCXO,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.ops = &clk_alpha_pll_fabia_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct clk_div_table post_div_table_video_pll0_out_even[] = {
|
||||
{ 0x1, 2 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll_postdiv video_pll0_out_even = {
|
||||
.offset = 0x0,
|
||||
.post_div_shift = 8,
|
||||
.post_div_table = post_div_table_video_pll0_out_even,
|
||||
.num_post_div = ARRAY_SIZE(post_div_table_video_pll0_out_even),
|
||||
.width = 4,
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_pll0_out_even",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_pll0.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_alpha_pll_postdiv_fabia_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_0[] = {
|
||||
{ P_BI_TCXO, 0 },
|
||||
{ P_VIDEO_PLL0_OUT_EVEN, 3 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_0[] = {
|
||||
{ .index = DT_BI_TCXO },
|
||||
{ .hw = &video_pll0_out_even.clkr.hw },
|
||||
};
|
||||
|
||||
static const struct parent_map video_cc_parent_map_1[] = {
|
||||
{ P_CHIP_SLEEP_CLK, 0 },
|
||||
};
|
||||
|
||||
static const struct clk_parent_data video_cc_parent_data_1[] = {
|
||||
{ .index = DT_SLEEP_CLK },
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_iris_clk_src[] = {
|
||||
F(133250000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
|
||||
F(240000000, P_VIDEO_PLL0_OUT_EVEN, 1.5, 0, 0),
|
||||
F(300000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(380000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
F(460000000, P_VIDEO_PLL0_OUT_EVEN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_iris_clk_src = {
|
||||
.cmd_rcgr = 0x1000,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_0,
|
||||
.freq_tbl = ftbl_video_cc_iris_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_iris_clk_src",
|
||||
.parent_data = video_cc_parent_data_0,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_0),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
|
||||
F(32764, P_CHIP_SLEEP_CLK, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_sleep_clk_src = {
|
||||
.cmd_rcgr = 0x701c,
|
||||
.mnd_width = 0,
|
||||
.hid_width = 5,
|
||||
.parent_map = video_cc_parent_map_1,
|
||||
.freq_tbl = ftbl_video_cc_sleep_clk_src,
|
||||
.clkr.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_sleep_clk_src",
|
||||
.parent_data = video_cc_parent_data_1,
|
||||
.num_parents = ARRAY_SIZE(video_cc_parent_data_1),
|
||||
.ops = &clk_rcg2_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_iris_ahb_clk = {
|
||||
.halt_reg = 0x5004,
|
||||
.halt_check = BRANCH_VOTED,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_iris_ahb_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_iris_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0_axi_clk = {
|
||||
.halt_reg = 0x800c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x800c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_axi_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvs0_core_clk = {
|
||||
.halt_reg = 0x3010,
|
||||
.halt_check = BRANCH_VOTED,
|
||||
.hwcg_reg = 0x3010,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x3010,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvs0_core_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_iris_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvsc_core_clk = {
|
||||
.halt_reg = 0x2014,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x2014,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvsc_core_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_iris_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_mvsc_ctl_axi_clk = {
|
||||
.halt_reg = 0x8004,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x8004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_mvsc_ctl_axi_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_sleep_clk = {
|
||||
.halt_reg = 0x7034,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x7034,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_sleep_clk",
|
||||
.parent_hws = (const struct clk_hw*[]) {
|
||||
&video_cc_sleep_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch video_cc_venus_ahb_clk = {
|
||||
.halt_reg = 0x801c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x801c,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "video_cc_venus_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct gdsc mvsc_gdsc = {
|
||||
.gdscr = 0x2004,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x6,
|
||||
.pd = {
|
||||
.name = "mvsc_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
static struct gdsc mvs0_gdsc = {
|
||||
.gdscr = 0x3004,
|
||||
.en_rest_wait_val = 0x2,
|
||||
.en_few_wait_val = 0x2,
|
||||
.clk_dis_wait_val = 0x6,
|
||||
.pd = {
|
||||
.name = "mvs0_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = HW_CTRL_TRIGGER,
|
||||
};
|
||||
|
||||
static struct gdsc *video_cc_sm6350_gdscs[] = {
|
||||
[MVSC_GDSC] = &mvsc_gdsc,
|
||||
[MVS0_GDSC] = &mvs0_gdsc,
|
||||
};
|
||||
|
||||
static struct clk_regmap *video_cc_sm6350_clocks[] = {
|
||||
[VIDEO_CC_IRIS_AHB_CLK] = &video_cc_iris_ahb_clk.clkr,
|
||||
[VIDEO_CC_IRIS_CLK_SRC] = &video_cc_iris_clk_src.clkr,
|
||||
[VIDEO_CC_MVS0_AXI_CLK] = &video_cc_mvs0_axi_clk.clkr,
|
||||
[VIDEO_CC_MVS0_CORE_CLK] = &video_cc_mvs0_core_clk.clkr,
|
||||
[VIDEO_CC_MVSC_CORE_CLK] = &video_cc_mvsc_core_clk.clkr,
|
||||
[VIDEO_CC_MVSC_CTL_AXI_CLK] = &video_cc_mvsc_ctl_axi_clk.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
|
||||
[VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
|
||||
[VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr,
|
||||
[VIDEO_PLL0] = &video_pll0.clkr,
|
||||
[VIDEO_PLL0_OUT_EVEN] = &video_pll0_out_even.clkr,
|
||||
};
|
||||
|
||||
static const struct regmap_config video_cc_sm6350_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0xb000,
|
||||
.fast_io = true,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_sm6350_desc = {
|
||||
.config = &video_cc_sm6350_regmap_config,
|
||||
.clks = video_cc_sm6350_clocks,
|
||||
.num_clks = ARRAY_SIZE(video_cc_sm6350_clocks),
|
||||
.gdscs = video_cc_sm6350_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(video_cc_sm6350_gdscs),
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_sm6350_match_table[] = {
|
||||
{ .compatible = "qcom,sm6350-videocc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, video_cc_sm6350_match_table);
|
||||
|
||||
static int video_cc_sm6350_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &video_cc_sm6350_desc);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
clk_fabia_pll_configure(&video_pll0, regmap, &video_pll0_config);
|
||||
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x7018); /* VIDEO_CC_XO_CLK */
|
||||
|
||||
return qcom_cc_really_probe(&pdev->dev, &video_cc_sm6350_desc, regmap);
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_sm6350_driver = {
|
||||
.probe = video_cc_sm6350_probe,
|
||||
.driver = {
|
||||
.name = "video_cc-sm6350",
|
||||
.of_match_table = video_cc_sm6350_match_table,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(video_cc_sm6350_driver);
|
||||
|
||||
MODULE_DESCRIPTION("QTI VIDEO_CC SM6350 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -271,7 +271,7 @@ static struct gdsc vcodec0_gdsc = {
|
|||
},
|
||||
.cxcs = (unsigned int []){ 0x890, 0x9ec },
|
||||
.cxc_count = 2,
|
||||
.flags = HW_CTRL | POLL_CFG_GDSCR,
|
||||
.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
@ -282,7 +282,7 @@ static struct gdsc vcodec1_gdsc = {
|
|||
},
|
||||
.cxcs = (unsigned int []){ 0x8d0, 0xa0c },
|
||||
.cxc_count = 2,
|
||||
.flags = HW_CTRL | POLL_CFG_GDSCR,
|
||||
.flags = HW_CTRL_TRIGGER | POLL_CFG_GDSCR,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ static struct gdsc vcodec0_gdsc = {
|
|||
.pd = {
|
||||
.name = "vcodec0_gdsc",
|
||||
},
|
||||
.flags = HW_CTRL,
|
||||
.flags = HW_CTRL_TRIGGER,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ static struct gdsc vcodec1_gdsc = {
|
|||
.pd = {
|
||||
.name = "vcodec1_gdsc",
|
||||
},
|
||||
.flags = HW_CTRL,
|
||||
.flags = HW_CTRL_TRIGGER,
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
};
|
||||
static struct clk_regmap *video_cc_sm8150_clocks[] = {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm8450-videocc.h>
|
||||
|
|
@ -63,6 +62,7 @@ static const struct alpha_pll_config sm8475_video_cc_pll0_config = {
|
|||
|
||||
static struct clk_alpha_pll video_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &video_cc_pll0_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -106,6 +106,7 @@ static const struct alpha_pll_config sm8475_video_cc_pll1_config = {
|
|||
|
||||
static struct clk_alpha_pll video_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.config = &video_cc_pll1_config,
|
||||
.vco_table = lucid_evo_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_evo_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
|
||||
|
|
@ -347,7 +348,7 @@ static struct gdsc video_cc_mvs0_gdsc = {
|
|||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.parent = &video_cc_mvs0c_gdsc.pd,
|
||||
.flags = RETAIN_FF_ENABLE | HW_CTRL,
|
||||
.flags = HW_CTRL_TRIGGER | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct gdsc video_cc_mvs1c_gdsc = {
|
||||
|
|
@ -372,7 +373,7 @@ static struct gdsc video_cc_mvs1_gdsc = {
|
|||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.parent = &video_cc_mvs1c_gdsc.pd,
|
||||
.flags = RETAIN_FF_ENABLE | HW_CTRL,
|
||||
.flags = HW_CTRL_TRIGGER | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
static struct clk_regmap *video_cc_sm8450_clocks[] = {
|
||||
|
|
@ -407,6 +408,17 @@ static const struct qcom_reset_map video_cc_sm8450_resets[] = {
|
|||
[VIDEO_CC_MVS1C_CLK_ARES] = { .reg = 0x808c, .bit = 2, .udelay = 1000 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *video_cc_sm8450_plls[] = {
|
||||
&video_cc_pll0,
|
||||
&video_cc_pll1,
|
||||
};
|
||||
|
||||
static u32 video_cc_sm8450_critical_cbcrs[] = {
|
||||
0x80e4, /* VIDEO_CC_AHB_CLK */
|
||||
0x8114, /* VIDEO_CC_XO_CLK */
|
||||
0x8130, /* VIDEO_CC_SLEEP_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config video_cc_sm8450_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
|
|
@ -415,6 +427,13 @@ static const struct regmap_config video_cc_sm8450_regmap_config = {
|
|||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data video_cc_sm8450_driver_data = {
|
||||
.alpha_plls = video_cc_sm8450_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(video_cc_sm8450_plls),
|
||||
.clk_cbcrs = video_cc_sm8450_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(video_cc_sm8450_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_sm8450_desc = {
|
||||
.config = &video_cc_sm8450_regmap_config,
|
||||
.clks = video_cc_sm8450_clocks,
|
||||
|
|
@ -423,6 +442,8 @@ static const struct qcom_cc_desc video_cc_sm8450_desc = {
|
|||
.num_resets = ARRAY_SIZE(video_cc_sm8450_resets),
|
||||
.gdscs = video_cc_sm8450_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(video_cc_sm8450_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &video_cc_sm8450_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_sm8450_match_table[] = {
|
||||
|
|
@ -434,23 +455,6 @@ MODULE_DEVICE_TABLE(of, video_cc_sm8450_match_table);
|
|||
|
||||
static int video_cc_sm8450_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &video_cc_sm8450_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
pm_runtime_put(&pdev->dev);
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(pdev->dev.of_node, "qcom,sm8475-videocc")) {
|
||||
/* Update VideoCC PLL0 */
|
||||
video_cc_pll0.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE];
|
||||
|
|
@ -458,23 +462,11 @@ static int video_cc_sm8450_probe(struct platform_device *pdev)
|
|||
/* Update VideoCC PLL1 */
|
||||
video_cc_pll1.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE];
|
||||
|
||||
clk_lucid_ole_pll_configure(&video_cc_pll0, regmap, &sm8475_video_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&video_cc_pll1, regmap, &sm8475_video_cc_pll1_config);
|
||||
} else {
|
||||
clk_lucid_evo_pll_configure(&video_cc_pll0, regmap, &video_cc_pll0_config);
|
||||
clk_lucid_evo_pll_configure(&video_cc_pll1, regmap, &video_cc_pll1_config);
|
||||
video_cc_pll0.config = &sm8475_video_cc_pll0_config;
|
||||
video_cc_pll1.config = &sm8475_video_cc_pll1_config;
|
||||
}
|
||||
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x80e4); /* VIDEO_CC_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x8130); /* VIDEO_CC_SLEEP_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x8114); /* VIDEO_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(&pdev->dev, &video_cc_sm8450_desc, regmap);
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
return qcom_cc_probe(pdev, &video_cc_sm8450_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_sm8450_driver = {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,sm8650-videocc.h>
|
||||
|
|
@ -51,6 +50,7 @@ static struct alpha_pll_config video_cc_pll0_config = {
|
|||
|
||||
static struct clk_alpha_pll video_cc_pll0 = {
|
||||
.offset = 0x0,
|
||||
.config = &video_cc_pll0_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -82,6 +82,7 @@ static struct alpha_pll_config video_cc_pll1_config = {
|
|||
|
||||
static struct clk_alpha_pll video_cc_pll1 = {
|
||||
.offset = 0x1000,
|
||||
.config = &video_cc_pll1_config,
|
||||
.vco_table = lucid_ole_vco,
|
||||
.num_vco = ARRAY_SIZE(lucid_ole_vco),
|
||||
.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE],
|
||||
|
|
@ -144,6 +145,16 @@ static const struct freq_tbl ftbl_video_cc_mvs0_clk_src_sm8650[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_mvs0_clk_src_x1e80100[] = {
|
||||
F(576000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(720000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1014000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1098000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1332000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
F(1443000000, P_VIDEO_CC_PLL0_OUT_MAIN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_mvs0_clk_src = {
|
||||
.cmd_rcgr = 0x8000,
|
||||
.mnd_width = 0,
|
||||
|
|
@ -176,6 +187,15 @@ static const struct freq_tbl ftbl_video_cc_mvs1_clk_src_sm8650[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static const struct freq_tbl ftbl_video_cc_mvs1_clk_src_x1e80100[] = {
|
||||
F(840000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
F(1050000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
F(1350000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
F(1500000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
F(1650000000, P_VIDEO_CC_PLL1_OUT_MAIN, 1, 0, 0),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct clk_rcg2 video_cc_mvs1_clk_src = {
|
||||
.cmd_rcgr = 0x8018,
|
||||
.mnd_width = 0,
|
||||
|
|
@ -511,6 +531,23 @@ static const struct qcom_reset_map video_cc_sm8550_resets[] = {
|
|||
[VIDEO_CC_XO_CLK_ARES] = { .reg = 0x8124, .bit = 2, .udelay = 100 },
|
||||
};
|
||||
|
||||
static struct clk_alpha_pll *video_cc_sm8550_plls[] = {
|
||||
&video_cc_pll0,
|
||||
&video_cc_pll1,
|
||||
};
|
||||
|
||||
static u32 video_cc_sm8550_critical_cbcrs[] = {
|
||||
0x80f4, /* VIDEO_CC_AHB_CLK */
|
||||
0x8124, /* VIDEO_CC_XO_CLK */
|
||||
0x8140, /* VIDEO_CC_SLEEP_CLK */
|
||||
};
|
||||
|
||||
static u32 video_cc_sm8650_critical_cbcrs[] = {
|
||||
0x80f4, /* VIDEO_CC_AHB_CLK */
|
||||
0x8124, /* VIDEO_CC_XO_CLK */
|
||||
0x8150, /* VIDEO_CC_SLEEP_CLK */
|
||||
};
|
||||
|
||||
static const struct regmap_config video_cc_sm8550_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
|
|
@ -519,6 +556,13 @@ static const struct regmap_config video_cc_sm8550_regmap_config = {
|
|||
.fast_io = true,
|
||||
};
|
||||
|
||||
static struct qcom_cc_driver_data video_cc_sm8550_driver_data = {
|
||||
.alpha_plls = video_cc_sm8550_plls,
|
||||
.num_alpha_plls = ARRAY_SIZE(video_cc_sm8550_plls),
|
||||
.clk_cbcrs = video_cc_sm8550_critical_cbcrs,
|
||||
.num_clk_cbcrs = ARRAY_SIZE(video_cc_sm8550_critical_cbcrs),
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc video_cc_sm8550_desc = {
|
||||
.config = &video_cc_sm8550_regmap_config,
|
||||
.clks = video_cc_sm8550_clocks,
|
||||
|
|
@ -527,37 +571,30 @@ static const struct qcom_cc_desc video_cc_sm8550_desc = {
|
|||
.num_resets = ARRAY_SIZE(video_cc_sm8550_resets),
|
||||
.gdscs = video_cc_sm8550_gdscs,
|
||||
.num_gdscs = ARRAY_SIZE(video_cc_sm8550_gdscs),
|
||||
.use_rpm = true,
|
||||
.driver_data = &video_cc_sm8550_driver_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id video_cc_sm8550_match_table[] = {
|
||||
{ .compatible = "qcom,sm8550-videocc" },
|
||||
{ .compatible = "qcom,sm8650-videocc" },
|
||||
{ .compatible = "qcom,x1e80100-videocc" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, video_cc_sm8550_match_table);
|
||||
|
||||
static int video_cc_sm8550_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
u32 sleep_clk_offset = 0x8140;
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap = qcom_cc_map(pdev, &video_cc_sm8550_desc);
|
||||
if (IS_ERR(regmap)) {
|
||||
pm_runtime_put(&pdev->dev);
|
||||
return PTR_ERR(regmap);
|
||||
if (of_device_is_compatible(pdev->dev.of_node, "qcom,x1e80100-videocc")) {
|
||||
video_cc_pll0_config.l = 0x1e;
|
||||
video_cc_pll0_config.alpha = 0x0000;
|
||||
video_cc_pll1_config.l = 0x2b;
|
||||
video_cc_pll1_config.alpha = 0xc000;
|
||||
video_cc_mvs0_clk_src.freq_tbl = ftbl_video_cc_mvs0_clk_src_x1e80100;
|
||||
video_cc_mvs1_clk_src.freq_tbl = ftbl_video_cc_mvs1_clk_src_x1e80100;
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(pdev->dev.of_node, "qcom,sm8650-videocc")) {
|
||||
sleep_clk_offset = 0x8150;
|
||||
video_cc_pll0_config.l = 0x1e;
|
||||
video_cc_pll0_config.alpha = 0xa000;
|
||||
video_cc_pll1_config.l = 0x2b;
|
||||
|
|
@ -569,21 +606,13 @@ static int video_cc_sm8550_probe(struct platform_device *pdev)
|
|||
video_cc_sm8550_clocks[VIDEO_CC_MVS1_SHIFT_CLK] = &video_cc_mvs1_shift_clk.clkr;
|
||||
video_cc_sm8550_clocks[VIDEO_CC_MVS1C_SHIFT_CLK] = &video_cc_mvs1c_shift_clk.clkr;
|
||||
video_cc_sm8550_clocks[VIDEO_CC_XO_CLK_SRC] = &video_cc_xo_clk_src.clkr;
|
||||
|
||||
video_cc_sm8550_driver_data.clk_cbcrs = video_cc_sm8650_critical_cbcrs;
|
||||
video_cc_sm8550_driver_data.num_clk_cbcrs =
|
||||
ARRAY_SIZE(video_cc_sm8650_critical_cbcrs);
|
||||
}
|
||||
|
||||
clk_lucid_ole_pll_configure(&video_cc_pll0, regmap, &video_cc_pll0_config);
|
||||
clk_lucid_ole_pll_configure(&video_cc_pll1, regmap, &video_cc_pll1_config);
|
||||
|
||||
/* Keep some clocks always-on */
|
||||
qcom_branch_set_clk_en(regmap, 0x80f4); /* VIDEO_CC_AHB_CLK */
|
||||
qcom_branch_set_clk_en(regmap, sleep_clk_offset); /* VIDEO_CC_SLEEP_CLK */
|
||||
qcom_branch_set_clk_en(regmap, 0x8124); /* VIDEO_CC_XO_CLK */
|
||||
|
||||
ret = qcom_cc_really_probe(&pdev->dev, &video_cc_sm8550_desc, regmap);
|
||||
|
||||
pm_runtime_put(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
return qcom_cc_probe(pdev, &video_cc_sm8550_desc);
|
||||
}
|
||||
|
||||
static struct platform_driver video_cc_sm8550_driver = {
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ static struct rockchip_pll_rate_table rk3568_pll_rates[] = {
|
|||
RK3036_PLL_RATE(200000000, 1, 100, 3, 4, 1, 0),
|
||||
RK3036_PLL_RATE(148500000, 1, 99, 4, 4, 1, 0),
|
||||
RK3036_PLL_RATE(135000000, 2, 45, 4, 1, 1, 0),
|
||||
RK3036_PLL_RATE(132000000, 1, 66, 6, 2, 1, 0),
|
||||
RK3036_PLL_RATE(128000000, 1, 16, 3, 1, 1, 0),
|
||||
RK3036_PLL_RATE(126400000, 1, 79, 5, 3, 1, 0),
|
||||
RK3036_PLL_RATE(119000000, 3, 119, 4, 2, 1, 0),
|
||||
|
|
|
|||
|
|
@ -42,8 +42,9 @@ struct ccu_common {
|
|||
};
|
||||
|
||||
struct ccu_mux {
|
||||
struct ccu_internal mux;
|
||||
struct ccu_common common;
|
||||
int clkid;
|
||||
u32 reg;
|
||||
struct clk_mux mux;
|
||||
};
|
||||
|
||||
struct ccu_gate {
|
||||
|
|
@ -75,6 +76,17 @@ struct ccu_pll {
|
|||
.flags = _flags, \
|
||||
}
|
||||
|
||||
#define TH_CCU_MUX(_name, _parents, _shift, _width) \
|
||||
{ \
|
||||
.mask = GENMASK(_width - 1, 0), \
|
||||
.shift = _shift, \
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA( \
|
||||
_name, \
|
||||
_parents, \
|
||||
&clk_mux_ops, \
|
||||
0), \
|
||||
}
|
||||
|
||||
#define CCU_GATE(_clkid, _struct, _name, _parent, _reg, _gate, _flags) \
|
||||
struct ccu_gate _struct = { \
|
||||
.enable = _gate, \
|
||||
|
|
@ -94,13 +106,6 @@ static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw)
|
|||
return container_of(hw, struct ccu_common, hw);
|
||||
}
|
||||
|
||||
static inline struct ccu_mux *hw_to_ccu_mux(struct clk_hw *hw)
|
||||
{
|
||||
struct ccu_common *common = hw_to_ccu_common(hw);
|
||||
|
||||
return container_of(common, struct ccu_mux, common);
|
||||
}
|
||||
|
||||
static inline struct ccu_pll *hw_to_ccu_pll(struct clk_hw *hw)
|
||||
{
|
||||
struct ccu_common *common = hw_to_ccu_common(hw);
|
||||
|
|
@ -415,32 +420,20 @@ static const struct clk_parent_data c910_i0_parents[] = {
|
|||
};
|
||||
|
||||
static struct ccu_mux c910_i0_clk = {
|
||||
.mux = TH_CCU_ARG(1, 1),
|
||||
.common = {
|
||||
.clkid = CLK_C910_I0,
|
||||
.cfg0 = 0x100,
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA("c910-i0",
|
||||
c910_i0_parents,
|
||||
&clk_mux_ops,
|
||||
0),
|
||||
}
|
||||
.clkid = CLK_C910_I0,
|
||||
.reg = 0x100,
|
||||
.mux = TH_CCU_MUX("c910-i0", c910_i0_parents, 1, 1),
|
||||
};
|
||||
|
||||
static const struct clk_parent_data c910_parents[] = {
|
||||
{ .hw = &c910_i0_clk.common.hw },
|
||||
{ .hw = &c910_i0_clk.mux.hw },
|
||||
{ .hw = &cpu_pll1_clk.common.hw }
|
||||
};
|
||||
|
||||
static struct ccu_mux c910_clk = {
|
||||
.mux = TH_CCU_ARG(0, 1),
|
||||
.common = {
|
||||
.clkid = CLK_C910,
|
||||
.cfg0 = 0x100,
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA("c910",
|
||||
c910_parents,
|
||||
&clk_mux_ops,
|
||||
0),
|
||||
}
|
||||
.clkid = CLK_C910,
|
||||
.reg = 0x100,
|
||||
.mux = TH_CCU_MUX("c910", c910_parents, 0, 1),
|
||||
};
|
||||
|
||||
static const struct clk_parent_data ahb2_cpusys_parents[] = {
|
||||
|
|
@ -582,7 +575,14 @@ static const struct clk_parent_data peri2sys_apb_pclk_pd[] = {
|
|||
{ .hw = &peri2sys_apb_pclk.common.hw }
|
||||
};
|
||||
|
||||
static CLK_FIXED_FACTOR_FW_NAME(osc12m_clk, "osc_12m", "osc_24m", 2, 1, 0);
|
||||
static struct clk_fixed_factor osc12m_clk = {
|
||||
.div = 2,
|
||||
.mult = 1,
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA("osc_12m",
|
||||
osc_24m_clk,
|
||||
&clk_fixed_factor_ops,
|
||||
0),
|
||||
};
|
||||
|
||||
static const char * const out_parents[] = { "osc_24m", "osc_12m" };
|
||||
|
||||
|
|
@ -792,11 +792,12 @@ static CCU_GATE(CLK_AON2CPU_A2X, aon2cpu_a2x_clk, "aon2cpu-a2x", axi4_cpusys2_ac
|
|||
0x134, BIT(8), 0);
|
||||
static CCU_GATE(CLK_X2X_CPUSYS, x2x_cpusys_clk, "x2x-cpusys", axi4_cpusys2_aclk_pd,
|
||||
0x134, BIT(7), 0);
|
||||
static CCU_GATE(CLK_CPU2AON_X2H, cpu2aon_x2h_clk, "cpu2aon-x2h", axi_aclk_pd, 0x138, BIT(8), 0);
|
||||
static CCU_GATE(CLK_CPU2AON_X2H, cpu2aon_x2h_clk, "cpu2aon-x2h", axi_aclk_pd,
|
||||
0x138, BIT(8), CLK_IGNORE_UNUSED);
|
||||
static CCU_GATE(CLK_CPU2PERI_X2H, cpu2peri_x2h_clk, "cpu2peri-x2h", axi4_cpusys2_aclk_pd,
|
||||
0x140, BIT(9), CLK_IGNORE_UNUSED);
|
||||
static CCU_GATE(CLK_PERISYS_APB1_HCLK, perisys_apb1_hclk, "perisys-apb1-hclk", perisys_ahb_hclk_pd,
|
||||
0x150, BIT(9), 0);
|
||||
0x150, BIT(9), CLK_IGNORE_UNUSED);
|
||||
static CCU_GATE(CLK_PERISYS_APB2_HCLK, perisys_apb2_hclk, "perisys-apb2-hclk", perisys_ahb_hclk_pd,
|
||||
0x150, BIT(10), CLK_IGNORE_UNUSED);
|
||||
static CCU_GATE(CLK_PERISYS_APB3_HCLK, perisys_apb3_hclk, "perisys-apb3-hclk", perisys_ahb_hclk_pd,
|
||||
|
|
@ -917,15 +918,9 @@ static const struct clk_parent_data uart_sclk_parents[] = {
|
|||
};
|
||||
|
||||
static struct ccu_mux uart_sclk = {
|
||||
.mux = TH_CCU_ARG(0, 1),
|
||||
.common = {
|
||||
.clkid = CLK_UART_SCLK,
|
||||
.cfg0 = 0x210,
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA("uart-sclk",
|
||||
uart_sclk_parents,
|
||||
&clk_mux_ops,
|
||||
0),
|
||||
}
|
||||
.clkid = CLK_UART_SCLK,
|
||||
.reg = 0x210,
|
||||
.mux = TH_CCU_MUX("uart-sclk", uart_sclk_parents, 0, 1),
|
||||
};
|
||||
|
||||
static struct ccu_common *th1520_pll_clks[] = {
|
||||
|
|
@ -962,10 +957,10 @@ static struct ccu_common *th1520_div_clks[] = {
|
|||
&dpu1_clk.common,
|
||||
};
|
||||
|
||||
static struct ccu_common *th1520_mux_clks[] = {
|
||||
&c910_i0_clk.common,
|
||||
&c910_clk.common,
|
||||
&uart_sclk.common,
|
||||
static struct ccu_mux *th1520_mux_clks[] = {
|
||||
&c910_i0_clk,
|
||||
&c910_clk,
|
||||
&uart_sclk,
|
||||
};
|
||||
|
||||
static struct ccu_common *th1520_gate_clks[] = {
|
||||
|
|
@ -1067,7 +1062,7 @@ static const struct regmap_config th1520_clk_regmap_config = {
|
|||
struct th1520_plat_data {
|
||||
struct ccu_common **th1520_pll_clks;
|
||||
struct ccu_common **th1520_div_clks;
|
||||
struct ccu_common **th1520_mux_clks;
|
||||
struct ccu_mux **th1520_mux_clks;
|
||||
struct ccu_common **th1520_gate_clks;
|
||||
|
||||
int nr_clks;
|
||||
|
|
@ -1154,23 +1149,15 @@ static int th1520_clk_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
for (i = 0; i < plat_data->nr_mux_clks; i++) {
|
||||
struct ccu_mux *cm = hw_to_ccu_mux(&plat_data->th1520_mux_clks[i]->hw);
|
||||
const struct clk_init_data *init = cm->common.hw.init;
|
||||
struct ccu_mux *cm = plat_data->th1520_mux_clks[i];
|
||||
|
||||
plat_data->th1520_mux_clks[i]->map = map;
|
||||
hw = devm_clk_hw_register_mux_parent_data_table(dev,
|
||||
init->name,
|
||||
init->parent_data,
|
||||
init->num_parents,
|
||||
0,
|
||||
base + cm->common.cfg0,
|
||||
cm->mux.shift,
|
||||
cm->mux.width,
|
||||
0, NULL, NULL);
|
||||
if (IS_ERR(hw))
|
||||
return PTR_ERR(hw);
|
||||
cm->mux.reg = base + cm->reg;
|
||||
|
||||
priv->hws[cm->common.clkid] = hw;
|
||||
ret = devm_clk_hw_register(dev, &cm->mux.hw);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->hws[cm->clkid] = &cm->mux.hw;
|
||||
}
|
||||
|
||||
for (i = 0; i < plat_data->nr_gate_clks; i++) {
|
||||
|
|
|
|||
13
include/dt-bindings/clock/nxp,imx94-clock.h
Normal file
13
include/dt-bindings/clock/nxp,imx94-clock.h
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright 2025 NXP
|
||||
*/
|
||||
|
||||
#ifndef __DT_BINDINGS_CLOCK_IMX94_H
|
||||
#define __DT_BINDINGS_CLOCK_IMX94_H
|
||||
|
||||
#define IMX94_CLK_DISPMIX_CLK_SEL 0
|
||||
|
||||
#define IMX94_CLK_DISPMIX_LVDS_CLK_GATE 0
|
||||
|
||||
#endif /* __DT_BINDINGS_CLOCK_IMX94_H */
|
||||
|
|
@ -249,6 +249,16 @@
|
|||
#define GCC_UFS_MEM_CLKREF_EN 239
|
||||
#define GCC_UFS_CARD_CLKREF_EN 240
|
||||
#define GPLL9 241
|
||||
#define GCC_CAMERA_AHB_CLK 242
|
||||
#define GCC_CAMERA_XO_CLK 243
|
||||
#define GCC_CPUSS_DVM_BUS_CLK 244
|
||||
#define GCC_CPUSS_GNOC_CLK 245
|
||||
#define GCC_DISP_AHB_CLK 246
|
||||
#define GCC_DISP_XO_CLK 247
|
||||
#define GCC_GPU_CFG_AHB_CLK 248
|
||||
#define GCC_NPU_CFG_AHB_CLK 249
|
||||
#define GCC_VIDEO_AHB_CLK 250
|
||||
#define GCC_VIDEO_XO_CLK 251
|
||||
|
||||
#define GCC_EMAC_BCR 0
|
||||
#define GCC_GPU_BCR 1
|
||||
|
|
|
|||
16
include/dt-bindings/clock/qcom,ipq5018-cmn-pll.h
Normal file
16
include/dt-bindings/clock/qcom,ipq5018-cmn-pll.h
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_IPQ5018_CMN_PLL_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_IPQ5018_CMN_PLL_H
|
||||
|
||||
/* CMN PLL core clock. */
|
||||
#define IPQ5018_CMN_PLL_CLK 0
|
||||
|
||||
/* The output clocks from CMN PLL of IPQ5018. */
|
||||
#define IPQ5018_XO_24MHZ_CLK 1
|
||||
#define IPQ5018_SLEEP_32KHZ_CLK 2
|
||||
#define IPQ5018_ETH_50MHZ_CLK 3
|
||||
#endif
|
||||
22
include/dt-bindings/clock/qcom,ipq5424-cmn-pll.h
Normal file
22
include/dt-bindings/clock/qcom,ipq5424-cmn-pll.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_IPQ5424_CMN_PLL_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_IPQ5424_CMN_PLL_H
|
||||
|
||||
/* CMN PLL core clock. */
|
||||
#define IPQ5424_CMN_PLL_CLK 0
|
||||
|
||||
/* The output clocks from CMN PLL of IPQ5424. */
|
||||
#define IPQ5424_XO_24MHZ_CLK 1
|
||||
#define IPQ5424_SLEEP_32KHZ_CLK 2
|
||||
#define IPQ5424_PCS_31P25MHZ_CLK 3
|
||||
#define IPQ5424_NSS_300MHZ_CLK 4
|
||||
#define IPQ5424_PPE_375MHZ_CLK 5
|
||||
#define IPQ5424_ETH0_50MHZ_CLK 6
|
||||
#define IPQ5424_ETH1_50MHZ_CLK 7
|
||||
#define IPQ5424_ETH2_50MHZ_CLK 8
|
||||
#define IPQ5424_ETH_25MHZ_CLK 9
|
||||
#endif
|
||||
131
include/dt-bindings/clock/qcom,milos-camcc.h
Normal file
131
include/dt-bindings/clock/qcom,milos-camcc.h
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_CAM_CC_MILOS_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_CAM_CC_MILOS_H
|
||||
|
||||
/* CAM_CC clocks */
|
||||
#define CAM_CC_PLL0 0
|
||||
#define CAM_CC_PLL0_OUT_EVEN 1
|
||||
#define CAM_CC_PLL0_OUT_ODD 2
|
||||
#define CAM_CC_PLL1 3
|
||||
#define CAM_CC_PLL1_OUT_EVEN 4
|
||||
#define CAM_CC_PLL2 5
|
||||
#define CAM_CC_PLL2_OUT_EVEN 6
|
||||
#define CAM_CC_PLL3 7
|
||||
#define CAM_CC_PLL3_OUT_EVEN 8
|
||||
#define CAM_CC_PLL4 9
|
||||
#define CAM_CC_PLL4_OUT_EVEN 10
|
||||
#define CAM_CC_PLL5 11
|
||||
#define CAM_CC_PLL5_OUT_EVEN 12
|
||||
#define CAM_CC_PLL6 13
|
||||
#define CAM_CC_PLL6_OUT_EVEN 14
|
||||
#define CAM_CC_BPS_AHB_CLK 15
|
||||
#define CAM_CC_BPS_AREG_CLK 16
|
||||
#define CAM_CC_BPS_CLK 17
|
||||
#define CAM_CC_BPS_CLK_SRC 18
|
||||
#define CAM_CC_CAMNOC_ATB_CLK 19
|
||||
#define CAM_CC_CAMNOC_AXI_CLK_SRC 20
|
||||
#define CAM_CC_CAMNOC_AXI_HF_CLK 21
|
||||
#define CAM_CC_CAMNOC_AXI_SF_CLK 22
|
||||
#define CAM_CC_CAMNOC_NRT_AXI_CLK 23
|
||||
#define CAM_CC_CAMNOC_RT_AXI_CLK 24
|
||||
#define CAM_CC_CCI_0_CLK 25
|
||||
#define CAM_CC_CCI_0_CLK_SRC 26
|
||||
#define CAM_CC_CCI_1_CLK 27
|
||||
#define CAM_CC_CCI_1_CLK_SRC 28
|
||||
#define CAM_CC_CORE_AHB_CLK 29
|
||||
#define CAM_CC_CPAS_AHB_CLK 30
|
||||
#define CAM_CC_CPHY_RX_CLK_SRC 31
|
||||
#define CAM_CC_CRE_AHB_CLK 32
|
||||
#define CAM_CC_CRE_CLK 33
|
||||
#define CAM_CC_CRE_CLK_SRC 34
|
||||
#define CAM_CC_CSI0PHYTIMER_CLK 35
|
||||
#define CAM_CC_CSI0PHYTIMER_CLK_SRC 36
|
||||
#define CAM_CC_CSI1PHYTIMER_CLK 37
|
||||
#define CAM_CC_CSI1PHYTIMER_CLK_SRC 38
|
||||
#define CAM_CC_CSI2PHYTIMER_CLK 39
|
||||
#define CAM_CC_CSI2PHYTIMER_CLK_SRC 40
|
||||
#define CAM_CC_CSI3PHYTIMER_CLK 41
|
||||
#define CAM_CC_CSI3PHYTIMER_CLK_SRC 42
|
||||
#define CAM_CC_CSIPHY0_CLK 43
|
||||
#define CAM_CC_CSIPHY1_CLK 44
|
||||
#define CAM_CC_CSIPHY2_CLK 45
|
||||
#define CAM_CC_CSIPHY3_CLK 46
|
||||
#define CAM_CC_FAST_AHB_CLK_SRC 47
|
||||
#define CAM_CC_GDSC_CLK 48
|
||||
#define CAM_CC_ICP_ATB_CLK 49
|
||||
#define CAM_CC_ICP_CLK 50
|
||||
#define CAM_CC_ICP_CLK_SRC 51
|
||||
#define CAM_CC_ICP_CTI_CLK 52
|
||||
#define CAM_CC_ICP_TS_CLK 53
|
||||
#define CAM_CC_MCLK0_CLK 54
|
||||
#define CAM_CC_MCLK0_CLK_SRC 55
|
||||
#define CAM_CC_MCLK1_CLK 56
|
||||
#define CAM_CC_MCLK1_CLK_SRC 57
|
||||
#define CAM_CC_MCLK2_CLK 58
|
||||
#define CAM_CC_MCLK2_CLK_SRC 59
|
||||
#define CAM_CC_MCLK3_CLK 60
|
||||
#define CAM_CC_MCLK3_CLK_SRC 61
|
||||
#define CAM_CC_MCLK4_CLK 62
|
||||
#define CAM_CC_MCLK4_CLK_SRC 63
|
||||
#define CAM_CC_OPE_0_AHB_CLK 64
|
||||
#define CAM_CC_OPE_0_AREG_CLK 65
|
||||
#define CAM_CC_OPE_0_CLK 66
|
||||
#define CAM_CC_OPE_0_CLK_SRC 67
|
||||
#define CAM_CC_SLEEP_CLK 68
|
||||
#define CAM_CC_SLEEP_CLK_SRC 69
|
||||
#define CAM_CC_SLOW_AHB_CLK_SRC 70
|
||||
#define CAM_CC_SOC_AHB_CLK 71
|
||||
#define CAM_CC_SYS_TMR_CLK 72
|
||||
#define CAM_CC_TFE_0_AHB_CLK 73
|
||||
#define CAM_CC_TFE_0_CLK 74
|
||||
#define CAM_CC_TFE_0_CLK_SRC 75
|
||||
#define CAM_CC_TFE_0_CPHY_RX_CLK 76
|
||||
#define CAM_CC_TFE_0_CSID_CLK 77
|
||||
#define CAM_CC_TFE_0_CSID_CLK_SRC 78
|
||||
#define CAM_CC_TFE_1_AHB_CLK 79
|
||||
#define CAM_CC_TFE_1_CLK 80
|
||||
#define CAM_CC_TFE_1_CLK_SRC 81
|
||||
#define CAM_CC_TFE_1_CPHY_RX_CLK 82
|
||||
#define CAM_CC_TFE_1_CSID_CLK 83
|
||||
#define CAM_CC_TFE_1_CSID_CLK_SRC 84
|
||||
#define CAM_CC_TFE_2_AHB_CLK 85
|
||||
#define CAM_CC_TFE_2_CLK 86
|
||||
#define CAM_CC_TFE_2_CLK_SRC 87
|
||||
#define CAM_CC_TFE_2_CPHY_RX_CLK 88
|
||||
#define CAM_CC_TFE_2_CSID_CLK 89
|
||||
#define CAM_CC_TFE_2_CSID_CLK_SRC 90
|
||||
#define CAM_CC_TOP_SHIFT_CLK 91
|
||||
#define CAM_CC_XO_CLK_SRC 92
|
||||
|
||||
/* CAM_CC resets */
|
||||
#define CAM_CC_BPS_BCR 0
|
||||
#define CAM_CC_CAMNOC_BCR 1
|
||||
#define CAM_CC_CAMSS_TOP_BCR 2
|
||||
#define CAM_CC_CCI_0_BCR 3
|
||||
#define CAM_CC_CCI_1_BCR 4
|
||||
#define CAM_CC_CPAS_BCR 5
|
||||
#define CAM_CC_CRE_BCR 6
|
||||
#define CAM_CC_CSI0PHY_BCR 7
|
||||
#define CAM_CC_CSI1PHY_BCR 8
|
||||
#define CAM_CC_CSI2PHY_BCR 9
|
||||
#define CAM_CC_CSI3PHY_BCR 10
|
||||
#define CAM_CC_ICP_BCR 11
|
||||
#define CAM_CC_MCLK0_BCR 12
|
||||
#define CAM_CC_MCLK1_BCR 13
|
||||
#define CAM_CC_MCLK2_BCR 14
|
||||
#define CAM_CC_MCLK3_BCR 15
|
||||
#define CAM_CC_MCLK4_BCR 16
|
||||
#define CAM_CC_OPE_0_BCR 17
|
||||
#define CAM_CC_TFE_0_BCR 18
|
||||
#define CAM_CC_TFE_1_BCR 19
|
||||
#define CAM_CC_TFE_2_BCR 20
|
||||
|
||||
/* CAM_CC power domains */
|
||||
#define CAM_CC_CAMSS_TOP_GDSC 0
|
||||
|
||||
#endif
|
||||
61
include/dt-bindings/clock/qcom,milos-dispcc.h
Normal file
61
include/dt-bindings/clock/qcom,milos-dispcc.h
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_MILOS_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_DISP_CC_MILOS_H
|
||||
|
||||
/* DISP_CC clocks */
|
||||
#define DISP_CC_PLL0 0
|
||||
#define DISP_CC_MDSS_ACCU_CLK 1
|
||||
#define DISP_CC_MDSS_AHB1_CLK 2
|
||||
#define DISP_CC_MDSS_AHB_CLK 3
|
||||
#define DISP_CC_MDSS_AHB_CLK_SRC 4
|
||||
#define DISP_CC_MDSS_BYTE0_CLK 5
|
||||
#define DISP_CC_MDSS_BYTE0_CLK_SRC 6
|
||||
#define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC 7
|
||||
#define DISP_CC_MDSS_BYTE0_INTF_CLK 8
|
||||
#define DISP_CC_MDSS_DPTX0_AUX_CLK 9
|
||||
#define DISP_CC_MDSS_DPTX0_AUX_CLK_SRC 10
|
||||
#define DISP_CC_MDSS_DPTX0_CRYPTO_CLK 11
|
||||
#define DISP_CC_MDSS_DPTX0_LINK_CLK 12
|
||||
#define DISP_CC_MDSS_DPTX0_LINK_CLK_SRC 13
|
||||
#define DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC 14
|
||||
#define DISP_CC_MDSS_DPTX0_LINK_INTF_CLK 15
|
||||
#define DISP_CC_MDSS_DPTX0_PIXEL0_CLK 16
|
||||
#define DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC 17
|
||||
#define DISP_CC_MDSS_DPTX0_PIXEL1_CLK 18
|
||||
#define DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC 19
|
||||
#define DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK 20
|
||||
#define DISP_CC_MDSS_ESC0_CLK 21
|
||||
#define DISP_CC_MDSS_ESC0_CLK_SRC 22
|
||||
#define DISP_CC_MDSS_MDP1_CLK 23
|
||||
#define DISP_CC_MDSS_MDP_CLK 24
|
||||
#define DISP_CC_MDSS_MDP_CLK_SRC 25
|
||||
#define DISP_CC_MDSS_MDP_LUT1_CLK 26
|
||||
#define DISP_CC_MDSS_MDP_LUT_CLK 27
|
||||
#define DISP_CC_MDSS_NON_GDSC_AHB_CLK 28
|
||||
#define DISP_CC_MDSS_PCLK0_CLK 29
|
||||
#define DISP_CC_MDSS_PCLK0_CLK_SRC 30
|
||||
#define DISP_CC_MDSS_RSCC_AHB_CLK 31
|
||||
#define DISP_CC_MDSS_RSCC_VSYNC_CLK 32
|
||||
#define DISP_CC_MDSS_VSYNC1_CLK 33
|
||||
#define DISP_CC_MDSS_VSYNC_CLK 34
|
||||
#define DISP_CC_MDSS_VSYNC_CLK_SRC 35
|
||||
#define DISP_CC_SLEEP_CLK 36
|
||||
#define DISP_CC_SLEEP_CLK_SRC 37
|
||||
#define DISP_CC_XO_CLK 38
|
||||
#define DISP_CC_XO_CLK_SRC 39
|
||||
|
||||
/* DISP_CC resets */
|
||||
#define DISP_CC_MDSS_CORE_BCR 0
|
||||
#define DISP_CC_MDSS_CORE_INT2_BCR 1
|
||||
#define DISP_CC_MDSS_RSCC_BCR 2
|
||||
|
||||
/* DISP_CC power domains */
|
||||
#define DISP_CC_MDSS_CORE_GDSC 0
|
||||
#define DISP_CC_MDSS_CORE_INT2_GDSC 1
|
||||
|
||||
#endif
|
||||
210
include/dt-bindings/clock/qcom,milos-gcc.h
Normal file
210
include/dt-bindings/clock/qcom,milos-gcc.h
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_GCC_MILOS_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_GCC_MILOS_H
|
||||
|
||||
/* GCC clocks */
|
||||
#define GCC_GPLL0 0
|
||||
#define GCC_GPLL0_OUT_EVEN 1
|
||||
#define GCC_GPLL2 2
|
||||
#define GCC_GPLL4 3
|
||||
#define GCC_GPLL6 4
|
||||
#define GCC_GPLL7 5
|
||||
#define GCC_GPLL9 6
|
||||
#define GCC_AGGRE_NOC_PCIE_AXI_CLK 7
|
||||
#define GCC_AGGRE_UFS_PHY_AXI_CLK 8
|
||||
#define GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK 9
|
||||
#define GCC_AGGRE_USB3_PRIM_AXI_CLK 10
|
||||
#define GCC_BOOT_ROM_AHB_CLK 11
|
||||
#define GCC_CAMERA_AHB_CLK 12
|
||||
#define GCC_CAMERA_HF_AXI_CLK 13
|
||||
#define GCC_CAMERA_HF_XO_CLK 14
|
||||
#define GCC_CAMERA_SF_AXI_CLK 15
|
||||
#define GCC_CAMERA_SF_XO_CLK 16
|
||||
#define GCC_CFG_NOC_PCIE_ANOC_AHB_CLK 17
|
||||
#define GCC_CFG_NOC_USB3_PRIM_AXI_CLK 18
|
||||
#define GCC_CNOC_PCIE_SF_AXI_CLK 19
|
||||
#define GCC_DDRSS_GPU_AXI_CLK 20
|
||||
#define GCC_DDRSS_PCIE_SF_QTB_CLK 21
|
||||
#define GCC_DISP_AHB_CLK 22
|
||||
#define GCC_DISP_GPLL0_DIV_CLK_SRC 23
|
||||
#define GCC_DISP_HF_AXI_CLK 24
|
||||
#define GCC_DISP_XO_CLK 25
|
||||
#define GCC_GP1_CLK 26
|
||||
#define GCC_GP1_CLK_SRC 27
|
||||
#define GCC_GP2_CLK 28
|
||||
#define GCC_GP2_CLK_SRC 29
|
||||
#define GCC_GP3_CLK 30
|
||||
#define GCC_GP3_CLK_SRC 31
|
||||
#define GCC_GPU_CFG_AHB_CLK 32
|
||||
#define GCC_GPU_GPLL0_CLK_SRC 33
|
||||
#define GCC_GPU_GPLL0_DIV_CLK_SRC 34
|
||||
#define GCC_GPU_MEMNOC_GFX_CLK 35
|
||||
#define GCC_GPU_SNOC_DVM_GFX_CLK 36
|
||||
#define GCC_PCIE_0_AUX_CLK 37
|
||||
#define GCC_PCIE_0_AUX_CLK_SRC 38
|
||||
#define GCC_PCIE_0_CFG_AHB_CLK 39
|
||||
#define GCC_PCIE_0_MSTR_AXI_CLK 40
|
||||
#define GCC_PCIE_0_PHY_RCHNG_CLK 41
|
||||
#define GCC_PCIE_0_PHY_RCHNG_CLK_SRC 42
|
||||
#define GCC_PCIE_0_PIPE_CLK 43
|
||||
#define GCC_PCIE_0_PIPE_CLK_SRC 44
|
||||
#define GCC_PCIE_0_PIPE_DIV2_CLK 45
|
||||
#define GCC_PCIE_0_PIPE_DIV2_CLK_SRC 46
|
||||
#define GCC_PCIE_0_SLV_AXI_CLK 47
|
||||
#define GCC_PCIE_0_SLV_Q2A_AXI_CLK 48
|
||||
#define GCC_PCIE_1_AUX_CLK 49
|
||||
#define GCC_PCIE_1_AUX_CLK_SRC 50
|
||||
#define GCC_PCIE_1_CFG_AHB_CLK 51
|
||||
#define GCC_PCIE_1_MSTR_AXI_CLK 52
|
||||
#define GCC_PCIE_1_PHY_RCHNG_CLK 53
|
||||
#define GCC_PCIE_1_PHY_RCHNG_CLK_SRC 54
|
||||
#define GCC_PCIE_1_PIPE_CLK 55
|
||||
#define GCC_PCIE_1_PIPE_CLK_SRC 56
|
||||
#define GCC_PCIE_1_PIPE_DIV2_CLK 57
|
||||
#define GCC_PCIE_1_PIPE_DIV2_CLK_SRC 58
|
||||
#define GCC_PCIE_1_SLV_AXI_CLK 59
|
||||
#define GCC_PCIE_1_SLV_Q2A_AXI_CLK 60
|
||||
#define GCC_PCIE_RSCC_CFG_AHB_CLK 61
|
||||
#define GCC_PCIE_RSCC_XO_CLK 62
|
||||
#define GCC_PDM2_CLK 63
|
||||
#define GCC_PDM2_CLK_SRC 64
|
||||
#define GCC_PDM_AHB_CLK 65
|
||||
#define GCC_PDM_XO4_CLK 66
|
||||
#define GCC_QMIP_CAMERA_NRT_AHB_CLK 67
|
||||
#define GCC_QMIP_CAMERA_RT_AHB_CLK 68
|
||||
#define GCC_QMIP_DISP_AHB_CLK 69
|
||||
#define GCC_QMIP_GPU_AHB_CLK 70
|
||||
#define GCC_QMIP_PCIE_AHB_CLK 71
|
||||
#define GCC_QMIP_VIDEO_CV_CPU_AHB_CLK 72
|
||||
#define GCC_QMIP_VIDEO_CVP_AHB_CLK 73
|
||||
#define GCC_QMIP_VIDEO_V_CPU_AHB_CLK 74
|
||||
#define GCC_QMIP_VIDEO_VCODEC_AHB_CLK 75
|
||||
#define GCC_QUPV3_WRAP0_CORE_2X_CLK 76
|
||||
#define GCC_QUPV3_WRAP0_CORE_CLK 77
|
||||
#define GCC_QUPV3_WRAP0_QSPI_REF_CLK 78
|
||||
#define GCC_QUPV3_WRAP0_QSPI_REF_CLK_SRC 79
|
||||
#define GCC_QUPV3_WRAP0_S0_CLK 80
|
||||
#define GCC_QUPV3_WRAP0_S0_CLK_SRC 81
|
||||
#define GCC_QUPV3_WRAP0_S1_CLK 82
|
||||
#define GCC_QUPV3_WRAP0_S1_CLK_SRC 83
|
||||
#define GCC_QUPV3_WRAP0_S2_CLK 84
|
||||
#define GCC_QUPV3_WRAP0_S2_CLK_SRC 85
|
||||
#define GCC_QUPV3_WRAP0_S3_CLK 86
|
||||
#define GCC_QUPV3_WRAP0_S3_CLK_SRC 87
|
||||
#define GCC_QUPV3_WRAP0_S4_CLK 88
|
||||
#define GCC_QUPV3_WRAP0_S4_CLK_SRC 89
|
||||
#define GCC_QUPV3_WRAP0_S5_CLK 90
|
||||
#define GCC_QUPV3_WRAP0_S5_CLK_SRC 91
|
||||
#define GCC_QUPV3_WRAP0_S6_CLK 92
|
||||
#define GCC_QUPV3_WRAP0_S6_CLK_SRC 93
|
||||
#define GCC_QUPV3_WRAP1_CORE_2X_CLK 94
|
||||
#define GCC_QUPV3_WRAP1_CORE_CLK 95
|
||||
#define GCC_QUPV3_WRAP1_QSPI_REF_CLK 96
|
||||
#define GCC_QUPV3_WRAP1_QSPI_REF_CLK_SRC 97
|
||||
#define GCC_QUPV3_WRAP1_S0_CLK 98
|
||||
#define GCC_QUPV3_WRAP1_S0_CLK_SRC 99
|
||||
#define GCC_QUPV3_WRAP1_S1_CLK 100
|
||||
#define GCC_QUPV3_WRAP1_S1_CLK_SRC 101
|
||||
#define GCC_QUPV3_WRAP1_S2_CLK 102
|
||||
#define GCC_QUPV3_WRAP1_S2_CLK_SRC 103
|
||||
#define GCC_QUPV3_WRAP1_S3_CLK 104
|
||||
#define GCC_QUPV3_WRAP1_S3_CLK_SRC 105
|
||||
#define GCC_QUPV3_WRAP1_S4_CLK 106
|
||||
#define GCC_QUPV3_WRAP1_S4_CLK_SRC 107
|
||||
#define GCC_QUPV3_WRAP1_S5_CLK 108
|
||||
#define GCC_QUPV3_WRAP1_S5_CLK_SRC 109
|
||||
#define GCC_QUPV3_WRAP1_S6_CLK 110
|
||||
#define GCC_QUPV3_WRAP1_S6_CLK_SRC 111
|
||||
#define GCC_QUPV3_WRAP_0_M_AHB_CLK 112
|
||||
#define GCC_QUPV3_WRAP_0_S_AHB_CLK 113
|
||||
#define GCC_QUPV3_WRAP_1_M_AHB_CLK 114
|
||||
#define GCC_QUPV3_WRAP_1_S_AHB_CLK 115
|
||||
#define GCC_SDCC1_AHB_CLK 116
|
||||
#define GCC_SDCC1_APPS_CLK 117
|
||||
#define GCC_SDCC1_APPS_CLK_SRC 118
|
||||
#define GCC_SDCC1_ICE_CORE_CLK 119
|
||||
#define GCC_SDCC1_ICE_CORE_CLK_SRC 120
|
||||
#define GCC_SDCC2_AHB_CLK 121
|
||||
#define GCC_SDCC2_APPS_CLK 122
|
||||
#define GCC_SDCC2_APPS_CLK_SRC 123
|
||||
#define GCC_UFS_PHY_AHB_CLK 124
|
||||
#define GCC_UFS_PHY_AXI_CLK 125
|
||||
#define GCC_UFS_PHY_AXI_CLK_SRC 126
|
||||
#define GCC_UFS_PHY_AXI_HW_CTL_CLK 127
|
||||
#define GCC_UFS_PHY_ICE_CORE_CLK 128
|
||||
#define GCC_UFS_PHY_ICE_CORE_CLK_SRC 129
|
||||
#define GCC_UFS_PHY_ICE_CORE_HW_CTL_CLK 130
|
||||
#define GCC_UFS_PHY_PHY_AUX_CLK 131
|
||||
#define GCC_UFS_PHY_PHY_AUX_CLK_SRC 132
|
||||
#define GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK 133
|
||||
#define GCC_UFS_PHY_RX_SYMBOL_0_CLK 134
|
||||
#define GCC_UFS_PHY_RX_SYMBOL_0_CLK_SRC 135
|
||||
#define GCC_UFS_PHY_RX_SYMBOL_1_CLK 136
|
||||
#define GCC_UFS_PHY_RX_SYMBOL_1_CLK_SRC 137
|
||||
#define GCC_UFS_PHY_TX_SYMBOL_0_CLK 138
|
||||
#define GCC_UFS_PHY_TX_SYMBOL_0_CLK_SRC 139
|
||||
#define GCC_UFS_PHY_UNIPRO_CORE_CLK 140
|
||||
#define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC 141
|
||||
#define GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK 142
|
||||
#define GCC_USB30_PRIM_ATB_CLK 143
|
||||
#define GCC_USB30_PRIM_MASTER_CLK 144
|
||||
#define GCC_USB30_PRIM_MASTER_CLK_SRC 145
|
||||
#define GCC_USB30_PRIM_MOCK_UTMI_CLK 146
|
||||
#define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC 147
|
||||
#define GCC_USB30_PRIM_MOCK_UTMI_POSTDIV_CLK_SRC 148
|
||||
#define GCC_USB30_PRIM_SLEEP_CLK 149
|
||||
#define GCC_USB3_PRIM_PHY_AUX_CLK 150
|
||||
#define GCC_USB3_PRIM_PHY_AUX_CLK_SRC 151
|
||||
#define GCC_USB3_PRIM_PHY_COM_AUX_CLK 152
|
||||
#define GCC_USB3_PRIM_PHY_PIPE_CLK 153
|
||||
#define GCC_USB3_PRIM_PHY_PIPE_CLK_SRC 154
|
||||
#define GCC_VIDEO_AHB_CLK 155
|
||||
#define GCC_VIDEO_AXI0_CLK 156
|
||||
#define GCC_VIDEO_XO_CLK 157
|
||||
|
||||
/* GCC resets */
|
||||
#define GCC_CAMERA_BCR 0
|
||||
#define GCC_DISPLAY_BCR 1
|
||||
#define GCC_GPU_BCR 2
|
||||
#define GCC_PCIE_0_BCR 3
|
||||
#define GCC_PCIE_0_LINK_DOWN_BCR 4
|
||||
#define GCC_PCIE_0_NOCSR_COM_PHY_BCR 5
|
||||
#define GCC_PCIE_0_PHY_BCR 6
|
||||
#define GCC_PCIE_0_PHY_NOCSR_COM_PHY_BCR 7
|
||||
#define GCC_PCIE_1_BCR 8
|
||||
#define GCC_PCIE_1_LINK_DOWN_BCR 9
|
||||
#define GCC_PCIE_1_NOCSR_COM_PHY_BCR 10
|
||||
#define GCC_PCIE_1_PHY_BCR 11
|
||||
#define GCC_PCIE_1_PHY_NOCSR_COM_PHY_BCR 12
|
||||
#define GCC_PCIE_RSCC_BCR 13
|
||||
#define GCC_PDM_BCR 14
|
||||
#define GCC_QUPV3_WRAPPER_0_BCR 15
|
||||
#define GCC_QUPV3_WRAPPER_1_BCR 16
|
||||
#define GCC_QUSB2PHY_PRIM_BCR 17
|
||||
#define GCC_QUSB2PHY_SEC_BCR 18
|
||||
#define GCC_SDCC1_BCR 19
|
||||
#define GCC_SDCC2_BCR 20
|
||||
#define GCC_UFS_PHY_BCR 21
|
||||
#define GCC_USB30_PRIM_BCR 22
|
||||
#define GCC_USB3_DP_PHY_PRIM_BCR 23
|
||||
#define GCC_USB3_PHY_PRIM_BCR 24
|
||||
#define GCC_USB3PHY_PHY_PRIM_BCR 25
|
||||
#define GCC_VIDEO_AXI0_CLK_ARES 26
|
||||
#define GCC_VIDEO_BCR 27
|
||||
|
||||
/* GCC power domains */
|
||||
#define PCIE_0_GDSC 0
|
||||
#define PCIE_0_PHY_GDSC 1
|
||||
#define PCIE_1_GDSC 2
|
||||
#define PCIE_1_PHY_GDSC 3
|
||||
#define UFS_PHY_GDSC 4
|
||||
#define UFS_MEM_PHY_GDSC 5
|
||||
#define USB30_PRIM_GDSC 6
|
||||
#define USB3_PHY_GDSC 7
|
||||
|
||||
#endif
|
||||
56
include/dt-bindings/clock/qcom,milos-gpucc.h
Normal file
56
include/dt-bindings/clock/qcom,milos-gpucc.h
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_MILOS_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_GPU_CC_MILOS_H
|
||||
|
||||
/* GPU_CC clocks */
|
||||
#define GPU_CC_PLL0 0
|
||||
#define GPU_CC_PLL0_OUT_EVEN 1
|
||||
#define GPU_CC_AHB_CLK 2
|
||||
#define GPU_CC_CB_CLK 3
|
||||
#define GPU_CC_CX_ACCU_SHIFT_CLK 4
|
||||
#define GPU_CC_CX_FF_CLK 5
|
||||
#define GPU_CC_CX_GMU_CLK 6
|
||||
#define GPU_CC_CXO_AON_CLK 7
|
||||
#define GPU_CC_CXO_CLK 8
|
||||
#define GPU_CC_DEMET_CLK 9
|
||||
#define GPU_CC_DEMET_DIV_CLK_SRC 10
|
||||
#define GPU_CC_DPM_CLK 11
|
||||
#define GPU_CC_FF_CLK_SRC 12
|
||||
#define GPU_CC_FREQ_MEASURE_CLK 13
|
||||
#define GPU_CC_GMU_CLK_SRC 14
|
||||
#define GPU_CC_GX_ACCU_SHIFT_CLK 15
|
||||
#define GPU_CC_GX_ACD_AHB_FF_CLK 16
|
||||
#define GPU_CC_GX_AHB_FF_CLK 17
|
||||
#define GPU_CC_GX_GMU_CLK 18
|
||||
#define GPU_CC_GX_RCG_AHB_FF_CLK 19
|
||||
#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK 20
|
||||
#define GPU_CC_HUB_AON_CLK 21
|
||||
#define GPU_CC_HUB_CLK_SRC 22
|
||||
#define GPU_CC_HUB_CX_INT_CLK 23
|
||||
#define GPU_CC_HUB_DIV_CLK_SRC 24
|
||||
#define GPU_CC_MEMNOC_GFX_CLK 25
|
||||
#define GPU_CC_RSCC_HUB_AON_CLK 26
|
||||
#define GPU_CC_RSCC_XO_AON_CLK 27
|
||||
#define GPU_CC_SLEEP_CLK 28
|
||||
#define GPU_CC_XO_CLK_SRC 29
|
||||
#define GPU_CC_XO_DIV_CLK_SRC 30
|
||||
|
||||
/* GPU_CC resets */
|
||||
#define GPU_CC_CB_BCR 0
|
||||
#define GPU_CC_CX_BCR 1
|
||||
#define GPU_CC_FAST_HUB_BCR 2
|
||||
#define GPU_CC_FF_BCR 3
|
||||
#define GPU_CC_GMU_BCR 4
|
||||
#define GPU_CC_GX_BCR 5
|
||||
#define GPU_CC_RBCPR_BCR 6
|
||||
#define GPU_CC_XO_BCR 7
|
||||
|
||||
/* GPU_CC power domains */
|
||||
#define GPU_CC_CX_GDSC 0
|
||||
|
||||
#endif
|
||||
36
include/dt-bindings/clock/qcom,milos-videocc.h
Normal file
36
include/dt-bindings/clock/qcom,milos-videocc.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2025, Luca Weiss <luca.weiss@fairphone.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_VIDEO_CC_MILOS_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_VIDEO_CC_MILOS_H
|
||||
|
||||
/* VIDEO_CC clocks */
|
||||
#define VIDEO_CC_PLL0 0
|
||||
#define VIDEO_CC_AHB_CLK 1
|
||||
#define VIDEO_CC_AHB_CLK_SRC 2
|
||||
#define VIDEO_CC_MVS0_CLK 3
|
||||
#define VIDEO_CC_MVS0_CLK_SRC 4
|
||||
#define VIDEO_CC_MVS0_DIV_CLK_SRC 5
|
||||
#define VIDEO_CC_MVS0_SHIFT_CLK 6
|
||||
#define VIDEO_CC_MVS0C_CLK 7
|
||||
#define VIDEO_CC_MVS0C_DIV2_DIV_CLK_SRC 8
|
||||
#define VIDEO_CC_MVS0C_SHIFT_CLK 9
|
||||
#define VIDEO_CC_SLEEP_CLK 10
|
||||
#define VIDEO_CC_SLEEP_CLK_SRC 11
|
||||
#define VIDEO_CC_XO_CLK 12
|
||||
#define VIDEO_CC_XO_CLK_SRC 13
|
||||
|
||||
/* VIDEO_CC resets */
|
||||
#define VIDEO_CC_INTERFACE_BCR 0
|
||||
#define VIDEO_CC_MVS0_BCR 1
|
||||
#define VIDEO_CC_MVS0C_CLK_ARES 2
|
||||
#define VIDEO_CC_MVS0C_BCR 3
|
||||
|
||||
/* VIDEO_CC power domains */
|
||||
#define VIDEO_CC_MVS0_GDSC 0
|
||||
#define VIDEO_CC_MVS0C_GDSC 1
|
||||
|
||||
#endif
|
||||
110
include/dt-bindings/clock/qcom,qcs615-camcc.h
Normal file
110
include/dt-bindings/clock/qcom,qcs615-camcc.h
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_CAM_CC_QCS615_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_CAM_CC_QCS615_H
|
||||
|
||||
/* CAM_CC clocks */
|
||||
#define CAM_CC_BPS_AHB_CLK 0
|
||||
#define CAM_CC_BPS_AREG_CLK 1
|
||||
#define CAM_CC_BPS_AXI_CLK 2
|
||||
#define CAM_CC_BPS_CLK 3
|
||||
#define CAM_CC_BPS_CLK_SRC 4
|
||||
#define CAM_CC_CAMNOC_ATB_CLK 5
|
||||
#define CAM_CC_CAMNOC_AXI_CLK 6
|
||||
#define CAM_CC_CCI_CLK 7
|
||||
#define CAM_CC_CCI_CLK_SRC 8
|
||||
#define CAM_CC_CORE_AHB_CLK 9
|
||||
#define CAM_CC_CPAS_AHB_CLK 10
|
||||
#define CAM_CC_CPHY_RX_CLK_SRC 11
|
||||
#define CAM_CC_CSI0PHYTIMER_CLK 12
|
||||
#define CAM_CC_CSI0PHYTIMER_CLK_SRC 13
|
||||
#define CAM_CC_CSI1PHYTIMER_CLK 14
|
||||
#define CAM_CC_CSI1PHYTIMER_CLK_SRC 15
|
||||
#define CAM_CC_CSI2PHYTIMER_CLK 16
|
||||
#define CAM_CC_CSI2PHYTIMER_CLK_SRC 17
|
||||
#define CAM_CC_CSIPHY0_CLK 18
|
||||
#define CAM_CC_CSIPHY1_CLK 19
|
||||
#define CAM_CC_CSIPHY2_CLK 20
|
||||
#define CAM_CC_FAST_AHB_CLK_SRC 21
|
||||
#define CAM_CC_ICP_ATB_CLK 22
|
||||
#define CAM_CC_ICP_CLK 23
|
||||
#define CAM_CC_ICP_CLK_SRC 24
|
||||
#define CAM_CC_ICP_CTI_CLK 25
|
||||
#define CAM_CC_ICP_TS_CLK 26
|
||||
#define CAM_CC_IFE_0_AXI_CLK 27
|
||||
#define CAM_CC_IFE_0_CLK 28
|
||||
#define CAM_CC_IFE_0_CLK_SRC 29
|
||||
#define CAM_CC_IFE_0_CPHY_RX_CLK 30
|
||||
#define CAM_CC_IFE_0_CSID_CLK 31
|
||||
#define CAM_CC_IFE_0_CSID_CLK_SRC 32
|
||||
#define CAM_CC_IFE_0_DSP_CLK 33
|
||||
#define CAM_CC_IFE_1_AXI_CLK 34
|
||||
#define CAM_CC_IFE_1_CLK 35
|
||||
#define CAM_CC_IFE_1_CLK_SRC 36
|
||||
#define CAM_CC_IFE_1_CPHY_RX_CLK 37
|
||||
#define CAM_CC_IFE_1_CSID_CLK 38
|
||||
#define CAM_CC_IFE_1_CSID_CLK_SRC 39
|
||||
#define CAM_CC_IFE_1_DSP_CLK 40
|
||||
#define CAM_CC_IFE_LITE_CLK 41
|
||||
#define CAM_CC_IFE_LITE_CLK_SRC 42
|
||||
#define CAM_CC_IFE_LITE_CPHY_RX_CLK 43
|
||||
#define CAM_CC_IFE_LITE_CSID_CLK 44
|
||||
#define CAM_CC_IFE_LITE_CSID_CLK_SRC 45
|
||||
#define CAM_CC_IPE_0_AHB_CLK 46
|
||||
#define CAM_CC_IPE_0_AREG_CLK 47
|
||||
#define CAM_CC_IPE_0_AXI_CLK 48
|
||||
#define CAM_CC_IPE_0_CLK 49
|
||||
#define CAM_CC_IPE_0_CLK_SRC 50
|
||||
#define CAM_CC_JPEG_CLK 51
|
||||
#define CAM_CC_JPEG_CLK_SRC 52
|
||||
#define CAM_CC_LRME_CLK 53
|
||||
#define CAM_CC_LRME_CLK_SRC 54
|
||||
#define CAM_CC_MCLK0_CLK 55
|
||||
#define CAM_CC_MCLK0_CLK_SRC 56
|
||||
#define CAM_CC_MCLK1_CLK 57
|
||||
#define CAM_CC_MCLK1_CLK_SRC 58
|
||||
#define CAM_CC_MCLK2_CLK 59
|
||||
#define CAM_CC_MCLK2_CLK_SRC 60
|
||||
#define CAM_CC_MCLK3_CLK 61
|
||||
#define CAM_CC_MCLK3_CLK_SRC 62
|
||||
#define CAM_CC_PLL0 63
|
||||
#define CAM_CC_PLL1 64
|
||||
#define CAM_CC_PLL2 65
|
||||
#define CAM_CC_PLL2_OUT_AUX2 66
|
||||
#define CAM_CC_PLL3 67
|
||||
#define CAM_CC_SLOW_AHB_CLK_SRC 68
|
||||
#define CAM_CC_SOC_AHB_CLK 69
|
||||
#define CAM_CC_SYS_TMR_CLK 70
|
||||
|
||||
/* CAM_CC power domains */
|
||||
#define BPS_GDSC 0
|
||||
#define IFE_0_GDSC 1
|
||||
#define IFE_1_GDSC 2
|
||||
#define IPE_0_GDSC 3
|
||||
#define TITAN_TOP_GDSC 4
|
||||
|
||||
/* CAM_CC resets */
|
||||
#define CAM_CC_BPS_BCR 0
|
||||
#define CAM_CC_CAMNOC_BCR 1
|
||||
#define CAM_CC_CCI_BCR 2
|
||||
#define CAM_CC_CPAS_BCR 3
|
||||
#define CAM_CC_CSI0PHY_BCR 4
|
||||
#define CAM_CC_CSI1PHY_BCR 5
|
||||
#define CAM_CC_CSI2PHY_BCR 6
|
||||
#define CAM_CC_ICP_BCR 7
|
||||
#define CAM_CC_IFE_0_BCR 8
|
||||
#define CAM_CC_IFE_1_BCR 9
|
||||
#define CAM_CC_IFE_LITE_BCR 10
|
||||
#define CAM_CC_IPE_0_BCR 11
|
||||
#define CAM_CC_JPEG_BCR 12
|
||||
#define CAM_CC_LRME_BCR 13
|
||||
#define CAM_CC_MCLK0_BCR 14
|
||||
#define CAM_CC_MCLK1_BCR 15
|
||||
#define CAM_CC_MCLK2_BCR 16
|
||||
#define CAM_CC_MCLK3_BCR 17
|
||||
#define CAM_CC_TITAN_TOP_BCR 18
|
||||
|
||||
#endif
|
||||
52
include/dt-bindings/clock/qcom,qcs615-dispcc.h
Normal file
52
include/dt-bindings/clock/qcom,qcs615-dispcc.h
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_QCS615_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_DISP_CC_QCS615_H
|
||||
|
||||
/* DISP_CC clocks */
|
||||
#define DISP_CC_MDSS_AHB_CLK 0
|
||||
#define DISP_CC_MDSS_AHB_CLK_SRC 1
|
||||
#define DISP_CC_MDSS_BYTE0_CLK 2
|
||||
#define DISP_CC_MDSS_BYTE0_CLK_SRC 3
|
||||
#define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC 4
|
||||
#define DISP_CC_MDSS_BYTE0_INTF_CLK 5
|
||||
#define DISP_CC_MDSS_DP_AUX_CLK 6
|
||||
#define DISP_CC_MDSS_DP_AUX_CLK_SRC 7
|
||||
#define DISP_CC_MDSS_DP_CRYPTO_CLK 8
|
||||
#define DISP_CC_MDSS_DP_CRYPTO_CLK_SRC 9
|
||||
#define DISP_CC_MDSS_DP_LINK_CLK 10
|
||||
#define DISP_CC_MDSS_DP_LINK_CLK_SRC 11
|
||||
#define DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC 12
|
||||
#define DISP_CC_MDSS_DP_LINK_INTF_CLK 13
|
||||
#define DISP_CC_MDSS_DP_PIXEL1_CLK 14
|
||||
#define DISP_CC_MDSS_DP_PIXEL1_CLK_SRC 15
|
||||
#define DISP_CC_MDSS_DP_PIXEL_CLK 16
|
||||
#define DISP_CC_MDSS_DP_PIXEL_CLK_SRC 17
|
||||
#define DISP_CC_MDSS_ESC0_CLK 18
|
||||
#define DISP_CC_MDSS_ESC0_CLK_SRC 19
|
||||
#define DISP_CC_MDSS_MDP_CLK 20
|
||||
#define DISP_CC_MDSS_MDP_CLK_SRC 21
|
||||
#define DISP_CC_MDSS_MDP_LUT_CLK 22
|
||||
#define DISP_CC_MDSS_NON_GDSC_AHB_CLK 23
|
||||
#define DISP_CC_MDSS_PCLK0_CLK 24
|
||||
#define DISP_CC_MDSS_PCLK0_CLK_SRC 25
|
||||
#define DISP_CC_MDSS_ROT_CLK 26
|
||||
#define DISP_CC_MDSS_ROT_CLK_SRC 27
|
||||
#define DISP_CC_MDSS_RSCC_AHB_CLK 28
|
||||
#define DISP_CC_MDSS_RSCC_VSYNC_CLK 29
|
||||
#define DISP_CC_MDSS_VSYNC_CLK 30
|
||||
#define DISP_CC_MDSS_VSYNC_CLK_SRC 31
|
||||
#define DISP_CC_PLL0 32
|
||||
#define DISP_CC_XO_CLK 33
|
||||
|
||||
/* DISP_CC power domains */
|
||||
#define MDSS_CORE_GDSC 0
|
||||
|
||||
/* DISP_CC resets */
|
||||
#define DISP_CC_MDSS_CORE_BCR 0
|
||||
#define DISP_CC_MDSS_RSCC_BCR 1
|
||||
|
||||
#endif
|
||||
39
include/dt-bindings/clock/qcom,qcs615-gpucc.h
Normal file
39
include/dt-bindings/clock/qcom,qcs615-gpucc.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_QCS615_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_GPU_CC_QCS615_H
|
||||
|
||||
/* GPU_CC clocks */
|
||||
#define CRC_DIV_PLL0 0
|
||||
#define CRC_DIV_PLL1 1
|
||||
#define GPU_CC_PLL0 2
|
||||
#define GPU_CC_PLL1 3
|
||||
#define GPU_CC_CRC_AHB_CLK 4
|
||||
#define GPU_CC_CX_GFX3D_CLK 5
|
||||
#define GPU_CC_CX_GFX3D_SLV_CLK 6
|
||||
#define GPU_CC_CX_GMU_CLK 7
|
||||
#define GPU_CC_CX_SNOC_DVM_CLK 8
|
||||
#define GPU_CC_CXO_AON_CLK 9
|
||||
#define GPU_CC_CXO_CLK 10
|
||||
#define GPU_CC_GMU_CLK_SRC 11
|
||||
#define GPU_CC_GX_GFX3D_CLK 12
|
||||
#define GPU_CC_GX_GFX3D_CLK_SRC 13
|
||||
#define GPU_CC_GX_GMU_CLK 14
|
||||
#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK 15
|
||||
#define GPU_CC_SLEEP_CLK 16
|
||||
|
||||
/* GPU_CC power domains */
|
||||
#define CX_GDSC 0
|
||||
#define GX_GDSC 1
|
||||
|
||||
/* GPU_CC resets */
|
||||
#define GPU_CC_CX_BCR 0
|
||||
#define GPU_CC_GFX3D_AON_BCR 1
|
||||
#define GPU_CC_GMU_BCR 2
|
||||
#define GPU_CC_GX_BCR 3
|
||||
#define GPU_CC_XO_BCR 4
|
||||
|
||||
#endif
|
||||
30
include/dt-bindings/clock/qcom,qcs615-videocc.h
Normal file
30
include/dt-bindings/clock/qcom,qcs615-videocc.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_VIDEO_CC_QCS615_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_VIDEO_CC_QCS615_H
|
||||
|
||||
/* VIDEO_CC clocks */
|
||||
#define VIDEO_CC_SLEEP_CLK 0
|
||||
#define VIDEO_CC_SLEEP_CLK_SRC 1
|
||||
#define VIDEO_CC_VCODEC0_AXI_CLK 2
|
||||
#define VIDEO_CC_VCODEC0_CORE_CLK 3
|
||||
#define VIDEO_CC_VENUS_AHB_CLK 4
|
||||
#define VIDEO_CC_VENUS_CLK_SRC 5
|
||||
#define VIDEO_CC_VENUS_CTL_AXI_CLK 6
|
||||
#define VIDEO_CC_VENUS_CTL_CORE_CLK 7
|
||||
#define VIDEO_CC_XO_CLK 8
|
||||
#define VIDEO_PLL0 9
|
||||
|
||||
/* VIDEO_CC power domains */
|
||||
#define VCODEC0_GDSC 0
|
||||
#define VENUS_GDSC 1
|
||||
|
||||
/* VIDEO_CC resets */
|
||||
#define VIDEO_CC_INTERFACE_BCR 0
|
||||
#define VIDEO_CC_VCODEC0_BCR 1
|
||||
#define VIDEO_CC_VENUS_BCR 2
|
||||
|
||||
#endif
|
||||
181
include/dt-bindings/clock/qcom,sc8180x-camcc.h
Normal file
181
include/dt-bindings/clock/qcom,sc8180x-camcc.h
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
||||
/*
|
||||
* Copyright (c) 2025, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_QCOM_CAM_CC_SC8180X_H
|
||||
#define _DT_BINDINGS_CLK_QCOM_CAM_CC_SC8180X_H
|
||||
|
||||
/* CAM_CC clocks */
|
||||
#define CAM_CC_BPS_AHB_CLK 0
|
||||
#define CAM_CC_BPS_AREG_CLK 1
|
||||
#define CAM_CC_BPS_AXI_CLK 2
|
||||
#define CAM_CC_BPS_CLK 3
|
||||
#define CAM_CC_BPS_CLK_SRC 4
|
||||
#define CAM_CC_CAMNOC_AXI_CLK 5
|
||||
#define CAM_CC_CAMNOC_AXI_CLK_SRC 6
|
||||
#define CAM_CC_CAMNOC_DCD_XO_CLK 7
|
||||
#define CAM_CC_CCI_0_CLK 8
|
||||
#define CAM_CC_CCI_0_CLK_SRC 9
|
||||
#define CAM_CC_CCI_1_CLK 10
|
||||
#define CAM_CC_CCI_1_CLK_SRC 11
|
||||
#define CAM_CC_CCI_2_CLK 12
|
||||
#define CAM_CC_CCI_2_CLK_SRC 13
|
||||
#define CAM_CC_CCI_3_CLK 14
|
||||
#define CAM_CC_CCI_3_CLK_SRC 15
|
||||
#define CAM_CC_CORE_AHB_CLK 16
|
||||
#define CAM_CC_CPAS_AHB_CLK 17
|
||||
#define CAM_CC_CPHY_RX_CLK_SRC 18
|
||||
#define CAM_CC_CSI0PHYTIMER_CLK 19
|
||||
#define CAM_CC_CSI0PHYTIMER_CLK_SRC 20
|
||||
#define CAM_CC_CSI1PHYTIMER_CLK 21
|
||||
#define CAM_CC_CSI1PHYTIMER_CLK_SRC 22
|
||||
#define CAM_CC_CSI2PHYTIMER_CLK 23
|
||||
#define CAM_CC_CSI2PHYTIMER_CLK_SRC 24
|
||||
#define CAM_CC_CSI3PHYTIMER_CLK 25
|
||||
#define CAM_CC_CSI3PHYTIMER_CLK_SRC 26
|
||||
#define CAM_CC_CSIPHY0_CLK 27
|
||||
#define CAM_CC_CSIPHY1_CLK 28
|
||||
#define CAM_CC_CSIPHY2_CLK 29
|
||||
#define CAM_CC_CSIPHY3_CLK 30
|
||||
#define CAM_CC_FAST_AHB_CLK_SRC 31
|
||||
#define CAM_CC_FD_CORE_CLK 32
|
||||
#define CAM_CC_FD_CORE_CLK_SRC 33
|
||||
#define CAM_CC_FD_CORE_UAR_CLK 34
|
||||
#define CAM_CC_ICP_AHB_CLK 35
|
||||
#define CAM_CC_ICP_CLK 36
|
||||
#define CAM_CC_ICP_CLK_SRC 37
|
||||
#define CAM_CC_IFE_0_AXI_CLK 38
|
||||
#define CAM_CC_IFE_0_CLK 39
|
||||
#define CAM_CC_IFE_0_CLK_SRC 40
|
||||
#define CAM_CC_IFE_0_CPHY_RX_CLK 41
|
||||
#define CAM_CC_IFE_0_CSID_CLK 42
|
||||
#define CAM_CC_IFE_0_CSID_CLK_SRC 43
|
||||
#define CAM_CC_IFE_0_DSP_CLK 44
|
||||
#define CAM_CC_IFE_1_AXI_CLK 45
|
||||
#define CAM_CC_IFE_1_CLK 46
|
||||
#define CAM_CC_IFE_1_CLK_SRC 47
|
||||
#define CAM_CC_IFE_1_CPHY_RX_CLK 48
|
||||
#define CAM_CC_IFE_1_CSID_CLK 49
|
||||
#define CAM_CC_IFE_1_CSID_CLK_SRC 50
|
||||
#define CAM_CC_IFE_1_DSP_CLK 51
|
||||
#define CAM_CC_IFE_2_AXI_CLK 52
|
||||
#define CAM_CC_IFE_2_CLK 53
|
||||
#define CAM_CC_IFE_2_CLK_SRC 54
|
||||
#define CAM_CC_IFE_2_CPHY_RX_CLK 55
|
||||
#define CAM_CC_IFE_2_CSID_CLK 56
|
||||
#define CAM_CC_IFE_2_CSID_CLK_SRC 57
|
||||
#define CAM_CC_IFE_2_DSP_CLK 58
|
||||
#define CAM_CC_IFE_3_AXI_CLK 59
|
||||
#define CAM_CC_IFE_3_CLK 60
|
||||
#define CAM_CC_IFE_3_CLK_SRC 61
|
||||
#define CAM_CC_IFE_3_CPHY_RX_CLK 62
|
||||
#define CAM_CC_IFE_3_CSID_CLK 63
|
||||
#define CAM_CC_IFE_3_CSID_CLK_SRC 64
|
||||
#define CAM_CC_IFE_3_DSP_CLK 65
|
||||
#define CAM_CC_IFE_LITE_0_CLK 66
|
||||
#define CAM_CC_IFE_LITE_0_CLK_SRC 67
|
||||
#define CAM_CC_IFE_LITE_0_CPHY_RX_CLK 68
|
||||
#define CAM_CC_IFE_LITE_0_CSID_CLK 69
|
||||
#define CAM_CC_IFE_LITE_0_CSID_CLK_SRC 70
|
||||
#define CAM_CC_IFE_LITE_1_CLK 71
|
||||
#define CAM_CC_IFE_LITE_1_CLK_SRC 72
|
||||
#define CAM_CC_IFE_LITE_1_CPHY_RX_CLK 73
|
||||
#define CAM_CC_IFE_LITE_1_CSID_CLK 74
|
||||
#define CAM_CC_IFE_LITE_1_CSID_CLK_SRC 75
|
||||
#define CAM_CC_IFE_LITE_2_CLK 76
|
||||
#define CAM_CC_IFE_LITE_2_CLK_SRC 77
|
||||
#define CAM_CC_IFE_LITE_2_CPHY_RX_CLK 78
|
||||
#define CAM_CC_IFE_LITE_2_CSID_CLK 79
|
||||
#define CAM_CC_IFE_LITE_2_CSID_CLK_SRC 80
|
||||
#define CAM_CC_IFE_LITE_3_CLK 81
|
||||
#define CAM_CC_IFE_LITE_3_CLK_SRC 82
|
||||
#define CAM_CC_IFE_LITE_3_CPHY_RX_CLK 83
|
||||
#define CAM_CC_IFE_LITE_3_CSID_CLK 84
|
||||
#define CAM_CC_IFE_LITE_3_CSID_CLK_SRC 85
|
||||
#define CAM_CC_IPE_0_AHB_CLK 86
|
||||
#define CAM_CC_IPE_0_AREG_CLK 87
|
||||
#define CAM_CC_IPE_0_AXI_CLK 88
|
||||
#define CAM_CC_IPE_0_CLK 89
|
||||
#define CAM_CC_IPE_0_CLK_SRC 90
|
||||
#define CAM_CC_IPE_1_AHB_CLK 91
|
||||
#define CAM_CC_IPE_1_AREG_CLK 92
|
||||
#define CAM_CC_IPE_1_AXI_CLK 93
|
||||
#define CAM_CC_IPE_1_CLK 94
|
||||
#define CAM_CC_JPEG_CLK 95
|
||||
#define CAM_CC_JPEG_CLK_SRC 96
|
||||
#define CAM_CC_LRME_CLK 97
|
||||
#define CAM_CC_LRME_CLK_SRC 98
|
||||
#define CAM_CC_MCLK0_CLK 99
|
||||
#define CAM_CC_MCLK0_CLK_SRC 100
|
||||
#define CAM_CC_MCLK1_CLK 101
|
||||
#define CAM_CC_MCLK1_CLK_SRC 102
|
||||
#define CAM_CC_MCLK2_CLK 103
|
||||
#define CAM_CC_MCLK2_CLK_SRC 104
|
||||
#define CAM_CC_MCLK3_CLK 105
|
||||
#define CAM_CC_MCLK3_CLK_SRC 106
|
||||
#define CAM_CC_MCLK4_CLK 107
|
||||
#define CAM_CC_MCLK4_CLK_SRC 108
|
||||
#define CAM_CC_MCLK5_CLK 109
|
||||
#define CAM_CC_MCLK5_CLK_SRC 110
|
||||
#define CAM_CC_MCLK6_CLK 111
|
||||
#define CAM_CC_MCLK6_CLK_SRC 112
|
||||
#define CAM_CC_MCLK7_CLK 113
|
||||
#define CAM_CC_MCLK7_CLK_SRC 114
|
||||
#define CAM_CC_PLL0 115
|
||||
#define CAM_CC_PLL0_OUT_EVEN 116
|
||||
#define CAM_CC_PLL0_OUT_ODD 117
|
||||
#define CAM_CC_PLL1 118
|
||||
#define CAM_CC_PLL2 119
|
||||
#define CAM_CC_PLL2_OUT_MAIN 120
|
||||
#define CAM_CC_PLL3 121
|
||||
#define CAM_CC_PLL4 122
|
||||
#define CAM_CC_PLL5 123
|
||||
#define CAM_CC_PLL6 124
|
||||
#define CAM_CC_SLOW_AHB_CLK_SRC 125
|
||||
#define CAM_CC_XO_CLK_SRC 126
|
||||
|
||||
|
||||
/* CAM_CC power domains */
|
||||
#define BPS_GDSC 0
|
||||
#define IFE_0_GDSC 1
|
||||
#define IFE_1_GDSC 2
|
||||
#define IFE_2_GDSC 3
|
||||
#define IFE_3_GDSC 4
|
||||
#define IPE_0_GDSC 5
|
||||
#define IPE_1_GDSC 6
|
||||
#define TITAN_TOP_GDSC 7
|
||||
|
||||
/* CAM_CC resets */
|
||||
#define CAM_CC_BPS_BCR 0
|
||||
#define CAM_CC_CAMNOC_BCR 1
|
||||
#define CAM_CC_CCI_BCR 2
|
||||
#define CAM_CC_CPAS_BCR 3
|
||||
#define CAM_CC_CSI0PHY_BCR 4
|
||||
#define CAM_CC_CSI1PHY_BCR 5
|
||||
#define CAM_CC_CSI2PHY_BCR 6
|
||||
#define CAM_CC_CSI3PHY_BCR 7
|
||||
#define CAM_CC_FD_BCR 8
|
||||
#define CAM_CC_ICP_BCR 9
|
||||
#define CAM_CC_IFE_0_BCR 10
|
||||
#define CAM_CC_IFE_1_BCR 11
|
||||
#define CAM_CC_IFE_2_BCR 12
|
||||
#define CAM_CC_IFE_3_BCR 13
|
||||
#define CAM_CC_IFE_LITE_0_BCR 14
|
||||
#define CAM_CC_IFE_LITE_1_BCR 15
|
||||
#define CAM_CC_IFE_LITE_2_BCR 16
|
||||
#define CAM_CC_IFE_LITE_3_BCR 17
|
||||
#define CAM_CC_IPE_0_BCR 18
|
||||
#define CAM_CC_IPE_1_BCR 19
|
||||
#define CAM_CC_JPEG_BCR 20
|
||||
#define CAM_CC_LRME_BCR 21
|
||||
#define CAM_CC_MCLK0_BCR 22
|
||||
#define CAM_CC_MCLK1_BCR 23
|
||||
#define CAM_CC_MCLK2_BCR 24
|
||||
#define CAM_CC_MCLK3_BCR 25
|
||||
#define CAM_CC_MCLK4_BCR 26
|
||||
#define CAM_CC_MCLK5_BCR 27
|
||||
#define CAM_CC_MCLK6_BCR 28
|
||||
#define CAM_CC_MCLK7_BCR 29
|
||||
|
||||
#endif
|
||||
|
|
@ -482,4 +482,6 @@
|
|||
#define GCC_USB_1_PHY_BCR 85
|
||||
#define GCC_USB_2_PHY_BCR 86
|
||||
#define GCC_VIDEO_BCR 87
|
||||
#define GCC_VIDEO_AXI0_CLK_ARES 88
|
||||
#define GCC_VIDEO_AXI1_CLK_ARES 89
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue