Commit 514798d3 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux

Pull clk updates from Stephen Boyd:
 "This round has a diffstat dominated by Qualcomm clk drivers. Honestly
  though that's just a bunch of data so the diffstat reflects that.
  Looking beyond that there's just a bunch of updates all around in
  various clk drivers. Renesas and NXP (for i.MX) are two SoC vendors
  that have a lot of patches in here.

  Overall the driver changes look to be mostly enabling more clks and
  non-critical fixes that we could hold until the next merge window.

  I'm especially excited about the series from Arnd that graduates
  clkdev to be the only implementation of clk_get() and clk_put().
  That's a good step in the right direction to migreate eveerything over
  to the common clk framework. Now we don't have to worry about clkdev
  specific details, they're just part of the clk API now.

  Core:
   - clkdev is now the only option, i.e. clk_get()/clk_put() is
     implemented in only one place in the kernel instead of in
     drivers/clk/clkdev.c and in architectures that want their own
     implementation

  New Drivers:
   - Texas Instruments' LMK04832 Ultra Low-Noise JESD204B Compliant
     Clock Jitter Cleaner With Dual Loop PLLs
   - Qualcomm MDM9607 GCC
   - Qualcomm SC8180X display clks
   - Qualcomm SM6125 GCC
   - Qualcomm SM8250 CAMCC (camera)
   - Renesas RZ/G2L SoC
   - Hisilicon hi3559A SoC

  Updates:
   - Stop using clock-output-names in ST clk drivers (yay!)
   - Support secure mode of STM32MP1 SoCs
   - Improve clock support for Actions S500 SoC
   - duty cycle setting support on qcom clks
   - Add TI am33xx spread spectrum clock support
   - Use determine_rate() for the Amlogic pll ops instead of
     round_rate()
   - Restrict Amlogic gp0/1 and audio plls range on g12a/sm1
   - Improve Amlogic axg-audio controller error on deferral
   - Add NNA clocks on Amlogic g12a
   - Reduce memory footprint of Rockchip PLL rate tables
   - A fix for the newly added Rockchip rk3568 clk driver
   - Exported clock for the newly added Rockchip video decoder
   - Remove audio ipg clock from i.MX8MP
   - Remove deprecated legacy clock binding for i.MX SCU clock driver
   - Use common clk-imx8qxp for both i.MX8QXP and i.MX8QM
   - Add multiple clocks to clk-imx8qxp driver (enet, hdmi, lcdif,
     audio, parallel interface)
   - Add dedicated clock ops for i.MX paralel interface
   - Different fixes for clocks controlled by ATF on i.MX SoCs
   - Add A53/A72 frequency scaling support i.MX clk-scu driver
   - Add special case for DCSS clock on suspend for i.MX clk-scu driver
   - Add parent save/restore on suspend/resume to i.MX clk-scu driver
   - Skip runtime PM enablement for CPU clocks in i.MX clk-scu driver
   - Remove the sys1_pll/sys2_pll clock gates for i.MX8MQ and their
     bindings
   - Tegra clk driver no longer deasserts resets on clk_enable as it
     gets in the way of certain power-up sequences
   - Fix compile testing for Tegra clk driver
   - One patch to fix a divider on the Allwinner v3s Audio PLL
   - Add support for CPU core clock boost modes on Renesas R-Car Gen3
   - Add ISPCS (Image Signal Processor) clocks on Renesas R-Car V3U
   - Switch SH/R-Mobile and R-Car "DIV6" clocks to .determine_rate() and
     improve support for multiple parents
   - Switch Renesas RZ/N1 divider clocks to .determine_rate()
   - Add ZA2 (Audio Clock Generator) clock on Renesas R-Car D3
   - Convert ar7 to common clk framework
   - Convert ralink to common clk framework"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (161 commits)
  clk: zynqmp: Handle divider specific read only flag
  clk: zynqmp: Use firmware specific mux clock flags
  clk: zynqmp: Use firmware specific divider clock flags
  clk: zynqmp: Use firmware specific common clock flags
  clk: lmk04832: Use of match table
  clk: lmk04832: Depend on SPI
  clk: stm32mp1: new compatible for secure RCC support
  dt-bindings: clock: stm32mp1 new compatible for secure rcc
  dt-bindings: reset: add MCU HOLD BOOT ID for SCMI reset domains on stm32mp15
  dt-bindings: reset: add IDs for SCMI reset domains on stm32mp15
  dt-bindings: clock: add IDs for SCMI clocks on stm32mp15
  reset: stm32mp1: remove stm32mp1 reset
  clk: hisilicon: Add clock driver for hi3559A SoC
  dt-bindings: Document the hi3559a clock bindings
  clk: si5341: Add sysfs properties to allow checking/resetting device faults
  clk: si5341: Add silabs,iovdd-33 property
  clk: si5341: Add silabs,xaxb-ext-clk property
  clk: si5341: Allow different output VDD_SEL values
  clk: si5341: Update initialization magic
  clk: si5341: Check for input clock presence and PLL lock on startup
  ...
