Merge tag 'qcom-clk-for-6.17' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into clk-qcom
Pull Qualcomm clk driver updates from Bjorn Andersson: - Add global, display, gpu, video, camera, tcsr, and rpmh clock controller for the Qualcomm Milos SoC - Add camera, display, GPU, and video clock controllers for Qualcomm QCS615 - Add the video clock controller for Qualcomm SM6350 - Add a camera clock controller driver for Qualcomm SC8180X - Move Qualcomm PLL configuration to really probe across a variety of platforms, in order to handle the clock controllers powered by multiple power domains. - Replace round_rate() with determine_rate() across the Qualcomm clock implementations - Enable GDSC hardware control for video clock controller GDSCs in a few platforms. - Fix GE PHY reset on Qualcomm IPQ5018, broken NSS port6 frequency table on Qualcomm IPQ8074, add missing video resets on Qualcomm X1E80100 and keep the XO clock always on on Qualcomm IPQ5018. * tag 'qcom-clk-for-6.17' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (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:
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and
|
||||
power domains on SM8250.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,camcc-sm8250.h
|
||||
See also: include/dt-bindings/clock/qcom,camcc-sm8250.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks and power domains
|
||||
on SM6125.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-sm6125.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-sm6125.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SM6350.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-sm6350.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-sm6350.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -15,7 +15,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on IPQ4019.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-ipq4019.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-ipq4019.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on IPQ8074.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-ipq8074.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-ipq8074.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on MSM8976.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-msm8976.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-msm8976.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on MSM8994 and MSM8992.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-msm8994.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-msm8994.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module which provides the clocks, resets and
|
||||
power domains on MSM8996.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-msm8996.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-msm8996.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on MSM8998.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-msm8998.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-msm8998.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on QCM2290.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-qcm2290.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-qcm2290.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on QCS404.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-qcs404.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-qcs404.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SC7180.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sc7180.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sc7180.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SC7280.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sc7280.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sc7280.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SC8180x.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sc8180x.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sc8180x.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and
|
||||
power domains on SC8280xp.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sc8280xp.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sc8280xp.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SDM670 and SDM845
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sdm845.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sdm845.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and
|
||||
power domains on SDX55
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sdx55.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sdx55.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SDX65
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sdx65.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sdx65.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM4250/6115.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm6115.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm6115.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM6125.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm6125.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm6125.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM6350.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm6350.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm6350.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM8150.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm8150.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm8150.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM8250.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm8250.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm8250.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM8350.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm8350.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm8350.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM8450
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gcc-sm8450.h
|
||||
See also: include/dt-bindings/clock/qcom,gcc-sm8450.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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:
|
||||
- |
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm graphics clock control module provides the clocks, resets and power
|
||||
domains on MSM8998.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,gpucc-msm8998.h
|
||||
See also: include/dt-bindings/clock/qcom,gpucc-msm8998.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on qcm2290.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-qcm2290.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-qcm2290.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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>;
|
||||
};
|
||||
...
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm ECPRI Specification V2.0 Common Public Radio Interface clock control
|
||||
module which supports the clocks, resets on QDU1000 and QRU1000
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,qdu1000-ecpricc.h
|
||||
See also: include/dt-bindings/clock/qcom,qdu1000-ecpricc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module which supports the clocks, resets and
|
||||
power domains on QDU1000 and QRU1000
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,qdu1000-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,qdu1000-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and
|
||||
power domains on sa8775p.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sa8775p-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sa8775p-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and power
|
||||
domains on SC7180.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,camcc-sc7180.h
|
||||
See also: include/dt-bindings/clock/qcom,camcc-sc7180.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SC7180.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-sc7180.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-sc7180.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm LPASS core clock control module provides the clocks and power
|
||||
domains on SC7180.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,lpasscorecc-sc7180.h
|
||||
See also: include/dt-bindings/clock/qcom,lpasscorecc-sc7180.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and
|
||||
power domains on SC7280.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,camcc-sc7280.h
|
||||
See also: include/dt-bindings/clock/qcom,camcc-sc7280.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SC7280.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-sc7280.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-sc7280.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm LPASS core clock control module provides the clocks and power
|
||||
domains on SC7280.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,lpass-sc7280.h
|
||||
See also: include/dt-bindings/clock/qcom,lpass-sc7280.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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>;
|
||||
};
|
||||
...
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and power
|
||||
domains on SDM845.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,camcc-sm845.h
|
||||
See also: include/dt-bindings/clock/qcom,camcc-sm845.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SDM845.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-sdm845.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-sdm845.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -12,7 +12,7 @@ maintainers:
|
||||
description: |
|
||||
Qualcomm SDM845 LPASS (Low Power Audio SubSystem) Clock Controller.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,lpass-sdm845.h
|
||||
See also: include/dt-bindings/clock/qcom,lpass-sdm845.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SDX75
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sdx75-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sdx75-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -14,38 +14,26 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and power
|
||||
domains on SM4450
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm4450-camcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm4450-camcc.h
|
||||
|
||||
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:
|
||||
- |
|
||||
|
||||
@@ -14,15 +14,12 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SM4450
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm4450-dispcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm4450-dispcc.h
|
||||
|
||||
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:
|
||||
- |
|
||||
|
||||
@@ -14,7 +14,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM4450
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm4450-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm4450-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks and power domains
|
||||
on SM6115.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm6115-dispcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm6115-dispcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm graphics clock control module provides clocks, resets and power
|
||||
domains on Qualcomm SoCs.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm6115-gpucc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm6115-gpucc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm graphics clock control module provides clocks and power domains on
|
||||
Qualcomm SoCs.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm6125-gpucc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm6125-gpucc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SM6375.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,dispcc-sm6375.h
|
||||
See also: include/dt-bindings/clock/qcom,dispcc-sm6375.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM6375
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm6375-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm6375-gcc.h
|
||||
|
||||
allOf:
|
||||
- $ref: qcom,gcc.yaml#
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm graphics clock control module provides clocks, resets and power
|
||||
domains on Qualcomm SoCs.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm6375-gpucc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm6375-gpucc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -15,7 +15,7 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and power
|
||||
domains on SM7150.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm7150-camcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm7150-camcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -15,7 +15,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SM7150.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm7150-dispcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm7150-dispcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -15,7 +15,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM7150
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm7150-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm7150-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -15,7 +15,7 @@ description: |
|
||||
Qualcomm video clock control module provides the clocks, resets and power
|
||||
domains on SM7150.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,videocc-sm7150.h
|
||||
See also: include/dt-bindings/clock/qcom,videocc-sm7150.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,15 +13,12 @@ description: |
|
||||
Qualcomm camera clock control module provides the clocks, resets and
|
||||
power domains on SM8150.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm8150-camcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm8150-camcc.h
|
||||
|
||||
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>;
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm display clock control module provides the clocks, resets and power
|
||||
domains on SM8450.
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm8450-dispcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm8450-dispcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM8550
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm8550-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm8550-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -22,6 +22,7 @@ properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,milos-tcsr
|
||||
- qcom,sar2130p-tcsr
|
||||
- qcom,sm8550-tcsr
|
||||
- qcom,sm8650-tcsr
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on SM8650
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,sm8650-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,sm8650-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -13,7 +13,7 @@ description: |
|
||||
Qualcomm global clock control module provides the clocks, resets and power
|
||||
domains on X1E80100
|
||||
|
||||
See also:: include/dt-bindings/clock/qcom,x1e80100-gcc.h
|
||||
See also: include/dt-bindings/clock/qcom,x1e80100-gcc.h
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user