parents e058a84b d2b21013
...@@ -86,13 +86,11 @@ This binding uses the common clock binding[1]. ...@@ -86,13 +86,11 @@ This binding uses the common clock binding[1].
Required properties: Required properties:
- compatible: Should be one of: - compatible: Should be one of:
"fsl,imx8qm-clock" "fsl,imx8qm-clk"
"fsl,imx8qxp-clock" "fsl,imx8qxp-clk"
followed by "fsl,scu-clk" followed by "fsl,scu-clk"
- #clock-cells: Should be either - #clock-cells: Should be 2.
2: Contains the Resource and Clock ID value. Contains the Resource and Clock ID value.
or
1: Contains the Clock ID value. (DEPRECATED)
- clocks: List of clock specifiers, must contain an entry for - clocks: List of clock specifiers, must contain an entry for
each required entry in clock-names each required entry in clock-names
- clock-names: Should include entries "xtal_32KHz", "xtal_24MHz" - clock-names: Should include entries "xtal_32KHz", "xtal_24MHz"
......
Binding for simple gpio clock multiplexer.
This binding uses the common clock binding[1].
[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
Required properties:
- compatible : shall be "gpio-mux-clock".
- clocks: list of two references to parent clocks.
- #clock-cells : from common clock binding; shall be set to 0.
- select-gpios : GPIO reference for selecting the parent clock.
Example:
clock {
compatible = "gpio-mux-clock";
clocks = <&parentclk1>, <&parentclk2>;
#clock-cells = <0>;
select-gpios = <&gpio 1 GPIO_ACTIVE_HIGH>;
};
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/gpio-mux-clock.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Simple GPIO clock multiplexer
maintainers:
- Sergej Sawazki <ce3a@gmx.de>
properties:
compatible:
const: gpio-mux-clock
clocks:
items:
- description: First parent clock
- description: Second parent clock
'#clock-cells':
const: 0
select-gpios:
description: GPIO reference for selecting the parent clock.
maxItems: 1
required:
- compatible
- clocks
- '#clock-cells'
- select-gpios
additionalProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
clock {
compatible = "gpio-mux-clock";
clocks = <&parentclk1>, <&parentclk2>;
#clock-cells = <0>;
select-gpios = <&gpio 1 GPIO_ACTIVE_HIGH>;
};
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/hisilicon,hi3559av100-clock.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Hisilicon SOC Clock for HI3559AV100
maintainers:
- Dongjiu Geng <gengdongjiu@huawei.com>
description: |
Hisilicon SOC clock control module which supports the clocks, resets and
power domains on HI3559AV100.
See also:
dt-bindings/clock/hi3559av100-clock.h
properties:
compatible:
enum:
- hisilicon,hi3559av100-clock
- hisilicon,hi3559av100-shub-clock
reg:
minItems: 1
maxItems: 2
'#clock-cells':
const: 1
'#reset-cells':
const: 2
description: |
First cell is reset request register offset.
Second cell is bit offset in reset request register.
required:
- compatible
- reg
- '#clock-cells'
- '#reset-cells'
additionalProperties: false
examples:
- |
soc {
#address-cells = <2>;
#size-cells = <2>;
clock-controller@12010000 {
compatible = "hisilicon,hi3559av100-clock";
#clock-cells = <1>;
#reset-cells = <2>;
reg = <0x0 0x12010000 0x0 0x10000>;
};
};
...
...@@ -22,6 +22,8 @@ select: ...@@ -22,6 +22,8 @@ select:
enum: enum:
- ingenic,jz4740-cgu - ingenic,jz4740-cgu
- ingenic,jz4725b-cgu - ingenic,jz4725b-cgu
- ingenic,jz4760-cgu
- ingenic,jz4760b-cgu
- ingenic,jz4770-cgu - ingenic,jz4770-cgu
- ingenic,jz4780-cgu - ingenic,jz4780-cgu
- ingenic,x1000-cgu - ingenic,x1000-cgu
...@@ -49,6 +51,8 @@ properties: ...@@ -49,6 +51,8 @@ properties:
- enum: - enum:
- ingenic,jz4740-cgu - ingenic,jz4740-cgu
- ingenic,jz4725b-cgu - ingenic,jz4725b-cgu
- ingenic,jz4760-cgu
- ingenic,jz4760b-cgu
- ingenic,jz4770-cgu - ingenic,jz4770-cgu
- ingenic,jz4780-cgu - ingenic,jz4780-cgu
- ingenic,x1000-cgu - ingenic,x1000-cgu
......
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/qcom,camcc-sm8250.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Qualcomm Camera Clock & Reset Controller Binding for SM8250
maintainers:
- Jonathan Marek <jonathan@marek.ca>
description: |
Qualcomm camera clock control module which supports the clocks, resets and
power domains on SM8250.
See also dt-bindings/clock/qcom,camcc-sm8250.h
properties:
compatible:
const: qcom,sm8250-camcc
clocks:
items:
- description: Board XO source
- description: Sleep clock source
clock-names:
items:
- const: bi_tcxo
- const: sleep_clk
'#clock-cells':
const: 1
'#reset-cells':
const: 1
'#power-domain-cells':
const: 1
reg:
maxItems: 1
required:
- compatible
- reg
- clocks
- clock-names
- '#clock-cells'
- '#reset-cells'
- '#power-domain-cells'
additionalProperties: false
examples:
- |
#include <dt-bindings/clock/qcom,rpmh.h>
clock-controller@ad00000 {
compatible = "qcom,sm8250-camcc";
reg = <0x0ad00000 0x10000>;
clocks = <&rpmhcc RPMH_CXO_CLK>,
<&sleep_clk>;
clock-names = "bi_tcxo", "sleep_clk";
#clock-cells = <1>;
#reset-cells = <1>;
#power-domain-cells = <1>;
};
...
...@@ -20,6 +20,7 @@ description: | ...@@ -20,6 +20,7 @@ description: |
properties: properties:
compatible: compatible:
enum: enum:
- qcom,sc8180x-dispcc
- qcom,sm8150-dispcc - qcom,sm8150-dispcc
- qcom,sm8250-dispcc - qcom,sm8250-dispcc
......
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/qcom,gcc-sm6125.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Qualcomm Global Clock & Reset Controller Binding for SM6125
maintainers:
- Konrad Dybcio <konrad.dybcio@somainline.org>
description: |
Qualcomm global clock control module which supports the clocks, resets and
power domains on SM6125.
See also:
- dt-bindings/clock/qcom,gcc-sm6125.h
properties:
compatible:
const: qcom,gcc-sm6125
clocks:
items:
- description: Board XO source
- description: Sleep clock source
clock-names:
items:
- const: bi_tcxo
- const: sleep_clk
'#clock-cells':
const: 1
'#reset-cells':
const: 1
'#power-domain-cells':
const: 1
reg:
maxItems: 1
protected-clocks:
description:
Protected clock specifier list as per common clock binding.
required:
- compatible
- clocks
- clock-names
- reg
- '#clock-cells'
- '#reset-cells'
- '#power-domain-cells'
additionalProperties: false
examples:
- |
#include <dt-bindings/clock/qcom,rpmcc.h>
clock-controller@1400000 {
compatible = "qcom,gcc-sm6125";
reg = <0x01400000 0x1f0000>;
#clock-cells = <1>;
#reset-cells = <1>;
#power-domain-cells = <1>;
clock-names = "bi_tcxo", "sleep_clk";
clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>, <&sleep_clk>;
};
...
...@@ -26,9 +26,10 @@ description: | ...@@ -26,9 +26,10 @@ description: |
- dt-bindings/reset/qcom,gcc-msm8939.h - dt-bindings/reset/qcom,gcc-msm8939.h
- dt-bindings/clock/qcom,gcc-msm8660.h - dt-bindings/clock/qcom,gcc-msm8660.h
- dt-bindings/reset/qcom,gcc-msm8660.h - dt-bindings/reset/qcom,gcc-msm8660.h
- dt-bindings/clock/qcom,gcc-msm8974.h - dt-bindings/clock/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974)
- dt-bindings/reset/qcom,gcc-msm8974.h - dt-bindings/reset/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974)
- dt-bindings/clock/qcom,gcc-msm8994.h - dt-bindings/clock/qcom,gcc-msm8994.h
- dt-bindings/clock/qcom,gcc-mdm9607.h
- dt-bindings/clock/qcom,gcc-mdm9615.h - dt-bindings/clock/qcom,gcc-mdm9615.h
- dt-bindings/reset/qcom,gcc-mdm9615.h - dt-bindings/reset/qcom,gcc-mdm9615.h
- dt-bindings/clock/qcom,gcc-sdm660.h (qcom,gcc-sdm630 and qcom,gcc-sdm660) - dt-bindings/clock/qcom,gcc-sdm660.h (qcom,gcc-sdm630 and qcom,gcc-sdm660)
...@@ -40,6 +41,8 @@ properties: ...@@ -40,6 +41,8 @@ properties:
- qcom,gcc-ipq4019 - qcom,gcc-ipq4019
- qcom,gcc-ipq6018 - qcom,gcc-ipq6018
- qcom,gcc-ipq8064 - qcom,gcc-ipq8064
- qcom,gcc-mdm9607
- qcom,gcc-msm8226
- qcom,gcc-msm8660 - qcom,gcc-msm8660
- qcom,gcc-msm8916 - qcom,gcc-msm8916
- qcom,gcc-msm8939 - qcom,gcc-msm8939
......
...@@ -12,6 +12,7 @@ Required properties : ...@@ -12,6 +12,7 @@ Required properties :
"qcom,rpmcc-msm8660", "qcom,rpmcc" "qcom,rpmcc-msm8660", "qcom,rpmcc"
"qcom,rpmcc-apq8060", "qcom,rpmcc" "qcom,rpmcc-apq8060", "qcom,rpmcc"
"qcom,rpmcc-msm8226", "qcom,rpmcc"
"qcom,rpmcc-msm8916", "qcom,rpmcc" "qcom,rpmcc-msm8916", "qcom,rpmcc"
"qcom,rpmcc-msm8936", "qcom,rpmcc" "qcom,rpmcc-msm8936", "qcom,rpmcc"
"qcom,rpmcc-msm8974", "qcom,rpmcc" "qcom,rpmcc-msm8974", "qcom,rpmcc"
......
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: "http://devicetree.org/schemas/clock/renesas,rzg2l-cpg.yaml#"
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
title: Renesas RZ/G2L Clock Pulse Generator / Module Standby Mode
maintainers:
- Geert Uytterhoeven <geert+renesas@glider.be>
description: |
On Renesas RZ/G2L SoC, the CPG (Clock Pulse Generator) and Module
Standby Mode share the same register block.
They provide the following functionalities:
- The CPG block generates various core clocks,
- The Module Standby Mode block provides two functions:
1. Module Standby, providing a Clock Domain to control the clock supply
to individual SoC devices,
2. Reset Control, to perform a software reset of individual SoC devices.
properties:
compatible:
const: renesas,r9a07g044-cpg # RZ/G2{L,LC}
reg:
maxItems: 1
clocks:
maxItems: 1
clock-names:
description:
Clock source to CPG can be either from external clock input (EXCLK) or
crystal oscillator (XIN/XOUT).
const: extal
'#clock-cells':
description: |
- For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
and a core clock reference, as defined in
<dt-bindings/clock/r9a07g044-cpg.h>
- For module clocks, the two clock specifier cells must be "CPG_MOD" and
a module number, as defined in the <dt-bindings/clock/r9a07g044-cpg.h>.
const: 2
'#power-domain-cells':
description:
SoC devices that are part of the CPG/Module Standby Mode Clock Domain and
can be power-managed through Module Standby should refer to the CPG device
node in their "power-domains" property, as documented by the generic PM
Domain bindings in Documentation/devicetree/bindings/power/power-domain.yaml.
const: 0
'#reset-cells':
description:
The single reset specifier cell must be the module number, as defined in
the <dt-bindings/clock/r9a07g044-cpg.h>.
const: 1
required:
- compatible
- reg
- clocks
- clock-names
- '#clock-cells'
- '#power-domain-cells'
- '#reset-cells'
additionalProperties: false
examples:
- |
cpg: clock-controller@11010000 {
compatible = "renesas,r9a07g044-cpg";
reg = <0x11010000 0x10000>;
clocks = <&extal_clk>;
clock-names = "extal";
#clock-cells = <2>;
#power-domain-cells = <0>;
#reset-cells = <1>;
};
...@@ -24,9 +24,8 @@ it. ...@@ -24,9 +24,8 @@ it.
The device type, speed grade and revision are determined runtime by probing. The device type, speed grade and revision are determined runtime by probing.
The driver currently only supports XTAL input mode, and does not support any The driver currently does not support any fancy input configurations. They can
fancy input configurations. They can still be programmed into the chip and still be programmed into the chip and the driver will leave them "as is".
the driver will leave them "as is".
==I2C device node== ==I2C device node==
...@@ -45,9 +44,9 @@ Required properties: ...@@ -45,9 +44,9 @@ Required properties:
corresponding to inputs. Use a fixed clock for the "xtal" input. corresponding to inputs. Use a fixed clock for the "xtal" input.
At least one must be present. At least one must be present.
- clock-names: One of: "xtal", "in0", "in1", "in2" - clock-names: One of: "xtal", "in0", "in1", "in2"
- vdd-supply: Regulator node for VDD
Optional properties: Optional properties:
- vdd-supply: Regulator node for VDD
- vdda-supply: Regulator node for VDDA - vdda-supply: Regulator node for VDDA
- vdds-supply: Regulator node for VDDS - vdds-supply: Regulator node for VDDS
- silabs,pll-m-num, silabs,pll-m-den: Numerator and denominator for PLL - silabs,pll-m-num, silabs,pll-m-den: Numerator and denominator for PLL
...@@ -60,7 +59,14 @@ Optional properties: ...@@ -60,7 +59,14 @@ Optional properties:
be initialized, and always performs the soft-reset routine. Since this will be initialized, and always performs the soft-reset routine. Since this will
temporarily stop all output clocks, don't do this if the chip is generating temporarily stop all output clocks, don't do this if the chip is generating
the CPU clock for example. the CPU clock for example.
- silabs,xaxb-ext-clk: When present, indicates that the XA/XB pins are used
in EXTCLK (external reference clock) rather than XTAL (crystal) mode.
- interrupts: Interrupt for INTRb pin. - interrupts: Interrupt for INTRb pin.
- silabs,iovdd-33: When present, indicates that the I2C lines are using 3.3V
rather than 1.8V thresholds.
- vddoX-supply (where X is an output index): Regulator node for VDDO for the
specified output. The driver selects the output VDD_SEL setting based on this
voltage.
- #address-cells: shall be set to 1. - #address-cells: shall be set to 1.
- #size-cells: shall be set to 0. - #size-cells: shall be set to 0.
...@@ -77,8 +83,6 @@ Required child node properties: ...@@ -77,8 +83,6 @@ Required child node properties:
- reg: number of clock output. - reg: number of clock output.
Optional child node properties: Optional child node properties:
- vdd-supply: Regulator node for VDD for this output. The driver selects default
values for common-mode and amplitude based on the voltage.
- silabs,format: Output format, one of: - silabs,format: Output format, one of:
1 = differential (defaults to LVDS levels) 1 = differential (defaults to LVDS levels)
2 = low-power (defaults to HCSL levels) 2 = low-power (defaults to HCSL levels)
......
...@@ -54,7 +54,9 @@ properties: ...@@ -54,7 +54,9 @@ properties:
compatible: compatible:
items: items:
- const: st,stm32mp1-rcc - enum:
- st,stm32mp1-rcc-secure
- st,stm32mp1-rcc
- const: syscon - const: syscon
reg: reg:
...@@ -71,7 +73,7 @@ additionalProperties: false ...@@ -71,7 +73,7 @@ additionalProperties: false
examples: examples:
- | - |
rcc: rcc@50000000 { rcc: rcc@50000000 {
compatible = "st,stm32mp1-rcc", "syscon"; compatible = "st,stm32mp1-rcc-secure", "syscon";
reg = <0x50000000 0x1000>; reg = <0x50000000 0x1000>;
#clock-cells = <1>; #clock-cells = <1>;
#reset-cells = <1>; #reset-cells = <1>;
......
...@@ -10,7 +10,10 @@ Required properties: ...@@ -10,7 +10,10 @@ Required properties:
- compatible : shall be: - compatible : shall be:
"st,clkgen-pll0" "st,clkgen-pll0"
"st,clkgen-pll0-a0"
"st,clkgen-pll0-c0"
"st,clkgen-pll1" "st,clkgen-pll1"
"st,clkgen-pll1-c0"
"st,stih407-clkgen-plla9" "st,stih407-clkgen-plla9"
"st,stih418-clkgen-plla9" "st,stih418-clkgen-plla9"
......
...@@ -64,6 +64,16 @@ Required properties: ...@@ -64,6 +64,16 @@ Required properties:
audio use case) audio use case)
"st,flexgen-video", "st,flexgen" (enable clock propagation on parent "st,flexgen-video", "st,flexgen" (enable clock propagation on parent
and activate synchronous mode) and activate synchronous mode)
"st,flexgen-stih407-a0"
"st,flexgen-stih410-a0"
"st,flexgen-stih407-c0"
"st,flexgen-stih410-c0"
"st,flexgen-stih418-c0"
"st,flexgen-stih407-d0"
"st,flexgen-stih410-d0"
"st,flexgen-stih407-d2"
"st,flexgen-stih418-d2"
"st,flexgen-stih407-d3"
- #clock-cells : from common clock binding; shall be set to 1 (multiple clock - #clock-cells : from common clock binding; shall be set to 1 (multiple clock
outputs). outputs).
......
...@@ -12,6 +12,9 @@ This binding uses the common clock binding[1]. ...@@ -12,6 +12,9 @@ This binding uses the common clock binding[1].
Required properties: Required properties:
- compatible : shall be: - compatible : shall be:
"st,quadfs" "st,quadfs"
"st,quadfs-d0"
"st,quadfs-d2"
"st,quadfs-d3"
"st,quadfs-pll" "st,quadfs-pll"
......
...@@ -12,7 +12,9 @@ maintainers: ...@@ -12,7 +12,9 @@ maintainers:
properties: properties:
compatible: compatible:
items: items:
- const: ti,am654-ehrpwm-tbclk - enum:
- ti,am654-ehrpwm-tbclk
- ti,am64-epwm-tbclk
- const: syscon - const: syscon
"#clock-cells": "#clock-cells":
......
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/clock/ti,lmk04832.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Clock bindings for the Texas Instruments LMK04832
maintainers:
- Liam Beguin <liambeguin@gmail.com>
description: |
Devicetree binding for the LMK04832, a clock conditioner with JEDEC JESD204B
support. The LMK04832 is pin compatible with the LMK0482x family.
Link to datasheet, https://www.ti.com/lit/ds/symlink/lmk04832.pdf
properties:
compatible:
enum:
- ti,lmk04832
reg:
maxItems: 1
'#address-cells':
const: 1
'#size-cells':
const: 0
'#clock-cells':
const: 1
spi-max-frequency:
maximum: 5000000
clocks:
items:
- description: PLL2 reference clock.
clock-names:
items:
- const: oscin
reset-gpios:
maxItems: 1
ti,spi-4wire-rdbk:
description: |
Select SPI 4wire readback pin configuration.
Available readback pins are,
CLKin_SEL0 0
CLKin_SEL1 1
RESET 2
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2]
default: 1
ti,vco-hz:
description: Optional to set VCO frequency of the PLL in Hertz.
ti,sysref-ddly:
description: SYSREF digital delay value.
$ref: /schemas/types.yaml#/definitions/uint32
minimum: 8
maximum: 8191
default: 8
ti,sysref-mux:
description: |
SYSREF Mux configuration.
Available options are,
Normal SYNC 0
Re-clocked 1
SYSREF Pulser 2
SYSREF Continuous 3
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2, 3]
default: 3
ti,sync-mode:
description: SYNC pin configuration.
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1, 2]
default: 1
ti,sysref-pulse-count:
description:
Number of SYSREF pulses to send when SYSREF is not in continuous mode.
$ref: /schemas/types.yaml#/definitions/uint32
enum: [1, 2, 4, 8]
default: 4
patternProperties:
"@[0-9a-d]+$":
type: object
description:
Child nodes used to configure output clocks.
properties:
reg:
description:
clock output identifier.
minimum: 0
maximum: 13
ti,clkout-fmt:
description:
Clock output format.
Available options are,
Powerdown 0x00
LVDS 0x01
HSDS 6 mA 0x02
HSDS 8 mA 0x03
LVPECL 1600 mV 0x04
LVPECL 2000 mV 0x05
LCPECL 0x06
CML 16 mA 0x07
CML 24 mA 0x08
CML 32 mA 0x09
CMOS (Off/Inverted) 0x0a
CMOS (Normal/Off) 0x0b
CMOS (Inverted/Inverted) 0x0c
CMOS (Inverted/Normal) 0x0d
CMOS (Normal/Inverted) 0x0e
CMOS (Normal/Normal) 0x0f
$ref: /schemas/types.yaml#/definitions/uint32
minimum: 0
maximum: 15
ti,clkout-sysref:
description:
Select SYSREF clock path for output clock.
type: boolean
required:
- reg
additionalProperties: false
required:
- compatible
- reg
- '#clock-cells'
- clocks
- clock-names
additionalProperties: false
examples:
- |
clocks {
lmk04832_oscin: oscin {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <122880000>;
clock-output-names = "lmk04832-oscin";
};
};
spi0 {
#address-cells = <1>;
#size-cells = <0>;
lmk04832: clock-controller@0 {
#address-cells = <1>;
#size-cells = <0>;
reg = <0>;
compatible = "ti,lmk04832";
spi-max-frequency = <781250>;
reset-gpios = <&gpio_lmk 0 0 0>;
#clock-cells = <1>;
clocks = <&lmk04832_oscin>;
clock-names = "oscin";
ti,spi-4wire-rdbk = <0>;
ti,vco-hz = <2457600000>;
assigned-clocks =
<&lmk04832 0>, <&lmk04832 1>,
<&lmk04832 2>, <&lmk04832 3>,
<&lmk04832 4>,
<&lmk04832 6>, <&lmk04832 7>,
<&lmk04832 10>, <&lmk04832 11>;
assigned-clock-rates =
<122880000>, <384000>,
<122880000>, <384000>,
<122880000>,
<153600000>, <384000>,
<614400000>, <384000>;
clkout0@0 {
reg = <0>;
ti,clkout-fmt = <0x01>; // LVDS
};
clkout1@1 {
reg = <1>;
ti,clkout-fmt = <0x01>; // LVDS
ti,clkout-sysref;
};
};
};
...@@ -42,6 +42,11 @@ Required properties: ...@@ -42,6 +42,11 @@ Required properties:
"idlest" - contains the idle status register base address "idlest" - contains the idle status register base address
"mult-div1" - contains the multiplier / divider register base address "mult-div1" - contains the multiplier / divider register base address
"autoidle" - contains the autoidle register base address (optional) "autoidle" - contains the autoidle register base address (optional)
"ssc-deltam" - DPLL supports spread spectrum clocking (SSC), contains
the frequency spreading register base address (optional)
"ssc-modfreq" - DPLL supports spread spectrum clocking (SSC), contains
the modulation frequency register base address
(optional)
ti,am3-* dpll types do not have autoidle register ti,am3-* dpll types do not have autoidle register
ti,omap2-* dpll type does not support idlest / autoidle registers ti,omap2-* dpll type does not support idlest / autoidle registers
...@@ -51,6 +56,14 @@ Optional properties: ...@@ -51,6 +56,14 @@ Optional properties:
- ti,low-power-stop : DPLL supports low power stop mode, gating output - ti,low-power-stop : DPLL supports low power stop mode, gating output
- ti,low-power-bypass : DPLL output matches rate of parent bypass clock - ti,low-power-bypass : DPLL output matches rate of parent bypass clock
- ti,lock : DPLL locks in programmed rate - ti,lock : DPLL locks in programmed rate
- ti,min-div : the minimum divisor to start from to round the DPLL
target rate
- ti,ssc-deltam : DPLL supports spread spectrum clocking, frequency
spreading in permille (10th of a percent)
- ti,ssc-modfreq-hz : DPLL supports spread spectrum clocking, spread
spectrum modulation frequency
- ti,ssc-downspread : DPLL supports spread spectrum clocking, boolean
to enable the downspread feature
Examples: Examples:
dpll_core_ck: dpll_core_ck@44e00490 { dpll_core_ck: dpll_core_ck@44e00490 {
...@@ -83,3 +96,10 @@ Examples: ...@@ -83,3 +96,10 @@ Examples:
clocks = <&sys_ck>, <&sys_ck>; clocks = <&sys_ck>, <&sys_ck>;
reg = <0x0500>, <0x0540>; reg = <0x0500>, <0x0540>;
}; };
dpll_disp_ck: dpll_disp_ck {
#clock-cells = <0>;
compatible = "ti,am3-dpll-no-gate-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x0498>, <0x0448>, <0x0454>, <0x044c>, <0x0450>;
};
...@@ -353,7 +353,6 @@ config ARCH_EP93XX ...@@ -353,7 +353,6 @@ config ARCH_EP93XX
select ARM_VIC select ARM_VIC
select GENERIC_IRQ_MULTI_HANDLER select GENERIC_IRQ_MULTI_HANDLER
select AUTO_ZRELADDR select AUTO_ZRELADDR
select CLKDEV_LOOKUP
select CLKSRC_MMIO select CLKSRC_MMIO
select CPU_ARM920T select CPU_ARM920T
select GPIOLIB select GPIOLIB
...@@ -504,7 +503,6 @@ config ARCH_OMAP1 ...@@ -504,7 +503,6 @@ config ARCH_OMAP1
bool "TI OMAP1" bool "TI OMAP1"
depends on MMU depends on MMU
select ARCH_OMAP select ARCH_OMAP
select CLKDEV_LOOKUP
select CLKSRC_MMIO select CLKSRC_MMIO
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select GENERIC_IRQ_MULTI_HANDLER select GENERIC_IRQ_MULTI_HANDLER
......
...@@ -164,7 +164,7 @@ dpll_core_ck: dpll_core_ck@490 { ...@@ -164,7 +164,7 @@ dpll_core_ck: dpll_core_ck@490 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-core-clock"; compatible = "ti,am3-dpll-core-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x0490>, <0x045c>, <0x0468>; reg = <0x0490>, <0x045c>, <0x0468>, <0x0460>, <0x0464>;
}; };
dpll_core_x2_ck: dpll_core_x2_ck { dpll_core_x2_ck: dpll_core_x2_ck {
...@@ -204,7 +204,7 @@ dpll_mpu_ck: dpll_mpu_ck@488 { ...@@ -204,7 +204,7 @@ dpll_mpu_ck: dpll_mpu_ck@488 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-clock"; compatible = "ti,am3-dpll-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x0488>, <0x0420>, <0x042c>; reg = <0x0488>, <0x0420>, <0x042c>, <0x0424>, <0x0428>;
}; };
dpll_mpu_m2_ck: dpll_mpu_m2_ck@4a8 { dpll_mpu_m2_ck: dpll_mpu_m2_ck@4a8 {
...@@ -220,7 +220,7 @@ dpll_ddr_ck: dpll_ddr_ck@494 { ...@@ -220,7 +220,7 @@ dpll_ddr_ck: dpll_ddr_ck@494 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-no-gate-clock"; compatible = "ti,am3-dpll-no-gate-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x0494>, <0x0434>, <0x0440>; reg = <0x0494>, <0x0434>, <0x0440>, <0x0438>, <0x043c>;
}; };
dpll_ddr_m2_ck: dpll_ddr_m2_ck@4a0 { dpll_ddr_m2_ck: dpll_ddr_m2_ck@4a0 {
...@@ -244,7 +244,7 @@ dpll_disp_ck: dpll_disp_ck@498 { ...@@ -244,7 +244,7 @@ dpll_disp_ck: dpll_disp_ck@498 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-no-gate-clock"; compatible = "ti,am3-dpll-no-gate-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x0498>, <0x0448>, <0x0454>; reg = <0x0498>, <0x0448>, <0x0454>, <0x044c>, <0x0450>;
}; };
dpll_disp_m2_ck: dpll_disp_m2_ck@4a4 { dpll_disp_m2_ck: dpll_disp_m2_ck@4a4 {
...@@ -261,7 +261,7 @@ dpll_per_ck: dpll_per_ck@48c { ...@@ -261,7 +261,7 @@ dpll_per_ck: dpll_per_ck@48c {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-no-gate-j-type-clock"; compatible = "ti,am3-dpll-no-gate-j-type-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x048c>, <0x0470>, <0x049c>; reg = <0x048c>, <0x0470>, <0x049c>, <0x0474>, <0x0478>;
}; };
dpll_per_m2_ck: dpll_per_m2_ck@4ac { dpll_per_m2_ck: dpll_per_m2_ck@4ac {
......
...@@ -204,7 +204,7 @@ dpll_core_ck: dpll_core_ck@2d20 { ...@@ -204,7 +204,7 @@ dpll_core_ck: dpll_core_ck@2d20 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-core-clock"; compatible = "ti,am3-dpll-core-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x2d20>, <0x2d24>, <0x2d2c>; reg = <0x2d20>, <0x2d24>, <0x2d2c>, <0x2d48>, <0x2d4c>;
}; };
dpll_core_x2_ck: dpll_core_x2_ck { dpll_core_x2_ck: dpll_core_x2_ck {
...@@ -250,7 +250,7 @@ dpll_mpu_ck: dpll_mpu_ck@2d60 { ...@@ -250,7 +250,7 @@ dpll_mpu_ck: dpll_mpu_ck@2d60 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-clock"; compatible = "ti,am3-dpll-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x2d60>, <0x2d64>, <0x2d6c>; reg = <0x2d60>, <0x2d64>, <0x2d6c>, <0x2d88>, <0x2d8c>;
}; };
dpll_mpu_m2_ck: dpll_mpu_m2_ck@2d70 { dpll_mpu_m2_ck: dpll_mpu_m2_ck@2d70 {
...@@ -276,7 +276,7 @@ dpll_ddr_ck: dpll_ddr_ck@2da0 { ...@@ -276,7 +276,7 @@ dpll_ddr_ck: dpll_ddr_ck@2da0 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-clock"; compatible = "ti,am3-dpll-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x2da0>, <0x2da4>, <0x2dac>; reg = <0x2da0>, <0x2da4>, <0x2dac>, <0x2dc8>, <0x2dcc>;
}; };
dpll_ddr_m2_ck: dpll_ddr_m2_ck@2db0 { dpll_ddr_m2_ck: dpll_ddr_m2_ck@2db0 {
...@@ -294,7 +294,7 @@ dpll_disp_ck: dpll_disp_ck@2e20 { ...@@ -294,7 +294,7 @@ dpll_disp_ck: dpll_disp_ck@2e20 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-clock"; compatible = "ti,am3-dpll-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x2e20>, <0x2e24>, <0x2e2c>; reg = <0x2e20>, <0x2e24>, <0x2e2c>, <0x2e48>, <0x2e4c>;
}; };
dpll_disp_m2_ck: dpll_disp_m2_ck@2e30 { dpll_disp_m2_ck: dpll_disp_m2_ck@2e30 {
...@@ -313,7 +313,7 @@ dpll_per_ck: dpll_per_ck@2de0 { ...@@ -313,7 +313,7 @@ dpll_per_ck: dpll_per_ck@2de0 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-j-type-clock"; compatible = "ti,am3-dpll-j-type-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x2de0>, <0x2de4>, <0x2dec>; reg = <0x2de0>, <0x2de4>, <0x2dec>, <0x2e08>, <0x2e0c>;
}; };
dpll_per_m2_ck: dpll_per_m2_ck@2df0 { dpll_per_m2_ck: dpll_per_m2_ck@2df0 {
...@@ -557,7 +557,7 @@ dpll_extdev_ck: dpll_extdev_ck@2e60 { ...@@ -557,7 +557,7 @@ dpll_extdev_ck: dpll_extdev_ck@2e60 {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "ti,am3-dpll-clock"; compatible = "ti,am3-dpll-clock";
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>; clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
reg = <0x2e60>, <0x2e64>, <0x2e6c>; reg = <0x2e60>, <0x2e64>, <0x2e6c>, <0x2e88>, <0x2e8c>;
}; };
dpll_extdev_m2_ck: dpll_extdev_m2_ck@2e70 { dpll_extdev_m2_ck: dpll_extdev_m2_ck@2e70 {
......
...@@ -73,20 +73,6 @@ struct clk_ops clk_ops1 = { ...@@ -73,20 +73,6 @@ struct clk_ops clk_ops1 = {
#endif /* MCFPM_PPMCR1 */ #endif /* MCFPM_PPMCR1 */
#endif /* MCFPM_PPMCR0 */ #endif /* MCFPM_PPMCR0 */
struct clk *clk_get(struct device *dev, const char *id)
{
const char *clk_name = dev ? dev_name(dev) : id ? id : NULL;
struct clk *clk;
unsigned i;
for (i = 0; (clk = mcf_clks[i]) != NULL; ++i)
if (!strcmp(clk->name, clk_name))
return clk;
pr_warn("clk_get: didn't find clock %s\n", clk_name);
return ERR_PTR(-ENOENT);
}
EXPORT_SYMBOL(clk_get);
int clk_enable(struct clk *clk) int clk_enable(struct clk *clk)
{ {
unsigned long flags; unsigned long flags;
...@@ -117,13 +103,6 @@ void clk_disable(struct clk *clk) ...@@ -117,13 +103,6 @@ void clk_disable(struct clk *clk)
} }
EXPORT_SYMBOL(clk_disable); EXPORT_SYMBOL(clk_disable);
void clk_put(struct clk *clk)
{
if (clk->enabled != 0)
pr_warn("clk_put %s still enabled\n", clk->name);
}
EXPORT_SYMBOL(clk_put);
unsigned long clk_get_rate(struct clk *clk) unsigned long clk_get_rate(struct clk *clk)
{ {
if (!clk) if (!clk)
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -23,21 +24,15 @@ ...@@ -23,21 +24,15 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr0, "mcftmr.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr1, "mcftmr.1", MCF_BUSCLK);
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK);
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK);
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK);
struct clk *mcf_clks[] = { static struct clk_lookup m5206_clk_lookup[] = {
&clk_pll, CLKDEV_INIT(NULL, "pll.0", &clk_pll),
&clk_sys, CLKDEV_INIT(NULL, "sys.0", &clk_sys),
&clk_mcftmr0, CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
&clk_mcftmr1, CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
&clk_mcfuart0, CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
&clk_mcfuart1, CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
&clk_mcfi2c0, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -66,6 +61,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -66,6 +61,8 @@ void __init config_BSP(char *commandp, int size)
mcf_mapirq2imr(28, MCFINTC_EINT4); mcf_mapirq2imr(28, MCFINTC_EINT4);
mcf_mapirq2imr(31, MCFINTC_EINT7); mcf_mapirq2imr(31, MCFINTC_EINT7);
m5206_i2c_init(); m5206_i2c_init();
clkdev_add_table(m5206_clk_lookup, ARRAY_SIZE(m5206_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -48,31 +49,29 @@ DEFINE_CLK(0, "sys.0", 40, MCF_BUSCLK); ...@@ -48,31 +49,29 @@ DEFINE_CLK(0, "sys.0", 40, MCF_BUSCLK);
DEFINE_CLK(0, "gpio.0", 41, MCF_BUSCLK); DEFINE_CLK(0, "gpio.0", 41, MCF_BUSCLK);
DEFINE_CLK(0, "sdram.0", 42, MCF_CLK); DEFINE_CLK(0, "sdram.0", 42, MCF_CLK);
struct clk *mcf_clks[] = { static struct clk_lookup m520x_clk_lookup[] = {
&__clk_0_2, /* flexbus */ CLKDEV_INIT(NULL, "flexbus", &__clk_0_2),
&__clk_0_12, /* fec.0 */ CLKDEV_INIT("fec.0", NULL, &__clk_0_12),
&__clk_0_17, /* edma */ CLKDEV_INIT("edma", NULL, &__clk_0_17),
&__clk_0_18, /* intc.0 */ CLKDEV_INIT("intc.0", NULL, &__clk_0_18),
&__clk_0_21, /* iack.0 */ CLKDEV_INIT("iack.0", NULL, &__clk_0_21),
&__clk_0_22, /* imx1-i2c.0 */ CLKDEV_INIT("imx1-i2c.0", NULL, &__clk_0_22),
&__clk_0_23, /* mcfqspi.0 */ CLKDEV_INIT("mcfqspi.0", NULL, &__clk_0_23),
&__clk_0_24, /* mcfuart.0 */ CLKDEV_INIT("mcfuart.0", NULL, &__clk_0_24),
&__clk_0_25, /* mcfuart.1 */ CLKDEV_INIT("mcfuart.1", NULL, &__clk_0_25),
&__clk_0_26, /* mcfuart.2 */ CLKDEV_INIT("mcfuart.2", NULL, &__clk_0_26),
&__clk_0_28, /* mcftmr.0 */ CLKDEV_INIT("mcftmr.0", NULL, &__clk_0_28),
&__clk_0_29, /* mcftmr.1 */ CLKDEV_INIT("mcftmr.1", NULL, &__clk_0_29),
&__clk_0_30, /* mcftmr.2 */ CLKDEV_INIT("mcftmr.2", NULL, &__clk_0_30),
&__clk_0_31, /* mcftmr.3 */ CLKDEV_INIT("mcftmr.3", NULL, &__clk_0_31),
CLKDEV_INIT("mcfpit.0", NULL, &__clk_0_32),
&__clk_0_32, /* mcfpit.0 */ CLKDEV_INIT("mcfpit.1", NULL, &__clk_0_33),
&__clk_0_33, /* mcfpit.1 */ CLKDEV_INIT("mcfeport.0", NULL, &__clk_0_34),
&__clk_0_34, /* mcfeport.0 */ CLKDEV_INIT("mcfwdt.0", NULL, &__clk_0_35),
&__clk_0_35, /* mcfwdt.0 */ CLKDEV_INIT(NULL, "pll.0", &__clk_0_36),
&__clk_0_36, /* pll.0 */ CLKDEV_INIT(NULL, "sys.0", &__clk_0_40),
&__clk_0_40, /* sys.0 */ CLKDEV_INIT("gpio.0", NULL, &__clk_0_41),
&__clk_0_41, /* gpio.0 */ CLKDEV_INIT("sdram.0", NULL, &__clk_0_42),
&__clk_0_42, /* sdram.0 */
NULL,
}; };
static struct clk * const enable_clks[] __initconst = { static struct clk * const enable_clks[] __initconst = {
...@@ -115,6 +114,8 @@ static void __init m520x_clk_init(void) ...@@ -115,6 +114,8 @@ static void __init m520x_clk_init(void)
/* make sure these clocks are disabled */ /* make sure these clocks are disabled */
for (i = 0; i < ARRAY_SIZE(disable_clks); ++i) for (i = 0; i < ARRAY_SIZE(disable_clks); ++i)
__clk_init_disabled(disable_clks[i]); __clk_init_disabled(disable_clks[i]);
clkdev_add_table(m520x_clk_lookup, ARRAY_SIZE(m520x_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -26,31 +27,20 @@ ...@@ -26,31 +27,20 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcfpit0, "mcfpit.0", MCF_CLK);
DEFINE_CLK(mcfpit1, "mcfpit.1", MCF_CLK); struct clk_lookup m523x_clk_lookup[] = {
DEFINE_CLK(mcfpit2, "mcfpit.2", MCF_CLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcfpit3, "mcfpit.3", MCF_CLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT("mcfpit.0", NULL, &clk_pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT("mcfpit.1", NULL, &clk_pll),
DEFINE_CLK(mcfuart2, "mcfuart.2", MCF_BUSCLK); CLKDEV_INIT("mcfpit.2", NULL, &clk_pll),
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK); CLKDEV_INIT("mcfpit.3", NULL, &clk_pll),
DEFINE_CLK(fec0, "fec.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
CLKDEV_INIT("mcfuart.2", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("fec.0", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_mcfpit0,
&clk_mcfpit1,
&clk_mcfpit2,
&clk_mcfpit3,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfuart2,
&clk_mcfqspi0,
&clk_fec0,
&clk_mcfi2c0,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -100,6 +90,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -100,6 +90,8 @@ void __init config_BSP(char *commandp, int size)
m523x_fec_init(); m523x_fec_init();
m523x_qspi_init(); m523x_qspi_init();
m523x_i2c_init(); m523x_i2c_init();
clkdev_add_table(m523x_clk_lookup, ARRAY_SIZE(m523x_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -23,25 +24,17 @@ ...@@ -23,25 +24,17 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr0, "mcftmr.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr1, "mcftmr.1", MCF_BUSCLK); struct clk_lookup m5249_clk_lookup[] = {
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
DEFINE_CLK(mcfi2c1, "imx1-i2c.1", MCF_BUSCLK); CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.1", NULL, &clk_sys),
&clk_mcftmr0,
&clk_mcftmr1,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfqspi0,
&clk_mcfi2c0,
&clk_mcfi2c1,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -137,6 +130,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -137,6 +130,8 @@ void __init config_BSP(char *commandp, int size)
#endif #endif
m5249_qspi_init(); m5249_qspi_init();
m5249_i2c_init(); m5249_i2c_init();
clkdev_add_table(m5249_clk_lookup, ARRAY_SIZE(m5249_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -23,25 +24,17 @@ ...@@ -23,25 +24,17 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr0, "mcftmr.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr1, "mcftmr.1", MCF_BUSCLK); static struct clk_lookup m525x_clk_lookup[] = {
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT(NULL, "pll.0", &pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
DEFINE_CLK(mcfi2c1, "imx1-i2c.1", MCF_BUSCLK); CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.1", NULL, &clk_sys),
&clk_mcftmr0,
&clk_mcftmr1,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfqspi0,
&clk_mcfi2c0,
&clk_mcfi2c1,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -88,6 +81,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -88,6 +81,8 @@ void __init config_BSP(char *commandp, int size)
m525x_qspi_init(); m525x_qspi_init();
m525x_i2c_init(); m525x_i2c_init();
clkdev_add_table(m525x_clk_lookup, ARRAY_SIZE(m525x_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -34,27 +35,18 @@ unsigned char ledbank = 0xff; ...@@ -34,27 +35,18 @@ unsigned char ledbank = 0xff;
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr0, "mcftmr.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr1, "mcftmr.1", MCF_BUSCLK); static struct clk_lookup m5272_clk_lookup[] = {
DEFINE_CLK(mcftmr2, "mcftmr.2", MCF_BUSCLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcftmr3, "mcftmr.3", MCF_BUSCLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.2", NULL, &clk_sys),
DEFINE_CLK(fec0, "fec.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.3", NULL, &clk_sys),
CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("fec.0", NULL, &clk_sys),
&clk_mcftmr0,
&clk_mcftmr1,
&clk_mcftmr2,
&clk_mcftmr3,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfqspi0,
&clk_fec0,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -128,6 +120,7 @@ static int __init init_BSP(void) ...@@ -128,6 +120,7 @@ static int __init init_BSP(void)
{ {
m5272_uarts_init(); m5272_uarts_init();
fixed_phy_add(PHY_POLL, 0, &nettel_fixed_phy_status); fixed_phy_add(PHY_POLL, 0, &nettel_fixed_phy_status);
clkdev_add_table(m5272_clk_lookup, ARRAY_SIZE(m5272_clk_lookup));
return 0; return 0;
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -27,33 +28,21 @@ ...@@ -27,33 +28,21 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcfpit0, "mcfpit.0", MCF_CLK);
DEFINE_CLK(mcfpit1, "mcfpit.1", MCF_CLK); static struct clk_lookup m527x_clk_lookup[] = {
DEFINE_CLK(mcfpit2, "mcfpit.2", MCF_CLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcfpit3, "mcfpit.3", MCF_CLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT("mcfpit.0", NULL, &clk_pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT("mcfpit.1", NULL, &clk_pll),
DEFINE_CLK(mcfuart2, "mcfuart.2", MCF_BUSCLK); CLKDEV_INIT("mcfpit.2", NULL, &clk_pll),
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK); CLKDEV_INIT("mcfpit.3", NULL, &clk_pll),
DEFINE_CLK(fec0, "fec.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
DEFINE_CLK(fec1, "fec.1", MCF_BUSCLK); CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.2", NULL, &clk_sys),
CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("fec.0", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("fec.1", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_mcfpit0,
&clk_mcfpit1,
&clk_mcfpit2,
&clk_mcfpit3,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfuart2,
&clk_mcfqspi0,
&clk_fec0,
&clk_fec1,
&clk_mcfi2c0,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -151,6 +140,7 @@ void __init config_BSP(char *commandp, int size) ...@@ -151,6 +140,7 @@ void __init config_BSP(char *commandp, int size)
m527x_fec_init(); m527x_fec_init();
m527x_qspi_init(); m527x_qspi_init();
m527x_i2c_init(); m527x_i2c_init();
clkdev_add_table(m527x_clk_lookup, ARRAY_SIZE(m527x_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -28,31 +29,20 @@ ...@@ -28,31 +29,20 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcfpit0, "mcfpit.0", MCF_CLK);
DEFINE_CLK(mcfpit1, "mcfpit.1", MCF_CLK); static struct clk_lookup m528x_clk_lookup[] = {
DEFINE_CLK(mcfpit2, "mcfpit.2", MCF_CLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcfpit3, "mcfpit.3", MCF_CLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT("mcfpit.0", NULL, &clk_pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT("mcfpit.1", NULL, &clk_pll),
DEFINE_CLK(mcfuart2, "mcfuart.2", MCF_BUSCLK); CLKDEV_INIT("mcfpit.2", NULL, &clk_pll),
DEFINE_CLK(mcfqspi0, "mcfqspi.0", MCF_BUSCLK); CLKDEV_INIT("mcfpit.3", NULL, &clk_pll),
DEFINE_CLK(fec0, "fec.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
CLKDEV_INIT("mcfuart.2", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("fec.0", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_mcfpit0,
&clk_mcfpit1,
&clk_mcfpit2,
&clk_mcfpit3,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfuart2,
&clk_mcfqspi0,
&clk_fec0,
&clk_mcfi2c0,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -146,6 +136,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -146,6 +136,8 @@ void __init config_BSP(char *commandp, int size)
m528x_fec_init(); m528x_fec_init();
m528x_qspi_init(); m528x_qspi_init();
m528x_i2c_init(); m528x_i2c_init();
clkdev_add_table(m528x_clk_lookup, ARRAY_SIZE(m528x_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -32,21 +33,15 @@ unsigned char ledbank = 0xff; ...@@ -32,21 +33,15 @@ unsigned char ledbank = 0xff;
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr0, "mcftmr.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr1, "mcftmr.1", MCF_BUSCLK); static struct clk_lookup m5307_clk_lookup[] = {
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_mcftmr0,
&clk_mcftmr1,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfi2c0,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -88,6 +83,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -88,6 +83,8 @@ void __init config_BSP(char *commandp, int size)
wdebug(MCFDEBUG_CSR, MCFDEBUG_CSR_PSTCLK); wdebug(MCFDEBUG_CSR, MCFDEBUG_CSR_PSTCLK);
#endif #endif
m5307_i2c_init(); m5307_i2c_init();
clkdev_add_table(m5307_clk_lookup, ARRAY_SIZE(m5307_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -65,45 +66,42 @@ DEFINE_CLK(1, "mdha.0", 32, MCF_CLK); ...@@ -65,45 +66,42 @@ DEFINE_CLK(1, "mdha.0", 32, MCF_CLK);
DEFINE_CLK(1, "skha.0", 33, MCF_CLK); DEFINE_CLK(1, "skha.0", 33, MCF_CLK);
DEFINE_CLK(1, "rng.0", 34, MCF_CLK); DEFINE_CLK(1, "rng.0", 34, MCF_CLK);
struct clk *mcf_clks[] = { static struct clk_lookup m53xx_clk_lookup[] = {
&__clk_0_2, /* flexbus */ CLKDEV_INIT("flexbus", NULL, &__clk_0_2),
&__clk_0_8, /* mcfcan.0 */ CLKDEV_INIT("mcfcan.0", NULL, &__clk_0_8),
&__clk_0_12, /* fec.0 */ CLKDEV_INIT("fec.0", NULL, &__clk_0_12),
&__clk_0_17, /* edma */ CLKDEV_INIT("edma", NULL, &__clk_0_17),
&__clk_0_18, /* intc.0 */ CLKDEV_INIT("intc.0", NULL, &__clk_0_18),
&__clk_0_19, /* intc.1 */ CLKDEV_INIT("intc.1", NULL, &__clk_0_19),
&__clk_0_21, /* iack.0 */ CLKDEV_INIT("iack.0", NULL, &__clk_0_21),
&__clk_0_22, /* imx1-i2c.0 */ CLKDEV_INIT("imx1-i2c.0", NULL, &__clk_0_22),
&__clk_0_23, /* mcfqspi.0 */ CLKDEV_INIT("mcfqspi.0", NULL, &__clk_0_23),
&__clk_0_24, /* mcfuart.0 */ CLKDEV_INIT("mcfuart.0", NULL, &__clk_0_24),
&__clk_0_25, /* mcfuart.1 */ CLKDEV_INIT("mcfuart.1", NULL, &__clk_0_25),
&__clk_0_26, /* mcfuart.2 */ CLKDEV_INIT("mcfuart.2", NULL, &__clk_0_26),
&__clk_0_28, /* mcftmr.0 */ CLKDEV_INIT("mcftmr.0", NULL, &__clk_0_28),
&__clk_0_29, /* mcftmr.1 */ CLKDEV_INIT("mcftmr.1", NULL, &__clk_0_29),
&__clk_0_30, /* mcftmr.2 */ CLKDEV_INIT("mcftmr.2", NULL, &__clk_0_30),
&__clk_0_31, /* mcftmr.3 */ CLKDEV_INIT("mcftmr.3", NULL, &__clk_0_31),
CLKDEV_INIT("mcfpit.0", NULL, &__clk_0_32),
&__clk_0_32, /* mcfpit.0 */ CLKDEV_INIT("mcfpit.1", NULL, &__clk_0_33),
&__clk_0_33, /* mcfpit.1 */ CLKDEV_INIT("mcfpit.2", NULL, &__clk_0_34),
&__clk_0_34, /* mcfpit.2 */ CLKDEV_INIT("mcfpit.3", NULL, &__clk_0_35),
&__clk_0_35, /* mcfpit.3 */ CLKDEV_INIT("mcfpwm.0", NULL, &__clk_0_36),
&__clk_0_36, /* mcfpwm.0 */ CLKDEV_INIT("mcfeport.0", NULL, &__clk_0_37),
&__clk_0_37, /* mcfeport.0 */ CLKDEV_INIT("mcfwdt.0", NULL, &__clk_0_38),
&__clk_0_38, /* mcfwdt.0 */ CLKDEV_INIT(NULL, "sys.0", &__clk_0_40),
&__clk_0_40, /* sys.0 */ CLKDEV_INIT("gpio.0", NULL, &__clk_0_41),
&__clk_0_41, /* gpio.0 */ CLKDEV_INIT("mcfrtc.0", NULL, &__clk_0_42),
&__clk_0_42, /* mcfrtc.0 */ CLKDEV_INIT("mcflcd.0", NULL, &__clk_0_43),
&__clk_0_43, /* mcflcd.0 */ CLKDEV_INIT("mcfusb-otg.0", NULL, &__clk_0_44),
&__clk_0_44, /* mcfusb-otg.0 */ CLKDEV_INIT("mcfusb-host.0", NULL, &__clk_0_45),
&__clk_0_45, /* mcfusb-host.0 */ CLKDEV_INIT("sdram.0", NULL, &__clk_0_46),
&__clk_0_46, /* sdram.0 */ CLKDEV_INIT("ssi.0", NULL, &__clk_0_47),
&__clk_0_47, /* ssi.0 */ CLKDEV_INIT(NULL, "pll.0", &__clk_0_48),
&__clk_0_48, /* pll.0 */ CLKDEV_INIT("mdha.0", NULL, &__clk_1_32),
CLKDEV_INIT("skha.0", NULL, &__clk_1_33),
&__clk_1_32, /* mdha.0 */ CLKDEV_INIT("rng.0", NULL, &__clk_1_34),
&__clk_1_33, /* skha.0 */
&__clk_1_34, /* rng.0 */
NULL,
}; };
static struct clk * const enable_clks[] __initconst = { static struct clk * const enable_clks[] __initconst = {
...@@ -158,6 +156,8 @@ static void __init m53xx_clk_init(void) ...@@ -158,6 +156,8 @@ static void __init m53xx_clk_init(void)
/* make sure these clocks are disabled */ /* make sure these clocks are disabled */
for (i = 0; i < ARRAY_SIZE(disable_clks); ++i) for (i = 0; i < ARRAY_SIZE(disable_clks); ++i)
__clk_init_disabled(disable_clks[i]); __clk_init_disabled(disable_clks[i]);
clkdev_add_table(m53xx_clk_lookup, ARRAY_SIZE(m53xx_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -23,21 +24,15 @@ ...@@ -23,21 +24,15 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr0, "mcftmr.0", MCF_BUSCLK);
DEFINE_CLK(mcftmr1, "mcftmr.1", MCF_BUSCLK);
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK);
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK);
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK);
struct clk *mcf_clks[] = { static struct clk_lookup m5407_clk_lookup[] = {
&clk_pll, CLKDEV_INIT(NULL, "pll.0", &clk_pll),
&clk_sys, CLKDEV_INIT(NULL, "sys.0", &clk_sys),
&clk_mcftmr0, CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
&clk_mcftmr1, CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
&clk_mcfuart0, CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
&clk_mcfuart1, CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
&clk_mcfi2c0, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -63,6 +58,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -63,6 +58,8 @@ void __init config_BSP(char *commandp, int size)
mcf_mapirq2imr(29, MCFINTC_EINT5); mcf_mapirq2imr(29, MCFINTC_EINT5);
mcf_mapirq2imr(31, MCFINTC_EINT7); mcf_mapirq2imr(31, MCFINTC_EINT7);
m5407_i2c_init(); m5407_i2c_init();
clkdev_add_table(m5407_clk_lookup, ARRAY_SIZE(m5407_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* (C) Copyright Steven King <sfking@fdwdc.com> * (C) Copyright Steven King <sfking@fdwdc.com>
*/ */
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -78,72 +79,67 @@ DEFINE_CLK(2, "ipg.0", 0, MCF_CLK); ...@@ -78,72 +79,67 @@ DEFINE_CLK(2, "ipg.0", 0, MCF_CLK);
DEFINE_CLK(2, "ahb.0", 1, MCF_CLK); DEFINE_CLK(2, "ahb.0", 1, MCF_CLK);
DEFINE_CLK(2, "per.0", 2, MCF_CLK); DEFINE_CLK(2, "per.0", 2, MCF_CLK);
struct clk *mcf_clks[] = { static struct clk_lookup m5411x_clk_lookup[] = {
&__clk_0_2, CLKDEV_INIT("flexbus", NULL, &__clk_0_2),
&__clk_0_8, CLKDEV_INIT("mcfcan.0", NULL, &__clk_0_8),
&__clk_0_9, CLKDEV_INIT("mcfcan.1", NULL, &__clk_0_9),
&__clk_0_14, CLKDEV_INIT("imx1-i2c.1", NULL, &__clk_0_14),
&__clk_0_15, CLKDEV_INIT("mcfdspi.1", NULL, &__clk_0_15),
&__clk_0_17, CLKDEV_INIT("edma", NULL, &__clk_0_17),
&__clk_0_18, CLKDEV_INIT("intc.0", NULL, &__clk_0_18),
&__clk_0_19, CLKDEV_INIT("intc.1", NULL, &__clk_0_19),
&__clk_0_20, CLKDEV_INIT("intc.2", NULL, &__clk_0_20),
&__clk_0_22, CLKDEV_INIT("imx1-i2c.0", NULL, &__clk_0_22),
&__clk_0_23, CLKDEV_INIT("fsl-dspi.0", NULL, &__clk_0_23),
&__clk_0_24, CLKDEV_INIT("mcfuart.0", NULL, &__clk_0_24),
&__clk_0_25, CLKDEV_INIT("mcfuart.1", NULL, &__clk_0_25),
&__clk_0_26, CLKDEV_INIT("mcfuart.2", NULL, &__clk_0_26),
&__clk_0_27, CLKDEV_INIT("mcfuart.3", NULL, &__clk_0_27),
&__clk_0_28, CLKDEV_INIT("mcftmr.0", NULL, &__clk_0_28),
&__clk_0_29, CLKDEV_INIT("mcftmr.1", NULL, &__clk_0_29),
&__clk_0_30, CLKDEV_INIT("mcftmr.2", NULL, &__clk_0_30),
&__clk_0_31, CLKDEV_INIT("mcftmr.3", NULL, &__clk_0_31),
&__clk_0_32, CLKDEV_INIT("mcfpit.0", NULL, &__clk_0_32),
&__clk_0_33, CLKDEV_INIT("mcfpit.1", NULL, &__clk_0_33),
&__clk_0_34, CLKDEV_INIT("mcfpit.2", NULL, &__clk_0_34),
&__clk_0_35, CLKDEV_INIT("mcfpit.3", NULL, &__clk_0_35),
&__clk_0_37, CLKDEV_INIT("mcfeport.0", NULL, &__clk_0_37),
&__clk_0_38, CLKDEV_INIT("mcfadc.0", NULL, &__clk_0_38),
&__clk_0_39, CLKDEV_INIT("mcfdac.0", NULL, &__clk_0_39),
&__clk_0_42, CLKDEV_INIT("mcfrtc.0", NULL, &__clk_0_42),
&__clk_0_43, CLKDEV_INIT("mcfsim.0", NULL, &__clk_0_43),
&__clk_0_44, CLKDEV_INIT("mcfusb-otg.0", NULL, &__clk_0_44),
&__clk_0_45, CLKDEV_INIT("mcfusb-host.0", NULL, &__clk_0_45),
&__clk_0_46, CLKDEV_INIT("mcfddr-sram.0", NULL, &__clk_0_46),
&__clk_0_47, CLKDEV_INIT("mcfssi.0", NULL, &__clk_0_47),
&__clk_0_48, CLKDEV_INIT(NULL, "pll.0", &__clk_0_48),
&__clk_0_49, CLKDEV_INIT("mcfrng.0", NULL, &__clk_0_49),
&__clk_0_50, CLKDEV_INIT("mcfssi.1", NULL, &__clk_0_50),
&__clk_0_51, CLKDEV_INIT("sdhci-esdhc-mcf.0", NULL, &__clk_0_51),
&__clk_0_53, CLKDEV_INIT("enet-fec.0", NULL, &__clk_0_53),
&__clk_0_54, CLKDEV_INIT("enet-fec.1", NULL, &__clk_0_54),
&__clk_0_55, CLKDEV_INIT("switch.0", NULL, &__clk_0_55),
&__clk_0_56, CLKDEV_INIT("switch.1", NULL, &__clk_0_56),
&__clk_0_63, CLKDEV_INIT("nand.0", NULL, &__clk_0_63),
CLKDEV_INIT("mcfow.0", NULL, &__clk_1_2),
&__clk_1_2, CLKDEV_INIT("imx1-i2c.2", NULL, &__clk_1_4),
&__clk_1_4, CLKDEV_INIT("imx1-i2c.3", NULL, &__clk_1_5),
&__clk_1_5, CLKDEV_INIT("imx1-i2c.4", NULL, &__clk_1_6),
&__clk_1_6, CLKDEV_INIT("imx1-i2c.5", NULL, &__clk_1_7),
&__clk_1_7, CLKDEV_INIT("mcfuart.4", NULL, &__clk_1_24),
&__clk_1_24, CLKDEV_INIT("mcfuart.5", NULL, &__clk_1_25),
&__clk_1_25, CLKDEV_INIT("mcfuart.6", NULL, &__clk_1_26),
&__clk_1_26, CLKDEV_INIT("mcfuart.7", NULL, &__clk_1_27),
&__clk_1_27, CLKDEV_INIT("mcfuart.8", NULL, &__clk_1_28),
&__clk_1_28, CLKDEV_INIT("mcfuart.9", NULL, &__clk_1_29),
&__clk_1_29, CLKDEV_INIT("mcfpwm.0", NULL, &__clk_1_34),
&__clk_1_34, CLKDEV_INIT(NULL, "sys.0", &__clk_1_36),
&__clk_1_36, CLKDEV_INIT("gpio.0", NULL, &__clk_1_37),
&__clk_1_37, CLKDEV_INIT("ipg.0", NULL, &__clk_2_0),
CLKDEV_INIT("ahb.0", NULL, &__clk_2_1),
&__clk_2_0, CLKDEV_INIT("per.0", NULL, &__clk_2_2),
&__clk_2_1,
&__clk_2_2,
NULL,
}; };
static struct clk * const enable_clks[] __initconst = { static struct clk * const enable_clks[] __initconst = {
/* make sure these clocks are enabled */ /* make sure these clocks are enabled */
&__clk_0_15, /* dspi.1 */ &__clk_0_15, /* dspi.1 */
...@@ -228,6 +224,8 @@ static void __init m5441x_clk_init(void) ...@@ -228,6 +224,8 @@ static void __init m5441x_clk_init(void)
/* make sure these clocks are disabled */ /* make sure these clocks are disabled */
for (i = 0; i < ARRAY_SIZE(disable_clks); ++i) for (i = 0; i < ARRAY_SIZE(disable_clks); ++i)
__clk_init_disabled(disable_clks[i]); __clk_init_disabled(disable_clks[i]);
clkdev_add_table(m5411x_clk_lookup, ARRAY_SIZE(m5411x_clk_lookup));
} }
static void __init m5441x_uarts_init(void) static void __init m5441x_uarts_init(void)
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
/***************************************************************************/ /***************************************************************************/
#include <linux/clkdev.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/param.h> #include <linux/param.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -32,25 +33,17 @@ ...@@ -32,25 +33,17 @@
DEFINE_CLK(pll, "pll.0", MCF_CLK); DEFINE_CLK(pll, "pll.0", MCF_CLK);
DEFINE_CLK(sys, "sys.0", MCF_BUSCLK); DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
DEFINE_CLK(mcfslt0, "mcfslt.0", MCF_BUSCLK);
DEFINE_CLK(mcfslt1, "mcfslt.1", MCF_BUSCLK); static struct clk_lookup m54xx_clk_lookup[] = {
DEFINE_CLK(mcfuart0, "mcfuart.0", MCF_BUSCLK); CLKDEV_INIT(NULL, "pll.0", &clk_pll),
DEFINE_CLK(mcfuart1, "mcfuart.1", MCF_BUSCLK); CLKDEV_INIT(NULL, "sys.0", &clk_sys),
DEFINE_CLK(mcfuart2, "mcfuart.2", MCF_BUSCLK); CLKDEV_INIT("mcfslt.0", NULL, &clk_sys),
DEFINE_CLK(mcfuart3, "mcfuart.3", MCF_BUSCLK); CLKDEV_INIT("mcfslt.1", NULL, &clk_sys),
DEFINE_CLK(mcfi2c0, "imx1-i2c.0", MCF_BUSCLK); CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
struct clk *mcf_clks[] = { CLKDEV_INIT("mcfuart.2", NULL, &clk_sys),
&clk_pll, CLKDEV_INIT("mcfuart.3", NULL, &clk_sys),
&clk_sys, CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
&clk_mcfslt0,
&clk_mcfslt1,
&clk_mcfuart0,
&clk_mcfuart1,
&clk_mcfuart2,
&clk_mcfuart3,
&clk_mcfi2c0,
NULL
}; };
/***************************************************************************/ /***************************************************************************/
...@@ -100,6 +93,8 @@ void __init config_BSP(char *commandp, int size) ...@@ -100,6 +93,8 @@ void __init config_BSP(char *commandp, int size)
mach_sched_init = hw_timer_init; mach_sched_init = hw_timer_init;
m54xx_uarts_init(); m54xx_uarts_init();
m54xx_i2c_init(); m54xx_i2c_init();
clkdev_add_table(m54xx_clk_lookup, ARRAY_SIZE(m54xx_clk_lookup));
} }
/***************************************************************************/ /***************************************************************************/
...@@ -15,15 +15,12 @@ struct clk_ops { ...@@ -15,15 +15,12 @@ struct clk_ops {
}; };
struct clk { struct clk {
const char *name;
struct clk_ops *clk_ops; struct clk_ops *clk_ops;
unsigned long rate; unsigned long rate;
unsigned long enabled; unsigned long enabled;
u8 slot; u8 slot;
}; };
extern struct clk *mcf_clks[];
#ifdef MCFPM_PPMCR0 #ifdef MCFPM_PPMCR0
extern struct clk_ops clk_ops0; extern struct clk_ops clk_ops0;
#ifdef MCFPM_PPMCR1 #ifdef MCFPM_PPMCR1
...@@ -34,7 +31,6 @@ extern struct clk_ops clk_ops2; ...@@ -34,7 +31,6 @@ extern struct clk_ops clk_ops2;
#define DEFINE_CLK(clk_bank, clk_name, clk_slot, clk_rate) \ #define DEFINE_CLK(clk_bank, clk_name, clk_slot, clk_rate) \
static struct clk __clk_##clk_bank##_##clk_slot = { \ static struct clk __clk_##clk_bank##_##clk_slot = { \
.name = clk_name, \
.clk_ops = &clk_ops##clk_bank, \ .clk_ops = &clk_ops##clk_bank, \
.rate = clk_rate, \ .rate = clk_rate, \
.slot = clk_slot, \ .slot = clk_slot, \
...@@ -45,7 +41,6 @@ void __clk_init_disabled(struct clk *); ...@@ -45,7 +41,6 @@ void __clk_init_disabled(struct clk *);
#else #else
#define DEFINE_CLK(clk_ref, clk_name, clk_rate) \ #define DEFINE_CLK(clk_ref, clk_name, clk_rate) \
static struct clk clk_##clk_ref = { \ static struct clk clk_##clk_ref = { \
.name = clk_name, \
.rate = clk_rate, \ .rate = clk_rate, \
} }
#endif /* MCFPM_PPMCR0 */ #endif /* MCFPM_PPMCR0 */
......
...@@ -201,6 +201,7 @@ config MIPS_ALCHEMY ...@@ -201,6 +201,7 @@ config MIPS_ALCHEMY
config AR7 config AR7
bool "Texas Instruments AR7" bool "Texas Instruments AR7"
select BOOT_ELF32 select BOOT_ELF32
select COMMON_CLK
select DMA_NONCOHERENT select DMA_NONCOHERENT
select CEVT_R4K select CEVT_R4K
select CSRC_R4K select CSRC_R4K
...@@ -215,7 +216,6 @@ config AR7 ...@@ -215,7 +216,6 @@ config AR7
select SYS_SUPPORTS_ZBOOT_UART16550 select SYS_SUPPORTS_ZBOOT_UART16550
select GPIOLIB select GPIOLIB
select VLYNQ select VLYNQ
select HAVE_LEGACY_CLK
help help
Support for the Texas Instruments AR7 System-on-a-Chip Support for the Texas Instruments AR7 System-on-a-Chip
family: TNETD7100, 7200 and 7300. family: TNETD7100, 7200 and 7300.
...@@ -332,7 +332,6 @@ config BCM63XX ...@@ -332,7 +332,6 @@ config BCM63XX
select SWAP_IO_SPACE select SWAP_IO_SPACE
select GPIOLIB select GPIOLIB
select MIPS_L1_CACHE_SHIFT_4 select MIPS_L1_CACHE_SHIFT_4
select CLKDEV_LOOKUP
select HAVE_LEGACY_CLK select HAVE_LEGACY_CLK
help help
Support for BCM63XX based boards Support for BCM63XX based boards
...@@ -446,7 +445,6 @@ config LANTIQ ...@@ -446,7 +445,6 @@ config LANTIQ
select GPIOLIB select GPIOLIB
select SWAP_IO_SPACE select SWAP_IO_SPACE
select BOOT_RAW select BOOT_RAW
select CLKDEV_LOOKUP
select HAVE_LEGACY_CLK select HAVE_LEGACY_CLK
select USE_OF select USE_OF
select PINCTRL select PINCTRL
...@@ -630,6 +628,7 @@ config MACH_NINTENDO64 ...@@ -630,6 +628,7 @@ config MACH_NINTENDO64
config RALINK config RALINK
bool "Ralink based machines" bool "Ralink based machines"
select CEVT_R4K select CEVT_R4K
select COMMON_CLK
select CSRC_R4K select CSRC_R4K
select BOOT_RAW select BOOT_RAW
select DMA_NONCOHERENT select DMA_NONCOHERENT
...@@ -642,7 +641,6 @@ config RALINK ...@@ -642,7 +641,6 @@ config RALINK
select SYS_SUPPORTS_MIPS16 select SYS_SUPPORTS_MIPS16
select SYS_SUPPORTS_ZBOOT select SYS_SUPPORTS_ZBOOT
select SYS_HAS_EARLY_PRINTK select SYS_HAS_EARLY_PRINTK
select CLKDEV_LOOKUP
select ARCH_HAS_RESET_CONTROLLER select ARCH_HAS_RESET_CONTROLLER
select RESET_CONTROLLER select RESET_CONTROLLER
......
...@@ -13,7 +13,9 @@ ...@@ -13,7 +13,9 @@
#include <linux/gcd.h> #include <linux/gcd.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/clkdev.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clk-provider.h>
#include <asm/addrspace.h> #include <asm/addrspace.h>
#include <asm/mach-ar7/ar7.h> #include <asm/mach-ar7/ar7.h>
...@@ -84,17 +86,17 @@ struct tnetd7200_clocks { ...@@ -84,17 +86,17 @@ struct tnetd7200_clocks {
struct tnetd7200_clock usb; struct tnetd7200_clock usb;
}; };
static struct clk bus_clk = { struct clk_rate {
u32 rate;
};
static struct clk_rate bus_clk = {
.rate = 125000000, .rate = 125000000,
}; };
static struct clk cpu_clk = { static struct clk_rate cpu_clk = {
.rate = 150000000, .rate = 150000000,
}; };
static struct clk dsp_clk;
static struct clk vbus_clk;
static void approximate(int base, int target, int *prediv, static void approximate(int base, int target, int *prediv,
int *postdiv, int *mul) int *postdiv, int *mul)
{ {
...@@ -240,6 +242,8 @@ static void __init tnetd7300_init_clocks(void) ...@@ -240,6 +242,8 @@ static void __init tnetd7300_init_clocks(void)
struct tnetd7300_clocks *clocks = struct tnetd7300_clocks *clocks =
ioremap(UR8_REGS_CLOCKS, ioremap(UR8_REGS_CLOCKS,
sizeof(struct tnetd7300_clocks)); sizeof(struct tnetd7300_clocks));
u32 dsp_clk;
struct clk *clk;
bus_clk.rate = tnetd7300_get_clock(BUS_PLL_SOURCE_SHIFT, bus_clk.rate = tnetd7300_get_clock(BUS_PLL_SOURCE_SHIFT,
&clocks->bus, bootcr, AR7_AFE_CLOCK); &clocks->bus, bootcr, AR7_AFE_CLOCK);
...@@ -250,12 +254,18 @@ static void __init tnetd7300_init_clocks(void) ...@@ -250,12 +254,18 @@ static void __init tnetd7300_init_clocks(void)
else else
cpu_clk.rate = bus_clk.rate; cpu_clk.rate = bus_clk.rate;
if (dsp_clk.rate == 250000000) dsp_clk = tnetd7300_dsp_clock();
if (dsp_clk == 250000000)
tnetd7300_set_clock(DSP_PLL_SOURCE_SHIFT, &clocks->dsp, tnetd7300_set_clock(DSP_PLL_SOURCE_SHIFT, &clocks->dsp,
bootcr, dsp_clk.rate); bootcr, dsp_clk);
iounmap(clocks); iounmap(clocks);
iounmap(bootcr); iounmap(bootcr);
clk = clk_register_fixed_rate(NULL, "cpu", NULL, 0, cpu_clk.rate);
clkdev_create(clk, "cpu", NULL);
clk = clk_register_fixed_rate(NULL, "dsp", NULL, 0, dsp_clk);
clkdev_create(clk, "dsp", NULL);
} }
static void tnetd7200_set_clock(int base, struct tnetd7200_clock *clock, static void tnetd7200_set_clock(int base, struct tnetd7200_clock *clock,
...@@ -327,6 +337,7 @@ static void __init tnetd7200_init_clocks(void) ...@@ -327,6 +337,7 @@ static void __init tnetd7200_init_clocks(void)
int cpu_base, cpu_mul, cpu_prediv, cpu_postdiv; int cpu_base, cpu_mul, cpu_prediv, cpu_postdiv;
int dsp_base, dsp_mul, dsp_prediv, dsp_postdiv; int dsp_base, dsp_mul, dsp_prediv, dsp_postdiv;
int usb_base, usb_mul, usb_prediv, usb_postdiv; int usb_base, usb_mul, usb_prediv, usb_postdiv;
struct clk *clk;
cpu_base = tnetd7200_get_clock_base(TNETD7200_CLOCK_ID_CPU, bootcr); cpu_base = tnetd7200_get_clock_base(TNETD7200_CLOCK_ID_CPU, bootcr);
dsp_base = tnetd7200_get_clock_base(TNETD7200_CLOCK_ID_DSP, bootcr); dsp_base = tnetd7200_get_clock_base(TNETD7200_CLOCK_ID_DSP, bootcr);
...@@ -395,100 +406,34 @@ static void __init tnetd7200_init_clocks(void) ...@@ -395,100 +406,34 @@ static void __init tnetd7200_init_clocks(void)
usb_prediv, usb_postdiv, -1, usb_mul, usb_prediv, usb_postdiv, -1, usb_mul,
TNETD7200_DEF_USB_CLK); TNETD7200_DEF_USB_CLK);
dsp_clk.rate = cpu_clk.rate;
iounmap(clocks); iounmap(clocks);
iounmap(bootcr); iounmap(bootcr);
}
/*
* Linux clock API
*/
int clk_enable(struct clk *clk)
{
return 0;
}
EXPORT_SYMBOL(clk_enable);
void clk_disable(struct clk *clk)
{
}
EXPORT_SYMBOL(clk_disable);
unsigned long clk_get_rate(struct clk *clk)
{
if (!clk)
return 0;
return clk->rate; clk = clk_register_fixed_rate(NULL, "cpu", NULL, 0, cpu_clk.rate);
} clkdev_create(clk, "cpu", NULL);
EXPORT_SYMBOL(clk_get_rate); clkdev_create(clk, "dsp", NULL);
struct clk *clk_get(struct device *dev, const char *id)
{
if (!strcmp(id, "bus"))
return &bus_clk;
/* cpmac and vbus share the same rate */
if (!strcmp(id, "cpmac"))
return &vbus_clk;
if (!strcmp(id, "cpu"))
return &cpu_clk;
if (!strcmp(id, "dsp"))
return &dsp_clk;
if (!strcmp(id, "vbus"))
return &vbus_clk;
return ERR_PTR(-ENOENT);
} }
EXPORT_SYMBOL(clk_get);
void clk_put(struct clk *clk)
{
}
EXPORT_SYMBOL(clk_put);
void __init ar7_init_clocks(void) void __init ar7_init_clocks(void)
{ {
struct clk *clk;
switch (ar7_chip_id()) { switch (ar7_chip_id()) {
case AR7_CHIP_7100: case AR7_CHIP_7100:
case AR7_CHIP_7200: case AR7_CHIP_7200:
tnetd7200_init_clocks(); tnetd7200_init_clocks();
break; break;
case AR7_CHIP_7300: case AR7_CHIP_7300:
dsp_clk.rate = tnetd7300_dsp_clock();
tnetd7300_init_clocks(); tnetd7300_init_clocks();
break; break;
default: default:
break; break;
} }
clk = clk_register_fixed_rate(NULL, "bus", NULL, 0, bus_clk.rate);
clkdev_create(clk, "bus", NULL);
/* adjust vbus clock rate */ /* adjust vbus clock rate */
vbus_clk.rate = bus_clk.rate / 2; clk = clk_register_fixed_factor(NULL, "vbus", "bus", 0, 1, 2);
} clkdev_create(clk, "vbus", NULL);
clkdev_create(clk, "cpmac", "cpmac.1");
/* dummy functions, should not be called */ clkdev_create(clk, "cpmac", "cpmac.1");
long clk_round_rate(struct clk *clk, unsigned long rate)
{
WARN_ON(clk);
return 0;
}
EXPORT_SYMBOL(clk_round_rate);
int clk_set_rate(struct clk *clk, unsigned long rate)
{
WARN_ON(clk);
return 0;
}
EXPORT_SYMBOL(clk_set_rate);
int clk_set_parent(struct clk *clk, struct clk *parent)
{
WARN_ON(clk);
return 0;
}
EXPORT_SYMBOL(clk_set_parent);
struct clk *clk_get_parent(struct clk *clk)
{
WARN_ON(clk);
return NULL;
} }
EXPORT_SYMBOL(clk_get_parent);
...@@ -131,10 +131,6 @@ static inline u8 ar7_chip_rev(void) ...@@ -131,10 +131,6 @@ static inline u8 ar7_chip_rev(void)
0x14))) >> 16) & 0xff; 0x14))) >> 16) & 0xff;
} }
struct clk {
unsigned int rate;
};
static inline int ar7_has_high_cpmac(void) static inline int ar7_has_high_cpmac(void)
{ {
u16 chip_id = ar7_chip_id(); u16 chip_id = ar7_chip_id();
......
...@@ -17,7 +17,6 @@ config PIC32MZDA ...@@ -17,7 +17,6 @@ config PIC32MZDA
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
select GPIOLIB select GPIOLIB
select COMMON_CLK select COMMON_CLK
select CLKDEV_LOOKUP
select LIBFDT select LIBFDT
select USE_OF select USE_OF
select PINCTRL select PINCTRL
......
...@@ -28,22 +28,18 @@ choice ...@@ -28,22 +28,18 @@ choice
bool "RT288x" bool "RT288x"
select MIPS_AUTO_PFN_OFFSET select MIPS_AUTO_PFN_OFFSET
select MIPS_L1_CACHE_SHIFT_4 select MIPS_L1_CACHE_SHIFT_4
select HAVE_LEGACY_CLK
select HAVE_PCI select HAVE_PCI
config SOC_RT305X config SOC_RT305X
bool "RT305x" bool "RT305x"
select HAVE_LEGACY_CLK
config SOC_RT3883 config SOC_RT3883
bool "RT3883" bool "RT3883"
select HAVE_LEGACY_CLK
select HAVE_PCI select HAVE_PCI
config SOC_MT7620 config SOC_MT7620
bool "MT7620/8" bool "MT7620/8"
select CPU_MIPSR2_IRQ_VI select CPU_MIPSR2_IRQ_VI
select HAVE_LEGACY_CLK
select HAVE_PCI select HAVE_PCI
config SOC_MT7621 config SOC_MT7621
...@@ -54,7 +50,6 @@ choice ...@@ -54,7 +50,6 @@ choice
select SYS_SUPPORTS_MIPS_CPS select SYS_SUPPORTS_MIPS_CPS
select SYS_SUPPORTS_HIGHMEM select SYS_SUPPORTS_HIGHMEM
select MIPS_GIC select MIPS_GIC
select COMMON_CLK
select CLKSRC_MIPS_GIC select CLKSRC_MIPS_GIC
select HAVE_PCI if PCI_MT7621 select HAVE_PCI if PCI_MT7621
select SOC_BUS select SOC_BUS
......
...@@ -10,79 +10,21 @@ ...@@ -10,79 +10,21 @@
#include <linux/export.h> #include <linux/export.h>
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clk-provider.h>
#include <asm/time.h> #include <asm/time.h>
#include "common.h" #include "common.h"
struct clk {
struct clk_lookup cl;
unsigned long rate;
};
void ralink_clk_add(const char *dev, unsigned long rate) void ralink_clk_add(const char *dev, unsigned long rate)
{ {
struct clk *clk = kzalloc(sizeof(struct clk), GFP_KERNEL); struct clk *clk = clk_register_fixed_rate(NULL, dev, NULL, 0, rate);
if (!clk) if (!clk)
panic("failed to add clock"); panic("failed to add clock");
clk->cl.dev_id = dev; clkdev_create(clk, NULL, "%s", dev);
clk->cl.clk = clk;
clk->rate = rate;
clkdev_add(&clk->cl);
}
/*
* Linux clock API
*/
int clk_enable(struct clk *clk)
{
return 0;
}
EXPORT_SYMBOL_GPL(clk_enable);
void clk_disable(struct clk *clk)
{
}
EXPORT_SYMBOL_GPL(clk_disable);
unsigned long clk_get_rate(struct clk *clk)
{
if (!clk)
return 0;
return clk->rate;
}
EXPORT_SYMBOL_GPL(clk_get_rate);
int clk_set_rate(struct clk *clk, unsigned long rate)
{
return -1;
}
EXPORT_SYMBOL_GPL(clk_set_rate);
long clk_round_rate(struct clk *clk, unsigned long rate)
{
return -1;
}
EXPORT_SYMBOL_GPL(clk_round_rate);
int clk_set_parent(struct clk *clk, struct clk *parent)
{
WARN_ON(clk);
return -1;
}
EXPORT_SYMBOL_GPL(clk_set_parent);
struct clk *clk_get_parent(struct clk *clk)
{
WARN_ON(clk);
return NULL;
} }
EXPORT_SYMBOL_GPL(clk_get_parent);
void __init plat_time_init(void) void __init plat_time_init(void)
{ {
......
...@@ -14,7 +14,6 @@ config SUPERH ...@@ -14,7 +14,6 @@ config SUPERH
select ARCH_HIBERNATION_POSSIBLE if MMU select ARCH_HIBERNATION_POSSIBLE if MMU
select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_PARPORT
select ARCH_WANT_IPC_PARSE_VERSION select ARCH_WANT_IPC_PARSE_VERSION
select CLKDEV_LOOKUP
select CPU_NO_EFFICIENT_FFS select CPU_NO_EFFICIENT_FFS
select DMA_DECLARE_COHERENT select DMA_DECLARE_COHERENT
select GENERIC_ATOMIC64 select GENERIC_ATOMIC64
......
...@@ -6,10 +6,6 @@ config HAVE_CLK ...@@ -6,10 +6,6 @@ config HAVE_CLK
The <linux/clk.h> calls support software clock gating and The <linux/clk.h> calls support software clock gating and
thus are a key power management tool on many systems. thus are a key power management tool on many systems.
config CLKDEV_LOOKUP
bool
select HAVE_CLK
config HAVE_CLK_PREPARE config HAVE_CLK_PREPARE
bool bool
...@@ -26,7 +22,7 @@ menuconfig COMMON_CLK ...@@ -26,7 +22,7 @@ menuconfig COMMON_CLK
bool "Common Clock Framework" bool "Common Clock Framework"
depends on !HAVE_LEGACY_CLK depends on !HAVE_LEGACY_CLK
select HAVE_CLK_PREPARE select HAVE_CLK_PREPARE
select CLKDEV_LOOKUP select HAVE_CLK
select SRCU select SRCU
select RATIONAL select RATIONAL
help help
...@@ -55,6 +51,14 @@ config CLK_HSDK ...@@ -55,6 +51,14 @@ config CLK_HSDK
This driver supports the HSDK core, system, ddr, tunnel and hdmi PLLs This driver supports the HSDK core, system, ddr, tunnel and hdmi PLLs
control. control.
config LMK04832
tristate "Ti LMK04832 JESD204B Compliant Clock Jitter Cleaner"
depends on SPI
select REGMAP_SPI
help
Say yes here to build support for Texas Instruments' LMK04832 Ultra
Low-Noise JESD204B Compliant Clock Jitter Cleaner With Dual Loop PLLs
config COMMON_CLK_MAX77686 config COMMON_CLK_MAX77686
tristate "Clock driver for Maxim 77620/77686/77802 MFD" tristate "Clock driver for Maxim 77620/77686/77802 MFD"
depends on MFD_MAX77686 || MFD_MAX77620 || COMPILE_TEST depends on MFD_MAX77686 || MFD_MAX77620 || COMPILE_TEST
...@@ -335,6 +339,16 @@ config COMMON_CLK_STM32MP157 ...@@ -335,6 +339,16 @@ config COMMON_CLK_STM32MP157
help help
Support for stm32mp157 SoC family clocks Support for stm32mp157 SoC family clocks
config COMMON_CLK_STM32MP157_SCMI
bool "stm32mp157 Clock driver with Trusted Firmware"
depends on COMMON_CLK_STM32MP157
select COMMON_CLK_SCMI
select ARM_SCMI_PROTOCOL
default y
help
Support for stm32mp157 SoC family clocks with Trusted Firmware using
SCMI protocol.
config COMMON_CLK_STM32F config COMMON_CLK_STM32F
def_bool COMMON_CLK && (MACH_STM32F429 || MACH_STM32F469 || MACH_STM32F746) def_bool COMMON_CLK && (MACH_STM32F429 || MACH_STM32F469 || MACH_STM32F746)
help help
...@@ -358,10 +372,10 @@ config COMMON_CLK_MMP2_AUDIO ...@@ -358,10 +372,10 @@ config COMMON_CLK_MMP2_AUDIO
config COMMON_CLK_BD718XX config COMMON_CLK_BD718XX
tristate "Clock driver for 32K clk gates on ROHM PMICs" tristate "Clock driver for 32K clk gates on ROHM PMICs"
depends on MFD_ROHM_BD718XX || MFD_ROHM_BD70528 || MFD_ROHM_BD71828 depends on MFD_ROHM_BD718XX || MFD_ROHM_BD71828
help help
This driver supports ROHM BD71837, ROHM BD71847, ROHM BD71828 and This driver supports ROHM BD71837, BD71847, BD71850, BD71815
ROHM BD70528 PMICs clock gates. and BD71828 PMICs clock gates.
config COMMON_CLK_FIXED_MMIO config COMMON_CLK_FIXED_MMIO
bool "Clock driver for Memory Mapped Fixed values" bool "Clock driver for Memory Mapped Fixed values"
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# common clock types # common clock types
obj-$(CONFIG_HAVE_CLK) += clk-devres.o clk-bulk.o obj-$(CONFIG_HAVE_CLK) += clk-devres.o clk-bulk.o clkdev.o
obj-$(CONFIG_CLKDEV_LOOKUP) += clkdev.o
obj-$(CONFIG_COMMON_CLK) += clk.o obj-$(CONFIG_COMMON_CLK) += clk.o
obj-$(CONFIG_COMMON_CLK) += clk-divider.o obj-$(CONFIG_COMMON_CLK) += clk-divider.o
obj-$(CONFIG_COMMON_CLK) += clk-fixed-factor.o obj-$(CONFIG_COMMON_CLK) += clk-fixed-factor.o
...@@ -37,6 +36,7 @@ obj-$(CONFIG_MACH_ASPEED_G6) += clk-ast2600.o ...@@ -37,6 +36,7 @@ obj-$(CONFIG_MACH_ASPEED_G6) += clk-ast2600.o
obj-$(CONFIG_ARCH_HIGHBANK) += clk-highbank.o obj-$(CONFIG_ARCH_HIGHBANK) += clk-highbank.o
obj-$(CONFIG_CLK_HSDK) += clk-hsdk-pll.o obj-$(CONFIG_CLK_HSDK) += clk-hsdk-pll.o
obj-$(CONFIG_COMMON_CLK_K210) += clk-k210.o obj-$(CONFIG_COMMON_CLK_K210) += clk-k210.o
obj-$(CONFIG_LMK04832) += clk-lmk04832.o
obj-$(CONFIG_COMMON_CLK_LOCHNAGAR) += clk-lochnagar.o obj-$(CONFIG_COMMON_CLK_LOCHNAGAR) += clk-lochnagar.o
obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
obj-$(CONFIG_COMMON_CLK_MAX9485) += clk-max9485.o obj-$(CONFIG_COMMON_CLK_MAX9485) += clk-max9485.o
......
...@@ -113,6 +113,7 @@ static const char * const sensor_clk_mux_p[] = { "hosc", "bisp_clk" }; ...@@ -113,6 +113,7 @@ static const char * const sensor_clk_mux_p[] = { "hosc", "bisp_clk" };
static const char * const sd_clk_mux_p[] = { "dev_clk", "nand_pll_clk" }; static const char * const sd_clk_mux_p[] = { "dev_clk", "nand_pll_clk" };
static const char * const pwm_clk_mux_p[] = { "losc", "hosc" }; static const char * const pwm_clk_mux_p[] = { "losc", "hosc" };
static const char * const ahbprediv_clk_mux_p[] = { "dev_clk", "display_pll_clk", "nand_pll_clk", "ddr_pll_clk" }; static const char * const ahbprediv_clk_mux_p[] = { "dev_clk", "display_pll_clk", "nand_pll_clk", "ddr_pll_clk" };
static const char * const nic_clk_mux_p[] = { "dev_clk", "display_pll_clk", "nand_pll_clk", "ddr_pll_clk" };
static const char * const uart_clk_mux_p[] = { "hosc", "dev_pll_clk" }; static const char * const uart_clk_mux_p[] = { "hosc", "dev_pll_clk" };
static const char * const de_clk_mux_p[] = { "display_pll_clk", "dev_clk" }; static const char * const de_clk_mux_p[] = { "display_pll_clk", "dev_clk" };
static const char * const i2s_clk_mux_p[] = { "audio_pll_clk" }; static const char * const i2s_clk_mux_p[] = { "audio_pll_clk" };
...@@ -127,8 +128,7 @@ static struct clk_factor_table sd_factor_table[] = { ...@@ -127,8 +128,7 @@ static struct clk_factor_table sd_factor_table[] = {
{ 12, 1, 13 }, { 13, 1, 14 }, { 14, 1, 15 }, { 15, 1, 16 }, { 12, 1, 13 }, { 13, 1, 14 }, { 14, 1, 15 }, { 15, 1, 16 },
{ 16, 1, 17 }, { 17, 1, 18 }, { 18, 1, 19 }, { 19, 1, 20 }, { 16, 1, 17 }, { 17, 1, 18 }, { 18, 1, 19 }, { 19, 1, 20 },
{ 20, 1, 21 }, { 21, 1, 22 }, { 22, 1, 23 }, { 23, 1, 24 }, { 20, 1, 21 }, { 21, 1, 22 }, { 22, 1, 23 }, { 23, 1, 24 },
{ 24, 1, 25 }, { 25, 1, 26 }, { 26, 1, 27 }, { 27, 1, 28 }, { 24, 1, 25 },
{ 28, 1, 29 }, { 29, 1, 30 }, { 30, 1, 31 }, { 31, 1, 32 },
/* bit8: /128 */ /* bit8: /128 */
{ 256, 1, 1 * 128 }, { 257, 1, 2 * 128 }, { 258, 1, 3 * 128 }, { 259, 1, 4 * 128 }, { 256, 1, 1 * 128 }, { 257, 1, 2 * 128 }, { 258, 1, 3 * 128 }, { 259, 1, 4 * 128 },
...@@ -137,19 +137,20 @@ static struct clk_factor_table sd_factor_table[] = { ...@@ -137,19 +137,20 @@ static struct clk_factor_table sd_factor_table[] = {
{ 268, 1, 13 * 128 }, { 269, 1, 14 * 128 }, { 270, 1, 15 * 128 }, { 271, 1, 16 * 128 }, { 268, 1, 13 * 128 }, { 269, 1, 14 * 128 }, { 270, 1, 15 * 128 }, { 271, 1, 16 * 128 },
{ 272, 1, 17 * 128 }, { 273, 1, 18 * 128 }, { 274, 1, 19 * 128 }, { 275, 1, 20 * 128 }, { 272, 1, 17 * 128 }, { 273, 1, 18 * 128 }, { 274, 1, 19 * 128 }, { 275, 1, 20 * 128 },
{ 276, 1, 21 * 128 }, { 277, 1, 22 * 128 }, { 278, 1, 23 * 128 }, { 279, 1, 24 * 128 }, { 276, 1, 21 * 128 }, { 277, 1, 22 * 128 }, { 278, 1, 23 * 128 }, { 279, 1, 24 * 128 },
{ 280, 1, 25 * 128 }, { 281, 1, 26 * 128 }, { 282, 1, 27 * 128 }, { 283, 1, 28 * 128 }, { 280, 1, 25 * 128 },
{ 284, 1, 29 * 128 }, { 285, 1, 30 * 128 }, { 286, 1, 31 * 128 }, { 287, 1, 32 * 128 },
{ 0, 0, 0 }, { 0, 0, 0 },
}; };
static struct clk_factor_table bisp_factor_table[] = { static struct clk_factor_table de_factor_table[] = {
{ 0, 1, 1 }, { 1, 1, 2 }, { 2, 1, 3 }, { 3, 1, 4 }, { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 5 },
{ 4, 1, 5 }, { 5, 1, 6 }, { 6, 1, 7 }, { 7, 1, 8 }, { 4, 1, 3 }, { 5, 1, 4 }, { 6, 1, 6 }, { 7, 1, 8 },
{ 8, 1, 12 },
{ 0, 0, 0 }, { 0, 0, 0 },
}; };
static struct clk_factor_table ahb_factor_table[] = { static struct clk_factor_table hde_factor_table[] = {
{ 1, 1, 2 }, { 2, 1, 3 }, { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 5 },
{ 4, 1, 3 }, { 5, 1, 4 }, { 6, 1, 6 }, { 7, 1, 8 },
{ 0, 0, 0 }, { 0, 0, 0 },
}; };
...@@ -158,6 +159,13 @@ static struct clk_div_table rmii_ref_div_table[] = { ...@@ -158,6 +159,13 @@ static struct clk_div_table rmii_ref_div_table[] = {
{ 0, 0 }, { 0, 0 },
}; };
static struct clk_div_table std12rate_div_table[] = {
{ 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 },
{ 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 },
{ 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 },
{ 0, 0 },
};
static struct clk_div_table i2s_div_table[] = { static struct clk_div_table i2s_div_table[] = {
{ 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 },
{ 4, 6 }, { 5, 8 }, { 6, 12 }, { 7, 16 }, { 4, 6 }, { 5, 8 }, { 6, 12 }, { 7, 16 },
...@@ -174,7 +182,6 @@ static struct clk_div_table nand_div_table[] = { ...@@ -174,7 +182,6 @@ static struct clk_div_table nand_div_table[] = {
/* mux clock */ /* mux clock */
static OWL_MUX(dev_clk, "dev_clk", dev_clk_mux_p, CMU_DEVPLL, 12, 1, CLK_SET_RATE_PARENT); static OWL_MUX(dev_clk, "dev_clk", dev_clk_mux_p, CMU_DEVPLL, 12, 1, CLK_SET_RATE_PARENT);
static OWL_MUX(ahbprediv_clk, "ahbprediv_clk", ahbprediv_clk_mux_p, CMU_BUSCLK1, 8, 3, CLK_SET_RATE_PARENT);
/* gate clocks */ /* gate clocks */
static OWL_GATE(gpio_clk, "gpio_clk", "apb_clk", CMU_DEVCLKEN0, 18, 0, 0); static OWL_GATE(gpio_clk, "gpio_clk", "apb_clk", CMU_DEVCLKEN0, 18, 0, 0);
...@@ -187,45 +194,60 @@ static OWL_GATE(timer_clk, "timer_clk", "hosc", CMU_DEVCLKEN1, 27, 0, 0); ...@@ -187,45 +194,60 @@ static OWL_GATE(timer_clk, "timer_clk", "hosc", CMU_DEVCLKEN1, 27, 0, 0);
static OWL_GATE(hdmi_clk, "hdmi_clk", "hosc", CMU_DEVCLKEN1, 3, 0, 0); static OWL_GATE(hdmi_clk, "hdmi_clk", "hosc", CMU_DEVCLKEN1, 3, 0, 0);
/* divider clocks */ /* divider clocks */
static OWL_DIVIDER(h_clk, "h_clk", "ahbprediv_clk", CMU_BUSCLK1, 12, 2, NULL, 0, 0); static OWL_DIVIDER(h_clk, "h_clk", "ahbprediv_clk", CMU_BUSCLK1, 2, 2, NULL, 0, 0);
static OWL_DIVIDER(apb_clk, "apb_clk", "ahb_clk", CMU_BUSCLK1, 14, 2, NULL, 0, 0); static OWL_DIVIDER(apb_clk, "apb_clk", "nic_clk", CMU_BUSCLK1, 14, 2, NULL, 0, 0);
static OWL_DIVIDER(rmii_ref_clk, "rmii_ref_clk", "ethernet_pll_clk", CMU_ETHERNETPLL, 1, 1, rmii_ref_div_table, 0, 0); static OWL_DIVIDER(rmii_ref_clk, "rmii_ref_clk", "ethernet_pll_clk", CMU_ETHERNETPLL, 1, 1, rmii_ref_div_table, 0, 0);
/* factor clocks */ /* factor clocks */
static OWL_FACTOR(ahb_clk, "ahb_clk", "h_clk", CMU_BUSCLK1, 2, 2, ahb_factor_table, 0, 0); static OWL_FACTOR(de1_clk, "de_clk1", "de_clk", CMU_DECLK, 0, 4, de_factor_table, 0, 0);
static OWL_FACTOR(de1_clk, "de_clk1", "de_clk", CMU_DECLK, 0, 3, bisp_factor_table, 0, 0); static OWL_FACTOR(de2_clk, "de_clk2", "de_clk", CMU_DECLK, 4, 4, de_factor_table, 0, 0);
static OWL_FACTOR(de2_clk, "de_clk2", "de_clk", CMU_DECLK, 4, 3, bisp_factor_table, 0, 0);
/* composite clocks */ /* composite clocks */
static OWL_COMP_DIV(nic_clk, "nic_clk", nic_clk_mux_p,
OWL_MUX_HW(CMU_BUSCLK1, 4, 3),
{ 0 },
OWL_DIVIDER_HW(CMU_BUSCLK1, 16, 2, 0, NULL),
0);
static OWL_COMP_DIV(ahbprediv_clk, "ahbprediv_clk", ahbprediv_clk_mux_p,
OWL_MUX_HW(CMU_BUSCLK1, 8, 3),
{ 0 },
OWL_DIVIDER_HW(CMU_BUSCLK1, 12, 2, 0, NULL),
CLK_SET_RATE_PARENT);
static OWL_COMP_FIXED_FACTOR(ahb_clk, "ahb_clk", "h_clk",
{ 0 },
1, 1, 0);
static OWL_COMP_FACTOR(vce_clk, "vce_clk", hde_clk_mux_p, static OWL_COMP_FACTOR(vce_clk, "vce_clk", hde_clk_mux_p,
OWL_MUX_HW(CMU_VCECLK, 4, 2), OWL_MUX_HW(CMU_VCECLK, 4, 2),
OWL_GATE_HW(CMU_DEVCLKEN0, 26, 0), OWL_GATE_HW(CMU_DEVCLKEN0, 26, 0),
OWL_FACTOR_HW(CMU_VCECLK, 0, 3, 0, bisp_factor_table), OWL_FACTOR_HW(CMU_VCECLK, 0, 3, 0, hde_factor_table),
0); 0);
static OWL_COMP_FACTOR(vde_clk, "vde_clk", hde_clk_mux_p, static OWL_COMP_FACTOR(vde_clk, "vde_clk", hde_clk_mux_p,
OWL_MUX_HW(CMU_VDECLK, 4, 2), OWL_MUX_HW(CMU_VDECLK, 4, 2),
OWL_GATE_HW(CMU_DEVCLKEN0, 25, 0), OWL_GATE_HW(CMU_DEVCLKEN0, 25, 0),
OWL_FACTOR_HW(CMU_VDECLK, 0, 3, 0, bisp_factor_table), OWL_FACTOR_HW(CMU_VDECLK, 0, 3, 0, hde_factor_table),
0); 0);
static OWL_COMP_FACTOR(bisp_clk, "bisp_clk", bisp_clk_mux_p, static OWL_COMP_DIV(bisp_clk, "bisp_clk", bisp_clk_mux_p,
OWL_MUX_HW(CMU_BISPCLK, 4, 1), OWL_MUX_HW(CMU_BISPCLK, 4, 1),
OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0), OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0),
OWL_FACTOR_HW(CMU_BISPCLK, 0, 3, 0, bisp_factor_table), OWL_DIVIDER_HW(CMU_BISPCLK, 0, 4, 0, std12rate_div_table),
0); 0);
static OWL_COMP_FACTOR(sensor0_clk, "sensor0_clk", sensor_clk_mux_p, static OWL_COMP_DIV(sensor0_clk, "sensor0_clk", sensor_clk_mux_p,
OWL_MUX_HW(CMU_SENSORCLK, 4, 1), OWL_MUX_HW(CMU_SENSORCLK, 4, 1),
OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0), OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0),
OWL_FACTOR_HW(CMU_SENSORCLK, 0, 3, 0, bisp_factor_table), OWL_DIVIDER_HW(CMU_SENSORCLK, 0, 4, 0, std12rate_div_table),
CLK_IGNORE_UNUSED); 0);
static OWL_COMP_FACTOR(sensor1_clk, "sensor1_clk", sensor_clk_mux_p, static OWL_COMP_DIV(sensor1_clk, "sensor1_clk", sensor_clk_mux_p,
OWL_MUX_HW(CMU_SENSORCLK, 4, 1), OWL_MUX_HW(CMU_SENSORCLK, 4, 1),
OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0), OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0),
OWL_FACTOR_HW(CMU_SENSORCLK, 8, 3, 0, bisp_factor_table), OWL_DIVIDER_HW(CMU_SENSORCLK, 8, 4, 0, std12rate_div_table),
CLK_IGNORE_UNUSED); 0);
static OWL_COMP_FACTOR(sd0_clk, "sd0_clk", sd_clk_mux_p, static OWL_COMP_FACTOR(sd0_clk, "sd0_clk", sd_clk_mux_p,
OWL_MUX_HW(CMU_SD0CLK, 9, 1), OWL_MUX_HW(CMU_SD0CLK, 9, 1),
...@@ -302,10 +324,14 @@ static OWL_COMP_FIXED_FACTOR(i2c3_clk, "i2c3_clk", "ethernet_pll_clk", ...@@ -302,10 +324,14 @@ static OWL_COMP_FIXED_FACTOR(i2c3_clk, "i2c3_clk", "ethernet_pll_clk",
OWL_GATE_HW(CMU_DEVCLKEN1, 31, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 31, 0),
1, 5, 0); 1, 5, 0);
static OWL_COMP_FIXED_FACTOR(ethernet_clk, "ethernet_clk", "ethernet_pll_clk",
OWL_GATE_HW(CMU_DEVCLKEN1, 22, 0),
1, 20, 0);
static OWL_COMP_DIV(uart0_clk, "uart0_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart0_clk, "uart0_clk", uart_clk_mux_p,
OWL_MUX_HW(CMU_UART0CLK, 16, 1), OWL_MUX_HW(CMU_UART0CLK, 16, 1),
OWL_GATE_HW(CMU_DEVCLKEN1, 6, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 6, 0),
OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), OWL_DIVIDER_HW(CMU_UART0CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
CLK_IGNORE_UNUSED); CLK_IGNORE_UNUSED);
static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p,
...@@ -317,31 +343,31 @@ static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p, ...@@ -317,31 +343,31 @@ static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p,
static OWL_COMP_DIV(uart2_clk, "uart2_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart2_clk, "uart2_clk", uart_clk_mux_p,
OWL_MUX_HW(CMU_UART2CLK, 16, 1), OWL_MUX_HW(CMU_UART2CLK, 16, 1),
OWL_GATE_HW(CMU_DEVCLKEN1, 8, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 8, 0),
OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), OWL_DIVIDER_HW(CMU_UART2CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
CLK_IGNORE_UNUSED); CLK_IGNORE_UNUSED);
static OWL_COMP_DIV(uart3_clk, "uart3_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart3_clk, "uart3_clk", uart_clk_mux_p,
OWL_MUX_HW(CMU_UART3CLK, 16, 1), OWL_MUX_HW(CMU_UART3CLK, 16, 1),
OWL_GATE_HW(CMU_DEVCLKEN1, 19, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 19, 0),
OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), OWL_DIVIDER_HW(CMU_UART3CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
CLK_IGNORE_UNUSED); CLK_IGNORE_UNUSED);
static OWL_COMP_DIV(uart4_clk, "uart4_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart4_clk, "uart4_clk", uart_clk_mux_p,
OWL_MUX_HW(CMU_UART4CLK, 16, 1), OWL_MUX_HW(CMU_UART4CLK, 16, 1),
OWL_GATE_HW(CMU_DEVCLKEN1, 20, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 20, 0),
OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), OWL_DIVIDER_HW(CMU_UART4CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
CLK_IGNORE_UNUSED); CLK_IGNORE_UNUSED);
static OWL_COMP_DIV(uart5_clk, "uart5_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart5_clk, "uart5_clk", uart_clk_mux_p,
OWL_MUX_HW(CMU_UART5CLK, 16, 1), OWL_MUX_HW(CMU_UART5CLK, 16, 1),
OWL_GATE_HW(CMU_DEVCLKEN1, 21, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 21, 0),
OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), OWL_DIVIDER_HW(CMU_UART5CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
CLK_IGNORE_UNUSED); CLK_IGNORE_UNUSED);
static OWL_COMP_DIV(uart6_clk, "uart6_clk", uart_clk_mux_p, static OWL_COMP_DIV(uart6_clk, "uart6_clk", uart_clk_mux_p,
OWL_MUX_HW(CMU_UART6CLK, 16, 1), OWL_MUX_HW(CMU_UART6CLK, 16, 1),
OWL_GATE_HW(CMU_DEVCLKEN1, 18, 0), OWL_GATE_HW(CMU_DEVCLKEN1, 18, 0),
OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL), OWL_DIVIDER_HW(CMU_UART6CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
CLK_IGNORE_UNUSED); CLK_IGNORE_UNUSED);
static OWL_COMP_DIV(i2srx_clk, "i2srx_clk", i2s_clk_mux_p, static OWL_COMP_DIV(i2srx_clk, "i2srx_clk", i2s_clk_mux_p,
...@@ -436,6 +462,8 @@ static struct owl_clk_common *s500_clks[] = { ...@@ -436,6 +462,8 @@ static struct owl_clk_common *s500_clks[] = {
&apb_clk.common, &apb_clk.common,
&dmac_clk.common, &dmac_clk.common,
&gpio_clk.common, &gpio_clk.common,
&nic_clk.common,
&ethernet_clk.common,
}; };
static struct clk_hw_onecell_data s500_hw_clks = { static struct clk_hw_onecell_data s500_hw_clks = {
...@@ -495,6 +523,8 @@ static struct clk_hw_onecell_data s500_hw_clks = { ...@@ -495,6 +523,8 @@ static struct clk_hw_onecell_data s500_hw_clks = {
[CLK_APB] = &apb_clk.common.hw, [CLK_APB] = &apb_clk.common.hw,
[CLK_DMAC] = &dmac_clk.common.hw, [CLK_DMAC] = &dmac_clk.common.hw,
[CLK_GPIO] = &gpio_clk.common.hw, [CLK_GPIO] = &gpio_clk.common.hw,
[CLK_NIC] = &nic_clk.common.hw,
[CLK_ETHERNET] = &ethernet_clk.common.hw,
}, },
.num = CLK_NR_CLKS, .num = CLK_NR_CLKS,
}; };
......
...@@ -198,7 +198,7 @@ static int __wrpll_update_parent_rate(struct wrpll_cfg *c, ...@@ -198,7 +198,7 @@ static int __wrpll_update_parent_rate(struct wrpll_cfg *c,
} }
/** /**
* wrpll_configure() - compute PLL configuration for a target rate * wrpll_configure_for_rate() - compute PLL configuration for a target rate
* @c: ptr to a struct wrpll_cfg record to write into * @c: ptr to a struct wrpll_cfg record to write into
* @target_rate: target PLL output clock rate (post-Q-divider) * @target_rate: target PLL output clock rate (post-Q-divider)
* @parent_rate: PLL input refclk rate (pre-R-divider) * @parent_rate: PLL input refclk rate (pre-R-divider)
......
...@@ -15,15 +15,13 @@ ...@@ -15,15 +15,13 @@
/* clk control registers */ /* clk control registers */
/* BD71815 */ /* BD71815 */
#define BD71815_REG_OUT32K 0x1d #define BD71815_REG_OUT32K 0x1d
/* BD70528 */
#define BD70528_REG_OUT32K 0x2c
/* BD71828 */ /* BD71828 */
#define BD71828_REG_OUT32K 0x4B #define BD71828_REG_OUT32K 0x4B
/* BD71837 and BD71847 */ /* BD71837 and BD71847 */
#define BD718XX_REG_OUT32K 0x2E #define BD718XX_REG_OUT32K 0x2E
/* /*
* BD71837, BD71847, BD70528 and BD71828 all use bit [0] to clk output control * BD71837, BD71847, and BD71828 all use bit [0] to clk output control
*/ */
#define CLK_OUT_EN_MASK BIT(0) #define CLK_OUT_EN_MASK BIT(0)
...@@ -116,10 +114,6 @@ static int bd71837_clk_probe(struct platform_device *pdev) ...@@ -116,10 +114,6 @@ static int bd71837_clk_probe(struct platform_device *pdev)
c->reg = BD71828_REG_OUT32K; c->reg = BD71828_REG_OUT32K;
c->mask = CLK_OUT_EN_MASK; c->mask = CLK_OUT_EN_MASK;
break; break;
case ROHM_CHIP_TYPE_BD70528:
c->reg = BD70528_REG_OUT32K;
c->mask = CLK_OUT_EN_MASK;
break;
case ROHM_CHIP_TYPE_BD71815: case ROHM_CHIP_TYPE_BD71815:
c->reg = BD71815_REG_OUT32K; c->reg = BD71815_REG_OUT32K;
c->mask = CLK_OUT_EN_MASK; c->mask = CLK_OUT_EN_MASK;
...@@ -150,7 +144,6 @@ static int bd71837_clk_probe(struct platform_device *pdev) ...@@ -150,7 +144,6 @@ static int bd71837_clk_probe(struct platform_device *pdev)
static const struct platform_device_id bd718x7_clk_id[] = { static const struct platform_device_id bd718x7_clk_id[] = {
{ "bd71837-clk", ROHM_CHIP_TYPE_BD71837 }, { "bd71837-clk", ROHM_CHIP_TYPE_BD71837 },
{ "bd71847-clk", ROHM_CHIP_TYPE_BD71847 }, { "bd71847-clk", ROHM_CHIP_TYPE_BD71847 },
{ "bd70528-clk", ROHM_CHIP_TYPE_BD70528 },
{ "bd71828-clk", ROHM_CHIP_TYPE_BD71828 }, { "bd71828-clk", ROHM_CHIP_TYPE_BD71828 },
{ "bd71815-clk", ROHM_CHIP_TYPE_BD71815 }, { "bd71815-clk", ROHM_CHIP_TYPE_BD71815 },
{ }, { },
...@@ -168,6 +161,6 @@ static struct platform_driver bd71837_clk = { ...@@ -168,6 +161,6 @@ static struct platform_driver bd71837_clk = {
module_platform_driver(bd71837_clk); module_platform_driver(bd71837_clk);
MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
MODULE_DESCRIPTION("BD718(15/18/28/37/47/50) and BD70528 chip clk driver"); MODULE_DESCRIPTION("BD718(15/18/28/37/47/50) and chip clk driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:bd718xx-clk"); MODULE_ALIAS("platform:bd718xx-clk");
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -69,7 +69,10 @@ ...@@ -69,7 +69,10 @@
#define VC5_FEEDBACK_FRAC_DIV(n) (0x19 + (n)) #define VC5_FEEDBACK_FRAC_DIV(n) (0x19 + (n))
#define VC5_RC_CONTROL0 0x1e #define VC5_RC_CONTROL0 0x1e
#define VC5_RC_CONTROL1 0x1f #define VC5_RC_CONTROL1 0x1f
/* Register 0x20 is factory reserved */
/* These registers are named "Unused Factory Reserved Registers" */
#define VC5_RESERVED_X0(idx) (0x20 + ((idx) * 0x10))
#define VC5_RESERVED_X0_BYPASS_SYNC BIT(7) /* bypass_sync<idx> bit */
/* Output divider control for divider 1,2,3,4 */ /* Output divider control for divider 1,2,3,4 */
#define VC5_OUT_DIV_CONTROL(idx) (0x21 + ((idx) * 0x10)) #define VC5_OUT_DIV_CONTROL(idx) (0x21 + ((idx) * 0x10))
...@@ -87,7 +90,6 @@ ...@@ -87,7 +90,6 @@
#define VC5_OUT_DIV_SKEW_INT(idx, n) (0x2b + ((idx) * 0x10) + (n)) #define VC5_OUT_DIV_SKEW_INT(idx, n) (0x2b + ((idx) * 0x10) + (n))
#define VC5_OUT_DIV_INT(idx, n) (0x2d + ((idx) * 0x10) + (n)) #define VC5_OUT_DIV_INT(idx, n) (0x2d + ((idx) * 0x10) + (n))
#define VC5_OUT_DIV_SKEW_FRAC(idx) (0x2f + ((idx) * 0x10)) #define VC5_OUT_DIV_SKEW_FRAC(idx) (0x2f + ((idx) * 0x10))
/* Registers 0x30, 0x40, 0x50 are factory reserved */
/* Clock control register for clock 1,2 */ /* Clock control register for clock 1,2 */
#define VC5_CLK_OUTPUT_CFG(idx, n) (0x60 + ((idx) * 0x2) + (n)) #define VC5_CLK_OUTPUT_CFG(idx, n) (0x60 + ((idx) * 0x2) + (n))
...@@ -140,6 +142,8 @@ ...@@ -140,6 +142,8 @@
#define VC5_HAS_INTERNAL_XTAL BIT(0) #define VC5_HAS_INTERNAL_XTAL BIT(0)
/* chip has PFD requency doubler */ /* chip has PFD requency doubler */
#define VC5_HAS_PFD_FREQ_DBL BIT(1) #define VC5_HAS_PFD_FREQ_DBL BIT(1)
/* chip has bits to disable FOD sync */
#define VC5_HAS_BYPASS_SYNC_BIT BIT(2)
/* Supported IDT VC5 models. */ /* Supported IDT VC5 models. */
enum vc5_model { enum vc5_model {
...@@ -581,6 +585,23 @@ static int vc5_clk_out_prepare(struct clk_hw *hw) ...@@ -581,6 +585,23 @@ static int vc5_clk_out_prepare(struct clk_hw *hw)
unsigned int src; unsigned int src;
int ret; int ret;
/*
* When enabling a FOD, all currently enabled FODs are briefly
* stopped in order to synchronize all of them. This causes a clock
* disruption to any unrelated chips that might be already using
* other clock outputs. Bypass the sync feature to avoid the issue,
* which is possible on the VersaClock 6E family via reserved
* registers.
*/
if (vc5->chip_info->flags & VC5_HAS_BYPASS_SYNC_BIT) {
ret = regmap_update_bits(vc5->regmap,
VC5_RESERVED_X0(hwdata->num),
VC5_RESERVED_X0_BYPASS_SYNC,
VC5_RESERVED_X0_BYPASS_SYNC);
if (ret)
return ret;
}
/* /*
* If the input mux is disabled, enable it first and * If the input mux is disabled, enable it first and
* select source from matching FOD. * select source from matching FOD.
...@@ -1166,7 +1187,7 @@ static const struct vc5_chip_info idt_5p49v6965_info = { ...@@ -1166,7 +1187,7 @@ static const struct vc5_chip_info idt_5p49v6965_info = {
.model = IDT_VC6_5P49V6965, .model = IDT_VC6_5P49V6965,
.clk_fod_cnt = 4, .clk_fod_cnt = 4,
.clk_out_cnt = 5, .clk_out_cnt = 5,
.flags = 0, .flags = VC5_HAS_BYPASS_SYNC_BIT,
}; };
static const struct i2c_device_id vc5_id[] = { static const struct i2c_device_id vc5_id[] = {
......
...@@ -190,34 +190,6 @@ vclkdev_create(struct clk_hw *hw, const char *con_id, const char *dev_fmt, ...@@ -190,34 +190,6 @@ vclkdev_create(struct clk_hw *hw, const char *con_id, const char *dev_fmt,
return cl; return cl;
} }
struct clk_lookup * __ref
clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...)
{
struct clk_lookup *cl;
va_list ap;
va_start(ap, dev_fmt);
cl = vclkdev_alloc(__clk_get_hw(clk), con_id, dev_fmt, ap);
va_end(ap);
return cl;
}
EXPORT_SYMBOL(clkdev_alloc);
struct clk_lookup *
clkdev_hw_alloc(struct clk_hw *hw, const char *con_id, const char *dev_fmt, ...)
{
struct clk_lookup *cl;
va_list ap;
va_start(ap, dev_fmt);
cl = vclkdev_alloc(hw, con_id, dev_fmt, ap);
va_end(ap);
return cl;
}
EXPORT_SYMBOL(clkdev_hw_alloc);
/** /**
* clkdev_create - allocate and add a clkdev lookup structure * clkdev_create - allocate and add a clkdev lookup structure
* @clk: struct clk to associate with all clk_lookups * @clk: struct clk to associate with all clk_lookups
......
...@@ -15,6 +15,13 @@ config COMMON_CLK_HI3519 ...@@ -15,6 +15,13 @@ config COMMON_CLK_HI3519
help help
Build the clock driver for hi3519. Build the clock driver for hi3519.
config COMMON_CLK_HI3559A
bool "Hi3559A Clock Driver"
depends on ARCH_HISI || COMPILE_TEST
default ARCH_HISI
help
Build the clock driver for hi3559a.
config COMMON_CLK_HI3660 config COMMON_CLK_HI3660
bool "Hi3660 Clock Driver" bool "Hi3660 Clock Driver"
depends on ARCH_HISI || COMPILE_TEST depends on ARCH_HISI || COMPILE_TEST
......
...@@ -10,6 +10,7 @@ obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o ...@@ -10,6 +10,7 @@ obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o
obj-$(CONFIG_ARCH_HIX5HD2) += clk-hix5hd2.o obj-$(CONFIG_ARCH_HIX5HD2) += clk-hix5hd2.o
obj-$(CONFIG_COMMON_CLK_HI3516CV300) += crg-hi3516cv300.o obj-$(CONFIG_COMMON_CLK_HI3516CV300) += crg-hi3516cv300.o
obj-$(CONFIG_COMMON_CLK_HI3519) += clk-hi3519.o obj-$(CONFIG_COMMON_CLK_HI3519) += clk-hi3519.o
obj-$(CONFIG_COMMON_CLK_HI3559A) += clk-hi3559a.o
obj-$(CONFIG_COMMON_CLK_HI3660) += clk-hi3660.o obj-$(CONFIG_COMMON_CLK_HI3660) += clk-hi3660.o
obj-$(CONFIG_COMMON_CLK_HI3670) += clk-hi3670.o obj-$(CONFIG_COMMON_CLK_HI3670) += clk-hi3670.o
obj-$(CONFIG_COMMON_CLK_HI3798CV200) += crg-hi3798cv200.o obj-$(CONFIG_COMMON_CLK_HI3798CV200) += crg-hi3798cv200.o
......
This diff is collapsed.
...@@ -162,7 +162,7 @@ int hisi_clk_register_mux(const struct hisi_mux_clock *clks, ...@@ -162,7 +162,7 @@ int hisi_clk_register_mux(const struct hisi_mux_clock *clks,
clks[i].num_parents, clks[i].flags, clks[i].num_parents, clks[i].flags,
base + clks[i].offset, clks[i].shift, base + clks[i].offset, clks[i].shift,
mask, clks[i].mux_flags, mask, clks[i].mux_flags,
clks[i].table, &hisi_clk_lock); (u32 *)clks[i].table, &hisi_clk_lock);
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
pr_err("%s: failed to register clock %s\n", pr_err("%s: failed to register clock %s\n",
__func__, clks[i].name); __func__, clks[i].name);
......
...@@ -50,7 +50,7 @@ struct hisi_mux_clock { ...@@ -50,7 +50,7 @@ struct hisi_mux_clock {
u8 shift; u8 shift;
u8 width; u8 width;
u8 mux_flags; u8 mux_flags;
u32 *table; const u32 *table;
const char *alias; const char *alias;
}; };
......
...@@ -27,7 +27,8 @@ obj-$(CONFIG_CLK_IMX8MP) += clk-imx8mp.o ...@@ -27,7 +27,8 @@ obj-$(CONFIG_CLK_IMX8MP) += clk-imx8mp.o
obj-$(CONFIG_CLK_IMX8MQ) += clk-imx8mq.o obj-$(CONFIG_CLK_IMX8MQ) += clk-imx8mq.o
obj-$(CONFIG_MXC_CLK_SCU) += clk-imx-scu.o clk-imx-lpcg-scu.o obj-$(CONFIG_MXC_CLK_SCU) += clk-imx-scu.o clk-imx-lpcg-scu.o
clk-imx-scu-$(CONFIG_CLK_IMX8QXP) += clk-scu.o clk-imx8qxp.o clk-imx-scu-$(CONFIG_CLK_IMX8QXP) += clk-scu.o clk-imx8qxp.o \
clk-imx8qxp-rsrc.o clk-imx8qm-rsrc.o
clk-imx-lpcg-scu-$(CONFIG_CLK_IMX8QXP) += clk-lpcg-scu.o clk-imx8qxp-lpcg.o clk-imx-lpcg-scu-$(CONFIG_CLK_IMX8QXP) += clk-lpcg-scu.o clk-imx8qxp-lpcg.o
obj-$(CONFIG_CLK_IMX1) += clk-imx1.o obj-$(CONFIG_CLK_IMX1) += clk-imx1.o
......
...@@ -556,7 +556,6 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) ...@@ -556,7 +556,6 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
hws[IMX8MP_CLK_MIPI_DSI_ESC_RX] = imx8m_clk_hw_composite_bus("mipi_dsi_esc_rx", imx8mp_mipi_dsi_esc_rx_sels, ccm_base + 0x9200); hws[IMX8MP_CLK_MIPI_DSI_ESC_RX] = imx8m_clk_hw_composite_bus("mipi_dsi_esc_rx", imx8mp_mipi_dsi_esc_rx_sels, ccm_base + 0x9200);
hws[IMX8MP_CLK_IPG_ROOT] = imx_clk_hw_divider2("ipg_root", "ahb_root", ccm_base + 0x9080, 0, 1); hws[IMX8MP_CLK_IPG_ROOT] = imx_clk_hw_divider2("ipg_root", "ahb_root", ccm_base + 0x9080, 0, 1);
hws[IMX8MP_CLK_IPG_AUDIO_ROOT] = imx_clk_hw_divider2("ipg_audio_root", "audio_ahb", ccm_base + 0x9180, 0, 1);
hws[IMX8MP_CLK_DRAM_ALT] = imx8m_clk_hw_composite("dram_alt", imx8mp_dram_alt_sels, ccm_base + 0xa000); hws[IMX8MP_CLK_DRAM_ALT] = imx8m_clk_hw_composite("dram_alt", imx8mp_dram_alt_sels, ccm_base + 0xa000);
hws[IMX8MP_CLK_DRAM_APB] = imx8m_clk_hw_composite_critical("dram_apb", imx8mp_dram_apb_sels, ccm_base + 0xa080); hws[IMX8MP_CLK_DRAM_APB] = imx8m_clk_hw_composite_critical("dram_apb", imx8mp_dram_apb_sels, ccm_base + 0xa080);
......
...@@ -358,46 +358,26 @@ static int imx8mq_clocks_probe(struct platform_device *pdev) ...@@ -358,46 +358,26 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
hws[IMX8MQ_VIDEO2_PLL_OUT] = imx_clk_hw_sscg_pll("video2_pll_out", video2_pll_out_sels, ARRAY_SIZE(video2_pll_out_sels), 0, 0, 0, base + 0x54, 0); hws[IMX8MQ_VIDEO2_PLL_OUT] = imx_clk_hw_sscg_pll("video2_pll_out", video2_pll_out_sels, ARRAY_SIZE(video2_pll_out_sels), 0, 0, 0, base + 0x54, 0);
/* SYS PLL1 fixed output */ /* SYS PLL1 fixed output */
hws[IMX8MQ_SYS1_PLL_40M_CG] = imx_clk_hw_gate("sys1_pll_40m_cg", "sys1_pll_out", base + 0x30, 9); hws[IMX8MQ_SYS1_PLL_40M] = imx_clk_hw_fixed_factor("sys1_pll_40m", "sys1_pll_out", 1, 20);
hws[IMX8MQ_SYS1_PLL_80M_CG] = imx_clk_hw_gate("sys1_pll_80m_cg", "sys1_pll_out", base + 0x30, 11); hws[IMX8MQ_SYS1_PLL_80M] = imx_clk_hw_fixed_factor("sys1_pll_80m", "sys1_pll_out", 1, 10);
hws[IMX8MQ_SYS1_PLL_100M_CG] = imx_clk_hw_gate("sys1_pll_100m_cg", "sys1_pll_out", base + 0x30, 13); hws[IMX8MQ_SYS1_PLL_100M] = imx_clk_hw_fixed_factor("sys1_pll_100m", "sys1_pll_out", 1, 8);
hws[IMX8MQ_SYS1_PLL_133M_CG] = imx_clk_hw_gate("sys1_pll_133m_cg", "sys1_pll_out", base + 0x30, 15); hws[IMX8MQ_SYS1_PLL_133M] = imx_clk_hw_fixed_factor("sys1_pll_133m", "sys1_pll_out", 1, 6);
hws[IMX8MQ_SYS1_PLL_160M_CG] = imx_clk_hw_gate("sys1_pll_160m_cg", "sys1_pll_out", base + 0x30, 17); hws[IMX8MQ_SYS1_PLL_160M] = imx_clk_hw_fixed_factor("sys1_pll_160m", "sys1_pll_out", 1, 5);
hws[IMX8MQ_SYS1_PLL_200M_CG] = imx_clk_hw_gate("sys1_pll_200m_cg", "sys1_pll_out", base + 0x30, 19); hws[IMX8MQ_SYS1_PLL_200M] = imx_clk_hw_fixed_factor("sys1_pll_200m", "sys1_pll_out", 1, 4);
hws[IMX8MQ_SYS1_PLL_266M_CG] = imx_clk_hw_gate("sys1_pll_266m_cg", "sys1_pll_out", base + 0x30, 21); hws[IMX8MQ_SYS1_PLL_266M] = imx_clk_hw_fixed_factor("sys1_pll_266m", "sys1_pll_out", 1, 3);
hws[IMX8MQ_SYS1_PLL_400M_CG] = imx_clk_hw_gate("sys1_pll_400m_cg", "sys1_pll_out", base + 0x30, 23); hws[IMX8MQ_SYS1_PLL_400M] = imx_clk_hw_fixed_factor("sys1_pll_400m", "sys1_pll_out", 1, 2);
hws[IMX8MQ_SYS1_PLL_800M_CG] = imx_clk_hw_gate("sys1_pll_800m_cg", "sys1_pll_out", base + 0x30, 25); hws[IMX8MQ_SYS1_PLL_800M] = imx_clk_hw_fixed_factor("sys1_pll_800m", "sys1_pll_out", 1, 1);
hws[IMX8MQ_SYS1_PLL_40M] = imx_clk_hw_fixed_factor("sys1_pll_40m", "sys1_pll_40m_cg", 1, 20);
hws[IMX8MQ_SYS1_PLL_80M] = imx_clk_hw_fixed_factor("sys1_pll_80m", "sys1_pll_80m_cg", 1, 10);
hws[IMX8MQ_SYS1_PLL_100M] = imx_clk_hw_fixed_factor("sys1_pll_100m", "sys1_pll_100m_cg", 1, 8);
hws[IMX8MQ_SYS1_PLL_133M] = imx_clk_hw_fixed_factor("sys1_pll_133m", "sys1_pll_133m_cg", 1, 6);
hws[IMX8MQ_SYS1_PLL_160M] = imx_clk_hw_fixed_factor("sys1_pll_160m", "sys1_pll_160m_cg", 1, 5);
hws[IMX8MQ_SYS1_PLL_200M] = imx_clk_hw_fixed_factor("sys1_pll_200m", "sys1_pll_200m_cg", 1, 4);
hws[IMX8MQ_SYS1_PLL_266M] = imx_clk_hw_fixed_factor("sys1_pll_266m", "sys1_pll_266m_cg", 1, 3);
hws[IMX8MQ_SYS1_PLL_400M] = imx_clk_hw_fixed_factor("sys1_pll_400m", "sys1_pll_400m_cg", 1, 2);
hws[IMX8MQ_SYS1_PLL_800M] = imx_clk_hw_fixed_factor("sys1_pll_800m", "sys1_pll_800m_cg", 1, 1);
/* SYS PLL2 fixed output */ /* SYS PLL2 fixed output */
hws[IMX8MQ_SYS2_PLL_50M_CG] = imx_clk_hw_gate("sys2_pll_50m_cg", "sys2_pll_out", base + 0x3c, 9); hws[IMX8MQ_SYS2_PLL_50M] = imx_clk_hw_fixed_factor("sys2_pll_50m", "sys2_pll_out", 1, 20);
hws[IMX8MQ_SYS2_PLL_100M_CG] = imx_clk_hw_gate("sys2_pll_100m_cg", "sys2_pll_out", base + 0x3c, 11); hws[IMX8MQ_SYS2_PLL_100M] = imx_clk_hw_fixed_factor("sys2_pll_100m", "sys2_pll_out", 1, 10);
hws[IMX8MQ_SYS2_PLL_125M_CG] = imx_clk_hw_gate("sys2_pll_125m_cg", "sys2_pll_out", base + 0x3c, 13); hws[IMX8MQ_SYS2_PLL_125M] = imx_clk_hw_fixed_factor("sys2_pll_125m", "sys2_pll_out", 1, 8);
hws[IMX8MQ_SYS2_PLL_166M_CG] = imx_clk_hw_gate("sys2_pll_166m_cg", "sys2_pll_out", base + 0x3c, 15); hws[IMX8MQ_SYS2_PLL_166M] = imx_clk_hw_fixed_factor("sys2_pll_166m", "sys2_pll_out", 1, 6);
hws[IMX8MQ_SYS2_PLL_200M_CG] = imx_clk_hw_gate("sys2_pll_200m_cg", "sys2_pll_out", base + 0x3c, 17); hws[IMX8MQ_SYS2_PLL_200M] = imx_clk_hw_fixed_factor("sys2_pll_200m", "sys2_pll_out", 1, 5);
hws[IMX8MQ_SYS2_PLL_250M_CG] = imx_clk_hw_gate("sys2_pll_250m_cg", "sys2_pll_out", base + 0x3c, 19); hws[IMX8MQ_SYS2_PLL_250M] = imx_clk_hw_fixed_factor("sys2_pll_250m", "sys2_pll_out", 1, 4);
hws[IMX8MQ_SYS2_PLL_333M_CG] = imx_clk_hw_gate("sys2_pll_333m_cg", "sys2_pll_out", base + 0x3c, 21); hws[IMX8MQ_SYS2_PLL_333M] = imx_clk_hw_fixed_factor("sys2_pll_333m", "sys2_pll_out", 1, 3);
hws[IMX8MQ_SYS2_PLL_500M_CG] = imx_clk_hw_gate("sys2_pll_500m_cg", "sys2_pll_out", base + 0x3c, 23); hws[IMX8MQ_SYS2_PLL_500M] = imx_clk_hw_fixed_factor("sys2_pll_500m", "sys2_pll_out", 1, 2);
hws[IMX8MQ_SYS2_PLL_1000M_CG] = imx_clk_hw_gate("sys2_pll_1000m_cg", "sys2_pll_out", base + 0x3c, 25); hws[IMX8MQ_SYS2_PLL_1000M] = imx_clk_hw_fixed_factor("sys2_pll_1000m", "sys2_pll_out", 1, 1);
hws[IMX8MQ_SYS2_PLL_50M] = imx_clk_hw_fixed_factor("sys2_pll_50m", "sys2_pll_50m_cg", 1, 20);
hws[IMX8MQ_SYS2_PLL_100M] = imx_clk_hw_fixed_factor("sys2_pll_100m", "sys2_pll_100m_cg", 1, 10);
hws[IMX8MQ_SYS2_PLL_125M] = imx_clk_hw_fixed_factor("sys2_pll_125m", "sys2_pll_125m_cg", 1, 8);
hws[IMX8MQ_SYS2_PLL_166M] = imx_clk_hw_fixed_factor("sys2_pll_166m", "sys2_pll_166m_cg", 1, 6);
hws[IMX8MQ_SYS2_PLL_200M] = imx_clk_hw_fixed_factor("sys2_pll_200m", "sys2_pll_200m_cg", 1, 5);
hws[IMX8MQ_SYS2_PLL_250M] = imx_clk_hw_fixed_factor("sys2_pll_250m", "sys2_pll_250m_cg", 1, 4);
hws[IMX8MQ_SYS2_PLL_333M] = imx_clk_hw_fixed_factor("sys2_pll_333m", "sys2_pll_333m_cg", 1, 3);
hws[IMX8MQ_SYS2_PLL_500M] = imx_clk_hw_fixed_factor("sys2_pll_500m", "sys2_pll_500m_cg", 1, 2);
hws[IMX8MQ_SYS2_PLL_1000M] = imx_clk_hw_fixed_factor("sys2_pll_1000m", "sys2_pll_1000m_cg", 1, 1);
hws[IMX8MQ_CLK_MON_AUDIO_PLL1_DIV] = imx_clk_hw_divider("audio_pll1_out_monitor", "audio_pll1_bypass", base + 0x78, 0, 3); hws[IMX8MQ_CLK_MON_AUDIO_PLL1_DIV] = imx_clk_hw_divider("audio_pll1_out_monitor", "audio_pll1_bypass", base + 0x78, 0, 3);
hws[IMX8MQ_CLK_MON_AUDIO_PLL2_DIV] = imx_clk_hw_divider("audio_pll2_out_monitor", "audio_pll2_bypass", base + 0x78, 4, 3); hws[IMX8MQ_CLK_MON_AUDIO_PLL2_DIV] = imx_clk_hw_divider("audio_pll2_out_monitor", "audio_pll2_bypass", base + 0x78, 4, 3);
......
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2019-2021 NXP
* Dong Aisheng <aisheng.dong@nxp.com>
*/
#include <dt-bindings/firmware/imx/rsrc.h>
#include "clk-scu.h"
/* Keep sorted in the ascending order */
static const u32 imx8qm_clk_scu_rsrc_table[] = {
IMX_SC_R_A53,
IMX_SC_R_A72,
IMX_SC_R_DC_0_VIDEO0,
IMX_SC_R_DC_0_VIDEO1,
IMX_SC_R_DC_0,
IMX_SC_R_DC_0_PLL_0,
IMX_SC_R_DC_0_PLL_1,
IMX_SC_R_DC_1_VIDEO0,
IMX_SC_R_DC_1_VIDEO1,
IMX_SC_R_DC_1,
IMX_SC_R_DC_1_PLL_0,
IMX_SC_R_DC_1_PLL_1,
IMX_SC_R_SPI_0,
IMX_SC_R_SPI_1,
IMX_SC_R_SPI_2,
IMX_SC_R_SPI_3,
IMX_SC_R_UART_0,
IMX_SC_R_UART_1,
IMX_SC_R_UART_2,
IMX_SC_R_UART_3,
IMX_SC_R_UART_4,
IMX_SC_R_EMVSIM_0,
IMX_SC_R_EMVSIM_1,
IMX_SC_R_I2C_0,
IMX_SC_R_I2C_1,
IMX_SC_R_I2C_2,
IMX_SC_R_I2C_3,
IMX_SC_R_I2C_4,
IMX_SC_R_ADC_0,
IMX_SC_R_ADC_1,
IMX_SC_R_FTM_0,
IMX_SC_R_FTM_1,
IMX_SC_R_CAN_0,
IMX_SC_R_GPU_0_PID0,
IMX_SC_R_GPU_1_PID0,
IMX_SC_R_PWM_0,
IMX_SC_R_PWM_1,
IMX_SC_R_PWM_2,
IMX_SC_R_PWM_3,
IMX_SC_R_PWM_4,
IMX_SC_R_PWM_5,
IMX_SC_R_PWM_6,
IMX_SC_R_PWM_7,
IMX_SC_R_GPT_0,
IMX_SC_R_GPT_1,
IMX_SC_R_GPT_2,
IMX_SC_R_GPT_3,
IMX_SC_R_GPT_4,
IMX_SC_R_FSPI_0,
IMX_SC_R_FSPI_1,
IMX_SC_R_SDHC_0,
IMX_SC_R_SDHC_1,
IMX_SC_R_SDHC_2,
IMX_SC_R_ENET_0,
IMX_SC_R_ENET_1,
IMX_SC_R_MLB_0,
IMX_SC_R_USB_2,
IMX_SC_R_NAND,
IMX_SC_R_LVDS_0,
IMX_SC_R_LVDS_0_PWM_0,
IMX_SC_R_LVDS_0_I2C_0,
IMX_SC_R_LVDS_0_I2C_1,
IMX_SC_R_LVDS_1,
IMX_SC_R_LVDS_1_PWM_0,
IMX_SC_R_LVDS_1_I2C_0,
IMX_SC_R_LVDS_1_I2C_1,
IMX_SC_R_M4_0_I2C,
IMX_SC_R_M4_1_I2C,
IMX_SC_R_AUDIO_PLL_0,
IMX_SC_R_VPU_UART,
IMX_SC_R_VPUCORE,
IMX_SC_R_MIPI_0,
IMX_SC_R_MIPI_0_PWM_0,
IMX_SC_R_MIPI_0_I2C_0,
IMX_SC_R_MIPI_0_I2C_1,
IMX_SC_R_MIPI_1,
IMX_SC_R_MIPI_1_PWM_0,
IMX_SC_R_MIPI_1_I2C_0,
IMX_SC_R_MIPI_1_I2C_1,
IMX_SC_R_CSI_0,
IMX_SC_R_CSI_0_PWM_0,
IMX_SC_R_CSI_0_I2C_0,
IMX_SC_R_CSI_1,
IMX_SC_R_CSI_1_PWM_0,
IMX_SC_R_CSI_1_I2C_0,
IMX_SC_R_HDMI,
IMX_SC_R_HDMI_I2S,
IMX_SC_R_HDMI_I2C_0,
IMX_SC_R_HDMI_PLL_0,
IMX_SC_R_HDMI_RX,
IMX_SC_R_HDMI_RX_BYPASS,
IMX_SC_R_HDMI_RX_I2C_0,
IMX_SC_R_AUDIO_PLL_1,
IMX_SC_R_AUDIO_CLK_0,
IMX_SC_R_AUDIO_CLK_1,
IMX_SC_R_HDMI_RX_PWM_0,
IMX_SC_R_HDMI_PLL_1,
IMX_SC_R_VPU,
};
const struct imx_clk_scu_rsrc_table imx_clk_scu_rsrc_imx8qm = {
.rsrc = imx8qm_clk_scu_rsrc_table,
.num = ARRAY_SIZE(imx8qm_clk_scu_rsrc_table),
};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -25,6 +25,16 @@ config INGENIC_CGU_JZ4725B ...@@ -25,6 +25,16 @@ config INGENIC_CGU_JZ4725B
If building for a JZ4725B SoC, you want to say Y here. If building for a JZ4725B SoC, you want to say Y here.
config INGENIC_CGU_JZ4760
bool "Ingenic JZ4760 CGU driver"
default MACH_JZ4760
select INGENIC_CGU_COMMON
help
Support the clocks provided by the CGU hardware on Ingenic JZ4760
and compatible SoCs.
If building for a JZ4760 SoC, you want to say Y here.
config INGENIC_CGU_JZ4770 config INGENIC_CGU_JZ4770
bool "Ingenic JZ4770 CGU driver" bool "Ingenic JZ4770 CGU driver"
default MACH_JZ4770 default MACH_JZ4770
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
obj-$(CONFIG_INGENIC_CGU_COMMON) += cgu.o pm.o obj-$(CONFIG_INGENIC_CGU_COMMON) += cgu.o pm.o
obj-$(CONFIG_INGENIC_CGU_JZ4740) += jz4740-cgu.o obj-$(CONFIG_INGENIC_CGU_JZ4740) += jz4740-cgu.o
obj-$(CONFIG_INGENIC_CGU_JZ4725B) += jz4725b-cgu.o obj-$(CONFIG_INGENIC_CGU_JZ4725B) += jz4725b-cgu.o
obj-$(CONFIG_INGENIC_CGU_JZ4760) += jz4760-cgu.o
obj-$(CONFIG_INGENIC_CGU_JZ4770) += jz4770-cgu.o obj-$(CONFIG_INGENIC_CGU_JZ4770) += jz4770-cgu.o
obj-$(CONFIG_INGENIC_CGU_JZ4780) += jz4780-cgu.o obj-$(CONFIG_INGENIC_CGU_JZ4780) += jz4780-cgu.o
obj-$(CONFIG_INGENIC_CGU_X1000) += x1000-cgu.o obj-$(CONFIG_INGENIC_CGU_X1000) += x1000-cgu.o
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -326,6 +326,7 @@ static const struct ingenic_soc_info x1000_soc_info = { ...@@ -326,6 +326,7 @@ static const struct ingenic_soc_info x1000_soc_info = {
static const struct of_device_id __maybe_unused ingenic_tcu_of_match[] __initconst = { static const struct of_device_id __maybe_unused ingenic_tcu_of_match[] __initconst = {
{ .compatible = "ingenic,jz4740-tcu", .data = &jz4740_soc_info, }, { .compatible = "ingenic,jz4740-tcu", .data = &jz4740_soc_info, },
{ .compatible = "ingenic,jz4725b-tcu", .data = &jz4725b_soc_info, }, { .compatible = "ingenic,jz4725b-tcu", .data = &jz4725b_soc_info, },
{ .compatible = "ingenic,jz4760-tcu", .data = &jz4770_soc_info, },
{ .compatible = "ingenic,jz4770-tcu", .data = &jz4770_soc_info, }, { .compatible = "ingenic,jz4770-tcu", .data = &jz4770_soc_info, },
{ .compatible = "ingenic,x1000-tcu", .data = &x1000_soc_info, }, { .compatible = "ingenic,x1000-tcu", .data = &x1000_soc_info, },
{ /* sentinel */ } { /* sentinel */ }
...@@ -477,5 +478,6 @@ static void __init ingenic_tcu_init(struct device_node *np) ...@@ -477,5 +478,6 @@ static void __init ingenic_tcu_init(struct device_node *np)
CLK_OF_DECLARE_DRIVER(jz4740_cgu, "ingenic,jz4740-tcu", ingenic_tcu_init); CLK_OF_DECLARE_DRIVER(jz4740_cgu, "ingenic,jz4740-tcu", ingenic_tcu_init);
CLK_OF_DECLARE_DRIVER(jz4725b_cgu, "ingenic,jz4725b-tcu", ingenic_tcu_init); CLK_OF_DECLARE_DRIVER(jz4725b_cgu, "ingenic,jz4725b-tcu", ingenic_tcu_init);
CLK_OF_DECLARE_DRIVER(jz4760_cgu, "ingenic,jz4760-tcu", ingenic_tcu_init);
CLK_OF_DECLARE_DRIVER(jz4770_cgu, "ingenic,jz4770-tcu", ingenic_tcu_init); CLK_OF_DECLARE_DRIVER(jz4770_cgu, "ingenic,jz4770-tcu", ingenic_tcu_init);
CLK_OF_DECLARE_DRIVER(x1000_cgu, "ingenic,x1000-tcu", ingenic_tcu_init); CLK_OF_DECLARE_DRIVER(x1000_cgu, "ingenic,x1000-tcu", ingenic_tcu_init);
This diff is collapsed.
...@@ -1665,8 +1665,7 @@ static int devm_clk_get_enable(struct device *dev, char *id) ...@@ -1665,8 +1665,7 @@ static int devm_clk_get_enable(struct device *dev, char *id)
clk = devm_clk_get(dev, id); clk = devm_clk_get(dev, id);
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
ret = PTR_ERR(clk); ret = PTR_ERR(clk);
if (ret != -EPROBE_DEFER) dev_err_probe(dev, ret, "failed to get %s", id);
dev_err(dev, "failed to get %s", id);
return ret; return ret;
} }
...@@ -1811,7 +1810,7 @@ static int axg_audio_clkc_probe(struct platform_device *pdev) ...@@ -1811,7 +1810,7 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
ret = device_reset(dev); ret = device_reset(dev);
if (ret) { if (ret) {
dev_err(dev, "failed to reset device\n"); dev_err_probe(dev, ret, "failed to reset device\n");
return ret; return ret;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment