mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
Merge commit 'be9616a9ff96f49b484837dc9dcb25d99ea50ab5'
* commit 'be9616a9ff96f49b484837dc9dcb25d99ea50ab5': (191 commits) ARM: rk3506_defconfig: Enable CONFIG_ROCKCHIP_MINI_KERNEL ARM: dts: rockchip: rk3506g-test1-v10-audio: Add extcon for usb ARM: dts: rk3506g-evb1-v10: Enable es8388-sound ARM: dts: rockchip: add flexbus cif for rk3506 evb1 ARM: dts: rockchip: rk3506-evb1: add ramoops ARM: dts: rockchip: rk3506g-test1: add pdm_mic_array sound card with es7202 ARM: dts: rockchip: rk3506-evb1: Additional reservation cma buf ARM: dts: rockchip: rk3506g-evb1: enable logo display for mipi board ARM: dts: rockchip: Support usb2phy for rk3506g-evb1 ARM: dts: rockchip: rk3506-evb1-v10: Enable usb2 phy ARM: dts: rockchip: Add rk3506-amp.dtsi ARM: dts: rk3506-evb1-v10: enable rng node ARM: dts: rockchip: rk3506-evb1: add reserved-memory for display and drm_logo memory config ARM: dts: rockchip: Add rk3506g-test1-v10 audio board ARM: dts: rk3506-evb1-v10: Add FLEXBUS fspi node ARM: dts: rk3503-evb1: enable dsm_sound card ARM: dts: rk3506-evb1-v10: enable RGA node ARM: dts: rk3506-evb1: add dsm_sound/acodec_sound card node ARM: dts: rockchip: rk3506g-iotest-pdm: for pdm test ARM: dts: rockchip: rk3506g-iotest: add pdm_mic_array card node ... Change-Id: I6919fb2ee7ee43882b70bca1e251f84d8354d766
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/clock/rockchip,rk3506-cru.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Rockchip rk3506 Family Clock and Reset Control Module
|
||||
|
||||
maintainers:
|
||||
- Finley Xiao <finley.xiao@rock-chips.com>
|
||||
- Heiko Stuebner <heiko@sntech.de>
|
||||
|
||||
description: |
|
||||
The RK3506 clock controller generates the clock and also implements a reset
|
||||
controller for SoC peripherals. For example it provides SCLK_UART2 and
|
||||
PCLK_UART2, as well as SRST_P_UART2 and SRST_UART2 for the second UART
|
||||
module.
|
||||
Each clock is assigned an identifier and client nodes can use this identifier
|
||||
to specify the clock which they consume. All available clock and reset IDs
|
||||
are defined as preprocessor macros in dt-binding headers.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- rockchip,rk3506-cru
|
||||
- rockchip,rk3506-grf-cru
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#clock-cells":
|
||||
const: 1
|
||||
|
||||
"#reset-cells":
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: xin24m
|
||||
- const: xin32k
|
||||
|
||||
assigned-clocks: true
|
||||
|
||||
assigned-clock-rates: true
|
||||
|
||||
rockchip,grf:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description: >
|
||||
phandle to the syscon managing the "general register files". It is used
|
||||
for GRF muxes, if missing any muxes present in the GRF will not be
|
||||
available.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#clock-cells"
|
||||
- "#reset-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
cru: clock-controller@ff9a0000 {
|
||||
compatible = "rockchip,rk3506-cru";
|
||||
reg = <0xff9a0000 0x20000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
@@ -160,6 +160,16 @@ properties:
|
||||
description: when set, check the vbus status from grf con for Type-C
|
||||
interface. It's used when the vbusdet pin is always pulled up.
|
||||
|
||||
rockchip,gpio-vbus-det:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: when set, indicates that the otg port will use a gpio
|
||||
for USB vbus detection.
|
||||
|
||||
rockchip,gpio-id-det:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: when set, indicates that the otg port will use a gpio
|
||||
for USB id detection.
|
||||
|
||||
rockchip,sel-pipe-phystatus:
|
||||
$ref: /schemas/types.yaml#/definitions/flag
|
||||
description: when set, select the pipe phy status from grf for usb
|
||||
|
||||
@@ -15,11 +15,15 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: rockchip,sfc
|
||||
enum:
|
||||
- rockchip,fspi
|
||||
- rockchip,sfc
|
||||
|
||||
description:
|
||||
The rockchip sfc controller is a standalone IP with version register,
|
||||
and the driver can handle all the feature difference inside the IP
|
||||
depending on the version register.
|
||||
The rockchip flexible spi controller is the next generation IP of sfc.
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@@ -44,6 +48,12 @@ properties:
|
||||
description: Disable DMA and utilize FIFO mode only
|
||||
type: boolean
|
||||
|
||||
rockchip,sclk-x2-bypass:
|
||||
description:
|
||||
Turn off the internal 2 frequency division logic of the controller clock,
|
||||
and the interface clock is 1:1 with the controller working clock.
|
||||
type: boolean
|
||||
|
||||
patternProperties:
|
||||
"^flash@[0-3]$":
|
||||
type: object
|
||||
|
||||
@@ -1220,7 +1220,18 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
|
||||
rk3308bs-evb-amic-v11-aarch32.dtb \
|
||||
rk3308bs-evb-dmic-pdm-v11-aarch32.dtb \
|
||||
rk3308bs-evb-mipi-display-v11-aarch32.dtb \
|
||||
rk3308hs-voice-module-board-v10-aarch32.dtb
|
||||
rk3308hs-voice-module-board-v10-aarch32.dtb \
|
||||
rk3503g-evb1-v10.dtb \
|
||||
rk3506b-evb1-v10.dtb \
|
||||
rk3506g-evb1-v10.dtb \
|
||||
rk3506g-evb1-v10-amp.dtb \
|
||||
rk3506g-evb1-v10-mcu-k350c4516t.dtb \
|
||||
rk3506g-evb1-v10-rgb-Q7050ITH2641AA1T.dtb \
|
||||
rk3506g-evb1-v10-sii9022-bt1120-to-hdmi.dtb \
|
||||
rk3506g-evb1-v10-sii9022-rgb2hdmi.dtb \
|
||||
rk3506g-iotest-v10.dtb \
|
||||
rk3506g-iotest-v10-pdm.dtb \
|
||||
rk3506g-test1-v10-audio.dtb
|
||||
dtb-$(CONFIG_ARCH_S3C24XX) += \
|
||||
s3c2416-smdk2416.dtb
|
||||
dtb-$(CONFIG_ARCH_S3C64XX) += \
|
||||
|
||||
6
arch/arm/boot/dts/rk3503.dtsi
Normal file
6
arch/arm/boot/dts/rk3503.dtsi
Normal file
@@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#include "rk3506.dtsi"
|
||||
26
arch/arm/boot/dts/rk3503g-evb1-v10.dts
Normal file
26
arch/arm/boot/dts/rk3503g-evb1-v10.dts
Normal file
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3503.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3503G(QFN88) EVB1 V10 Board";
|
||||
compatible = "rockchip,rk3503g-evb1-v10", "rockchip,rk3506";
|
||||
};
|
||||
|
||||
&acdcdig_dsm {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dsm_sound {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sai3 {
|
||||
status = "okay";
|
||||
};
|
||||
89
arch/arm/boot/dts/rk3506-amp.dtsi
Normal file
89
arch/arm/boot/dts/rk3506-amp.dtsi
Normal file
@@ -0,0 +1,89 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/soc/rockchip-amp.h>
|
||||
|
||||
#define CPU_GET_AFFINITY(cluster, cpu) (cpu)
|
||||
|
||||
/ {
|
||||
cpus {
|
||||
/delete-node/ cpu@f02;
|
||||
};
|
||||
|
||||
rockchip_amp: rockchip-amp {
|
||||
compatible = "rockchip,amp";
|
||||
clocks = <&cru HCLK_M0>, <&cru STCLK_M0>,
|
||||
<&cru SCLK_UART4>, <&cru PCLK_UART4>,
|
||||
<&cru PCLK_TIMER>, <&cru CLK_TIMER0_CH5>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io27_uart4_tx>, <&rm_io28_uart4_rx>;
|
||||
|
||||
amp-cpu-aff-maskbits = /bits/ 64 <0x0 0x1 0x1 0x2 0x2 0x4>;
|
||||
amp-irqs = /bits/ 64 <
|
||||
/* GPIO EXT */
|
||||
GIC_AMP_IRQ_CFG_ROUTE(35, 0xd0, CPU_GET_AFFINITY(0, 2))
|
||||
GIC_AMP_IRQ_CFG_ROUTE(39, 0xd0, CPU_GET_AFFINITY(0, 2))
|
||||
GIC_AMP_IRQ_CFG_ROUTE(43, 0xd0, CPU_GET_AFFINITY(0, 2))
|
||||
GIC_AMP_IRQ_CFG_ROUTE(47, 0xd0, CPU_GET_AFFINITY(0, 2))
|
||||
GIC_AMP_IRQ_CFG_ROUTE(51, 0xd0, CPU_GET_AFFINITY(0, 2))
|
||||
/* UART4 */
|
||||
GIC_AMP_IRQ_CFG_ROUTE(70, 0xd0, CPU_GET_AFFINITY(0, 2))
|
||||
/* MAILBOX */
|
||||
GIC_AMP_IRQ_CFG_ROUTE(174, 0xd0, CPU_GET_AFFINITY(0, 2))>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
/* remote amp core address */
|
||||
amp_shmem_reserved: amp-shmem@3b00000 {
|
||||
reg = <0x03b00000 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
rpmsg_reserved: rpmsg@3c00000 {
|
||||
reg = <0x03c00000 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
rpmsg_dma_reserved: rpmsg-dma@3d00000 {
|
||||
compatible = "shared-dma-pool";
|
||||
reg = <0x03d00000 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
/* mcu address */
|
||||
mcu_reserved: mcu@fff80000 {
|
||||
reg = <0xfff80000 0xc000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
|
||||
rpmsg: rpmsg@3c00000 {
|
||||
compatible = "rockchip,rpmsg";
|
||||
mbox-names = "rpmsg-rx", "rpmsg-tx";
|
||||
mboxes = <&mailbox0 0 &mailbox0 3>;
|
||||
rockchip,vdev-nums = <1>;
|
||||
rockchip,link-id = <0x03>;
|
||||
reg = <0x3c00000 0x100000>;
|
||||
memory-region = <&rpmsg_dma_reserved>;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&arm_pmu {
|
||||
interrupt-affinity = <&cpu0>, <&cpu1>;
|
||||
};
|
||||
|
||||
&mailbox0 {
|
||||
rockchip,txpoll-period-ms = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
835
arch/arm/boot/dts/rk3506-evb1-v10.dtsi
Normal file
835
arch/arm/boot/dts/rk3506-evb1-v10.dtsi
Normal file
@@ -0,0 +1,835 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/display/drm_mipi_dsi.h>
|
||||
#include <dt-bindings/input/rk-input.h>
|
||||
#include <dt-bindings/mfd/rockchip-flexbus.h>
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506 EVB1 V10 Board";
|
||||
compatible = "rockchip,rk3506-evb1-v10", "rockchip,rk3506";
|
||||
|
||||
chosen {
|
||||
bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=4 ubi.block=0,rootfs root=/dev/ubiblock0_0 rootfstype=squashfs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
|
||||
};
|
||||
|
||||
acodec_sound: acodec-sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "rockchip,acodec";
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,mclk-fs = <1024>;
|
||||
simple-audio-card,bitclock-master = <&codec_master>;
|
||||
simple-audio-card,frame-master = <&codec_master>;
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&sai4>;
|
||||
};
|
||||
codec_master: simple-audio-card,codec {
|
||||
sound-dai = <&audio_codec>;
|
||||
};
|
||||
};
|
||||
|
||||
adc_keys: adc-keys {
|
||||
compatible = "adc-keys";
|
||||
io-channels = <&saradc 1>;
|
||||
io-channel-names = "buttons";
|
||||
keyup-threshold-microvolt = <1800000>;
|
||||
poll-interval = <100>;
|
||||
|
||||
vol-up-key {
|
||||
label = "volume up";
|
||||
linux,code = <KEY_VOLUMEUP>;
|
||||
press-threshold-microvolt = <16000>;
|
||||
};
|
||||
|
||||
vol-down-key {
|
||||
label = "volume down";
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
press-threshold-microvolt = <420000>;
|
||||
};
|
||||
|
||||
menu-key {
|
||||
label = "menu";
|
||||
linux,code = <KEY_MENU>;
|
||||
press-threshold-microvolt = <800000>;
|
||||
};
|
||||
|
||||
esc-key {
|
||||
label = "esc";
|
||||
linux,code = <KEY_ESC>;
|
||||
press-threshold-microvolt = <1200000>;
|
||||
};
|
||||
};
|
||||
|
||||
backlight: backlight {
|
||||
compatible = "pwm-backlight";
|
||||
pwms = <&pwm0_4ch_2 0 25000 0>;
|
||||
brightness-levels = <
|
||||
0 20 20 21 21 22 22 23
|
||||
23 24 24 25 25 26 26 27
|
||||
27 28 28 29 29 30 30 31
|
||||
31 32 32 33 33 34 34 35
|
||||
35 36 36 37 37 38 38 39
|
||||
40 41 42 43 44 45 46 47
|
||||
48 49 50 51 52 53 54 55
|
||||
56 57 58 59 60 61 62 63
|
||||
64 65 66 67 68 69 70 71
|
||||
72 73 74 75 76 77 78 79
|
||||
80 81 82 83 84 85 86 87
|
||||
88 89 90 91 92 93 94 95
|
||||
96 97 98 99 100 101 102 103
|
||||
104 105 106 107 108 109 110 111
|
||||
112 113 114 115 116 117 118 119
|
||||
120 121 122 123 124 125 126 127
|
||||
128 129 130 131 132 133 134 135
|
||||
136 137 138 139 140 141 142 143
|
||||
144 145 146 147 148 149 150 151
|
||||
152 153 154 155 156 157 158 159
|
||||
160 161 162 163 164 165 166 167
|
||||
168 169 170 171 172 173 174 175
|
||||
176 177 178 179 180 181 182 183
|
||||
184 185 186 187 188 189 190 191
|
||||
192 193 194 195 196 197 198 199
|
||||
200 201 202 203 204 205 206 207
|
||||
208 209 210 211 212 213 214 215
|
||||
216 217 218 219 220 221 222 223
|
||||
224 225 226 227 228 229 230 231
|
||||
232 233 234 235 236 237 238 239
|
||||
240 241 242 243 244 245 246 247
|
||||
248 249 250 251 252 253 254 255
|
||||
>;
|
||||
default-brightness-level = <200>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
dsm_sound: dsm-sound {
|
||||
status = "disabled";
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,mclk-fs = <256>;
|
||||
simple-audio-card,name = "rockchip,dsm-sound";
|
||||
simple-audio-card,bitclock-master = <&sndcodec>;
|
||||
simple-audio-card,frame-master = <&sndcodec>;
|
||||
sndcpu: simple-audio-card,cpu {
|
||||
sound-dai = <&sai3>;
|
||||
};
|
||||
sndcodec: simple-audio-card,codec {
|
||||
sound-dai = <&acdcdig_dsm>;
|
||||
};
|
||||
};
|
||||
|
||||
es8388_sound: es8388-sound {
|
||||
status = "disabled";
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "rockchip-es8388";
|
||||
spk-con-gpio = <&gpio1 RK_PC6 GPIO_ACTIVE_HIGH>;
|
||||
rockchip,pre-power-on-delay-ms = <30>;
|
||||
rockchip,post-power-down-delay-ms = <40>;
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai1>;
|
||||
rockchip,codec = <&es8388>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "LOUT1",
|
||||
"Speaker", "ROUT1",
|
||||
"Speaker", "Speaker Power",
|
||||
"Speaker", "Speaker Power",
|
||||
"LINPUT1", "Main Mic",
|
||||
"LINPUT2", "Main Mic",
|
||||
"RINPUT1", "Main Mic",
|
||||
"RINPUT2", "Main Mic";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spk_ctrl>;
|
||||
};
|
||||
|
||||
fiq_debugger: fiq-debugger {
|
||||
compatible = "rockchip,fiq-debugger";
|
||||
rockchip,serial-id = <0>;
|
||||
rockchip,wake-irq = <0>;
|
||||
rockchip,irq-mode-enable = <1>;
|
||||
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
|
||||
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
gpio_keys: gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&key_wake_up>;
|
||||
|
||||
wake_up: wake-up {
|
||||
label = "Wake-up";
|
||||
gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <KEY_WAKEUP>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
cma: linux,cma {
|
||||
compatible = "shared-dma-pool";
|
||||
reusable;
|
||||
size = <0x800000>;
|
||||
linux,cma-default;
|
||||
};
|
||||
|
||||
drm_logo: drm-logo@0 {
|
||||
compatible = "rockchip,drm-logo";
|
||||
reg = <0x0 0x0>;
|
||||
};
|
||||
|
||||
ramoops: ramoops@880000 {
|
||||
compatible = "ramoops";
|
||||
reg = <0x880000 0x80000>;
|
||||
boot-log-size = <0x10000>; /* do not change */
|
||||
boot-log-count = <0x1>; /* do not change */
|
||||
console-size = <0x70000>;
|
||||
pmsg-size = <0x0>;
|
||||
ftrace-size = <0x0>;
|
||||
record-size = <0x0>;
|
||||
};
|
||||
};
|
||||
|
||||
vcc12v_dc: vcc12v-dc {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc12v_dc";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <12000000>;
|
||||
regulator-max-microvolt = <12000000>;
|
||||
};
|
||||
|
||||
vcc_sys: vcc-sys {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_sys";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
vin-supply = <&vcc12v_dc>;
|
||||
};
|
||||
|
||||
vcc3v3_stb: vcc3v3-stb {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc3v3_stb";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc_1v8: vcc-1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_1v8";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
vin-supply = <&vcc3v3_stb>;
|
||||
};
|
||||
|
||||
vcc_ddr: vcc-ddr {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_ddr";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vdd_arm: vdd-arm {
|
||||
compatible = "pwm-regulator";
|
||||
pwms = <&pwm0_4ch_0 0 5000 1>;
|
||||
regulator-name = "vdd_arm";
|
||||
regulator-min-microvolt = <710000>;
|
||||
regulator-max-microvolt = <1207000>;
|
||||
regulator-init-microvolt = <1011000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
pwm-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc0v9_stb: vcc0v9-stb {
|
||||
compatible = "pwm-regulator";
|
||||
pwms = <&pwm0_4ch_1 0 5000 1>;
|
||||
regulator-name = "vcc0v9_stb";
|
||||
regulator-min-microvolt = <810000>;
|
||||
regulator-max-microvolt = <1006000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
pwm-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
sdio_pwrseq: sdio-pwrseq {
|
||||
compatible = "mmc-pwrseq-simple";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_enable_h>;
|
||||
|
||||
/*
|
||||
* On the module itself this is one of these (depending
|
||||
* on the actual card populated):
|
||||
* - SDIO_RESET_L_WL_REG_ON
|
||||
* - PDN (power down when low)
|
||||
*/
|
||||
reset-gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wireless-bluetooth {
|
||||
compatible = "bluetooth-platdata";
|
||||
uart_rts_gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default", "rts_gpio";
|
||||
pinctrl-0 = <&uart5m0_rtsn_pins>;
|
||||
pinctrl-1 = <&uart5_gpios>;
|
||||
BT,power_gpio = <&gpio3 RK_PB6 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
wireless-wlan {
|
||||
compatible = "wlan-platdata";
|
||||
rockchip,grf = <&grf>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_wake_host>;
|
||||
wifi_chip_type = "cyw43455";
|
||||
WIFI,host_wake_irq = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&audio_codec {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&can0 {
|
||||
assigned-clocks = <&cru CLK_CAN0>;
|
||||
assigned-clock-rates = <200000000>;
|
||||
pinctrl-0 = <&rm_io30_can0_tx &rm_io31_can0_rx>;
|
||||
pinctrl-names = "default";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&cpu0 {
|
||||
cpu-supply = <&vdd_arm>;
|
||||
};
|
||||
|
||||
&display_subsystem {
|
||||
logo-memory-region = <&drm_logo>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dsi {
|
||||
status = "disabled";
|
||||
rockchip,lane-rate = <850>;
|
||||
dsi_panel: panel@0 {
|
||||
status = "okay";
|
||||
compatible = "simple-panel-dsi";
|
||||
reg = <0>;
|
||||
backlight = <&backlight>;
|
||||
prepare-delay-ms = <5>;
|
||||
reset-delay-ms = <1>;
|
||||
init-delay-ms = <80>;
|
||||
disable-delay-ms = <10>;
|
||||
unprepare-delay-ms = <5>;
|
||||
|
||||
width-mm = <68>;
|
||||
height-mm = <121>;
|
||||
|
||||
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
|
||||
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET)>;
|
||||
dsi,format = <MIPI_DSI_FMT_RGB888>;
|
||||
dsi,lanes = <2>;
|
||||
panel-init-sequence = [
|
||||
39 00 04 ff 98 81 03
|
||||
15 00 02 01 00
|
||||
15 00 02 02 00
|
||||
15 00 02 03 53
|
||||
15 00 02 04 53
|
||||
15 00 02 05 13
|
||||
15 00 02 06 04
|
||||
15 00 02 07 02
|
||||
15 00 02 08 02
|
||||
15 00 02 09 00
|
||||
15 00 02 0a 00
|
||||
15 00 02 0b 00
|
||||
15 00 02 0c 00
|
||||
15 00 02 0d 00
|
||||
15 00 02 0e 00
|
||||
15 00 02 0f 00
|
||||
15 00 02 10 00
|
||||
15 00 02 11 00
|
||||
15 00 02 12 00
|
||||
15 00 02 13 00
|
||||
15 00 02 14 00
|
||||
15 00 02 15 08
|
||||
15 00 02 16 10
|
||||
15 00 02 17 00
|
||||
15 00 02 18 08
|
||||
15 00 02 19 00
|
||||
15 00 02 1a 00
|
||||
15 00 02 1b 00
|
||||
15 00 02 1c 00
|
||||
15 00 02 1d 00
|
||||
15 00 02 1e c0
|
||||
15 00 02 1f 80
|
||||
15 00 02 20 02
|
||||
15 00 02 21 09
|
||||
15 00 02 22 00
|
||||
15 00 02 23 00
|
||||
15 00 02 24 00
|
||||
15 00 02 25 00
|
||||
15 00 02 26 00
|
||||
15 00 02 27 00
|
||||
15 00 02 28 55
|
||||
15 00 02 29 03
|
||||
15 00 02 2a 00
|
||||
15 00 02 2b 00
|
||||
15 00 02 2c 00
|
||||
15 00 02 2d 00
|
||||
15 00 02 2e 00
|
||||
15 00 02 2f 00
|
||||
15 00 02 30 00
|
||||
15 00 02 31 00
|
||||
15 00 02 32 00
|
||||
15 00 02 33 00
|
||||
15 00 02 34 04
|
||||
15 00 02 35 05
|
||||
15 00 02 36 05
|
||||
15 00 02 37 00
|
||||
15 00 02 38 3c
|
||||
15 00 02 39 35
|
||||
15 00 02 3a 00
|
||||
15 00 02 3b 40
|
||||
15 00 02 3c 00
|
||||
15 00 02 3d 00
|
||||
15 00 02 3e 00
|
||||
15 00 02 3f 00
|
||||
15 00 02 40 00
|
||||
15 00 02 41 88
|
||||
15 00 02 42 00
|
||||
15 00 02 43 00
|
||||
15 00 02 44 1f
|
||||
15 00 02 50 01
|
||||
15 00 02 51 23
|
||||
15 00 02 52 45
|
||||
15 00 02 53 67
|
||||
15 00 02 54 89
|
||||
15 00 02 55 ab
|
||||
15 00 02 56 01
|
||||
15 00 02 57 23
|
||||
15 00 02 58 45
|
||||
15 00 02 59 67
|
||||
15 00 02 5a 89
|
||||
15 00 02 5b ab
|
||||
15 00 02 5c cd
|
||||
15 00 02 5d ef
|
||||
15 00 02 5e 03
|
||||
15 00 02 5f 14
|
||||
15 00 02 60 15
|
||||
15 00 02 61 0c
|
||||
15 00 02 62 0d
|
||||
15 00 02 63 0e
|
||||
15 00 02 64 0f
|
||||
15 00 02 65 10
|
||||
15 00 02 66 11
|
||||
15 00 02 67 08
|
||||
15 00 02 68 02
|
||||
15 00 02 69 0a
|
||||
15 00 02 6a 02
|
||||
15 00 02 6b 02
|
||||
15 00 02 6c 02
|
||||
15 00 02 6d 02
|
||||
15 00 02 6e 02
|
||||
15 00 02 6f 02
|
||||
15 00 02 70 02
|
||||
15 00 02 71 02
|
||||
15 00 02 72 06
|
||||
15 00 02 73 02
|
||||
15 00 02 74 02
|
||||
15 00 02 75 14
|
||||
15 00 02 76 15
|
||||
15 00 02 77 0f
|
||||
15 00 02 78 0e
|
||||
15 00 02 79 0d
|
||||
15 00 02 7a 0c
|
||||
15 00 02 7b 11
|
||||
15 00 02 7c 10
|
||||
15 00 02 7d 06
|
||||
15 00 02 7e 02
|
||||
15 00 02 7f 0a
|
||||
15 00 02 80 02
|
||||
15 00 02 81 02
|
||||
15 00 02 82 02
|
||||
15 00 02 83 02
|
||||
15 00 02 84 02
|
||||
15 00 02 85 02
|
||||
15 00 02 86 02
|
||||
15 00 02 87 02
|
||||
15 00 02 88 08
|
||||
15 00 02 89 02
|
||||
15 00 02 8a 02
|
||||
39 00 04 ff 98 81 04
|
||||
15 00 02 00 80
|
||||
15 00 02 70 00
|
||||
15 00 02 71 00
|
||||
15 00 02 66 fe
|
||||
15 00 02 82 15
|
||||
15 00 02 84 15
|
||||
15 00 02 85 15
|
||||
15 00 02 3a 24
|
||||
15 00 02 32 ac
|
||||
15 00 02 8c 80
|
||||
15 00 02 3c f5
|
||||
15 00 02 88 33
|
||||
39 00 04 ff 98 81 01
|
||||
15 00 02 22 0a
|
||||
15 00 02 31 00
|
||||
15 00 02 53 78
|
||||
15 00 02 55 7b
|
||||
15 00 02 60 20
|
||||
15 00 02 61 00
|
||||
15 00 02 62 0d
|
||||
15 00 02 63 00
|
||||
15 00 02 a0 00
|
||||
15 00 02 a1 10
|
||||
15 00 02 a2 1c
|
||||
15 00 02 a3 13
|
||||
15 00 02 a4 15
|
||||
15 00 02 a5 26
|
||||
15 00 02 a6 1a
|
||||
15 00 02 a7 1d
|
||||
15 00 02 a8 67
|
||||
15 00 02 a9 1c
|
||||
15 00 02 aa 29
|
||||
15 00 02 ab 5b
|
||||
15 00 02 ac 26
|
||||
15 00 02 ad 28
|
||||
15 00 02 ae 5c
|
||||
15 00 02 af 30
|
||||
15 00 02 b0 31
|
||||
15 00 02 b1 32
|
||||
15 00 02 b2 00
|
||||
15 00 02 b1 2e
|
||||
15 00 02 b2 32
|
||||
15 00 02 b3 00
|
||||
15 00 02 b6 02
|
||||
15 00 02 b7 03
|
||||
15 00 02 c0 00
|
||||
15 00 02 c1 10
|
||||
15 00 02 c2 1c
|
||||
15 00 02 c3 13
|
||||
15 00 02 c4 15
|
||||
15 00 02 c5 26
|
||||
15 00 02 c6 1a
|
||||
15 00 02 c7 1d
|
||||
15 00 02 c8 67
|
||||
15 00 02 c9 1c
|
||||
15 00 02 ca 29
|
||||
15 00 02 cb 5b
|
||||
15 00 02 cc 26
|
||||
15 00 02 cd 28
|
||||
15 00 02 ce 5c
|
||||
15 00 02 cf 30
|
||||
15 00 02 d0 31
|
||||
15 00 02 d1 2e
|
||||
15 00 02 d2 32
|
||||
15 00 02 d3 00
|
||||
39 00 04 ff 98 81 00
|
||||
05 00 01 11
|
||||
05 01 01 29
|
||||
];
|
||||
|
||||
disp_timings0: display-timings {
|
||||
native-mode = <&dsi_timing0>;
|
||||
dsi_timing0: timing0 {
|
||||
clock-frequency = <65000000>;
|
||||
hactive = <720>;
|
||||
vactive = <1280>;
|
||||
hfront-porch = <48>;
|
||||
hsync-len = <8>;
|
||||
hback-porch = <52>;
|
||||
vfront-porch = <16>;
|
||||
vsync-len = <6>;
|
||||
vback-porch = <15>;
|
||||
hsync-active = <0>;
|
||||
vsync-active = <0>;
|
||||
de-active = <0>;
|
||||
pixelclk-active = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
panel_in_dsi: endpoint {
|
||||
remote-endpoint = <&dsi_out_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
dsi_out_panel: endpoint {
|
||||
remote-endpoint = <&panel_in_dsi>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&dsi_in_vop {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&flexbus {
|
||||
rockchip,flexbus0-opmode = <ROCKCHIP_FLEXBUS0_OPMODE_DAC>;
|
||||
rockchip,flexbus1-opmode = <ROCKCHIP_FLEXBUS1_OPMODE_ADC>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&flexbus_adc {
|
||||
pinctrl-names = "default";
|
||||
/* 12bit ADC device */
|
||||
pinctrl-0 = <&flexbus1_clk_pins
|
||||
&flexbus1_d0_pins &flexbus1_d1_pins &flexbus1_d2_pins &flexbus1_d3_pins
|
||||
&flexbus1_d4_pins &flexbus1_d5_pins &flexbus1_d6_pins &flexbus1_d7_pins
|
||||
&flexbus1_d8_pins &flexbus1_d9_pins &flexbus1_d10_pins &flexbus1_d11_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&flexbus_dac {
|
||||
pinctrl-names = "default";
|
||||
/* 14bit DAC device */
|
||||
pinctrl-0 = <&flexbus0_clk_pins
|
||||
&flexbus0_d0_pins &flexbus0_d1_pins &flexbus0_d2_pins &flexbus0_d3_pins
|
||||
&flexbus0_d4_pins &flexbus0_d5_pins &flexbus0_d6_pins &flexbus0_d7_pins
|
||||
&flexbus0_d8_pins &flexbus0_d9_pins &flexbus0_d10_pins &flexbus0_d11_pins
|
||||
&flexbus0_d12_pins &flexbus0_d13_pins>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&flexbus_fspi {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&flexbus0m1_pins &flexbus0_clk_pins
|
||||
&flexbus0_d0_pins &flexbus0_d1_pins
|
||||
&flexbus0_d2_pins &flexbus0_d3_pins>;
|
||||
status = "disabled";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <100000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
&fspi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
&gmac0 {
|
||||
phy-mode = "rmii";
|
||||
clock_in_out = "output";
|
||||
|
||||
snps,reset-gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_LOW>;
|
||||
snps,reset-active-low;
|
||||
snps,reset-delays-us = <0 20000 100000>;
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <ð_rmii0_miim_pins
|
||||
ð_rmii0_tx_bus2_pins
|
||||
ð_rmii0_rx_bus2_pins
|
||||
ð_rmii0_clk_pins>;
|
||||
|
||||
phy-handle = <&rmii_phy0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io13_i2c0_scl
|
||||
&rm_io14_i2c0_sda>;
|
||||
|
||||
es8388: es8388@11 {
|
||||
status = "disabled";
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x11>;
|
||||
clocks = <&mclkout_sai1>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai1>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io8_sai1_mclk>;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io4_i2c2_scl &rm_io5_i2c2_sda>;
|
||||
status = "okay";
|
||||
|
||||
gt1x: gt1x@14 {
|
||||
compatible = "goodix,gt1x";
|
||||
reg = <0x14>;
|
||||
gtp_ics_slot_report;
|
||||
goodix,rst-gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
|
||||
goodix,irq-gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
rmii_phy0: phy@1 {
|
||||
compatible = "ethernet-phy-ieee802.3-c22";
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
&mmc {
|
||||
bus-width = <4>;
|
||||
cap-sd-highspeed;
|
||||
no-sd;
|
||||
no-mmc;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_clk_pins &sdmmc_cmd_pins &sdmmc_bus4_pins>;
|
||||
ignore-pm-notify;
|
||||
keep-power-in-suspend;
|
||||
non-removable;
|
||||
mmc-pwrseq = <&sdio_pwrseq>;
|
||||
sd-uhs-sdr104;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
gpio-keys {
|
||||
key_wake_up: key-wake-up {
|
||||
rockchip,pins = <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
sdio-pwrseq {
|
||||
wifi_enable_h: wifi-enable-h {
|
||||
rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
speaker {
|
||||
spk_ctrl: spk-ctrl {
|
||||
rockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
wireless-bluetooth {
|
||||
uart5_gpios: uart5-gpios {
|
||||
rockchip,pins = <3 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
wireless-wlan {
|
||||
wifi_wake_host: wifi-wake-host {
|
||||
rockchip,pins = <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwm0_4ch_0 {
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io21_pwm0_ch0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm0_4ch_1 {
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io20_pwm0_ch1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm0_4ch_2 {
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io3_pwm0_ch2>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rga2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rng {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sai1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io9_sai1_sclk
|
||||
&rm_io10_sai1_lrck
|
||||
&rm_io11_sai1_sdi
|
||||
&rm_io12_sai1_sdo0>;
|
||||
};
|
||||
|
||||
&sai4 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&saradc {
|
||||
vref-supply = <&vcc_1v8>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&tsadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart5 {
|
||||
pinctrl-0 = <&uart5m0_xfer_pins &uart5m0_ctsn_pins>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy_otg0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy_otg1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb2phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb20_otg0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb20_otg1 {
|
||||
dr_mode = "host";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vop {
|
||||
status = "okay";
|
||||
};
|
||||
15787
arch/arm/boot/dts/rk3506-pinctrl-rmio.dtsi
Normal file
15787
arch/arm/boot/dts/rk3506-pinctrl-rmio.dtsi
Normal file
File diff suppressed because it is too large
Load Diff
1753
arch/arm/boot/dts/rk3506-pinctrl.dtsi
Normal file
1753
arch/arm/boot/dts/rk3506-pinctrl.dtsi
Normal file
File diff suppressed because it is too large
Load Diff
1694
arch/arm/boot/dts/rk3506.dtsi
Normal file
1694
arch/arm/boot/dts/rk3506.dtsi
Normal file
File diff suppressed because it is too large
Load Diff
50
arch/arm/boot/dts/rk3506b-evb1-v10.dts
Normal file
50
arch/arm/boot/dts/rk3506b-evb1-v10.dts
Normal file
@@ -0,0 +1,50 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3506.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506B(BGA) EVB1 V10 Board";
|
||||
compatible = "rockchip,rk3506b-evb1-v10", "rockchip,rk3506";
|
||||
|
||||
vcc5v0_otg0: vcc5v0-otg0-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc5v0_otg0";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_otg0_en>;
|
||||
};
|
||||
|
||||
vcc5v0_otg1: vcc5v0-otg1-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc5v0_otg1";
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_otg1_en>;
|
||||
};
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
usb {
|
||||
vcc5v0_otg0_en: vcc5v0-otg0-en {
|
||||
rockchip,pins = <1 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
vcc5v0_otg1_en: vcc5v0-otg1-en {
|
||||
rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
60
arch/arm/boot/dts/rk3506g-evb1-flexbus-cif.dtsi
Normal file
60
arch/arm/boot/dts/rk3506g-evb1-flexbus-cif.dtsi
Normal file
@@ -0,0 +1,60 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*
|
||||
*/
|
||||
|
||||
&flexbus {
|
||||
rockchip,flexbus0-opmode = <ROCKCHIP_FLEXBUS0_OPMODE_DAC>;
|
||||
rockchip,flexbus1-opmode = <ROCKCHIP_FLEXBUS1_OPMODE_CIF>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
status = "okay";
|
||||
gc2145@3c {
|
||||
status = "okay";
|
||||
compatible = "galaxycore,gc2145";
|
||||
reg = <0x3c>;
|
||||
|
||||
clocks = <&cru CLK_REF_OUT1>;
|
||||
clock-names = "xvclk";
|
||||
power-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
|
||||
pwdn-gpios = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ref_clk1_pins>;
|
||||
|
||||
rockchip,camera-module-index = <0>;
|
||||
rockchip,camera-module-facing = "back";
|
||||
rockchip,camera-module-name = "CameraKing";
|
||||
rockchip,camera-module-lens-name = "Largan";
|
||||
|
||||
port {
|
||||
gc2145_out: endpoint {
|
||||
remote-endpoint = <&cif_in_cam>;
|
||||
vsync-active = <0>;
|
||||
hsync-active = <1>;
|
||||
pclk-sample = <1>;
|
||||
bus-width = <8>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&flexbus_cif {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&flexbus1_d1_pins &flexbus1_d2_pins &flexbus1_d3_pins &flexbus1_d4_pins
|
||||
&flexbus1_d5_pins &flexbus1_d6_pins &flexbus1_d7_pins &flexbus1_d8_pins
|
||||
&flexbus1_d12_pins &flexbus1_d13_pins &flexbus1_clk_pins>;
|
||||
ports {
|
||||
port@0 {
|
||||
cif_in_cam: endpoint@0 {
|
||||
remote-endpoint = <&gc2145_out>;
|
||||
vsync-active = <0>;
|
||||
hsync-active = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
9
arch/arm/boot/dts/rk3506g-evb1-v10-amp.dts
Normal file
9
arch/arm/boot/dts/rk3506g-evb1-v10-amp.dts
Normal file
@@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3506g-evb1-v10.dts"
|
||||
#include "rk3506-amp.dtsi"
|
||||
219
arch/arm/boot/dts/rk3506g-evb1-v10-mcu-k350c4516t.dts
Normal file
219
arch/arm/boot/dts/rk3506g-evb1-v10-mcu-k350c4516t.dts
Normal file
@@ -0,0 +1,219 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/display/media-bus-format.h>
|
||||
#include "rk3506.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506G(QFN128) EVB1 V10 Board + RK EVB MCU PANLE DISPLAY Ext Board";
|
||||
compatible = "rockchip,rk3506g-evb1-v10-mcu-k350c4516t", "rockchip,rk3506";
|
||||
};
|
||||
|
||||
&rgb {
|
||||
status = "okay";
|
||||
rockchip,data-sync-bypass;
|
||||
pinctrl-names = "default";
|
||||
/*
|
||||
* rgb3x8_rgb2x8_m0_pins/rgb3x8_rgb2x8_m1_pins for RGB3x8(8bit)/RGB565(8bit)
|
||||
* rgb565_pins for RGB565(16bit)
|
||||
*/
|
||||
pinctrl-0 = <&rgb565_pins>;
|
||||
|
||||
/*
|
||||
* 320x480 RGB/MCU screen K350C4516T
|
||||
*/
|
||||
mcu_panel: mcu-panel {
|
||||
/*
|
||||
* MEDIA_BUS_FMT_RGB888_3X8 for RGB3x8(8bit)
|
||||
* MEDIA_BUS_FMT_RGB565_1X16 for RGB565(16bit)
|
||||
* MEDIA_BUS_FMT_RGB565_2X8_LE for RGB565(8bit)
|
||||
*/
|
||||
bus-format = <MEDIA_BUS_FMT_RGB565_1X16>;
|
||||
backlight = <&backlight>;
|
||||
enable-gpios = <&gpio0 RK_PA1 GPIO_ACTIVE_LOW>;
|
||||
enable-delay-ms = <20>;
|
||||
reset-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
|
||||
reset-delay-ms = <10>;
|
||||
prepare-delay-ms = <20>;
|
||||
unprepare-delay-ms = <20>;
|
||||
disable-delay-ms = <20>;
|
||||
init-delay-ms = <10>;
|
||||
width-mm = <217>;
|
||||
height-mm = <136>;
|
||||
|
||||
// type:0 is cmd, 1 is data
|
||||
panel-init-sequence = [
|
||||
//type delay num val1 val2 val3
|
||||
00 00 01 e0
|
||||
01 00 01 00
|
||||
01 00 01 07
|
||||
01 00 01 0f
|
||||
01 00 01 0d
|
||||
01 00 01 1b
|
||||
01 00 01 0a
|
||||
01 00 01 3c
|
||||
01 00 01 78
|
||||
01 00 01 4a
|
||||
01 00 01 07
|
||||
01 00 01 0e
|
||||
01 00 01 09
|
||||
01 00 01 1b
|
||||
01 00 01 1e
|
||||
01 00 01 0f
|
||||
00 00 01 e1
|
||||
01 00 01 00
|
||||
01 00 01 22
|
||||
01 00 01 24
|
||||
01 00 01 06
|
||||
01 00 01 12
|
||||
01 00 01 07
|
||||
01 00 01 36
|
||||
01 00 01 47
|
||||
01 00 01 47
|
||||
01 00 01 06
|
||||
01 00 01 0a
|
||||
01 00 01 07
|
||||
01 00 01 30
|
||||
01 00 01 37
|
||||
01 00 01 0f
|
||||
|
||||
00 00 01 c0
|
||||
01 00 01 10
|
||||
01 00 01 10
|
||||
|
||||
00 00 01 c1
|
||||
01 00 01 41
|
||||
|
||||
00 00 01 c5
|
||||
01 00 01 00
|
||||
01 00 01 22
|
||||
01 00 01 80
|
||||
|
||||
00 00 01 36
|
||||
01 00 01 48
|
||||
|
||||
00 00 01 3a
|
||||
01 00 01 55 /*
|
||||
* interface pixel format:
|
||||
* 66 for RGB3x8(8bit)
|
||||
* 55 for RGB565(16bit)/RGB565(8bit)
|
||||
*/
|
||||
|
||||
00 00 01 b0
|
||||
01 00 01 00
|
||||
|
||||
00 00 01 b1
|
||||
01 00 01 a0 /*
|
||||
* frame rate control:
|
||||
* 10 (30hz) for RGB3x8(8bit)
|
||||
* 70 (45hz) for RGB565(8bit)
|
||||
* a0 (60hz) for RGB565(16bit)
|
||||
*/
|
||||
01 00 01 11
|
||||
00 00 01 b4
|
||||
01 00 01 02
|
||||
00 00 01 B6
|
||||
01 00 01 02 /*
|
||||
* display function control:
|
||||
* 32 for RGB
|
||||
* 02 for MCU
|
||||
*/
|
||||
01 00 01 02
|
||||
|
||||
00 00 01 b7
|
||||
01 00 01 c6
|
||||
|
||||
00 00 01 be
|
||||
01 00 01 00
|
||||
01 00 01 04
|
||||
|
||||
00 00 01 e9
|
||||
01 00 01 00
|
||||
|
||||
00 00 01 f7
|
||||
01 00 01 a9
|
||||
01 00 01 51
|
||||
01 00 01 2c
|
||||
01 00 01 82
|
||||
|
||||
00 78 01 11
|
||||
00 32 01 29
|
||||
00 00 01 2c
|
||||
];
|
||||
|
||||
panel-exit-sequence = [
|
||||
//type delay num val1 val2 val3
|
||||
00 0a 01 28
|
||||
00 78 01 10
|
||||
];
|
||||
|
||||
display-timings {
|
||||
native-mode = <&kd050fwfba002_timing>;
|
||||
|
||||
kd050fwfba002_timing: timing0 {
|
||||
/*
|
||||
* 5226750 for frame rate 30Hz
|
||||
* 7840125 for frame rate 45Hz
|
||||
* 10453500 for frame rate 60Hz
|
||||
*/
|
||||
clock-frequency = <10453500>;
|
||||
hactive = <320>;
|
||||
vactive = <480>;
|
||||
hback-porch = <10>;
|
||||
hfront-porch = <5>;
|
||||
vback-porch = <10>;
|
||||
vfront-porch = <5>;
|
||||
hsync-len = <10>;
|
||||
vsync-len = <10>;
|
||||
hsync-active = <0>;
|
||||
vsync-active = <0>;
|
||||
de-active = <0>;
|
||||
pixelclk-active = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
port {
|
||||
panel_in_rgb: endpoint {
|
||||
remote-endpoint = <&rgb_out_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ports {
|
||||
rgb_out: port@1 {
|
||||
reg = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rgb_out_panel: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&panel_in_rgb>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb_in_vop {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&route_rgb {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vop {
|
||||
mcu-timing {
|
||||
mcu-pix-total = <5>;
|
||||
mcu-cs-pst = <1>;
|
||||
mcu-cs-pend = <4>;
|
||||
mcu-rw-pst = <2>;
|
||||
mcu-rw-pend = <3>;
|
||||
|
||||
mcu-hold-mode = <0>;
|
||||
};
|
||||
};
|
||||
80
arch/arm/boot/dts/rk3506g-evb1-v10-rgb-Q7050ITH2641AA1T.dts
Normal file
80
arch/arm/boot/dts/rk3506g-evb1-v10-rgb-Q7050ITH2641AA1T.dts
Normal file
@@ -0,0 +1,80 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/display/media-bus-format.h>
|
||||
#include "rk3506.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506G(QFN128) EVB1 V10 Board + RK EVB VOP3 RGB24BIT DISPLAY Ext Board";
|
||||
compatible = "rockchip,rk3506g-evb1-v10-rgb-Q7050ITH2641AA1T", "rockchip,rk3506";
|
||||
|
||||
panel: panel {
|
||||
compatible = "simple-panel";
|
||||
bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
|
||||
backlight = <&backlight>;
|
||||
enable-gpios = <&gpio0 RK_PA1 GPIO_ACTIVE_LOW>;
|
||||
enable-delay-ms = <20>;
|
||||
reset-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
|
||||
reset-value = <0>;
|
||||
reset-delay-ms = <10>;
|
||||
status = "okay";
|
||||
|
||||
display-timings {
|
||||
native-mode = <&q7050ith2641aa1t_timing>;
|
||||
|
||||
q7050ith2641aa1t_timing: timing0 {
|
||||
clock-frequency = <51200000>;
|
||||
hactive = <1024>;
|
||||
vactive = <600>;
|
||||
hback-porch = <160>;
|
||||
hfront-porch = <160>;
|
||||
vback-porch = <23>;
|
||||
vfront-porch = <12>;
|
||||
hsync-len = <24>;
|
||||
vsync-len = <2>;
|
||||
hsync-active = <0>;
|
||||
vsync-active = <0>;
|
||||
de-active = <0>;
|
||||
pixelclk-active = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
port {
|
||||
panel_in_rgb: endpoint {
|
||||
remote-endpoint = <&rgb_out_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgb888_pins>;
|
||||
|
||||
ports {
|
||||
rgb_out: port@1 {
|
||||
reg = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rgb_out_panel: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&panel_in_rgb>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb_in_vop {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&route_rgb {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -0,0 +1,91 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/display/media-bus-format.h>
|
||||
#include "rk3506.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506G(QFN128) EVB1 V10 Board + RK EVB EXT DisplayBoard SII9022A BT1120toHDMI V10";
|
||||
compatible = "rockchip,rk3506g-evb1-v10-sii9022-bt1120-to-hdmi", "rockchip,rk3506";
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io4_i2c2_scl &rm_io5_i2c2_sda>;
|
||||
status = "okay";
|
||||
|
||||
sii9022: sii9022@39 {
|
||||
compatible = "sil,sii9022";
|
||||
reg = <0x39>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sii902x_hdmi>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA6 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reset-gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
|
||||
enable-gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
/*
|
||||
* MEDIA_BUS_FMT_YUYV8_1X16 for bt1120
|
||||
* MEDIA_BUS_FMT_UYVY8_2X8 for bt656
|
||||
*/
|
||||
bus-format = <MEDIA_BUS_FMT_YUYV8_1X16>;
|
||||
status = "okay";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
sii9022_in_rgb: endpoint {
|
||||
remote-endpoint = <&rgb_out_sii9022>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
sii902x {
|
||||
sii902x_hdmi: sii902x-hdmi {
|
||||
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
/*
|
||||
* bt1120_pins for bt1120
|
||||
* bt656_m0_pins/bt656_m1_pins for bt656
|
||||
*/
|
||||
pinctrl-0 = <&bt1120_pins>;
|
||||
|
||||
ports {
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rgb_out_sii9022: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&sii9022_in_rgb>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb_in_vop {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&route_rgb {
|
||||
status = "okay";
|
||||
};
|
||||
82
arch/arm/boot/dts/rk3506g-evb1-v10-sii9022-rgb2hdmi.dts
Normal file
82
arch/arm/boot/dts/rk3506g-evb1-v10-sii9022-rgb2hdmi.dts
Normal file
@@ -0,0 +1,82 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/display/media-bus-format.h>
|
||||
#include "rk3506.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506G(QFN128) EVB1 V10 Board + RK EVB SII9022 RGB2HDMI DISPLAY Ext Board";
|
||||
compatible = "rockchip,rk3506g-evb1-v10-sii9022-rgb2hdmi", "rockchip,rk3506";
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
pinctrl-0 = <&rm_io4_i2c2_scl &rm_io5_i2c2_sda>;
|
||||
status = "okay";
|
||||
|
||||
sii9022: sii9022@39 {
|
||||
compatible = "sil,sii9022";
|
||||
reg = <0x39>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sii902x_hdmi>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA6 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reset-gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
|
||||
enable-gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
|
||||
status = "okay";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
sii9022_in_rgb: endpoint {
|
||||
remote-endpoint = <&rgb_out_sii9022>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
sii902x {
|
||||
sii902x_hdmi: sii902x-hdmi {
|
||||
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgb888_pins>;
|
||||
|
||||
ports {
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rgb_out_sii9022: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&sii9022_in_rgb>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&rgb_in_vop {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&route_rgb {
|
||||
status = "okay";
|
||||
};
|
||||
133
arch/arm/boot/dts/rk3506g-evb1-v10.dts
Normal file
133
arch/arm/boot/dts/rk3506g-evb1-v10.dts
Normal file
@@ -0,0 +1,133 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3506.dtsi"
|
||||
#include "rk3506-evb1-v10.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506G(QFN128) EVB1 V10 Board";
|
||||
compatible = "rockchip,rk3506g-evb1-v10", "rockchip,rk3506";
|
||||
|
||||
extcon_usb: extcon-usb {
|
||||
compatible = "linux,extcon-usb-gpio";
|
||||
vbus-gpio = <&gpio1 RK_PC5 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&usb_extcon_vbus>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
vcc3v3_lcd_n: vcc3v3-lcd0-n {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
regulator-name = "vcc3v3_lcd_n";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-off-in-suspend;
|
||||
};
|
||||
};
|
||||
|
||||
vcc5v0_otg0: vcc5v0-otg0-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc5v0_otg0";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_otg0_en>;
|
||||
};
|
||||
|
||||
vcc5v0_otg1: vcc5v0-otg1-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc5v0_otg1";
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_otg1_en>;
|
||||
};
|
||||
};
|
||||
|
||||
&cma {
|
||||
size = <0x1600000>;
|
||||
};
|
||||
|
||||
&dsi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dsi_dphy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dsi_in_vop {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dsi_panel {
|
||||
power-supply = <&vcc3v3_lcd_n>;
|
||||
};
|
||||
|
||||
&es8388 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&es8388_sound {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
>1x {
|
||||
power-supply = <&vcc3v3_lcd_n>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
usb {
|
||||
usb_extcon_vbus: usb-extcon-vbus {
|
||||
rockchip,pins = <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
vcc5v0_otg0_en: vcc5v0-otg0-en {
|
||||
rockchip,pins = <1 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
vcc5v0_otg1_en: vcc5v0-otg1-en {
|
||||
rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&route_dsi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sai1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy_otg0 {
|
||||
vbus-supply = <&vcc5v0_otg0>;
|
||||
rockchip,gpio-vbus-det;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy_otg1 {
|
||||
phy-supply = <&vcc5v0_otg1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb2phy {
|
||||
extcon = <&extcon_usb>;
|
||||
status = "okay";
|
||||
};
|
||||
161
arch/arm/boot/dts/rk3506g-iotest-pwm-test.dtsi
Normal file
161
arch/arm/boot/dts/rk3506g-iotest-pwm-test.dtsi
Normal file
@@ -0,0 +1,161 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/ {
|
||||
pwm_rockchip_test: pwm-rockchip-test {
|
||||
compatible = "pwm-rockchip-test";
|
||||
pwms = <&pwm0_4ch_0 0 25000 0>,
|
||||
<&pwm0_4ch_1 0 25000 0>,
|
||||
<&pwm0_4ch_2 0 25000 0>,
|
||||
<&pwm0_4ch_3 0 25000 0>,
|
||||
<&pwm1_8ch_0 0 25000 0>,
|
||||
<&pwm1_8ch_1 0 25000 0>,
|
||||
<&pwm1_8ch_2 0 25000 0>,
|
||||
<&pwm1_8ch_3 0 25000 0>,
|
||||
<&pwm1_8ch_4 0 25000 0>,
|
||||
<&pwm1_8ch_5 0 25000 0>,
|
||||
<&pwm1_8ch_6 0 25000 0>,
|
||||
<&pwm1_8ch_7 0 25000 0>;
|
||||
pwm-names = "pwm0_0",
|
||||
"pwm0_1",
|
||||
"pwm0_2",
|
||||
"pwm0_3",
|
||||
"pwm1_0",
|
||||
"pwm1_1",
|
||||
"pwm1_2",
|
||||
"pwm1_3",
|
||||
"pwm1_4",
|
||||
"pwm1_5",
|
||||
"pwm1_6",
|
||||
"pwm1_7";
|
||||
};
|
||||
};
|
||||
|
||||
/* use GPIO0_B0 ~ GPIO0_C3(rm_io8 ~ rm_io19) by default */
|
||||
&pwm0_4ch_0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io8_pwm0_ch0>;
|
||||
assigned-clocks = <&cru CLK_PWM0>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm0_4ch_1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io9_pwm0_ch1>;
|
||||
assigned-clocks = <&cru CLK_PWM0>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm0_4ch_2 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io10_pwm0_ch2>;
|
||||
assigned-clocks = <&cru CLK_PWM0>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm0_4ch_3 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io11_pwm0_ch3>;
|
||||
assigned-clocks = <&cru CLK_PWM0>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io12_pwm1_ch0>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io13_pwm1_ch1>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_2 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io14_pwm1_ch2>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_3 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io15_pwm1_ch3>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_4 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io16_pwm1_ch4>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_5 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io17_pwm1_ch5>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_6 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io18_pwm1_ch6>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
|
||||
#ifdef BIPHASIC_COUNTER_TEST
|
||||
&pwm1_8ch_0 {
|
||||
pinctrl-0 = <&rm_io12_pwm1_bip_cntr_a0 &rm_io0_pwm1_bip_cntr_b0>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_1 {
|
||||
pinctrl-0 = <&rm_io13_pwm1_bip_cntr_a1 &rm_io1_pwm1_bip_cntr_b1>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_2 {
|
||||
pinctrl-0 = <&rm_io14_pwm1_bip_cntr_a2 &rm_io2_pwm1_bip_cntr_b2>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_3 {
|
||||
pinctrl-0 = <&rm_io15_pwm1_bip_cntr_a3 &rm_io3_pwm1_bip_cntr_b3>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_4 {
|
||||
pinctrl-0 = <&rm_io16_pwm1_bip_cntr_a4 &rm_io4_pwm1_bip_cntr_b4>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_5 {
|
||||
pinctrl-0 = <&rm_io17_pwm1_bip_cntr_a5 &rm_io5_pwm1_bip_cntr_b5>;
|
||||
};
|
||||
|
||||
&pwm1_8ch_6 {
|
||||
pinctrl-0 = <&rm_io18_pwm1_ch6 &rm_io6_pwm1_ch7>;
|
||||
};
|
||||
#else
|
||||
&pwm1_8ch_7 {
|
||||
status = "okay";
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io19_pwm1_ch7>;
|
||||
assigned-clocks = <&cru CLK_PWM1>;
|
||||
assigned-clock-rates = <100000000>;
|
||||
};
|
||||
#endif
|
||||
22
arch/arm/boot/dts/rk3506g-iotest-v10-pdm.dts
Normal file
22
arch/arm/boot/dts/rk3506g-iotest-v10-pdm.dts
Normal file
@@ -0,0 +1,22 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3506g-iotest-v10.dts"
|
||||
|
||||
&pdm_mic_array {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pdm {
|
||||
status = "okay";
|
||||
pinctrl-0 = <&rm_io24_pdm_clk0
|
||||
&rm_io25_pdm_clk1
|
||||
&rm_io26_pdm_sdi0
|
||||
&rm_io27_pdm_sdi1
|
||||
&rm_io28_pdm_sdi2
|
||||
&rm_io29_pdm_sdi3>;
|
||||
};
|
||||
212
arch/arm/boot/dts/rk3506g-iotest-v10.dts
Normal file
212
arch/arm/boot/dts/rk3506g-iotest-v10.dts
Normal file
@@ -0,0 +1,212 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3506.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506 EVB1 V10 Board";
|
||||
compatible = "rockchip,rk3506-evb1-v10", "rockchip,rk3506";
|
||||
|
||||
chosen {
|
||||
bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=4 ubi.block=0,rootfs root=/dev/ubiblock0_0 rootfstype=squashfs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
|
||||
};
|
||||
|
||||
fiq_debugger: fiq-debugger {
|
||||
compatible = "rockchip,fiq-debugger";
|
||||
rockchip,serial-id = <0>;
|
||||
rockchip,wake-irq = <0>;
|
||||
rockchip,irq-mode-enable = <1>;
|
||||
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
|
||||
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
pdmics: dummy-codec {
|
||||
compatible = "rockchip,dummy-codec";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
|
||||
pdm_mic_array: pdm-mic-array {
|
||||
status = "disabled";
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "rockchip,pdm-mic-array";
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&pdm>;
|
||||
};
|
||||
simple-audio-card,codec {
|
||||
sound-dai = <&pdmics>;
|
||||
};
|
||||
};
|
||||
|
||||
vcc12v_dc: vcc12v-dc {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc12v_dc";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <12000000>;
|
||||
regulator-max-microvolt = <12000000>;
|
||||
};
|
||||
|
||||
vcc_sys: vcc-sys {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_sys";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
vin-supply = <&vcc12v_dc>;
|
||||
};
|
||||
|
||||
vcc_3v3: vcc-3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_3v3";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc3v3_sd: vcc3v3-sd {
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>;
|
||||
regulator-name = "vcc3v3_sd";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_pwren>;
|
||||
};
|
||||
|
||||
vccio_sd: vccio-sd {
|
||||
compatible = "regulator-gpio";
|
||||
regulator-name = "vccio_sd";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
|
||||
states = <3300000 1
|
||||
1800000 0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_volt>;
|
||||
};
|
||||
|
||||
vcc_1v8: vcc-1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_1v8";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc_ddr: vcc-ddr {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_ddr";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vdd_arm: vdd-arm {
|
||||
compatible = "pwm-regulator";
|
||||
pwms = <&pwm0_4ch_0 0 5000 1>;
|
||||
regulator-name = "vdd_arm";
|
||||
regulator-min-microvolt = <710000>;
|
||||
regulator-max-microvolt = <1207000>;
|
||||
regulator-init-microvolt = <1011000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
pwm-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc0v9_stb: vcc0v9-stb {
|
||||
compatible = "pwm-regulator";
|
||||
pwms = <&pwm0_4ch_1 0 5000 1>;
|
||||
regulator-name = "vcc0v9_stb";
|
||||
regulator-min-microvolt = <810000>;
|
||||
regulator-max-microvolt = <1006000>;
|
||||
regulator-init-microvolt = <900000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
pwm-supply = <&vcc_sys>;
|
||||
};
|
||||
};
|
||||
|
||||
&fspi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
&mmc {
|
||||
/* For SDMMC */
|
||||
no-sdio;
|
||||
no-mmc;
|
||||
cap-mmc-highspeed;
|
||||
cap-sd-highspeed;
|
||||
cd-gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
|
||||
disable-wp;
|
||||
sd-uhs-sdr104;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_clk_pins &sdmmc_cmd_pins &sdmmc_bus4_pins &sdmmc_det>;
|
||||
vqmmc-supply = <&vccio_sd>;
|
||||
vmmc-supply = <&vcc3v3_sd>;
|
||||
|
||||
/* For eMMC
|
||||
* no-sdio;
|
||||
* no-sd;
|
||||
* cap-mmc-highspeed;
|
||||
* cap-sd-highspeed;
|
||||
* non-removable;
|
||||
* mmc-hs200-1_8v;
|
||||
* pinctrl-names = "default";
|
||||
* pinctrl-0 = <&sdmmc_clk_pins &sdmmc_cmd_pins &sdmmc_bus4_pins>;
|
||||
* vqmmc-supply = <&vccio_sd>;
|
||||
* vmmc-supply = <&vcc3v3_sd>;
|
||||
*/
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pdm {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
sdmmc {
|
||||
/omit-if-no-ref/
|
||||
sdmmc_pwren: sdmmc-pwren {
|
||||
rockchip,pins = <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
/omit-if-no-ref/
|
||||
sdmmc_volt: sdmmc-volt {
|
||||
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
/omit-if-no-ref/
|
||||
sdmmc_det: sdmmc-det {
|
||||
rockchip,pins = <3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwm0_4ch_0 {
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io21_pwm0_ch0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm0_4ch_1 {
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io20_pwm0_ch1>;
|
||||
status = "okay";
|
||||
};
|
||||
620
arch/arm/boot/dts/rk3506g-test1-v10-audio.dts
Normal file
620
arch/arm/boot/dts/rk3506g-test1-v10-audio.dts
Normal file
@@ -0,0 +1,620 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "rk3506.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Rockchip RK3506G TEST1 V10 Audio Board";
|
||||
compatible = "rockchip,rk3506g-test1-v10", "rockchip,rk3506";
|
||||
|
||||
chosen {
|
||||
bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=4 ubi.block=0,rootfs root=/dev/ubiblock0_0 rootfstype=squashfs rootwait snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
|
||||
};
|
||||
|
||||
acodec_sound: acodec-sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "sai4-1r-adc";
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,mclk-fs = <1024>;
|
||||
simple-audio-card,bitclock-master = <&codec_master>;
|
||||
simple-audio-card,frame-master = <&codec_master>;
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&sai4>;
|
||||
};
|
||||
codec_master: simple-audio-card,codec {
|
||||
sound-dai = <&audio_codec>;
|
||||
};
|
||||
};
|
||||
|
||||
dsm_sound: dsm-sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,mclk-fs = <256>;
|
||||
simple-audio-card,name = "rockchip-dsm-sound";
|
||||
simple-audio-card,bitclock-master = <&dsm_master>;
|
||||
simple-audio-card,frame-master = <&dsm_master>;
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&sai3>;
|
||||
};
|
||||
dsm_master: simple-audio-card,codec {
|
||||
sound-dai = <&acdcdig_dsm>;
|
||||
};
|
||||
};
|
||||
|
||||
extcon_usb: extcon-usb {
|
||||
compatible = "linux,extcon-usb-gpio";
|
||||
vbus-gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>;
|
||||
id-gpio = <&gpio3 RK_PB4 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&usb_extcon_vbus &usb_extcon_id>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
fiq_debugger: fiq-debugger {
|
||||
compatible = "rockchip,fiq-debugger";
|
||||
rockchip,serial-id = <0>;
|
||||
rockchip,wake-irq = <0>;
|
||||
rockchip,irq-mode-enable = <1>;
|
||||
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
|
||||
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
gpio_i2c0: i2c@0 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>, /* sda */
|
||||
<&gpio2 RK_PB0 GPIO_ACTIVE_HIGH>; /* scl */
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gpio_i2c0_pins>;
|
||||
|
||||
es8388_6: es8388@11 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x11>;
|
||||
clocks = <&mclkout_sai1>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai1>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-6";
|
||||
};
|
||||
|
||||
es8388_7: es8388@10 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x10>;
|
||||
clocks = <&mclkout_sai1>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai1>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-7";
|
||||
};
|
||||
};
|
||||
|
||||
gpio_i2c1: i2c@1 {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&gpio2 RK_PB3 GPIO_ACTIVE_HIGH>, /* sda */
|
||||
<&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>; /* scl */
|
||||
i2c-gpio,delay-us = <2>; /* ~100 kHz */
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gpio_i2c1_pins>;
|
||||
|
||||
es8388_8: es8388@11 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x11>;
|
||||
clocks = <&mclkout_sai2>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai2>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sai2m0_mclk_pins>;
|
||||
sound-name-prefix = "ES8388-8";
|
||||
};
|
||||
|
||||
es8388_9: es8388@10 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x10>;
|
||||
clocks = <&mclkout_sai3>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai3>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sai3_mclk_pins>;
|
||||
sound-name-prefix = "ES8388-9";
|
||||
};
|
||||
};
|
||||
|
||||
pdm_mic_array: pdm-mic-array {
|
||||
status = "disabled";
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "rockchip,pdm-mic-array";
|
||||
rockchip,cpu = <&pdm>;
|
||||
rockchip,codec = <&es7202_0>, <&es7202_1>,
|
||||
<&es7202_2>, <&es7202_3>;
|
||||
};
|
||||
|
||||
/* SAI0 1TX + 4RX */
|
||||
sai0_es8388x4_sound: sai0-es8388x4-sound {
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "sai0-1t4r-es8388x4";
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai0>;
|
||||
rockchip,codec = <&es8388_0>, <&es8388_1>,
|
||||
<&es8388_2>, <&es8388_3>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "ES8388-0 LOUT1",
|
||||
"Speaker", "ES8388-0 ROUT1",
|
||||
"ES8388-0 LINPUT1", "Main Mic", /* From ES8388-4 */
|
||||
"ES8388-0 LINPUT2", "Main Mic", /* From ES8388-4 */
|
||||
"ES8388-1 LINPUT1", "Main Mic", /* From ES8388-5 */
|
||||
"ES8388-1 LINPUT2", "Main Mic", /* From ES8388-5 */
|
||||
"ES8388-2 LINPUT1", "Main Mic", /* From ES8388-6 */
|
||||
"ES8388-2 LINPUT2", "Main Mic", /* From ES8388-6 */
|
||||
"ES8388-3 LINPUT1", "Main Mic", /* From ES8388-7 */
|
||||
"ES8388-3 LINPUT2", "Main Mic"; /* From ES8388-7 */
|
||||
};
|
||||
|
||||
/* SAI1 4TX + 1RX */
|
||||
sai1_es8388x4_sound: sai1-es8388x4-sound {
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "sai1-4t1r-es8388x4";
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai1>;
|
||||
rockchip,codec = <&es8388_4>, <&es8388_5>,
|
||||
<&es8388_6>, <&es8388_7>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "ES8388-4 LOUT1",
|
||||
"Speaker", "ES8388-4 ROUT1",
|
||||
"Speaker", "ES8388-5 LOUT1",
|
||||
"Speaker", "ES8388-5 ROUT1",
|
||||
"Speaker", "ES8388-6 LOUT1",
|
||||
"Speaker", "ES8388-6 ROUT1",
|
||||
"Speaker", "ES8388-7 LOUT1",
|
||||
"Speaker", "ES8388-7 ROUT1",
|
||||
"ES8388-4 LINPUT1", "Main Mic", /* From ES8388-0 */
|
||||
"ES8388-4 LINPUT2", "Main Mic"; /* From ES8388-0 */
|
||||
};
|
||||
|
||||
/* SAI2 1TX + 1RX */
|
||||
sai2_es8388x1_sound: sai2-es8388x1-sound {
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "sai2-1t1r-es8388x1";
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai2>;
|
||||
rockchip,codec = <&es8388_8>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "ES8388-8 LOUT1",
|
||||
"Speaker", "ES8388-8 ROUT1",
|
||||
"ES8388-8 LINPUT1", "Main Mic", /* From ES8388-8 */
|
||||
"ES8388-8 LINPUT2", "Main Mic"; /* From ES8388-8 */
|
||||
};
|
||||
|
||||
/* SAI3 1TX + 1RX */
|
||||
sai3_es8388x1_sound: sai3-es8388x1-sound {
|
||||
compatible = "rockchip,multicodecs-card";
|
||||
rockchip,card-name = "sai3-1t1r-es8388x1";
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai3>;
|
||||
rockchip,codec = <&es8388_9>;
|
||||
rockchip,audio-routing =
|
||||
"Speaker", "ES8388-9 LOUT1",
|
||||
"Speaker", "ES8388-9 ROUT1",
|
||||
"ES8388-9 LINPUT1", "Main Mic", /* From ES8388-9 */
|
||||
"ES8388-9 LINPUT2", "Main Mic"; /* From ES8388-9 */
|
||||
};
|
||||
|
||||
spdif_rx_dc: spdif-rx-dc {
|
||||
compatible = "rockchip,dummy-codec";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
|
||||
spdif_rx_sound: spdif-rx-sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "spdif-rx-sound";
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&spdif_rx>;
|
||||
};
|
||||
simple-audio-card,codec {
|
||||
sound-dai = <&spdif_rx_dc>;
|
||||
};
|
||||
};
|
||||
|
||||
spdif_tx_dc: spdif-tx-dc {
|
||||
compatible = "rockchip,dummy-codec";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
|
||||
spdif_tx_sound: spdif-tx-sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "spdif-tx-sound";
|
||||
simple-audio-card,mclk-fs = <128>;
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&spdif_tx>;
|
||||
};
|
||||
simple-audio-card,codec {
|
||||
sound-dai = <&spdif_tx_dc>;
|
||||
};
|
||||
};
|
||||
|
||||
vcc12v_dc: vcc12v-dc {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc12v_dc";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <12000000>;
|
||||
regulator-max-microvolt = <12000000>;
|
||||
};
|
||||
|
||||
vcc_sys: vcc-sys {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_sys";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
vin-supply = <&vcc12v_dc>;
|
||||
};
|
||||
|
||||
vcc_3v3: vcc-3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_3v3";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc_1v8: vcc-1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_1v8";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vdd_arm: vdd-arm {
|
||||
compatible = "pwm-regulator";
|
||||
pwms = <&pwm0_4ch_0 0 5000 1>;
|
||||
regulator-name = "vdd_arm";
|
||||
regulator-min-microvolt = <710000>;
|
||||
regulator-max-microvolt = <1207000>;
|
||||
regulator-init-microvolt = <1011000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-settling-time-up-us = <250>;
|
||||
pwm-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc5v0_otg0: vcc5v0-otg0-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc5v0_otg0";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio3 RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_otg0_en>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
|
||||
vcc5v0_otg1: vcc5v0-otg1-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc5v0_otg1";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
enable-active-high;
|
||||
gpio = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_otg1_en>;
|
||||
vin-supply = <&vcc_sys>;
|
||||
};
|
||||
};
|
||||
|
||||
&acdcdig_dsm {
|
||||
status = "disabled";
|
||||
pa-ctl-gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&dsm_audm1_ln_pins
|
||||
&dsm_audm1_lp_pins
|
||||
&dsm_spk_ctrl>;
|
||||
};
|
||||
|
||||
&audio_codec {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&fspi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io18_i2c0_scl
|
||||
&rm_io19_i2c0_sda>;
|
||||
|
||||
es7202_0: es7202@30 {
|
||||
status = "okay";
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "ES7202_PDM_ADC_1";
|
||||
reg = <0x30>;
|
||||
sound-name-prefix = "ES7202-0";
|
||||
};
|
||||
|
||||
es7202_1: es7202@31 {
|
||||
status = "okay";
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "ES7202_PDM_ADC_1";
|
||||
reg = <0x31>;
|
||||
sound-name-prefix = "ES7202-1";
|
||||
};
|
||||
|
||||
es7202_2: es7202@32 {
|
||||
status = "okay";
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "ES7202_PDM_ADC_1";
|
||||
reg = <0x32>;
|
||||
sound-name-prefix = "ES7202-2";
|
||||
};
|
||||
|
||||
es7202_3: es7202@34 {
|
||||
status = "okay";
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "ES7202_PDM_ADC_1";
|
||||
reg = <0x34>;
|
||||
sound-name-prefix = "ES7202-3";
|
||||
};
|
||||
|
||||
es8388_0: es8388@11 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x11>;
|
||||
clocks = <&mclkout_sai0>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai0>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io2_sai0_mclk>;
|
||||
sound-name-prefix = "ES8388-0";
|
||||
};
|
||||
|
||||
es8388_1: es8388@10 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x10>;
|
||||
clocks = <&mclkout_sai0>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai0>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-1";
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io25_i2c1_scl
|
||||
&rm_io26_i2c1_sda>;
|
||||
|
||||
es8388_2: es8388@11 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x11>;
|
||||
clocks = <&mclkout_sai0>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai0>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-2";
|
||||
};
|
||||
|
||||
es8388_3: es8388@10 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x10>;
|
||||
clocks = <&mclkout_sai0>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai0>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-3";
|
||||
};
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io30_i2c2_scl
|
||||
&rm_io31_i2c2_sda>;
|
||||
|
||||
es8388_4: es8388@11 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x11>;
|
||||
clocks = <&mclkout_sai1>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai1>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-4";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io8_sai1_mclk>;
|
||||
};
|
||||
|
||||
es8388_5: es8388@10 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "everest,es8388", "everest,es8323";
|
||||
reg = <0x10>;
|
||||
clocks = <&mclkout_sai1>;
|
||||
clock-names = "mclk";
|
||||
assigned-clocks = <&mclkout_sai1>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
sound-name-prefix = "ES8388-5";
|
||||
};
|
||||
};
|
||||
|
||||
&pdm {
|
||||
status = "disabled";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io11_pdm_clk0
|
||||
&rm_io12_pdm_sdi0
|
||||
&rm_io13_pdm_sdi1
|
||||
&rm_io14_pdm_sdi2
|
||||
&rm_io15_pdm_sdi3>;
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
acodec-dsm {
|
||||
/omit-if-no-ref/
|
||||
dsm_spk_ctrl: dsm-spk-ctrl {
|
||||
rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-i2c {
|
||||
/omit-if-no-ref/
|
||||
gpio_i2c0_pins: gpio-i2c0-pins {
|
||||
rockchip,pins =
|
||||
<2 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>, /* sda */
|
||||
<2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; /* scl */
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
gpio_i2c1_pins: gpio-i2c1-pins {
|
||||
rockchip,pins =
|
||||
<2 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>, /* sda */
|
||||
<2 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>; /* scl */
|
||||
};
|
||||
};
|
||||
|
||||
usb {
|
||||
usb_extcon_id: usb-extcon-id {
|
||||
rockchip,pins = <3 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
usb_extcon_vbus: usb-extcon-vbus {
|
||||
rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
vcc5v0_otg0_en: vcc5v0-otg0-en {
|
||||
rockchip,pins = <3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
vcc5v0_otg1_en: vcc5v0-otg1-en {
|
||||
rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwm0_4ch_0 {
|
||||
pinctrl-names = "active";
|
||||
pinctrl-0 = <&rm_io21_pwm0_ch0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sai0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io0_sai0_lrck
|
||||
&rm_io1_sai0_sclk
|
||||
&rm_io3_sai0_sdo
|
||||
&rm_io4_sai0_sdi0
|
||||
&rm_io5_sai0_sdi1
|
||||
&rm_io6_sai0_sdi2
|
||||
&rm_io7_sai0_sdi3>;
|
||||
};
|
||||
|
||||
&sai1 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io9_sai1_sclk
|
||||
&rm_io10_sai1_lrck
|
||||
&rm_io11_sai1_sdi
|
||||
&rm_io12_sai1_sdo0
|
||||
&rm_io13_sai1_sdo1
|
||||
&rm_io14_sai1_sdo2
|
||||
&rm_io15_sai1_sdo3>;
|
||||
};
|
||||
|
||||
&sai2 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sai2m0_lrck_pins
|
||||
&sai2m0_sclk_pins
|
||||
&sai2m0_sdi_pins
|
||||
&sai2m0_sdo_pins>;
|
||||
};
|
||||
|
||||
&sai3 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sai3_lrck_pins
|
||||
&sai3_sclk_pins
|
||||
&sai3_sdi_pins
|
||||
&sai3_sdo_pins>;
|
||||
};
|
||||
|
||||
&sai4 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spdif_rx {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io17_spdif_rx>;
|
||||
};
|
||||
|
||||
&spdif_tx {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rm_io16_spdif_tx>;
|
||||
};
|
||||
|
||||
&u2phy_otg0 {
|
||||
vbus-supply = <&vcc5v0_otg0>;
|
||||
rockchip,gpio-vbus-det;
|
||||
rockchip,gpio-id-det;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy_otg1 {
|
||||
phy-supply = <&vcc5v0_otg1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb20_otg0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb20_otg1 {
|
||||
dr_mode = "host";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb2phy {
|
||||
extcon = <&extcon_usb>;
|
||||
status = "okay";
|
||||
};
|
||||
302
arch/arm/configs/rk3506_defconfig
Normal file
302
arch/arm/configs/rk3506_defconfig
Normal file
@@ -0,0 +1,302 @@
|
||||
CONFIG_WERROR=y
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_KERNEL_XZ=y
|
||||
CONFIG_DEFAULT_HOSTNAME="localhost"
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_RD_GZIP is not set
|
||||
# CONFIG_RD_BZIP2 is not set
|
||||
# CONFIG_RD_LZMA is not set
|
||||
# CONFIG_RD_XZ is not set
|
||||
# CONFIG_RD_LZO is not set
|
||||
# CONFIG_RD_LZ4 is not set
|
||||
# CONFIG_RD_ZSTD is not set
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_BUG is not set
|
||||
# CONFIG_ELF_CORE is not set
|
||||
# CONFIG_BASE_FULL is not set
|
||||
# CONFIG_IO_URING is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_ARCH_ROCKCHIP=y
|
||||
# CONFIG_HARDEN_BRANCH_PREDICTOR is not set
|
||||
# CONFIG_HARDEN_BRANCH_HISTORY is not set
|
||||
# CONFIG_VDSO is not set
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
# CONFIG_ARM_ERRATA_643719 is not set
|
||||
CONFIG_SMP=y
|
||||
CONFIG_VMSPLIT_3G_OPT=y
|
||||
CONFIG_ARM_PSCI=y
|
||||
CONFIG_HZ_300=y
|
||||
CONFIG_THUMB2_KERNEL=y
|
||||
# CONFIG_CPU_SW_DOMAIN_PAN is not set
|
||||
CONFIG_ARCH_FORCE_MAX_ORDER=9
|
||||
CONFIG_UACCESS_WITH_MEMCPY=y
|
||||
CONFIG_CMDLINE="user_debug=31"
|
||||
CONFIG_CMDLINE_EXTEND=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_ARM_ROCKCHIP_CPUFREQ=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_ARM_CPUIDLE=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
# CONFIG_STACKPROTECTOR_STRONG is not set
|
||||
# CONFIG_STRICT_KERNEL_RWX is not set
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_MSDOS_PARTITION is not set
|
||||
CONFIG_CMDLINE_PARTITION=y
|
||||
CONFIG_IOSCHED_BFQ=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_KSM=y
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_INACTIVE=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_BRIDGE=y
|
||||
# CONFIG_BRIDGE_IGMP_SNOOPING is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_ALLOW_DEV_COREDUMP is not set
|
||||
CONFIG_ROCKCHIP_SIP=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
# CONFIG_MTD_OF_PARTS is not set
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_SPI_NAND=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPI_NOR_MISC=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_CORE is not set
|
||||
# CONFIG_NET_VENDOR_ALACRITECH is not set
|
||||
# CONFIG_NET_VENDOR_AMAZON is not set
|
||||
# CONFIG_NET_VENDOR_AQUANTIA is not set
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_CADENCE is not set
|
||||
# CONFIG_NET_VENDOR_CAVIUM is not set
|
||||
# CONFIG_NET_VENDOR_CIRRUS is not set
|
||||
# CONFIG_NET_VENDOR_CORTINA is not set
|
||||
# CONFIG_NET_VENDOR_EZCHIP is not set
|
||||
# CONFIG_NET_VENDOR_FARADAY is not set
|
||||
# CONFIG_NET_VENDOR_GOOGLE is not set
|
||||
# CONFIG_NET_VENDOR_HISILICON is not set
|
||||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MELLANOX is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_MICROCHIP is not set
|
||||
# CONFIG_NET_VENDOR_MICROSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NI is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_PENSANDO is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
# CONFIG_NET_VENDOR_SAMSUNG is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_SOLARFLARE is not set
|
||||
# CONFIG_NET_VENDOR_SMSC is not set
|
||||
# CONFIG_NET_VENDOR_SOCIONEXT is not set
|
||||
CONFIG_STMMAC_ETH=y
|
||||
CONFIG_STMMAC_ETHTOOL=y
|
||||
CONFIG_STMMAC_FULL=y
|
||||
# CONFIG_DWMAC_GENERIC is not set
|
||||
CONFIG_DWMAC_ROCKCHIP_TOOL=y
|
||||
# CONFIG_NET_VENDOR_SYNOPSYS is not set
|
||||
# CONFIG_NET_VENDOR_VIA is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
# CONFIG_NET_VENDOR_XILINX is not set
|
||||
CONFIG_MOTORCOMM_PHY=y
|
||||
CONFIG_PPP=y
|
||||
# CONFIG_WLAN is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_KEYBOARD_ADC=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
CONFIG_KEYBOARD_GPIO=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_TOUCHSCREEN_GT1X=y
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=6
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=6
|
||||
CONFIG_SERIAL_8250_DW=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_ROCKCHIP=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_GPIO=y
|
||||
CONFIG_I2C_RK3X=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ROCKCHIP_SFC=y
|
||||
# CONFIG_PTP_1588_CLOCK_KVM is not set
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_SYSCON_REBOOT_MODE=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_WRITABLE_TRIPS=y
|
||||
CONFIG_THERMAL_GOV_USER_SPACE=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_DEVFREQ_THERMAL=y
|
||||
CONFIG_ROCKCHIP_THERMAL=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_DW_WATCHDOG=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_REGULATOR_PWM=y
|
||||
CONFIG_MEDIA_SUPPORT=y
|
||||
CONFIG_MEDIA_SUPPORT_FILTER=y
|
||||
# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
|
||||
CONFIG_MEDIA_CAMERA_SUPPORT=y
|
||||
CONFIG_MEDIA_PLATFORM_SUPPORT=y
|
||||
CONFIG_V4L_PLATFORM_DRIVERS=y
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_IGNORE_IOTCL_PERMIT=y
|
||||
CONFIG_DRM_ROCKCHIP=y
|
||||
CONFIG_ROCKCHIP_VOP=y
|
||||
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
|
||||
CONFIG_ROCKCHIP_RGB=y
|
||||
CONFIG_DRM_PANEL_SIMPLE=y
|
||||
CONFIG_DRM_SII902X=y
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||
CONFIG_BACKLIGHT_PWM=y
|
||||
CONFIG_ROCKCHIP_MULTI_RGA=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
# CONFIG_SND_PCM_TIMER is not set
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
# CONFIG_SND_ARM is not set
|
||||
CONFIG_SND_SOC=y
|
||||
CONFIG_SND_SOC_DYNAMIC_DMA_CHAN=y
|
||||
CONFIG_SND_SOC_ROCKCHIP=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_PDM_V2=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_SAI=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_SPDIFRX=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
|
||||
CONFIG_SND_SOC_DUMMY_CODEC=y
|
||||
CONFIG_SND_SOC_ES7202=y
|
||||
CONFIG_SND_SOC_ES7202_MIC_MAX_CHANNELS=8
|
||||
CONFIG_SND_SOC_ES8323=y
|
||||
CONFIG_SND_SOC_RK3506=y
|
||||
CONFIG_SND_SOC_RK_DSM=y
|
||||
CONFIG_SND_SIMPLE_CARD=y
|
||||
# CONFIG_HID is not set
|
||||
# CONFIG_USB_HID is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_DWC2=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_CONFIGFS=y
|
||||
CONFIG_USB_CONFIGFS_UEVENT=y
|
||||
CONFIG_USB_CONFIGFS_F_FS=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_QUEUE_DEPTH=1
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_PL330_DMA=y
|
||||
CONFIG_DMABUF_HEAPS=y
|
||||
CONFIG_DMABUF_HEAPS_CMA=y
|
||||
# CONFIG_VIRTIO_MENU is not set
|
||||
# CONFIG_VHOST_MENU is not set
|
||||
CONFIG_STAGING=y
|
||||
CONFIG_ROCKCHIP_CLK_OUT=y
|
||||
# CONFIG_ARM_ARCH_TIMER_EVTSTREAM is not set
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_CPU_RK3506=y
|
||||
CONFIG_ROCKCHIP_CPUINFO=y
|
||||
CONFIG_ROCKCHIP_OPP=y
|
||||
CONFIG_ROCKCHIP_PVTM=y
|
||||
CONFIG_ROCKCHIP_SYSTEM_MONITOR=y
|
||||
CONFIG_FIQ_DEBUGGER=y
|
||||
CONFIG_FIQ_DEBUGGER_NO_SLEEP=y
|
||||
CONFIG_FIQ_DEBUGGER_CONSOLE=y
|
||||
CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y
|
||||
CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y
|
||||
CONFIG_RK_CONSOLE_THREAD=y
|
||||
CONFIG_ROCKCHIP_DEBUG=y
|
||||
CONFIG_ROCKCHIP_MINI_KERNEL=y
|
||||
CONFIG_PM_DEVFREQ=y
|
||||
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
|
||||
CONFIG_DEVFREQ_GOV_USERSPACE=y
|
||||
CONFIG_EXTCON=y
|
||||
CONFIG_EXTCON_USB_GPIO=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_ROCKCHIP_SARADC=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_ROCKCHIP=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y
|
||||
CONFIG_NVMEM_ROCKCHIP_OTP=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_SQUASHFS=y
|
||||
CONFIG_SQUASHFS_DECOMP_MULTI=y
|
||||
# CONFIG_SQUASHFS_ZLIB is not set
|
||||
CONFIG_SQUASHFS_XZ=y
|
||||
CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y
|
||||
CONFIG_PSTORE=y
|
||||
# CONFIG_PSTORE_DEFLATE_COMPRESS is not set
|
||||
CONFIG_PSTORE_CONSOLE=y
|
||||
CONFIG_PSTORE_RAM=y
|
||||
CONFIG_PSTORE_BOOT_LOG=y
|
||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
||||
# CONFIG_XZ_DEC_X86 is not set
|
||||
# CONFIG_XZ_DEC_POWERPC is not set
|
||||
# CONFIG_XZ_DEC_IA64 is not set
|
||||
# CONFIG_XZ_DEC_SPARC is not set
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_CMA_SIZE_MBYTES=0
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PRINTK_TIME_FROM_ARM_ARCH_TIMER=y
|
||||
# CONFIG_DEBUG_MISC is not set
|
||||
CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_MAGIC_SYSRQ_SERIAL is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
|
||||
CONFIG_HARDLOCKUP_DETECTOR=y
|
||||
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
CONFIG_BOOTPARAM_RCU_STALL_PANIC=y
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
@@ -141,6 +141,8 @@
|
||||
poll-interval = <100>;
|
||||
spk-con-gpio = <&gpio4 RK_PB1 GPIO_ACTIVE_HIGH>;
|
||||
hp-con-gpio = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
|
||||
rockchip,pre-power-on-delay-ms = <30>;
|
||||
rockchip,post-power-down-delay-ms = <40>;
|
||||
rockchip,format = "i2s";
|
||||
rockchip,mclk-fs = <256>;
|
||||
rockchip,cpu = <&sai1>;
|
||||
|
||||
@@ -388,12 +388,9 @@
|
||||
&sai1m0_sclk
|
||||
&sai1m0_sdi0
|
||||
&sai1m0_sdi1
|
||||
&sai1m0_sdi2
|
||||
&sai1m0_sdi3
|
||||
&sai1m0_sdo0
|
||||
&sai1m0_sdo1
|
||||
&sai1m0_sdo2
|
||||
&sai1m0_sdo3>;
|
||||
&sai1m0_sdo2>;
|
||||
};
|
||||
|
||||
&sdmmc {
|
||||
|
||||
@@ -107,6 +107,13 @@ config CLK_RK3399
|
||||
help
|
||||
Build the driver for RK3399 Clock Driver.
|
||||
|
||||
config CLK_RK3506
|
||||
tristate "Rockchip RK3506 clock controller support"
|
||||
depends on CPU_RK3506 || COMPILE_TEST
|
||||
default y
|
||||
help
|
||||
Build the driver for RK3506 Clock Driver.
|
||||
|
||||
config CLK_RK3528
|
||||
tristate "Rockchip RK3528 clock controller support"
|
||||
depends on CPU_RK3528 || COMPILE_TEST
|
||||
@@ -180,6 +187,12 @@ config ROCKCHIP_CLK_PVTM
|
||||
help
|
||||
Say y here to enable clk pvtm.
|
||||
|
||||
config ROCKCHIP_CLK_PVTPLL
|
||||
tristate "Rockchip Clk Pvtpll"
|
||||
default y if CPU_RV1103B || CPU_RK3506
|
||||
help
|
||||
Say y here to enable clk pvtpll.
|
||||
|
||||
config ROCKCHIP_DDRCLK
|
||||
bool
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ clk-rockchip-$(CONFIG_RESET_CONTROLLER) += softrst.o
|
||||
|
||||
obj-$(CONFIG_ROCKCHIP_CLK_LINK) += clk-link.o
|
||||
obj-$(CONFIG_ROCKCHIP_CLK_OUT) += clk-out.o
|
||||
obj-$(CONFIG_ROCKCHIP_CLK_PVTPLL) += clk-pvtpll.o
|
||||
|
||||
obj-$(CONFIG_CLK_PX30) += clk-px30.o
|
||||
obj-$(CONFIG_CLK_RV1106) += clk-rv1106.o
|
||||
@@ -34,6 +35,7 @@ obj-$(CONFIG_CLK_RK3308) += clk-rk3308.o
|
||||
obj-$(CONFIG_CLK_RK3328) += clk-rk3328.o
|
||||
obj-$(CONFIG_CLK_RK3368) += clk-rk3368.o
|
||||
obj-$(CONFIG_CLK_RK3399) += clk-rk3399.o
|
||||
obj-$(CONFIG_CLK_RK3506) += clk-rk3506.o
|
||||
obj-$(CONFIG_CLK_RK3528) += clk-rk3528.o
|
||||
obj-$(CONFIG_CLK_RK3562) += clk-rk3562.o
|
||||
obj-$(CONFIG_CLK_RK3568) += clk-rk3568.o
|
||||
|
||||
350
drivers/clk/rockchip/clk-pvtpll.c
Normal file
350
drivers/clk/rockchip/clk-pvtpll.c
Normal file
@@ -0,0 +1,350 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2024 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include "clk.h"
|
||||
|
||||
#define RV1103B_PVTPLL_GCK_CFG 0x20
|
||||
#define RV1103B_PVTPLL_GCK_LEN 0x24
|
||||
#define RV1103B_GCK_START BIT(0)
|
||||
#define RV1103B_GCK_EN BIT(1)
|
||||
#define RV1103B_GCK_MODE BIT(5)
|
||||
#define RV1103B_GCK_RING_LEN_SEL_OFFSET 0
|
||||
#define RV1103B_GCK_RING_LEN_SEL_MASK 0x1ff
|
||||
#define RV1103B_GCK_RING_SEL_OFFSET 10
|
||||
#define RV1103B_GCK_RING_SEL_MASK 0x07
|
||||
|
||||
#define RK3506_GRF_CORE_PVTPLL_CON0_L 0x00
|
||||
#define RK3506_GRF_CORE_PVTPLL_CON0_H 0x04
|
||||
#define RK3506_OSC_RING_SEL_OFFSET 8
|
||||
#define RK3506_OSC_RING_SEL_MASK 0x03
|
||||
#define RK3506_OSC_EN BIT(1)
|
||||
#define RK3506_START BIT(0)
|
||||
#define RK3506_RING_LENGTH_SEL_OFFSET 0
|
||||
#define RK3506_RING_LENGTH_SEL_MASK 0x7f
|
||||
|
||||
static DEFINE_MUTEX(pvtpll_reg_mutex);
|
||||
|
||||
struct rockchip_clock_pvtpll;
|
||||
|
||||
struct pvtpll_table {
|
||||
unsigned int rate;
|
||||
u32 length;
|
||||
u32 length_frac;
|
||||
u32 ring_sel;
|
||||
};
|
||||
|
||||
struct rockchip_clock_pvtpll_info {
|
||||
unsigned int table_size;
|
||||
struct pvtpll_table *table;
|
||||
int (*config)(struct rockchip_clock_pvtpll *pvtpll,
|
||||
struct pvtpll_table *table);
|
||||
};
|
||||
|
||||
struct rockchip_clock_pvtpll {
|
||||
const struct rockchip_clock_pvtpll_info *info;
|
||||
struct regmap *regmap;
|
||||
struct clk_hw hw;
|
||||
struct clk *main_clk;
|
||||
struct clk *sclk;
|
||||
struct clk *pvtpll_clk;
|
||||
struct clk *pvtpll_out;
|
||||
struct notifier_block pvtpll_nb;
|
||||
unsigned long cur_rate;
|
||||
};
|
||||
|
||||
#define ROCKCHIP_PVTPLL(_rate, _sel, _len) \
|
||||
{ \
|
||||
.rate = _rate##U, \
|
||||
.ring_sel = _sel, \
|
||||
.length = _len, \
|
||||
}
|
||||
|
||||
static struct pvtpll_table rv1103b_core_pvtpll_table[] = {
|
||||
/* rate_hz, ring_sel, length */
|
||||
ROCKCHIP_PVTPLL(1608000000, 1, 6),
|
||||
ROCKCHIP_PVTPLL(1512000000, 1, 6),
|
||||
ROCKCHIP_PVTPLL(1416000000, 1, 6),
|
||||
ROCKCHIP_PVTPLL(1296000000, 1, 6),
|
||||
ROCKCHIP_PVTPLL(1200000000, 1, 14),
|
||||
ROCKCHIP_PVTPLL(1008000000, 1, 32),
|
||||
ROCKCHIP_PVTPLL(816000000, 1, 60),
|
||||
};
|
||||
|
||||
static struct pvtpll_table rv1103b_npu_pvtpll_table[] = {
|
||||
/* rate_hz, ring_se, length */
|
||||
ROCKCHIP_PVTPLL(1000000000, 1, 12),
|
||||
ROCKCHIP_PVTPLL(900000000, 1, 12),
|
||||
ROCKCHIP_PVTPLL(800000000, 1, 16),
|
||||
ROCKCHIP_PVTPLL(700000000, 1, 36),
|
||||
};
|
||||
|
||||
static struct pvtpll_table rk3506_core_pvtpll_table[] = {
|
||||
/* rate_hz, ring_sel, length */
|
||||
ROCKCHIP_PVTPLL(1608000000, 0, 6),
|
||||
ROCKCHIP_PVTPLL(1512000000, 0, 6),
|
||||
ROCKCHIP_PVTPLL(1416000000, 0, 6),
|
||||
ROCKCHIP_PVTPLL(1296000000, 0, 6),
|
||||
ROCKCHIP_PVTPLL(1200000000, 0, 8),
|
||||
ROCKCHIP_PVTPLL(1008000000, 0, 15),
|
||||
};
|
||||
|
||||
static struct pvtpll_table
|
||||
*rockchip_get_pvtpll_settings(struct rockchip_clock_pvtpll *pvtpll,
|
||||
unsigned long rate)
|
||||
{
|
||||
const struct rockchip_clock_pvtpll_info *info = pvtpll->info;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < info->table_size; i++) {
|
||||
if (rate == info->table[i].rate)
|
||||
return &info->table[i];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int rv1103b_pvtpll_configs(struct rockchip_clock_pvtpll *pvtpll,
|
||||
struct pvtpll_table *table)
|
||||
{
|
||||
u32 val;
|
||||
int ret = 0;
|
||||
|
||||
val = HIWORD_UPDATE(table->ring_sel, RV1103B_GCK_RING_SEL_MASK,
|
||||
RV1103B_GCK_RING_SEL_OFFSET);
|
||||
ret = regmap_write(pvtpll->regmap, RV1103B_PVTPLL_GCK_LEN, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
val = HIWORD_UPDATE(table->length, RV1103B_GCK_RING_LEN_SEL_MASK,
|
||||
RV1103B_GCK_RING_LEN_SEL_OFFSET);
|
||||
ret = regmap_write(pvtpll->regmap, RV1103B_PVTPLL_GCK_LEN, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_write(pvtpll->regmap, RV1103B_PVTPLL_GCK_CFG,
|
||||
RV1103B_GCK_EN | (RV1103B_GCK_EN << 16) |
|
||||
RV1103B_GCK_MODE | (RV1103B_GCK_MODE << 16));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_write(pvtpll->regmap, RV1103B_PVTPLL_GCK_CFG,
|
||||
RV1103B_GCK_START | (RV1103B_GCK_START << 16));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rk3506_pvtpll_configs(struct rockchip_clock_pvtpll *pvtpll,
|
||||
struct pvtpll_table *table)
|
||||
{
|
||||
u32 val;
|
||||
int ret = 0;
|
||||
|
||||
val = HIWORD_UPDATE(table->ring_sel, RK3506_OSC_RING_SEL_MASK,
|
||||
RK3506_OSC_RING_SEL_OFFSET);
|
||||
ret = regmap_write(pvtpll->regmap, RK3506_GRF_CORE_PVTPLL_CON0_L, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
val = HIWORD_UPDATE(table->length, RK3506_RING_LENGTH_SEL_MASK,
|
||||
RK3506_RING_LENGTH_SEL_OFFSET);
|
||||
ret = regmap_write(pvtpll->regmap, RK3506_GRF_CORE_PVTPLL_CON0_H, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_write(pvtpll->regmap, RK3506_GRF_CORE_PVTPLL_CON0_L,
|
||||
RK3506_START | (RK3506_START << 16) |
|
||||
RK3506_OSC_EN | (RK3506_OSC_EN << 16));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rockchip_clock_pvtpll_set_rate(struct clk_hw *hw,
|
||||
unsigned long rate,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct rockchip_clock_pvtpll *pvtpll;
|
||||
struct pvtpll_table *table;
|
||||
int ret = 0;
|
||||
|
||||
pvtpll = container_of(hw, struct rockchip_clock_pvtpll, hw);
|
||||
|
||||
if (!pvtpll)
|
||||
return 0;
|
||||
|
||||
table = rockchip_get_pvtpll_settings(pvtpll, rate);
|
||||
if (!table)
|
||||
return 0;
|
||||
|
||||
ret = pvtpll->info->config(pvtpll, table);
|
||||
|
||||
pvtpll->cur_rate = rate;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
rockchip_clock_pvtpll_recalc_rate(struct clk_hw *hw,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
struct rockchip_clock_pvtpll *pvtpll;
|
||||
|
||||
pvtpll = container_of(hw, struct rockchip_clock_pvtpll, hw);
|
||||
|
||||
if (!pvtpll)
|
||||
return 0;
|
||||
|
||||
return pvtpll->cur_rate;
|
||||
}
|
||||
|
||||
static long rockchip_clock_pvtpll_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *prate)
|
||||
{
|
||||
struct rockchip_clock_pvtpll *pvtpll;
|
||||
struct pvtpll_table *table;
|
||||
|
||||
pvtpll = container_of(hw, struct rockchip_clock_pvtpll, hw);
|
||||
|
||||
if (!pvtpll)
|
||||
return 0;
|
||||
|
||||
table = rockchip_get_pvtpll_settings(pvtpll, rate);
|
||||
if (!table)
|
||||
return 0;
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
static const struct clk_ops clock_pvtpll_ops = {
|
||||
.recalc_rate = rockchip_clock_pvtpll_recalc_rate,
|
||||
.round_rate = rockchip_clock_pvtpll_round_rate,
|
||||
.set_rate = rockchip_clock_pvtpll_set_rate,
|
||||
};
|
||||
|
||||
static int clock_pvtpll_regitstor(struct device *dev,
|
||||
struct rockchip_clock_pvtpll *pvtpll)
|
||||
{
|
||||
struct clk_init_data init = {};
|
||||
|
||||
init.parent_names = NULL;
|
||||
init.num_parents = 0;
|
||||
init.flags = CLK_GET_RATE_NOCACHE;
|
||||
init.name = "pvtpll";
|
||||
init.ops = &clock_pvtpll_ops;
|
||||
|
||||
pvtpll->hw.init = &init;
|
||||
|
||||
/* optional override of the clockname */
|
||||
of_property_read_string_index(dev->of_node, "clock-output-names",
|
||||
0, &init.name);
|
||||
pvtpll->pvtpll_out = devm_clk_register(dev, &pvtpll->hw);
|
||||
if (IS_ERR(pvtpll->pvtpll_out))
|
||||
return PTR_ERR(pvtpll->pvtpll_out);
|
||||
|
||||
return of_clk_add_provider(dev->of_node, of_clk_src_simple_get,
|
||||
pvtpll->pvtpll_out);
|
||||
}
|
||||
|
||||
static const struct rockchip_clock_pvtpll_info rv1103b_core_pvtpll_data = {
|
||||
.config = rv1103b_pvtpll_configs,
|
||||
.table_size = ARRAY_SIZE(rv1103b_core_pvtpll_table),
|
||||
.table = rv1103b_core_pvtpll_table,
|
||||
};
|
||||
|
||||
static const struct rockchip_clock_pvtpll_info rv1103b_npu_pvtpll_data = {
|
||||
.config = rv1103b_pvtpll_configs,
|
||||
.table_size = ARRAY_SIZE(rv1103b_npu_pvtpll_table),
|
||||
.table = rv1103b_npu_pvtpll_table,
|
||||
};
|
||||
|
||||
static const struct rockchip_clock_pvtpll_info rk3506_core_pvtpll_data = {
|
||||
.config = rk3506_pvtpll_configs,
|
||||
.table_size = ARRAY_SIZE(rk3506_core_pvtpll_table),
|
||||
.table = rk3506_core_pvtpll_table,
|
||||
};
|
||||
|
||||
static const struct of_device_id rockchip_clock_pvtpll_match[] = {
|
||||
{
|
||||
.compatible = "rockchip,rv1103b-core-pvtpll",
|
||||
.data = (void *)&rv1103b_core_pvtpll_data,
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rv1103b-npu-pvtpll",
|
||||
.data = (void *)&rv1103b_npu_pvtpll_data,
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,rk3506-core-pvtpll",
|
||||
.data = (void *)&rk3506_core_pvtpll_data,
|
||||
},
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, rockchip_clock_pvtpll_match);
|
||||
|
||||
static int rockchip_clock_pvtpll_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct rockchip_clock_pvtpll *pvtpll;
|
||||
int error = 0;
|
||||
|
||||
pvtpll = devm_kzalloc(dev, sizeof(*pvtpll), GFP_KERNEL);
|
||||
if (!pvtpll)
|
||||
return -ENOMEM;
|
||||
|
||||
pvtpll->info = (const struct rockchip_clock_pvtpll_info *)device_get_match_data(&pdev->dev);
|
||||
if (!pvtpll->info)
|
||||
return -EINVAL;
|
||||
|
||||
pvtpll->regmap = device_node_to_regmap(np);
|
||||
if (IS_ERR(pvtpll->regmap))
|
||||
return PTR_ERR(pvtpll->regmap);
|
||||
|
||||
platform_set_drvdata(pdev, pvtpll);
|
||||
|
||||
error = clock_pvtpll_regitstor(&pdev->dev, pvtpll);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "failed to register clock: %d\n",
|
||||
error);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static int rockchip_clock_pvtpll_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
||||
of_clk_del_provider(np);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver rockchip_clock_pvtpll_driver = {
|
||||
.driver = {
|
||||
.name = "rockchip-clcok-pvtpll",
|
||||
.of_match_table = rockchip_clock_pvtpll_match,
|
||||
},
|
||||
.probe = rockchip_clock_pvtpll_probe,
|
||||
.remove = rockchip_clock_pvtpll_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(rockchip_clock_pvtpll_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Rockchip Clock Pvtpll Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
895
drivers/clk/rockchip/clk-rk3506.c
Normal file
895
drivers/clk/rockchip/clk-rk3506.c
Normal file
@@ -0,0 +1,895 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2023 Rockchip Electronics Co. Ltd.
|
||||
* Author: Finley Xiao <finley.xiao@rock-chips.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <dt-bindings/clock/rockchip,rk3506-cru.h>
|
||||
#include "clk.h"
|
||||
|
||||
#define RK3506_GRF_SOC_STATUS 0x100
|
||||
|
||||
#define PVTPLL_SRC_SEL_PVTPLL (BIT(7) | BIT(23))
|
||||
|
||||
enum rk3506_plls {
|
||||
gpll, v0pll, v1pll,
|
||||
};
|
||||
|
||||
/*
|
||||
* [FRAC PLL]: GPLL, V0PLL, V1PLL
|
||||
* - VCO Frequency: 950MHz to 3800MHZ
|
||||
* - Output Frequency: 19MHz to 3800MHZ
|
||||
* - refdiv: 1 to 63 (Int Mode), 1 to 2 (Frac Mode)
|
||||
* - fbdiv: 16 to 3800 (Int Mode), 20 to 380 (Frac Mode)
|
||||
* - post1div: 1 to 7
|
||||
* - post2div: 1 to 7
|
||||
*/
|
||||
static struct rockchip_pll_rate_table rk3506_pll_rates[] = {
|
||||
/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
|
||||
RK3036_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1350000000, 4, 225, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1179648000, 1, 49, 1, 1, 0, 2550137),
|
||||
RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(1000000000, 3, 125, 1, 1, 1, 0),
|
||||
RK3036_PLL_RATE(993484800, 1, 41, 1, 1, 0, 6630355),
|
||||
RK3036_PLL_RATE(983040000, 1, 40, 1, 1, 0, 16106127),
|
||||
RK3036_PLL_RATE(960000000, 1, 80, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(903168000, 1, 75, 2, 1, 0, 4429185),
|
||||
RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(800000000, 3, 200, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(600000000, 1, 50, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0),
|
||||
RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
|
||||
RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
|
||||
RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
|
||||
RK3036_PLL_RATE(96000000, 1, 48, 6, 2, 1, 0),
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
#define RK3506_DIV_ACLK_CORE_MASK 0xf
|
||||
#define RK3506_DIV_ACLK_CORE_SHIFT 9
|
||||
#define RK3506_DIV_PCLK_CORE_MASK 0xf
|
||||
#define RK3506_DIV_PCLK_CORE_SHIFT 0
|
||||
|
||||
#define RK3506_CLKSEL15(_aclk_core_div) \
|
||||
{ \
|
||||
.reg = RK3506_CLKSEL_CON(15), \
|
||||
.val = HIWORD_UPDATE(_aclk_core_div, RK3506_DIV_ACLK_CORE_MASK, \
|
||||
RK3506_DIV_ACLK_CORE_SHIFT), \
|
||||
}
|
||||
|
||||
#define RK3506_CLKSEL16(_pclk_core_div) \
|
||||
{ \
|
||||
.reg = RK3506_CLKSEL_CON(16), \
|
||||
.val = HIWORD_UPDATE(_pclk_core_div, RK3506_DIV_PCLK_CORE_MASK, \
|
||||
RK3506_DIV_PCLK_CORE_SHIFT), \
|
||||
}
|
||||
|
||||
/* SIGN-OFF: aclk_core: 500M, pclk_core: 125M, */
|
||||
#define RK3506_CPUCLK_RATE(_prate, _aclk_core_div, _pclk_core_div) \
|
||||
{ \
|
||||
.prate = _prate, \
|
||||
.divs = { \
|
||||
RK3506_CLKSEL15(_aclk_core_div), \
|
||||
RK3506_CLKSEL16(_pclk_core_div), \
|
||||
}, \
|
||||
}
|
||||
|
||||
static struct rockchip_cpuclk_rate_table rk3506_cpuclk_rates[] __initdata = {
|
||||
RK3506_CPUCLK_RATE(1608000000, 3, 12),
|
||||
RK3506_CPUCLK_RATE(1512000000, 3, 12),
|
||||
RK3506_CPUCLK_RATE(1416000000, 2, 11),
|
||||
RK3506_CPUCLK_RATE(1296000000, 2, 10),
|
||||
RK3506_CPUCLK_RATE(1200000000, 2, 9),
|
||||
RK3506_CPUCLK_RATE(1179648000, 2, 9),
|
||||
RK3506_CPUCLK_RATE(1008000000, 1, 7),
|
||||
RK3506_CPUCLK_RATE(903168000, 1, 7),
|
||||
RK3506_CPUCLK_RATE(800000000, 1, 6),
|
||||
RK3506_CPUCLK_RATE(589824000, 1, 4),
|
||||
RK3506_CPUCLK_RATE(400000000, 1, 3),
|
||||
RK3506_CPUCLK_RATE(200000000, 1, 1),
|
||||
};
|
||||
|
||||
PNAME(mux_pll_p) = { "xin24m" };
|
||||
PNAME(gpll_v0pll_v1pll_parents_p) = { "gpll", "v0pll", "v1pll" };
|
||||
PNAME(gpll_v0pll_v1pll_g_parents_p) = { "clk_gpll_gate", "clk_v0pll_gate", "clk_v1pll_gate" };
|
||||
PNAME(gpll_v0pll_v1pll_div_parents_p) = { "clk_gpll_div", "clk_v0pll_div", "clk_v1pll_div" };
|
||||
PNAME(xin24m_gpll_v0pll_v1pll_g_parents_p) = { "xin24m", "clk_gpll_gate", "clk_v0pll_gate", "clk_v1pll_gate" };
|
||||
PNAME(xin24m_g_gpll_v0pll_v1pll_g_parents_p) = { "xin24m_gate", "clk_gpll_gate", "clk_v0pll_gate", "clk_v1pll_gate" };
|
||||
PNAME(xin24m_g_gpll_v0pll_v1pll_div_parents_p) = { "xin24m_gate", "clk_gpll_div", "clk_v0pll_div", "clk_v1pll_div" };
|
||||
PNAME(xin24m_400k_32k_parents_p) = { "xin24m", "clk_rc", "clk_32k" };
|
||||
PNAME(clk_frac_uart_matrix0_mux_parents_p) = { "xin24m", "gpll", "clk_v0pll_gate", "clk_v1pll_gate" };
|
||||
PNAME(clk_timer0_parents_p) = { "xin24m", "clk_gpll_div_100m", "clk_32k", "clk_core_pvtpll", "sai0_mclk_in", "sai0_sclk_in" };
|
||||
PNAME(clk_timer1_parents_p) = { "xin24m", "clk_gpll_div_100m", "clk_32k", "clk_core_pvtpll", "sai1_mclk_in", "sai1_sclk_in" };
|
||||
PNAME(clk_timer2_parents_p) = { "xin24m", "clk_gpll_div_100m", "clk_32k", "clk_core_pvtpll", "sai2_mclk_in", "sai2_sclk_in" };
|
||||
PNAME(clk_timer3_parents_p) = { "xin24m", "clk_gpll_div_100m", "clk_32k", "clk_core_pvtpll", "sai3_mclk_in", "sai3_sclk_in" };
|
||||
PNAME(clk_timer4_parents_p) = { "xin24m", "clk_gpll_div_100m", "clk_32k", "clk_core_pvtpll", "mclk_asrc0" };
|
||||
PNAME(clk_timer5_parents_p) = { "xin24m", "clk_gpll_div_100m", "clk_32k", "clk_core_pvtpll", "mclk_asrc1" };
|
||||
PNAME(sclk_uart_parents_p) = { "xin24m", "clk_gpll_gate", "clk_v0pll_gate", "clk_frac_uart_matrix0", "clk_frac_uart_matrix1",
|
||||
"clk_frac_common_matrix0", "clk_frac_common_matrix1", "clk_frac_common_matrix2" };
|
||||
PNAME(clk_mac_ptp_root_parents_p) = { "gpll", "v0pll", "v1pll" };
|
||||
PNAME(clk_pwm_parents_p) = { "clk_rc", "sai0_mclk_in", "sai1_mclk_in", "sai2_mclk_in", "sai3_mclk_in", "sai0_sclk_in", "sai1_sclk_in",
|
||||
"sai2_sclk_in", "sai3_sclk_in", "mclk_asrc0", "mclk_asrc1" };
|
||||
PNAME(clk_can_parents_p) = { "xin24m", "gpll", "clk_v0pll_gate", "clk_v1pll_gate", "clk_frac_voice_matrix1",
|
||||
"clk_frac_common_matrix0", "clk_frac_common_matrix1", "clk_frac_common_matrix2" };
|
||||
PNAME(clk_pdm_parents_p) = { "xin24m_gate", "clk_int_voice_matrix0", "clk_int_voice_matrix1", "clk_int_voice_matrix2",
|
||||
"clk_frac_voice_matrix0", "clk_frac_voice_matrix1", "clk_frac_common_matrix0", "clk_frac_common_matrix1",
|
||||
"clk_frac_common_matrix2", "sai0_mclk_in", "sai1_mclk_in", "sai2_mclk_in", "sai3_mclk_in", "clk_gpll_div" };
|
||||
PNAME(mclk_sai_asrc_parents_p) = { "xin24m_gate", "clk_int_voice_matrix0", "clk_int_voice_matrix1", "clk_int_voice_matrix2",
|
||||
"clk_frac_voice_matrix0", "clk_frac_voice_matrix1", "clk_frac_common_matrix0", "clk_frac_common_matrix1",
|
||||
"clk_frac_common_matrix2", "sai0_mclk_in", "sai1_mclk_in", "sai2_mclk_in", "sai3_mclk_in" };
|
||||
PNAME(lrck_asrc_parents_p) = { "mclk_asrc0", "mclk_asrc1", "mclk_asrc2", "mclk_asrc3", "mclk_spdiftx", "clk_spdifrx_to_asrc", "clkout_pdm",
|
||||
"sai0_fs", "sai1_fs", "sai2_fs", "sai3_fs", "sai4_fs" };
|
||||
PNAME(cclk_src_sdmmc_parents_p) = { "xin24m_gate", "gpll", "clk_v0pll_gate", "clk_v1pll_gate" };
|
||||
PNAME(dclk_vop_parents_p) = { "xin24m_gate", "clk_gpll_gate", "clk_v0pll_gate", "clk_v1pll_gate", "clk_frac_voice_matrix1",
|
||||
"clk_frac_common_matrix0", "clk_frac_common_matrix1", "clk_frac_common_matrix2" };
|
||||
PNAME(dbclk_gpio0_parents_p) = { "xin24m", "clk_rc", "clk_32k_pmu" };
|
||||
PNAME(clk_pmu_hp_timer_parents_p) = { "xin24m", "gpll_div_100m", "clk_core_pvtpll" };
|
||||
PNAME(clk_ref_out_parents_p) = { "xin24m", "gpll", "v0pll", "v1pll" };
|
||||
PNAME(clk_32k_frac_parents_p) = { "xin24m", "v0pll", "v1pll", "clk_rc" };
|
||||
PNAME(clk_32k_parents_p) = { "xin32k", "clk_32k_rc", "clk_32k_frac" };
|
||||
PNAME(clk_ref_phy_pmu_mux_parents_p) = { "xin24m", "clk_ref_phy_pll" };
|
||||
PNAME(clk_vpll_ref_parents_p) = { "xin24m", "clk_pll_ref_io" };
|
||||
PNAME(mux_armclk_p) = { "armclk_pll", "clk_core_pvtpll" };
|
||||
|
||||
#define MFLAGS CLK_MUX_HIWORD_MASK
|
||||
#define DFLAGS CLK_DIVIDER_HIWORD_MASK
|
||||
#define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE)
|
||||
|
||||
static struct rockchip_pll_clock rk3506_pll_clks[] __initdata = {
|
||||
[gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p,
|
||||
CLK_IS_CRITICAL, RK3506_PLL_CON(0),
|
||||
RK3506_MODE_CON, 0, 2, 0, rk3506_pll_rates),
|
||||
[v0pll] = PLL(pll_rk3328, PLL_V0PLL, "v0pll", mux_pll_p,
|
||||
CLK_IS_CRITICAL, RK3506_PLL_CON(8),
|
||||
RK3506_MODE_CON, 2, 0, 0, rk3506_pll_rates),
|
||||
[v1pll] = PLL(pll_rk3328, PLL_V1PLL, "v1pll", mux_pll_p,
|
||||
CLK_IS_CRITICAL, RK3506_PLL_CON(16),
|
||||
RK3506_MODE_CON, 4, 1, 0, rk3506_pll_rates),
|
||||
};
|
||||
|
||||
static struct rockchip_clk_branch rk3506_armclk __initdata =
|
||||
MUX(ARMCLK, "armclk", mux_armclk_p, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
|
||||
RK3506_CLKSEL_CON(15), 8, 1, MFLAGS);
|
||||
|
||||
static struct rockchip_clk_branch rk3506_clk_branches[] __initdata = {
|
||||
/*
|
||||
* CRU Clock-Architecture
|
||||
*/
|
||||
/* top */
|
||||
GATE(XIN24M_GATE, "xin24m_gate", "xin24m", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(0), 1, GFLAGS),
|
||||
GATE(CLK_GPLL_GATE, "clk_gpll_gate", "gpll", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(0), 2, GFLAGS),
|
||||
GATE(CLK_V0PLL_GATE, "clk_v0pll_gate", "v0pll", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(0), 3, GFLAGS),
|
||||
GATE(CLK_V1PLL_GATE, "clk_v1pll_gate", "v1pll", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(0), 4, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_GPLL_DIV, "clk_gpll_div", "clk_gpll_gate", CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(0), 6, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 5, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_GPLL_DIV_100M, "clk_gpll_div_100m", "clk_gpll_div", 0,
|
||||
RK3506_CLKSEL_CON(0), 10, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 6, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_V0PLL_DIV, "clk_v0pll_div", "clk_v0pll_gate", CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(1), 0, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 7, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_V1PLL_DIV, "clk_v1pll_div", "clk_v1pll_gate", CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(1), 4, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 8, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_INT_VOICE_MATRIX0, "clk_int_voice_matrix0", "clk_v0pll_gate", 0,
|
||||
RK3506_CLKSEL_CON(1), 8, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 9, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_INT_VOICE_MATRIX1, "clk_int_voice_matrix1", "clk_v1pll_gate", 0,
|
||||
RK3506_CLKSEL_CON(2), 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 10, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_INT_VOICE_MATRIX2, "clk_int_voice_matrix2", "clk_v0pll_gate", 0,
|
||||
RK3506_CLKSEL_CON(2), 5, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(0), 11, GFLAGS),
|
||||
MUX(CLK_FRAC_UART_MATRIX0_MUX, "clk_frac_uart_matrix0_mux", clk_frac_uart_matrix0_mux_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(3), 9, 2, MFLAGS),
|
||||
MUX(CLK_FRAC_UART_MATRIX1_MUX, "clk_frac_uart_matrix1_mux", xin24m_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(3), 11, 2, MFLAGS),
|
||||
MUX(CLK_FRAC_VOICE_MATRIX0_MUX, "clk_frac_voice_matrix0_mux", xin24m_g_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(3), 13, 2, MFLAGS),
|
||||
MUX(CLK_FRAC_VOICE_MATRIX1_MUX, "clk_frac_voice_matrix1_mux", xin24m_g_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(4), 0, 2, MFLAGS),
|
||||
MUX(CLK_FRAC_COMMON_MATRIX0_MUX, "clk_frac_common_matrix0_mux", xin24m_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(4), 2, 2, MFLAGS),
|
||||
MUX(CLK_FRAC_COMMON_MATRIX1_MUX, "clk_frac_common_matrix1_mux", xin24m_g_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(4), 4, 2, MFLAGS),
|
||||
MUX(CLK_FRAC_COMMON_MATRIX2_MUX, "clk_frac_common_matrix2_mux", xin24m_g_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(4), 6, 2, MFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_UART_MATRIX0, "clk_frac_uart_matrix0", "clk_frac_uart_matrix0_mux", 0,
|
||||
RK3506_CLKSEL_CON(5), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(0), 13, GFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_UART_MATRIX1, "clk_frac_uart_matrix1", "clk_frac_uart_matrix1_mux", 0,
|
||||
RK3506_CLKSEL_CON(6), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(0), 14, GFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_VOICE_MATRIX0, "clk_frac_voice_matrix0", "clk_frac_voice_matrix0_mux", 0,
|
||||
RK3506_CLKSEL_CON(7), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(0), 15, GFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_VOICE_MATRIX1, "clk_frac_voice_matrix1", "clk_frac_voice_matrix1_mux", 0,
|
||||
RK3506_CLKSEL_CON(9), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(1), 0, GFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_COMMON_MATRIX0, "clk_frac_common_matrix0", "clk_frac_common_matrix0_mux", 0,
|
||||
RK3506_CLKSEL_CON(11), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(1), 1, GFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_COMMON_MATRIX1, "clk_frac_common_matrix1", "clk_frac_common_matrix1_mux", 0,
|
||||
RK3506_CLKSEL_CON(12), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(1), 2, GFLAGS),
|
||||
COMPOSITE_FRAC(CLK_FRAC_COMMON_MATRIX2, "clk_frac_common_matrix2", "clk_frac_common_matrix2_mux", 0,
|
||||
RK3506_CLKSEL_CON(13), CLK_FRAC_DIVIDER_NO_LIMIT,
|
||||
RK3506_CLKGATE_CON(1), 3, GFLAGS),
|
||||
GATE(CLK_REF_USBPHY_TOP, "clk_ref_usbphy_top", "xin24m", 0,
|
||||
RK3506_CLKGATE_CON(1), 4, GFLAGS),
|
||||
GATE(CLK_REF_DPHY_TOP, "clk_ref_dphy_top", "xin24m", 0,
|
||||
RK3506_CLKGATE_CON(1), 5, GFLAGS),
|
||||
|
||||
/* core */
|
||||
COMPOSITE_NOGATE(0, "armclk_pll", gpll_v0pll_v1pll_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(15), 5, 2, MFLAGS, 0, 5, DFLAGS),
|
||||
COMPOSITE_NOMUX(ACLK_CORE_ROOT, "aclk_core_root", "armclk", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKSEL_CON(15), 9, 4, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
||||
RK3506_CLKGATE_CON(2), 11, GFLAGS),
|
||||
COMPOSITE_NOMUX(PCLK_CORE_ROOT, "pclk_core_root", "armclk", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKSEL_CON(16), 0, 4, DFLAGS | CLK_DIVIDER_READ_ONLY,
|
||||
RK3506_CLKGATE_CON(2), 12, GFLAGS),
|
||||
GATE(PCLK_DBG, "pclk_dbg", "pclk_core_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(3), 1, GFLAGS),
|
||||
GATE(PCLK_CORE_GRF, "pclk_core_grf", "pclk_core_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(3), 4, GFLAGS),
|
||||
GATE(PCLK_CORE_CRU, "pclk_core_cru", "pclk_core_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(3), 5, GFLAGS),
|
||||
GATE(CLK_CORE_EMA_DETECT, "clk_core_ema_detect", "xin24m_gate", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(3), 6, GFLAGS),
|
||||
GATE(PCLK_GPIO1, "pclk_gpio1", "aclk_core_root", 0,
|
||||
RK3506_CLKGATE_CON(3), 8, GFLAGS),
|
||||
GATE(DBCLK_GPIO1, "dbclk_gpio1", "xin24m_gate", 0,
|
||||
RK3506_CLKGATE_CON(3), 9, GFLAGS),
|
||||
|
||||
/* core peri */
|
||||
COMPOSITE(ACLK_CORE_PERI_ROOT, "aclk_core_peri_root", gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(18), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(4), 0, GFLAGS),
|
||||
GATE(HCLK_CORE_PERI_ROOT, "hclk_core_peri_root", "aclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 1, GFLAGS),
|
||||
GATE(PCLK_CORE_PERI_ROOT, "pclk_core_peri_root", "aclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 2, GFLAGS),
|
||||
COMPOSITE(CLK_DSMC, "clk_dsmc", xin24m_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(18), 12, 2, MFLAGS, 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(4), 4, GFLAGS),
|
||||
GATE(ACLK_DSMC, "aclk_dsmc", "aclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 5, GFLAGS),
|
||||
GATE(PCLK_DSMC, "pclk_dsmc", "pclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 6, GFLAGS),
|
||||
COMPOSITE(CLK_FLEXBUS_TX, "clk_flexbus_tx", xin24m_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(19), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(4), 7, GFLAGS),
|
||||
COMPOSITE(CLK_FLEXBUS_RX, "clk_flexbus_rx", xin24m_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(19), 12, 2, MFLAGS, 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(4), 8, GFLAGS),
|
||||
GATE(ACLK_FLEXBUS, "aclk_flexbus", "aclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 9, GFLAGS),
|
||||
GATE(HCLK_FLEXBUS, "hclk_flexbus", "hclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 10, GFLAGS),
|
||||
GATE(ACLK_DSMC_SLV, "aclk_dsmc_slv", "aclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 11, GFLAGS),
|
||||
GATE(HCLK_DSMC_SLV, "hclk_dsmc_slv", "hclk_core_peri_root", 0,
|
||||
RK3506_CLKGATE_CON(4), 12, GFLAGS),
|
||||
|
||||
/* bus */
|
||||
COMPOSITE(ACLK_BUS_ROOT, "aclk_bus_root", gpll_v0pll_v1pll_div_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(21), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(5), 0, GFLAGS),
|
||||
COMPOSITE(HCLK_BUS_ROOT, "hclk_bus_root", gpll_v0pll_v1pll_div_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(21), 12, 2, MFLAGS, 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(5), 1, GFLAGS),
|
||||
COMPOSITE(PCLK_BUS_ROOT, "pclk_bus_root", gpll_v0pll_v1pll_div_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(22), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(5), 2, GFLAGS),
|
||||
GATE(ACLK_SYSRAM, "aclk_sysram", "aclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(5), 6, GFLAGS),
|
||||
GATE(HCLK_SYSRAM, "hclk_sysram", "aclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(5), 7, GFLAGS),
|
||||
GATE(ACLK_DMAC0, "aclk_dmac0", "aclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(5), 8, GFLAGS),
|
||||
GATE(ACLK_DMAC1, "aclk_dmac1", "aclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(5), 9, GFLAGS),
|
||||
GATE(HCLK_M0, "hclk_m0", "aclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(5), 10, GFLAGS),
|
||||
GATE(ACLK_CRYPTO_NS, "aclk_crypto_ns", "aclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(5), 14, GFLAGS),
|
||||
GATE(HCLK_CRYPTO_NS, "hclk_crypto_ns", "hclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(5), 15, GFLAGS),
|
||||
GATE(HCLK_RNG, "hclk_rng", "hclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 0, GFLAGS),
|
||||
GATE(PCLK_BUS_GRF, "pclk_bus_grf", "pclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(6), 1, GFLAGS),
|
||||
GATE(PCLK_TIMER, "pclk_timer", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 2, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_TIMER0_CH0, "clk_timer0_ch0", clk_timer0_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(22), 7, 3, MFLAGS,
|
||||
RK3506_CLKGATE_CON(6), 3, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_TIMER0_CH1, "clk_timer0_ch1", clk_timer1_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(22), 10, 3, MFLAGS,
|
||||
RK3506_CLKGATE_CON(6), 4, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_TIMER0_CH2, "clk_timer0_ch2", clk_timer2_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(22), 13, 3, MFLAGS,
|
||||
RK3506_CLKGATE_CON(6), 5, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_TIMER0_CH3, "clk_timer0_ch3", clk_timer3_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(23), 0, 3, MFLAGS,
|
||||
RK3506_CLKGATE_CON(6), 6, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_TIMER0_CH4, "clk_timer0_ch4", clk_timer4_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(23), 3, 3, MFLAGS,
|
||||
RK3506_CLKGATE_CON(6), 7, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_TIMER0_CH5, "clk_timer0_ch5", clk_timer5_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(23), 6, 3, MFLAGS,
|
||||
RK3506_CLKGATE_CON(6), 8, GFLAGS),
|
||||
GATE(PCLK_WDT0, "pclk_wdt0", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 9, GFLAGS),
|
||||
GATE(TCLK_WDT0, "tclk_wdt0", "xin24m_gate", 0,
|
||||
RK3506_CLKGATE_CON(6), 10, GFLAGS),
|
||||
GATE(PCLK_WDT1, "pclk_wdt1", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 11, GFLAGS),
|
||||
GATE(TCLK_WDT1, "tclk_wdt1", "xin24m_gate", 0,
|
||||
RK3506_CLKGATE_CON(6), 12, GFLAGS),
|
||||
GATE(PCLK_MAILBOX, "pclk_mailbox", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 13, GFLAGS),
|
||||
GATE(PCLK_INTMUX, "pclk_intmux", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 14, GFLAGS),
|
||||
GATE(PCLK_SPINLOCK, "pclk_spinlock", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(6), 15, GFLAGS),
|
||||
GATE(PCLK_DDRC, "pclk_ddrc", "pclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(7), 0, GFLAGS),
|
||||
GATE(HCLK_DDRPHY, "hclk_ddrphy", "hclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(7), 1, GFLAGS),
|
||||
GATE(PCLK_DDRMON, "pclk_ddrmon", "pclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(7), 2, GFLAGS),
|
||||
GATE(CLK_DDRMON_OSC, "clk_ddrmon_osc", "xin24m_gate", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(7), 3, GFLAGS),
|
||||
GATE(PCLK_STDBY, "pclk_stdby", "pclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(7), 4, GFLAGS),
|
||||
GATE(HCLK_USBOTG0, "hclk_usbotg0", "hclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(7), 5, GFLAGS),
|
||||
GATE(HCLK_USBOTG0_PMU, "hclk_usbotg0_pmu", "hclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(7), 6, GFLAGS),
|
||||
GATE(CLK_USBOTG0_ADP, "clk_usbotg0_adp", "clk_32k", 0,
|
||||
RK3506_CLKGATE_CON(7), 7, GFLAGS),
|
||||
GATE(HCLK_USBOTG1, "hclk_usbotg1", "hclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(7), 8, GFLAGS),
|
||||
GATE(HCLK_USBOTG1_PMU, "hclk_usbotg1_pmu", "hclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(7), 9, GFLAGS),
|
||||
GATE(CLK_USBOTG1_ADP, "clk_usbotg1_adp", "clk_32k", 0,
|
||||
RK3506_CLKGATE_CON(7), 10, GFLAGS),
|
||||
GATE(PCLK_USBPHY, "pclk_usbphy", "pclk_bus_root", 0,
|
||||
RK3506_CLKGATE_CON(7), 11, GFLAGS),
|
||||
GATE(ACLK_DMA2DDR, "aclk_dma2ddr", "aclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(8), 0, GFLAGS),
|
||||
GATE(PCLK_DMA2DDR, "pclk_dma2ddr", "pclk_bus_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(8), 1, GFLAGS),
|
||||
COMPOSITE_NOMUX(STCLK_M0, "stclk_m0", "xin24m_gate", 0,
|
||||
RK3506_CLKSEL_CON(23), 9, 6, DFLAGS,
|
||||
RK3506_CLKGATE_CON(8), 2, GFLAGS),
|
||||
COMPOSITE(CLK_DDRPHY, "clk_ddrphy", gpll_v0pll_v1pll_parents_p, CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKSEL_CON(4), 4, 2, MFLAGS, 0, 4, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 10, GFLAGS),
|
||||
FACTOR(CLK_DDRC_SRC, "clk_ddrc_src", "clk_ddrphy", 0, 1, 4),
|
||||
GATE(ACLK_DDRC_0, "aclk_ddrc_0", "clk_ddrc_src", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(10), 0, GFLAGS),
|
||||
GATE(ACLK_DDRC_1, "aclk_ddrc_1", "clk_ddrc_src", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(10), 1, GFLAGS),
|
||||
GATE(CLK_DDRC, "clk_ddrc", "clk_ddrc_src", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(10), 3, GFLAGS),
|
||||
GATE(CLK_DDRMON, "clk_ddrmon", "clk_ddrc_src", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(10), 4, GFLAGS),
|
||||
|
||||
/* ls peri */
|
||||
COMPOSITE(HCLK_LSPERI_ROOT, "hclk_lsperi_root", gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(29), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 0, GFLAGS),
|
||||
GATE(PCLK_LSPERI_ROOT, "pclk_lsperi_root", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 1, GFLAGS),
|
||||
GATE(PCLK_UART0, "pclk_uart0", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 4, GFLAGS),
|
||||
GATE(PCLK_UART1, "pclk_uart1", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 5, GFLAGS),
|
||||
GATE(PCLK_UART2, "pclk_uart2", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 6, GFLAGS),
|
||||
GATE(PCLK_UART3, "pclk_uart3", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 7, GFLAGS),
|
||||
GATE(PCLK_UART4, "pclk_uart4", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 8, GFLAGS),
|
||||
COMPOSITE(SCLK_UART0, "sclk_uart0", sclk_uart_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(29), 12, 3, MFLAGS, 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 9, GFLAGS),
|
||||
COMPOSITE(SCLK_UART1, "sclk_uart1", sclk_uart_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(30), 5, 3, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 10, GFLAGS),
|
||||
COMPOSITE(SCLK_UART2, "sclk_uart2", sclk_uart_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(30), 13, 3, MFLAGS, 8, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 11, GFLAGS),
|
||||
COMPOSITE(SCLK_UART3, "sclk_uart3", sclk_uart_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(31), 5, 3, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 12, GFLAGS),
|
||||
COMPOSITE(SCLK_UART4, "sclk_uart4", sclk_uart_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(31), 13, 3, MFLAGS, 8, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 13, GFLAGS),
|
||||
GATE(PCLK_I2C0, "pclk_i2c0", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(11), 14, GFLAGS),
|
||||
COMPOSITE(CLK_I2C0, "clk_i2c0", xin24m_g_gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(32), 4, 2, MFLAGS, 0, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(11), 15, GFLAGS),
|
||||
GATE(PCLK_I2C1, "pclk_i2c1", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(12), 0, GFLAGS),
|
||||
COMPOSITE(CLK_I2C1, "clk_i2c1", xin24m_g_gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(32), 10, 2, MFLAGS, 6, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 1, GFLAGS),
|
||||
GATE(PCLK_I2C2, "pclk_i2c2", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(12), 2, GFLAGS),
|
||||
COMPOSITE(CLK_I2C2, "clk_i2c2", xin24m_g_gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(33), 4, 2, MFLAGS, 0, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 3, GFLAGS),
|
||||
GATE(PCLK_PWM1, "pclk_pwm1", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(12), 4, GFLAGS),
|
||||
COMPOSITE(CLK_PWM1, "clk_pwm1", gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(33), 10, 2, MFLAGS, 6, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 5, GFLAGS),
|
||||
GATE(CLK_OSC_PWM1, "clk_osc_pwm1", "xin24m", 0,
|
||||
RK3506_CLKGATE_CON(12), 6, GFLAGS),
|
||||
GATE(CLK_RC_PWM1, "clk_rc_pwm1", "clk_rc", 0,
|
||||
RK3506_CLKGATE_CON(12), 7, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_FREQ_PWM1, "clk_freq_pwm1", clk_pwm_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(33), 12, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 8, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_COUNTER_PWM1, "clk_counter_pwm1", clk_pwm_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(34), 0, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 9, GFLAGS),
|
||||
GATE(PCLK_SPI0, "pclk_spi0", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(12), 10, GFLAGS),
|
||||
COMPOSITE(CLK_SPI0, "clk_spi0", xin24m_g_gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(34), 8, 2, MFLAGS, 4, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 11, GFLAGS),
|
||||
GATE(PCLK_SPI1, "pclk_spi1", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(12), 12, GFLAGS),
|
||||
COMPOSITE(CLK_SPI1, "clk_spi1", xin24m_g_gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(34), 14, 2, MFLAGS, 10, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 13, GFLAGS),
|
||||
GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(12), 14, GFLAGS),
|
||||
COMPOSITE_NODIV(DBCLK_GPIO2, "dbclk_gpio2", xin24m_400k_32k_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(35), 0, 2, MFLAGS,
|
||||
RK3506_CLKGATE_CON(12), 15, GFLAGS),
|
||||
GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 0, GFLAGS),
|
||||
COMPOSITE_NODIV(DBCLK_GPIO3, "dbclk_gpio3", xin24m_400k_32k_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(35), 2, 2, MFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 1, GFLAGS),
|
||||
GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 2, GFLAGS),
|
||||
COMPOSITE_NODIV(DBCLK_GPIO4, "dbclk_gpio4", xin24m_400k_32k_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(35), 4, 2, MFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 3, GFLAGS),
|
||||
GATE(HCLK_CAN0, "hclk_can0", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 4, GFLAGS),
|
||||
COMPOSITE(CLK_CAN0, "clk_can0", clk_can_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(35), 11, 3, MFLAGS, 6, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 5, GFLAGS),
|
||||
GATE(HCLK_CAN1, "hclk_can1", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 6, GFLAGS),
|
||||
COMPOSITE(CLK_CAN1, "clk_can1", clk_can_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(36), 5, 3, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 7, GFLAGS),
|
||||
GATE(HCLK_PDM, "hclk_pdm", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 8, GFLAGS),
|
||||
COMPOSITE(MCLK_PDM, "mclk_pdm", clk_pdm_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(37), 5, 4, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 9, GFLAGS),
|
||||
COMPOSITE(CLKOUT_PDM, "clkout_pdm", clk_pdm_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(38), 10, 4, MFLAGS, 0, 10, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 10, GFLAGS),
|
||||
COMPOSITE(MCLK_SPDIFTX, "mclk_spdiftx", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(39), 5, 4, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 11, GFLAGS),
|
||||
GATE(HCLK_SPDIFTX, "hclk_spdiftx", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 12, GFLAGS),
|
||||
GATE(HCLK_SPDIFRX, "hclk_spdifrx", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(13), 13, GFLAGS),
|
||||
COMPOSITE(MCLK_SPDIFRX, "mclk_spdifrx", gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(39), 14, 2, MFLAGS, 9, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 14, GFLAGS),
|
||||
COMPOSITE(MCLK_SAI0, "mclk_sai0", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(40), 8, 4, MFLAGS, 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(13), 15, GFLAGS),
|
||||
GATE(HCLK_SAI0, "hclk_sai0", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(14), 0, GFLAGS),
|
||||
GATE(MCLK_OUT_SAI0, "mclk_out_sai0", "mclk_sai0", 0,
|
||||
RK3506_CLKGATE_CON(14), 1, GFLAGS),
|
||||
COMPOSITE(MCLK_SAI1, "mclk_sai1", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(41), 8, 4, MFLAGS, 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(14), 2, GFLAGS),
|
||||
GATE(HCLK_SAI1, "hclk_sai1", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(14), 3, GFLAGS),
|
||||
GATE(MCLK_OUT_SAI1, "mclk_out_sai1", "mclk_sai1", 0,
|
||||
RK3506_CLKGATE_CON(14), 4, GFLAGS),
|
||||
GATE(HCLK_ASRC0, "hclk_asrc0", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(14), 5, GFLAGS),
|
||||
COMPOSITE(CLK_ASRC0, "clk_asrc0", gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(42), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(14), 6, GFLAGS),
|
||||
GATE(HCLK_ASRC1, "hclk_asrc1", "hclk_lsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(14), 7, GFLAGS),
|
||||
COMPOSITE(CLK_ASRC1, "clk_asrc1", gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(42), 12, 2, MFLAGS, 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(14), 8, GFLAGS),
|
||||
GATE(PCLK_CRU, "pclk_cru", "pclk_lsperi_root", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(14), 9, GFLAGS),
|
||||
GATE(PCLK_PMU_ROOT, "pclk_pmu_root", "pclk_lsperi_root", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(14), 10, GFLAGS),
|
||||
COMPOSITE_NODIV(MCLK_ASRC0, "mclk_asrc0", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(46), 0, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 0, GFLAGS),
|
||||
COMPOSITE_NODIV(MCLK_ASRC1, "mclk_asrc1", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(46), 4, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 1, GFLAGS),
|
||||
COMPOSITE_NODIV(MCLK_ASRC2, "mclk_asrc2", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(46), 8, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 2, GFLAGS),
|
||||
COMPOSITE_NODIV(MCLK_ASRC3, "mclk_asrc3", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(46), 12, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 3, GFLAGS),
|
||||
COMPOSITE_NODIV(LRCK_ASRC0_SRC, "lrck_asrc0_src", lrck_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(47), 0, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 4, GFLAGS),
|
||||
COMPOSITE_NODIV(LRCK_ASRC0_DST, "lrck_asrc0_dst", lrck_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(47), 4, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 5, GFLAGS),
|
||||
COMPOSITE_NODIV(LRCK_ASRC1_SRC, "lrck_asrc1_src", lrck_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(47), 8, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 6, GFLAGS),
|
||||
COMPOSITE_NODIV(LRCK_ASRC1_DST, "lrck_asrc1_dst", lrck_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(47), 12, 4, MFLAGS,
|
||||
RK3506_CLKGATE_CON(16), 7, GFLAGS),
|
||||
|
||||
/* hs peri */
|
||||
COMPOSITE(ACLK_HSPERI_ROOT, "aclk_hsperi_root", gpll_v0pll_v1pll_div_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_CLKSEL_CON(49), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(17), 0, GFLAGS),
|
||||
GATE(HCLK_HSPERI_ROOT, "hclk_hsperi_root", "aclk_hsperi_root", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(17), 1, GFLAGS),
|
||||
GATE(PCLK_HSPERI_ROOT, "pclk_hsperi_root", "hclk_hsperi_root", CLK_IS_CRITICAL,
|
||||
RK3506_CLKGATE_CON(17), 2, GFLAGS),
|
||||
COMPOSITE(CCLK_SRC_SDMMC, "cclk_src_sdmmc", cclk_src_sdmmc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(49), 13, 2, MFLAGS, 7, 6, DFLAGS,
|
||||
RK3506_CLKGATE_CON(17), 6, GFLAGS),
|
||||
GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 7, GFLAGS),
|
||||
GATE(HCLK_FSPI, "hclk_fspi", "hclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 8, GFLAGS),
|
||||
COMPOSITE(SCLK_FSPI, "sclk_fspi", xin24m_g_gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(50), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(17), 9, GFLAGS),
|
||||
GATE(PCLK_SPI2, "pclk_spi2", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 10, GFLAGS),
|
||||
GATE(ACLK_MAC0, "aclk_mac0", "aclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 11, GFLAGS),
|
||||
GATE(ACLK_MAC1, "aclk_mac1", "aclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 12, GFLAGS),
|
||||
GATE(PCLK_MAC0, "pclk_mac0", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 13, GFLAGS),
|
||||
GATE(PCLK_MAC1, "pclk_mac1", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(17), 14, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_MAC_ROOT, "clk_mac_root", "gpll", 0,
|
||||
RK3506_CLKSEL_CON(50), 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(17), 15, GFLAGS),
|
||||
GATE(CLK_MAC0, "clk_mac0", "clk_mac_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 0, GFLAGS),
|
||||
GATE(CLK_MAC1, "clk_mac1", "clk_mac_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 1, GFLAGS),
|
||||
COMPOSITE(MCLK_SAI2, "mclk_sai2", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(51), 8, 4, MFLAGS, 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(18), 2, GFLAGS),
|
||||
GATE(HCLK_SAI2, "hclk_sai2", "hclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 3, GFLAGS),
|
||||
GATE(MCLK_OUT_SAI2, "mclk_out_sai2", "mclk_sai2", 0,
|
||||
RK3506_CLKGATE_CON(18), 4, GFLAGS),
|
||||
COMPOSITE(MCLK_SAI3_SRC, "mclk_sai3_src", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(52), 8, 4, MFLAGS, 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(18), 5, GFLAGS),
|
||||
GATE(HCLK_SAI3, "hclk_sai3", "hclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 6, GFLAGS),
|
||||
GATE(MCLK_SAI3, "mclk_sai3", "mclk_sai3_src", 0,
|
||||
RK3506_CLKGATE_CON(18), 7, GFLAGS),
|
||||
GATE(MCLK_OUT_SAI3, "mclk_out_sai3", "mclk_sai3_src", 0,
|
||||
RK3506_CLKGATE_CON(18), 8, GFLAGS),
|
||||
COMPOSITE(MCLK_SAI4_SRC, "mclk_sai4_src", mclk_sai_asrc_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(53), 8, 4, MFLAGS, 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(18), 9, GFLAGS),
|
||||
GATE(HCLK_SAI4, "hclk_sai4", "hclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 10, GFLAGS),
|
||||
GATE(MCLK_SAI4, "mclk_sai4", "mclk_sai4_src", 0,
|
||||
RK3506_CLKGATE_CON(18), 11, GFLAGS),
|
||||
GATE(HCLK_DSM, "hclk_dsm", "hclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 12, GFLAGS),
|
||||
GATE(MCLK_DSM, "mclk_dsm", "mclk_sai3_src", 0,
|
||||
RK3506_CLKGATE_CON(18), 13, GFLAGS),
|
||||
GATE(PCLK_AUDIO_ADC, "pclk_audio_adc", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(18), 14, GFLAGS),
|
||||
GATE(MCLK_AUDIO_ADC, "mclk_audio_adc", "mclk_sai4_src", 0,
|
||||
RK3506_CLKGATE_CON(18), 15, GFLAGS),
|
||||
FACTOR(MCLK_AUDIO_ADC_DIV4, "mclk_audio_adc_div4", "mclk_audio_adc", 0, 1, 4),
|
||||
GATE(PCLK_SARADC, "pclk_saradc", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(19), 0, GFLAGS),
|
||||
COMPOSITE(CLK_SARADC, "clk_saradc", xin24m_400k_32k_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(54), 4, 2, MFLAGS, 0, 4, DFLAGS,
|
||||
RK3506_CLKGATE_CON(19), 1, GFLAGS),
|
||||
GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(19), 3, GFLAGS),
|
||||
GATE(CLK_SBPI_OTPC_NS, "clk_sbpi_otpc_ns", "xin24m_gate", 0,
|
||||
RK3506_CLKGATE_CON(19), 4, GFLAGS),
|
||||
FACTOR(CLK_USER_OTPC_NS, "clk_user_otpc_ns", "clk_sbpi_otpc_ns", 0, 1, 2),
|
||||
GATE(PCLK_UART5, "pclk_uart5", "pclk_hsperi_root", 0,
|
||||
RK3506_CLKGATE_CON(19), 6, GFLAGS),
|
||||
COMPOSITE(SCLK_UART5, "sclk_uart5", sclk_uart_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(54), 11, 3, MFLAGS, 6, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(19), 7, GFLAGS),
|
||||
GATE(PCLK_GPIO234_IOC, "pclk_gpio234_ioc", "pclk_hsperi_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(19), 8, GFLAGS),
|
||||
COMPOSITE(CLK_MAC_PTP_ROOT, "clk_mac_ptp_root", clk_mac_ptp_root_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(55), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(19), 9, GFLAGS),
|
||||
GATE(CLK_MAC0_PTP, "clk_mac0_ptp", "clk_mac_ptp_root", 0,
|
||||
RK3506_CLKGATE_CON(19), 10, GFLAGS),
|
||||
GATE(CLK_MAC1_PTP, "clk_mac1_ptp", "clk_mac_ptp_root", 0,
|
||||
RK3506_CLKGATE_CON(19), 11, GFLAGS),
|
||||
COMPOSITE(ACLK_VIO_ROOT, "aclk_vio_root", gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(58), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(21), 0, GFLAGS),
|
||||
COMPOSITE(HCLK_VIO_ROOT, "hclk_vio_root", gpll_v0pll_v1pll_div_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(58), 12, 2, MFLAGS, 7, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(21), 1, GFLAGS),
|
||||
GATE(PCLK_VIO_ROOT, "pclk_vio_root", "hclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 2, GFLAGS),
|
||||
GATE(HCLK_RGA, "hclk_rga", "hclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 6, GFLAGS),
|
||||
GATE(ACLK_RGA, "aclk_rga", "aclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 7, GFLAGS),
|
||||
COMPOSITE(CLK_CORE_RGA, "clk_core_rga", gpll_v0pll_v1pll_g_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(59), 5, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3506_CLKGATE_CON(21), 8, GFLAGS),
|
||||
GATE(ACLK_VOP, "aclk_vop", "aclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 9, GFLAGS),
|
||||
GATE(HCLK_VOP, "hclk_vop", "hclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 10, GFLAGS),
|
||||
COMPOSITE(DCLK_VOP, "dclk_vop", dclk_vop_parents_p, 0,
|
||||
RK3506_CLKSEL_CON(60), 8, 3, MFLAGS, 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(21), 11, GFLAGS),
|
||||
GATE(PCLK_DPHY, "pclk_dphy", "pclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 12, GFLAGS),
|
||||
GATE(PCLK_DSI_HOST, "pclk_dsi_host", "pclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 13, GFLAGS),
|
||||
GATE(PCLK_TSADC, "pclk_tsadc", "pclk_vio_root", 0,
|
||||
RK3506_CLKGATE_CON(21), 14, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_TSADC, "clk_tsadc", "xin24m_gate", 0,
|
||||
RK3506_CLKSEL_CON(61), 0, 8, DFLAGS,
|
||||
RK3506_CLKGATE_CON(21), 15, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_TSADC_TSEN, "clk_tsadc_tsen", "xin24m_gate", 0,
|
||||
RK3506_CLKSEL_CON(61), 8, 3, DFLAGS,
|
||||
RK3506_CLKGATE_CON(22), 0, GFLAGS),
|
||||
GATE(PCLK_GPIO1_IOC, "pclk_gpio1_ioc", "pclk_vio_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_CLKGATE_CON(22), 1, GFLAGS),
|
||||
|
||||
/* pmu */
|
||||
GATE(CLK_PMU, "clk_pmu", "xin24m", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 1, GFLAGS),
|
||||
GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 2, GFLAGS),
|
||||
GATE(PCLK_PMU_CRU, "pclk_pmu_cru", "pclk_pmu_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 4, GFLAGS),
|
||||
GATE(PCLK_PMU_GRF, "pclk_pmu_grf", "pclk_pmu_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 5, GFLAGS),
|
||||
GATE(PCLK_GPIO0_IOC, "pclk_gpio0_ioc", "pclk_pmu_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 7, GFLAGS),
|
||||
GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pmu_root", 0,
|
||||
RK3506_PMU_CLKGATE_CON(0), 8, GFLAGS),
|
||||
COMPOSITE_NODIV(DBCLK_GPIO0, "dbclk_gpio0", dbclk_gpio0_parents_p, 0,
|
||||
RK3506_PMU_CLKSEL_CON(0), 0, 2, MFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(0), 9, GFLAGS),
|
||||
GATE(PCLK_GPIO1_SHADOW, "pclk_gpio1_shadow", "pclk_pmu_root", 0,
|
||||
RK3506_PMU_CLKGATE_CON(0), 10, GFLAGS),
|
||||
COMPOSITE_NODIV(DBCLK_GPIO1_SHADOW, "dbclk_gpio1_shadow", dbclk_gpio0_parents_p, 0,
|
||||
RK3506_PMU_CLKSEL_CON(0), 2, 2, MFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(0), 11, GFLAGS),
|
||||
GATE(PCLK_PMU_HP_TIMER, "pclk_pmu_hp_timer", "pclk_pmu_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 12, GFLAGS),
|
||||
MUX(CLK_PMU_HP_TIMER, "clk_pmu_hp_timer", clk_pmu_hp_timer_parents_p, CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKSEL_CON(0), 4, 2, MFLAGS),
|
||||
GATE(PCLK_PWM0, "pclk_pwm0", "pclk_pmu_root", 0,
|
||||
RK3506_PMU_CLKGATE_CON(0), 15, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_PWM0, "clk_pwm0", "clk_gpll_div_100m", 0,
|
||||
RK3506_PMU_CLKSEL_CON(0), 6, 4, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 0, GFLAGS),
|
||||
GATE(CLK_OSC_PWM0, "clk_osc_pwm0", "xin24m", 0,
|
||||
RK3506_PMU_CLKGATE_CON(1), 1, GFLAGS),
|
||||
GATE(CLK_RC_PWM0, "clk_rc_pwm0", "clk_rc", 0,
|
||||
RK3506_PMU_CLKGATE_CON(1), 2, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_MAC_OUT, "clk_mac_out", "gpll", 0,
|
||||
RK3506_PMU_CLKSEL_CON(0), 10, 6, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 3, GFLAGS),
|
||||
COMPOSITE(CLK_REF_OUT0, "clk_ref_out0", clk_ref_out_parents_p, 0,
|
||||
RK3506_PMU_CLKSEL_CON(1), 6, 2, MFLAGS, 0, 6, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 4, GFLAGS),
|
||||
COMPOSITE(CLK_REF_OUT1, "clk_ref_out1", clk_ref_out_parents_p, 0,
|
||||
RK3506_PMU_CLKSEL_CON(1), 14, 2, MFLAGS, 8, 6, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 5, GFLAGS),
|
||||
COMPOSITE_DIV_OFFSET(CLK_32K_FRAC, "clk_32k_frac", clk_32k_frac_parents_p, CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKSEL_CON(3), 0, 2, MFLAGS,
|
||||
RK3506_PMU_CLKSEL_CON(2), 0, 32, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 6, GFLAGS),
|
||||
COMPOSITE_NOMUX(CLK_32K_RC, "clk_32k_rc", "clk_rc", CLK_IS_CRITICAL,
|
||||
RK3506_PMU_CLKSEL_CON(3), 2, 5, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 7, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_32K, "clk_32k", clk_32k_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_PMU_CLKSEL_CON(3), 7, 2, MFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 8, GFLAGS),
|
||||
COMPOSITE_NODIV(CLK_32K_PMU, "clk_32k_pmu", clk_32k_parents_p, CLK_IS_CRITICAL,
|
||||
RK3506_PMU_CLKSEL_CON(3), 9, 2, MFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 9, GFLAGS),
|
||||
GATE(CLK_PMU_32K, "clk_pmu_32k", "clk_32k_pmu", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 3, GFLAGS),
|
||||
GATE(CLK_PMU_HP_TIMER_32K, "clk_pmu_hp_timer_32k", "clk_32k_pmu", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(0), 14, GFLAGS),
|
||||
GATE(PCLK_TOUCH_KEY, "pclk_touch_key", "pclk_pmu_root", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(1), 12, GFLAGS),
|
||||
GATE(CLK_TOUCH_KEY, "clk_touch_key", "xin24m", CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKGATE_CON(1), 13, GFLAGS),
|
||||
COMPOSITE(CLK_REF_PHY_PLL, "clk_ref_phy_pll", gpll_v0pll_v1pll_parents_p, 0,
|
||||
RK3506_PMU_CLKSEL_CON(4), 13, 2, MFLAGS, 6, 7, DFLAGS,
|
||||
RK3506_PMU_CLKGATE_CON(1), 14, GFLAGS),
|
||||
MUX(CLK_REF_PHY_PMU_MUX, "clk_ref_phy_pmu_mux", clk_ref_phy_pmu_mux_parents_p, 0,
|
||||
RK3506_PMU_CLKSEL_CON(4), 15, 1, MFLAGS),
|
||||
GATE(CLK_WIFI_OUT, "clk_wifi_out", "xin24m", 0,
|
||||
RK3506_PMU_CLKGATE_CON(2), 0, GFLAGS),
|
||||
MUX(CLK_V0PLL_REF, "clk_v0pll_ref", clk_vpll_ref_parents_p, CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKSEL_CON(6), 0, 1, MFLAGS),
|
||||
MUX(CLK_V1PLL_REF, "clk_v1pll_ref", clk_vpll_ref_parents_p, CLK_IGNORE_UNUSED,
|
||||
RK3506_PMU_CLKSEL_CON(6), 1, 1, MFLAGS),
|
||||
|
||||
/* secure ns */
|
||||
GATE(CLK_CORE_CRYPTO_NS, "clk_core_crypto_ns", "clk_core_crypto", 0,
|
||||
RK3506_CLKGATE_CON(5), 12, GFLAGS),
|
||||
GATE(CLK_PKA_CRYPTO_NS, "clk_pka_crypto_ns", "clk_pka_crypto", 0,
|
||||
RK3506_CLKGATE_CON(5), 13, GFLAGS),
|
||||
|
||||
/* io */
|
||||
GATE(CLK_SPI2, "clk_spi2", "clk_spi2_io", 0,
|
||||
RK3506_CLKGATE_CON(20), 0, GFLAGS),
|
||||
};
|
||||
|
||||
static void __iomem *rk3506_cru_base;
|
||||
|
||||
static void rk3506_dump_cru(void)
|
||||
{
|
||||
if (rk3506_cru_base) {
|
||||
pr_warn("CRU:\n");
|
||||
print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
|
||||
32, 4, rk3506_cru_base,
|
||||
0xc30, false);
|
||||
pr_warn("PMU CRU:\n");
|
||||
print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
|
||||
32, 4, rk3506_cru_base + RK3506_PMU_CRU_BASE,
|
||||
0xa08, false);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init rk3506_clk_init(struct device_node *np)
|
||||
{
|
||||
struct rockchip_clk_provider *ctx;
|
||||
void __iomem *reg_base;
|
||||
|
||||
reg_base = of_iomap(np, 0);
|
||||
if (!reg_base) {
|
||||
pr_err("%s: could not map cru region\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
rk3506_cru_base = reg_base;
|
||||
|
||||
ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS);
|
||||
if (IS_ERR(ctx)) {
|
||||
pr_err("%s: rockchip clk init failed\n", __func__);
|
||||
iounmap(reg_base);
|
||||
return;
|
||||
}
|
||||
|
||||
rockchip_clk_register_plls(ctx, rk3506_pll_clks,
|
||||
ARRAY_SIZE(rk3506_pll_clks),
|
||||
RK3506_GRF_SOC_STATUS);
|
||||
|
||||
rockchip_clk_register_armclk_v2(ctx, &rk3506_armclk,
|
||||
rk3506_cpuclk_rates,
|
||||
ARRAY_SIZE(rk3506_cpuclk_rates));
|
||||
|
||||
rockchip_clk_register_branches(ctx, rk3506_clk_branches,
|
||||
ARRAY_SIZE(rk3506_clk_branches));
|
||||
|
||||
rockchip_register_softrst(np, 23, reg_base + RK3506_SOFTRST_CON(0),
|
||||
ROCKCHIP_SOFTRST_HIWORD_MASK);
|
||||
|
||||
rockchip_register_restart_notifier(ctx, RK3506_GLB_SRST_FST, NULL);
|
||||
|
||||
rockchip_clk_of_add_provider(np, ctx);
|
||||
|
||||
if (!rk_dump_cru)
|
||||
rk_dump_cru = rk3506_dump_cru;
|
||||
|
||||
/* pvtpll src init */
|
||||
writel_relaxed(PVTPLL_SRC_SEL_PVTPLL, reg_base + RK3506_CLKSEL_CON(15));
|
||||
}
|
||||
|
||||
CLK_OF_DECLARE(rk3506_cru, "rockchip,rk3506-cru", rk3506_clk_init);
|
||||
|
||||
#ifdef MODULE
|
||||
struct clk_rk3506_inits {
|
||||
void (*inits)(struct device_node *np);
|
||||
};
|
||||
|
||||
static const struct clk_rk3506_inits clk_3506_cru_init = {
|
||||
.inits = rk3506_clk_init,
|
||||
};
|
||||
|
||||
static const struct of_device_id clk_rk3506_match_table[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3506-cru",
|
||||
.data = &clk_3506_cru_init,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, clk_rk3506_match_table);
|
||||
|
||||
static int clk_rk3506_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *match;
|
||||
const struct clk_rk3506_inits *init_data;
|
||||
|
||||
match = of_match_device(clk_rk3506_match_table, &pdev->dev);
|
||||
if (!match || !match->data)
|
||||
return -EINVAL;
|
||||
|
||||
init_data = match->data;
|
||||
if (init_data->inits)
|
||||
init_data->inits(np);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_rk3506_driver = {
|
||||
.probe = clk_rk3506_probe,
|
||||
.driver = {
|
||||
.name = "clk-rk3506",
|
||||
.of_match_table = clk_rk3506_match_table,
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
};
|
||||
module_platform_driver(clk_rk3506_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Rockchip RK3506 Clock Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:clk-rk3506");
|
||||
#endif /* MODULE */
|
||||
@@ -305,6 +305,18 @@ struct clk;
|
||||
#define RK3399_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x100)
|
||||
#define RK3399_PMU_SOFTRST_CON(x) ((x) * 0x4 + 0x110)
|
||||
|
||||
#define RK3506_PMU_CRU_BASE 0x10000
|
||||
#define RK3506_PLL_CON(x) ((x) * 0x4 + RK3506_PMU_CRU_BASE)
|
||||
#define RK3506_CLKSEL_CON(x) ((x) * 0x4 + 0x300)
|
||||
#define RK3506_CLKGATE_CON(x) ((x) * 0x4 + 0x800)
|
||||
#define RK3506_SOFTRST_CON(x) ((x) * 0x4 + 0xa00)
|
||||
#define RK3506_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3506_PMU_CRU_BASE)
|
||||
#define RK3506_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3506_PMU_CRU_BASE)
|
||||
#define RK3506_MODE_CON 0x280
|
||||
#define RK3506_GLB_CNT_TH 0xc00
|
||||
#define RK3506_GLB_SRST_FST 0xc08
|
||||
#define RK3506_GLB_SRST_SND 0xc0c
|
||||
|
||||
#define RK3528_PMU_CRU_BASE 0x10000
|
||||
#define RK3528_PCIE_CRU_BASE 0x20000
|
||||
#define RK3528_DDRPHY_CRU_BASE 0x28000
|
||||
|
||||
@@ -12,8 +12,8 @@ config CRYPTO_DEV_ROCKCHIP_V2
|
||||
default y
|
||||
|
||||
config CRYPTO_DEV_ROCKCHIP_V3
|
||||
bool "crypto v3/v4 for RV1106/RK3528/RK3562/RK3576"
|
||||
depends on CPU_RV1106 || CPU_RK3528 || CPU_RK3562 || CPU_RK3576
|
||||
bool "crypto v3/v4 for RV1106/RK3506/RK3528/RK3562/RK3576"
|
||||
depends on CPU_RV1106 || CPU_RK3506 || CPU_RK3528 || CPU_RK3562 || CPU_RK3576
|
||||
default y
|
||||
|
||||
endif
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include "rk_crypto_core.h"
|
||||
#include "rk_crypto_ahash_utils.h"
|
||||
|
||||
uint32_t rk_hash_reserve_block = RK_HASH_RESERVE_BLOCK;
|
||||
|
||||
static const char * const hash_algo2name[] = {
|
||||
[HASH_ALGO_MD5] = "md5",
|
||||
[HASH_ALGO_SHA1] = "sha1",
|
||||
@@ -35,7 +37,7 @@ static void rk_ahash_ctx_clear(struct rk_ahash_ctx *ctx)
|
||||
{
|
||||
rk_alg_ctx_clear(&ctx->algs_ctx);
|
||||
|
||||
memset(ctx->hash_tmp, 0x00, RK_DMA_ALIGNMENT);
|
||||
memset(ctx->hash_tmp, 0x00, RK_HASH_RESERVE_BLOCK);
|
||||
memset(ctx->lastc, 0x00, sizeof(ctx->lastc));
|
||||
|
||||
ctx->hash_tmp_len = 0;
|
||||
@@ -81,13 +83,13 @@ static u32 rk_calc_lastc_new_len(u32 nbytes, u32 old_len)
|
||||
{
|
||||
u32 total_len = nbytes + old_len;
|
||||
|
||||
if (total_len <= RK_DMA_ALIGNMENT)
|
||||
if (total_len <= rk_hash_reserve_block)
|
||||
return nbytes;
|
||||
|
||||
if (total_len % RK_DMA_ALIGNMENT)
|
||||
return total_len % RK_DMA_ALIGNMENT;
|
||||
if (total_len % rk_hash_reserve_block)
|
||||
return total_len % rk_hash_reserve_block;
|
||||
|
||||
return RK_DMA_ALIGNMENT;
|
||||
return rk_hash_reserve_block;
|
||||
}
|
||||
|
||||
static int rk_ahash_fallback_digest(const char *alg_name, bool is_hmac,
|
||||
@@ -326,7 +328,7 @@ int rk_ahash_start(struct rk_crypto_dev *rk_dev)
|
||||
nbytes = ctx->hash_tmp_len + req->nbytes - ctx->lastc_len;
|
||||
|
||||
/* not enough data */
|
||||
if (nbytes < RK_DMA_ALIGNMENT) {
|
||||
if (nbytes < rk_hash_reserve_block) {
|
||||
CRYPTO_TRACE("nbytes = %u, not enough data", nbytes);
|
||||
memcpy(ctx->hash_tmp + ctx->hash_tmp_len,
|
||||
ctx->lastc, ctx->lastc_len);
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include "rk_crypto_core.h"
|
||||
#include "rk_crypto_utils.h"
|
||||
|
||||
extern uint32_t rk_hash_reserve_block;
|
||||
|
||||
struct rk_alg_ctx *rk_ahash_alg_ctx(struct rk_crypto_dev *rk_dev);
|
||||
|
||||
struct rk_crypto_algt *rk_ahash_get_algt(struct crypto_ahash *tfm);
|
||||
|
||||
@@ -42,7 +42,8 @@
|
||||
#define RK_BUFFER_ORDER 3
|
||||
#define RK_BUFFER_SIZE (PAGE_SIZE << RK_BUFFER_ORDER)
|
||||
|
||||
#define RK_DMA_ALIGNMENT 128
|
||||
#define RK_HASH_RESERVE_BLOCK 128
|
||||
|
||||
#define sha384_state sha512_state
|
||||
#define sha224_state sha256_state
|
||||
|
||||
@@ -175,7 +176,7 @@ struct rk_ahash_ctx {
|
||||
bool hash_tmp_mapped;
|
||||
u32 calc_cnt;
|
||||
|
||||
u8 lastc[RK_DMA_ALIGNMENT];
|
||||
u8 lastc[RK_HASH_RESERVE_BLOCK];
|
||||
u32 lastc_len;
|
||||
|
||||
void *priv;
|
||||
|
||||
@@ -22,11 +22,6 @@
|
||||
#define RK_POLL_PERIOD_US 100
|
||||
#define RK_POLL_TIMEOUT_US 50000
|
||||
|
||||
struct rk_ahash_expt_ctx {
|
||||
struct rk_ahash_ctx ctx;
|
||||
u8 lastc[RK_DMA_ALIGNMENT];
|
||||
};
|
||||
|
||||
static const u32 hash_algo2bc[] = {
|
||||
[HASH_ALGO_MD5] = CRYPTO_MD5,
|
||||
[HASH_ALGO_SHA1] = CRYPTO_SHA1,
|
||||
@@ -187,7 +182,7 @@ static void clean_hash_setting(struct rk_crypto_dev *rk_dev)
|
||||
|
||||
static int rk_ahash_import(struct ahash_request *req, const void *in)
|
||||
{
|
||||
struct rk_ahash_expt_ctx state;
|
||||
struct rk_ahash_ctx state;
|
||||
|
||||
/* 'in' may not be aligned so memcpy to local variable */
|
||||
memcpy(&state, in, sizeof(state));
|
||||
@@ -199,7 +194,7 @@ static int rk_ahash_import(struct ahash_request *req, const void *in)
|
||||
|
||||
static int rk_ahash_export(struct ahash_request *req, void *out)
|
||||
{
|
||||
struct rk_ahash_expt_ctx state;
|
||||
struct rk_ahash_ctx state;
|
||||
|
||||
/* Don't let anything leak to 'out' */
|
||||
memset(&state, 0, sizeof(state));
|
||||
@@ -225,9 +220,9 @@ static int rk_ahash_dma_start(struct rk_crypto_dev *rk_dev, uint32_t flag)
|
||||
CRYPTO_TRACE("ctx->calc_cnt = %u, count %u Byte, is_final = %d",
|
||||
ctx->calc_cnt, alg_ctx->count, is_final);
|
||||
|
||||
if (alg_ctx->count % RK_DMA_ALIGNMENT && !is_final) {
|
||||
if (alg_ctx->count % rk_hash_reserve_block && !is_final) {
|
||||
dev_err(rk_dev->dev, "count = %u is not aligned with [%u]\n",
|
||||
alg_ctx->count, RK_DMA_ALIGNMENT);
|
||||
alg_ctx->count, rk_hash_reserve_block);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -318,12 +313,14 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
|
||||
|
||||
CRYPTO_TRACE();
|
||||
|
||||
rk_hash_reserve_block = RK_HASH_RESERVE_BLOCK;
|
||||
|
||||
memset(ctx, 0x00, sizeof(*ctx));
|
||||
|
||||
if (!rk_dev->request_crypto)
|
||||
return -EFAULT;
|
||||
|
||||
alg_ctx->align_size = RK_DMA_ALIGNMENT;
|
||||
alg_ctx->align_size = 64;
|
||||
|
||||
alg_ctx->ops.start = rk_ahash_start;
|
||||
alg_ctx->ops.update = rk_ahash_crypto_rx;
|
||||
@@ -346,7 +343,7 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
|
||||
|
||||
crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), sizeof(struct rk_ahash_rctx));
|
||||
|
||||
algt->alg.hash.halg.statesize = sizeof(struct rk_ahash_expt_ctx);
|
||||
algt->alg.hash.halg.statesize = sizeof(struct rk_ahash_ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -21,11 +21,6 @@
|
||||
#define RK_POLL_PERIOD_US 100
|
||||
#define RK_POLL_TIMEOUT_US 50000
|
||||
|
||||
struct rk_ahash_expt_ctx {
|
||||
struct rk_ahash_ctx ctx;
|
||||
u8 lastc[RK_DMA_ALIGNMENT];
|
||||
};
|
||||
|
||||
struct rk_hash_mid_data {
|
||||
u32 valid_flag;
|
||||
u32 hash_ctl;
|
||||
@@ -267,7 +262,7 @@ static void clean_hash_setting(struct rk_crypto_dev *rk_dev)
|
||||
|
||||
static int rk_ahash_import(struct ahash_request *req, const void *in)
|
||||
{
|
||||
struct rk_ahash_expt_ctx state;
|
||||
struct rk_ahash_ctx state;
|
||||
|
||||
/* 'in' may not be aligned so memcpy to local variable */
|
||||
memcpy(&state, in, sizeof(state));
|
||||
@@ -279,7 +274,7 @@ static int rk_ahash_import(struct ahash_request *req, const void *in)
|
||||
|
||||
static int rk_ahash_export(struct ahash_request *req, void *out)
|
||||
{
|
||||
struct rk_ahash_expt_ctx state;
|
||||
struct rk_ahash_ctx state;
|
||||
|
||||
/* Don't let anything leak to 'out' */
|
||||
memset(&state, 0, sizeof(state));
|
||||
@@ -305,9 +300,9 @@ static int rk_ahash_dma_start(struct rk_crypto_dev *rk_dev, uint32_t flag)
|
||||
CRYPTO_TRACE("ctx->calc_cnt = %u, count %u Byte, is_final = %d",
|
||||
ctx->calc_cnt, alg_ctx->count, is_final);
|
||||
|
||||
if (alg_ctx->count % RK_DMA_ALIGNMENT && !is_final) {
|
||||
if (alg_ctx->count % rk_hash_reserve_block && !is_final) {
|
||||
dev_err(rk_dev->dev, "count = %u is not aligned with [%u]\n",
|
||||
alg_ctx->count, RK_DMA_ALIGNMENT);
|
||||
alg_ctx->count, rk_hash_reserve_block);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -405,12 +400,14 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
|
||||
|
||||
CRYPTO_TRACE();
|
||||
|
||||
rk_hash_reserve_block = 64;
|
||||
|
||||
memset(ctx, 0x00, sizeof(*ctx));
|
||||
|
||||
if (!rk_dev->request_crypto)
|
||||
return -EFAULT;
|
||||
|
||||
alg_ctx->align_size = RK_DMA_ALIGNMENT;
|
||||
alg_ctx->align_size = 64;
|
||||
|
||||
alg_ctx->ops.start = rk_ahash_start;
|
||||
alg_ctx->ops.update = rk_ahash_crypto_rx;
|
||||
@@ -441,7 +438,7 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
|
||||
|
||||
crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), sizeof(struct rk_ahash_rctx));
|
||||
|
||||
algt->alg.hash.halg.statesize = sizeof(struct rk_ahash_expt_ctx);
|
||||
algt->alg.hash.halg.statesize = sizeof(struct rk_ahash_ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -264,6 +264,22 @@ struct arm_smccc_res sip_smc_lastlog_request(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sip_smc_lastlog_request);
|
||||
|
||||
int sip_smc_access_mem_os_reg(u32 func, u32 id, u32 *val)
|
||||
{
|
||||
struct arm_smccc_res res;
|
||||
|
||||
if (val == NULL)
|
||||
return SIP_RET_INVALID_PARAMS;
|
||||
|
||||
res = __invoke_sip_fn_smc(SIP_ACCESS_MEM_OS_REG, func, id, *val);
|
||||
|
||||
if (func == RK_MEM_OS_REG_READ)
|
||||
*val = res.a1;
|
||||
|
||||
return res.a0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sip_smc_access_mem_os_reg);
|
||||
|
||||
int sip_smc_amp_config(u32 sub_func_id, u32 arg1, u32 arg2, u32 arg3)
|
||||
{
|
||||
struct arm_smccc_res res;
|
||||
|
||||
@@ -306,6 +306,7 @@ config DRM_SII902X
|
||||
select I2C_MUX
|
||||
select SND_SOC_HDMI_CODEC if (SND_SOC && !ROCKCHIP_MINI_KERNEL)
|
||||
select VIDEOMODE_HELPERS
|
||||
select HDMI if ROCKCHIP_MINI_KERNEL
|
||||
help
|
||||
Silicon Image sii902x bridge chip driver.
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#define SII902X_TPI_AVI_PIXEL_REP_4X 3
|
||||
#define SII902X_TPI_AVI_PIXEL_REP_2X 1
|
||||
#define SII902X_TPI_AVI_PIXEL_REP_NONE 0
|
||||
#define SII902X_TPI_CLK_RATIO_MASK GENMASK(7, 6)
|
||||
#define SII902X_TPI_CLK_RATIO_HALF (0 << 6)
|
||||
#define SII902X_TPI_CLK_RATIO_1X (1 << 6)
|
||||
#define SII902X_TPI_CLK_RATIO_2X (2 << 6)
|
||||
@@ -550,6 +551,7 @@ static void sii902x_bridge_mode_set(struct drm_bridge *bridge,
|
||||
u8 buf[HDMI_INFOFRAME_SIZE(AVI)];
|
||||
struct hdmi_avi_infoframe frame;
|
||||
u16 pixel_clock_10kHz = adj->clock / 10;
|
||||
u8 ratio;
|
||||
int ret, vrefresh;
|
||||
|
||||
if (sii902x->loader_protect) {
|
||||
@@ -570,8 +572,7 @@ static void sii902x_bridge_mode_set(struct drm_bridge *bridge,
|
||||
buf[5] = adj->crtc_htotal >> 8;
|
||||
buf[6] = adj->crtc_vtotal;
|
||||
buf[7] = adj->crtc_vtotal >> 8;
|
||||
buf[8] = SII902X_TPI_CLK_RATIO_1X | SII902X_TPI_AVI_PIXEL_REP_NONE |
|
||||
SII902X_TPI_AVI_PIXEL_REP_BUS_24BIT;
|
||||
buf[8] = SII902X_TPI_AVI_PIXEL_REP_NONE | SII902X_TPI_AVI_PIXEL_REP_BUS_24BIT;
|
||||
switch (sii902x->bus_format) {
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
case MEDIA_BUS_FMT_YVYU8_1X16:
|
||||
@@ -620,6 +621,13 @@ static void sii902x_bridge_mode_set(struct drm_bridge *bridge,
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (sii902x->mode.flags & DRM_MODE_FLAG_INTERLACE)
|
||||
ratio = SII902X_TPI_CLK_RATIO_2X;
|
||||
else
|
||||
ratio = SII902X_TPI_CLK_RATIO_1X;
|
||||
regmap_update_bits(sii902x->regmap, SII902X_TPI_PIXEL_REPETITION,
|
||||
SII902X_TPI_CLK_RATIO_MASK, ratio);
|
||||
|
||||
ret = drm_hdmi_avi_infoframe_from_display_mode(&frame,
|
||||
&sii902x->connector, adj);
|
||||
if (ret < 0) {
|
||||
|
||||
@@ -49,7 +49,7 @@ config ROCKCHIP_VOP
|
||||
CPU_PX30 || CPU_RK3308 || CPU_RV1106 || \
|
||||
CPU_RV1126 || CPU_RK3288 || CPU_RK3368 || \
|
||||
CPU_RK3399 || CPU_RK322X || CPU_RK3328 || \
|
||||
CPU_RK3576
|
||||
CPU_RK3576 || CPU_RK3506
|
||||
default y if !ROCKCHIP_MINI_KERNEL
|
||||
help
|
||||
This selects support for the VOP driver. You should enable it
|
||||
|
||||
@@ -185,6 +185,13 @@
|
||||
#define RK3399_TXRX_SRC_SEL_ISP0 BIT(4)
|
||||
#define RK3399_TXRX_TURNREQUEST GENMASK(3, 0)
|
||||
|
||||
#define RK3506_SYS_GRF_SOC_CON6 0x0018
|
||||
#define RK3506_DSI_FORCETXSTOPMODE (0xf << 4)
|
||||
#define RK3506_DSI_PHY_ENABLE_LANE1 BIT(9)
|
||||
#define RK3506_DSI_PHY_ENABLE_LANE0 BIT(8)
|
||||
#define RK3506_DSI_TURNDISABLE BIT(2)
|
||||
#define RK3506_DSI_FORCERXMODE BIT(0)
|
||||
|
||||
#define RK3562_SYS_GRF_VO_CON1 0x05d4
|
||||
#define RK3562_DSI_FORCETXSTOPMODE (0xf << 4)
|
||||
#define RK3562_DSI_TURNDISABLE (0x1 << 2)
|
||||
@@ -247,6 +254,7 @@ enum soc_type {
|
||||
RK3128,
|
||||
RK3288,
|
||||
RK3399,
|
||||
RK3506,
|
||||
RK3562,
|
||||
RK3568,
|
||||
RV1126,
|
||||
@@ -1770,6 +1778,25 @@ static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const struct rockchip_dw_dsi_chip_data rk3506_chip_data[] = {
|
||||
{
|
||||
.reg = 0xff640000,
|
||||
.lanecfg1_grf_reg = RK3506_SYS_GRF_SOC_CON6,
|
||||
.lanecfg1 = HIWORD_UPDATE(RK3506_DSI_PHY_ENABLE_LANE0 |
|
||||
RK3506_DSI_PHY_ENABLE_LANE1,
|
||||
RK3506_DSI_TURNDISABLE |
|
||||
RK3506_DSI_FORCERXMODE |
|
||||
RK3506_DSI_FORCETXSTOPMODE |
|
||||
RK3506_DSI_PHY_ENABLE_LANE0 |
|
||||
RK3506_DSI_PHY_ENABLE_LANE1),
|
||||
|
||||
.max_data_lanes = 2,
|
||||
.max_bit_rate_per_lane = 1500000000UL,
|
||||
.soc_type = RK3506,
|
||||
},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const struct rockchip_dw_dsi_chip_data rk3562_chip_data[] = {
|
||||
{
|
||||
.reg = 0xffb10000,
|
||||
@@ -1843,6 +1870,9 @@ static const struct of_device_id dw_mipi_dsi_rockchip_dt_ids[] = {
|
||||
}, {
|
||||
.compatible = "rockchip,rk3399-mipi-dsi",
|
||||
.data = &rk3399_chip_data,
|
||||
}, {
|
||||
.compatible = "rockchip,rk3506-mipi-dsi",
|
||||
.data = &rk3506_chip_data,
|
||||
}, {
|
||||
.compatible = "rockchip,rk3562-mipi-dsi",
|
||||
.data = &rk3562_chip_data,
|
||||
|
||||
@@ -2119,7 +2119,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
||||
dsp_h = 4;
|
||||
actual_h = dsp_h * actual_h / drm_rect_height(dest);
|
||||
}
|
||||
if ((vop->version == VOP_VERSION(2, 2) || vop->version == VOP_VERSION(2, 0xd)) &&
|
||||
if ((vop->version == VOP_VERSION(2, 2) || vop->version >= VOP_VERSION(2, 0xd)) &&
|
||||
(adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE))
|
||||
dsp_h = dsp_h / 2;
|
||||
|
||||
@@ -2134,7 +2134,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
|
||||
|
||||
dsp_stx = dest->x1 + mode->crtc_htotal - mode->crtc_hsync_start;
|
||||
dsp_sty = dest->y1 + mode->crtc_vtotal - mode->crtc_vsync_start;
|
||||
if ((vop->version == VOP_VERSION(2, 2) || vop->version == VOP_VERSION(2, 0xd)) &&
|
||||
if ((vop->version == VOP_VERSION(2, 2) || vop->version >= VOP_VERSION(2, 0xd)) &&
|
||||
(adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE))
|
||||
dsp_sty = dest->y1 / 2 + mode->crtc_vtotal - mode->crtc_vsync_start;
|
||||
dsp_st = dsp_sty << 16 | (dsp_stx & 0xffff);
|
||||
@@ -3144,7 +3144,7 @@ static void vop_crtc_send_mcu_cmd(struct drm_crtc *crtc, u32 type, u32 value)
|
||||
vop = to_vop(crtc);
|
||||
adjusted_mode = &crtc->state->adjusted_mode;
|
||||
|
||||
if (vop->version == VOP_VERSION(2, 0xd)) {
|
||||
if (vop->version >= VOP_VERSION(2, 0xd)) {
|
||||
/*
|
||||
* 1.set mcu bypass mode timing.
|
||||
* 2.set dclk rate to 150M.
|
||||
@@ -3176,7 +3176,7 @@ static void vop_crtc_send_mcu_cmd(struct drm_crtc *crtc, u32 type, u32 value)
|
||||
}
|
||||
mutex_unlock(&vop->vop_lock);
|
||||
|
||||
if (vop->version == VOP_VERSION(2, 0xd)) {
|
||||
if (vop->version >= VOP_VERSION(2, 0xd)) {
|
||||
/*
|
||||
* 1.restore mcu data mode timing.
|
||||
* 2.restore dclk rate to crtc_clock.
|
||||
@@ -3497,7 +3497,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
vop_crtc_load_lut(crtc);
|
||||
|
||||
if (vop->mcu_timing.mcu_pix_total) {
|
||||
if (vop->version == VOP_VERSION(2, 0xd))
|
||||
if (vop->version >= VOP_VERSION(2, 0xd))
|
||||
vop_set_out_mode(vop, s->output_mode);
|
||||
else
|
||||
vop_set_out_mode(vop, ROCKCHIP_OUT_MODE_P888);
|
||||
|
||||
@@ -54,6 +54,9 @@
|
||||
#define RK3288_LVDS_CON_CLKINV(x) HIWORD_UPDATE(x, 8, 8)
|
||||
#define RK3288_LVDS_CON_TTL_EN(x) HIWORD_UPDATE(x, 6, 6)
|
||||
|
||||
#define RK3506_GRF_SOC_CON2 0x0008
|
||||
#define RK3506_GRF_VOP_DATA_BYPASS(v) HIWORD_UPDATE(v, 1, 2)
|
||||
|
||||
#define RK3562_GRF_IOC_VO_IO_CON 0x10500
|
||||
#define RK3562_RGB_DATA_BYPASS(v) HIWORD_UPDATE(v, 6, 6)
|
||||
|
||||
@@ -263,7 +266,9 @@ static void rockchip_rgb_encoder_disable(struct drm_encoder *encoder)
|
||||
rgb->funcs->disable(rgb);
|
||||
|
||||
pinctrl_pm_select_sleep_state(rgb->dev);
|
||||
s->output_if &= ~(VOP_OUTPUT_IF_RGB | VOP_OUTPUT_IF_BT656 | VOP_OUTPUT_IF_BT1120);
|
||||
|
||||
if (crtc->state->active_changed)
|
||||
s->output_if &= ~(VOP_OUTPUT_IF_RGB | VOP_OUTPUT_IF_BT656 | VOP_OUTPUT_IF_BT1120);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -382,7 +387,6 @@ rockchip_rgb_encoder_mode_valid(struct drm_encoder *encoder,
|
||||
const struct drm_display_mode *mode)
|
||||
{
|
||||
struct rockchip_rgb *rgb = encoder_to_rgb(encoder);
|
||||
struct device *dev = rgb->dev;
|
||||
struct drm_display_info *info = &rgb->connector.display_info;
|
||||
u32 request_clock = mode->clock;
|
||||
u32 max_clock = rgb->max_dclk_rate;
|
||||
@@ -401,8 +405,8 @@ rockchip_rgb_encoder_mode_valid(struct drm_encoder *encoder,
|
||||
(rgb->mcu_pix_total + 1);
|
||||
|
||||
if (max_clock != 0 && request_clock > max_clock) {
|
||||
DRM_DEV_ERROR(dev, "mode [%dx%d] clock %d is higher than max_clock %d\n",
|
||||
mode->hdisplay, mode->vdisplay, request_clock, max_clock);
|
||||
DRM_DEBUG_DRIVER("mode [%dx%d] clock %d is higher than max_clock %d\n",
|
||||
mode->hdisplay, mode->vdisplay, request_clock, max_clock);
|
||||
return MODE_CLOCK_HIGH;
|
||||
}
|
||||
|
||||
@@ -1079,6 +1083,22 @@ static const struct rockchip_rgb_data rk3288_rgb = {
|
||||
.funcs = &rk3288_rgb_funcs,
|
||||
};
|
||||
|
||||
static void rk3506_rgb_enable(struct rockchip_rgb *rgb)
|
||||
{
|
||||
regmap_write(rgb->grf, RK3506_GRF_SOC_CON2,
|
||||
RK3506_GRF_VOP_DATA_BYPASS(rgb->data_sync_bypass ? 0x3 : 0x0));
|
||||
}
|
||||
|
||||
static const struct rockchip_rgb_funcs rk3506_rgb_funcs = {
|
||||
.enable = rk3506_rgb_enable,
|
||||
};
|
||||
|
||||
static const struct rockchip_rgb_data rk3506_rgb = {
|
||||
.rgb_max_dclk_rate = 120000,
|
||||
.mcu_max_dclk_rate = 120000,
|
||||
.funcs = &rk3506_rgb_funcs,
|
||||
};
|
||||
|
||||
static void rk3562_rgb_enable(struct rockchip_rgb *rgb)
|
||||
{
|
||||
regmap_write(rgb->grf, RK3562_GRF_IOC_VO_IO_CON,
|
||||
@@ -1166,6 +1186,7 @@ static const struct of_device_id rockchip_rgb_dt_ids[] = {
|
||||
{ .compatible = "rockchip,rk3288-rgb", .data = &rk3288_rgb },
|
||||
{ .compatible = "rockchip,rk3308-rgb", },
|
||||
{ .compatible = "rockchip,rk3368-rgb", },
|
||||
{ .compatible = "rockchip,rk3506-rgb", .data = &rk3506_rgb },
|
||||
{ .compatible = "rockchip,rk3562-rgb", .data = &rk3562_rgb },
|
||||
{ .compatible = "rockchip,rk3568-rgb", .data = &rk3568_rgb },
|
||||
{ .compatible = "rockchip,rk3576-rgb", .data = &rk3576_rgb },
|
||||
|
||||
@@ -1991,6 +1991,134 @@ static const struct vop_data rv1106_vop = {
|
||||
.win_size = ARRAY_SIZE(rv1106_vop_win_data),
|
||||
};
|
||||
|
||||
static const struct vop_ctrl rk3506_ctrl_data = {
|
||||
.cfg_done = VOP_REG(RK3366_LIT_REG_CFG_DONE, 0x1, 0),
|
||||
|
||||
.dsp_background = VOP_REG(RK3366_LIT_DSP_BG, 0x00ffffff, 0),
|
||||
|
||||
.axi_outstanding_max_num = VOP_REG(RK3366_LIT_SYS_CTRL1, 0x1f, 16),
|
||||
.axi_max_outstanding_en = VOP_REG(RK3366_LIT_SYS_CTRL1, 0x1, 12),
|
||||
|
||||
.auto_gate_en = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 0),
|
||||
.standby = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 1),
|
||||
.dsp_outzero = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 3),
|
||||
.yuv_clip = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 4),
|
||||
|
||||
.rgb_en = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 0),
|
||||
.rgb_pin_pol = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x7, 2),
|
||||
.bt1120_uv_swap = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 5),
|
||||
.bt656_en = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 6),
|
||||
.core_dclk_div = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 13),
|
||||
.mipi_en = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 24),
|
||||
.mipi_dclk_pol = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 25),
|
||||
.mipi_pin_pol = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x7, 26),
|
||||
.bt1120_yc_swap = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 30),
|
||||
.bt1120_en = VOP_REG(RK3366_LIT_DSP_CTRL0, 0x1, 31),
|
||||
|
||||
.dsp_interlace = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 0),
|
||||
.dsp_interlace_pol = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 1),
|
||||
.dither_up_en = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2),
|
||||
.overlay_mode = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 4),
|
||||
.dsp_lut_en = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 5),
|
||||
.dither_down_mode = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 6),
|
||||
.dither_down_sel = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 7),
|
||||
.dither_down_en = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 8),
|
||||
.dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9),
|
||||
.dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9),
|
||||
.dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11),
|
||||
.dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12),
|
||||
.dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14),
|
||||
.dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15),
|
||||
.out_mode = VOP_REG(RK3366_LIT_DSP_CTRL2, 0xf, 16),
|
||||
|
||||
.htotal_pw = VOP_REG(RK3366_LIT_DSP_HTOTAL_HS_END, 0x0fff0fff, 0),
|
||||
.hact_st_end = VOP_REG(RK3366_LIT_DSP_HACT_ST_END, 0x0fff0fff, 0),
|
||||
.vtotal_pw = VOP_REG(RK3366_LIT_DSP_VTOTAL_VS_END, 0x0fff0fff, 0),
|
||||
.vact_st_end = VOP_REG(RK3366_LIT_DSP_VACT_ST_END, 0x0fff0fff, 0),
|
||||
.vact_st_end_f1 = VOP_REG(RK3366_LIT_DSP_VACT_ST_END_F1, 0x0fff0fff, 0),
|
||||
.vs_st_end_f1 = VOP_REG(RK3366_LIT_DSP_VS_ST_END_F1, 0x0fff0fff, 0),
|
||||
|
||||
.bcsh_en = VOP_REG(RK3366_LIT_BCSH_CTRL, 0x1, 0),
|
||||
.bcsh_r2y_csc_mode = VOP_REG(RK3366_LIT_BCSH_CTRL, 0x1, 1),
|
||||
.bcsh_out_mode = VOP_REG(RK3366_LIT_BCSH_CTRL, 0x3, 2),
|
||||
.bcsh_y2r_csc_mode = VOP_REG(RK3366_LIT_BCSH_CTRL, 0x3, 4),
|
||||
.bcsh_y2r_en = VOP_REG(RK3366_LIT_BCSH_CTRL, 0x1, 6),
|
||||
.bcsh_r2y_en = VOP_REG(RK3366_LIT_BCSH_CTRL, 0x1, 7),
|
||||
|
||||
.bcsh_color_bar = VOP_REG(RK3366_LIT_BCSH_COL_BAR, 0xffffff, 0),
|
||||
.bcsh_brightness = VOP_REG(RK3366_LIT_BCSH_BCS, 0xff, 0),
|
||||
.bcsh_contrast = VOP_REG(RK3366_LIT_BCSH_BCS, 0x1ff, 8),
|
||||
.bcsh_sat_con = VOP_REG(RK3366_LIT_BCSH_BCS, 0x3ff, 20),
|
||||
.bcsh_sin_hue = VOP_REG(RK3366_LIT_BCSH_H, 0x1ff, 0),
|
||||
.bcsh_cos_hue = VOP_REG(RK3366_LIT_BCSH_H, 0x1ff, 16),
|
||||
|
||||
.mcu_pix_total = VOP_REG(RK3366_LIT_MCU_CTRL, 0x3f, 0),
|
||||
.mcu_cs_pst = VOP_REG(RK3366_LIT_MCU_CTRL, 0xf, 6),
|
||||
.mcu_cs_pend = VOP_REG(RK3366_LIT_MCU_CTRL, 0x3f, 10),
|
||||
.mcu_rw_pst = VOP_REG(RK3366_LIT_MCU_CTRL, 0xf, 16),
|
||||
.mcu_rw_pend = VOP_REG(RK3366_LIT_MCU_CTRL, 0x3f, 20),
|
||||
.mcu_clk_sel = VOP_REG(RK3366_LIT_MCU_CTRL, 0x1, 26),
|
||||
.mcu_hold_mode = VOP_REG(RK3366_LIT_MCU_CTRL, 0x1, 27),
|
||||
.mcu_frame_st = VOP_REG(RK3366_LIT_MCU_CTRL, 0x1, 28),
|
||||
.mcu_rs = VOP_REG(RK3366_LIT_MCU_CTRL, 0x1, 29),
|
||||
.mcu_bypass = VOP_REG(RK3366_LIT_MCU_CTRL, 0x1, 30),
|
||||
.mcu_type = VOP_REG(RK3366_LIT_MCU_CTRL, 0x1, 31),
|
||||
.mcu_rw_bypass_port = VOP_REG(RK3366_LIT_MCU_RW_BYPASS_PORT,
|
||||
0xffffffff, 0),
|
||||
};
|
||||
|
||||
static const struct vop_win_phy rk3506_lit_win1_data = {
|
||||
.data_formats = formats_win_lite,
|
||||
.nformats = ARRAY_SIZE(formats_win_lite),
|
||||
|
||||
.enable = VOP_REG(RK3366_LIT_WIN1_CTRL0, 0x1, 0),
|
||||
.csc_mode = VOP_REG(RK3366_LIT_WIN1_CTRL0, 0x1, 2),
|
||||
.format = VOP_REG(RK3366_LIT_WIN1_CTRL0, 0x7, 4),
|
||||
.interlace_read = VOP_REG(RK3366_LIT_WIN1_CTRL0, 0x1, 8),
|
||||
.rb_swap = VOP_REG(RK3366_LIT_WIN1_CTRL0, 0x1, 12),
|
||||
|
||||
.channel = VOP_REG(RK3366_LIT_WIN1_CTRL1, 0xf, 8),
|
||||
|
||||
.yrgb_vir = VOP_REG(RK3366_LIT_WIN1_VIR, 0x1fff, 0),
|
||||
|
||||
.yrgb_mst = VOP_REG(RK3366_LIT_WIN1_MST, 0xffffffff, 0),
|
||||
|
||||
.dsp_info = VOP_REG(RK3366_LIT_WIN1_DSP_INFO, 0xffffffff, 0),
|
||||
|
||||
.dsp_st = VOP_REG(RK3366_LIT_WIN1_DSP_ST, 0xffffffff, 0),
|
||||
|
||||
.color_key = VOP_REG(RK3366_LIT_WIN1_COLOR_KEY, 0xffffff, 0),
|
||||
.color_key_en = VOP_REG(RK3366_LIT_WIN1_COLOR_KEY, 0x1, 24),
|
||||
|
||||
.alpha_en = VOP_REG(RK3366_LIT_WIN1_ALPHA_CTRL, 0x1, 0),
|
||||
.alpha_mode = VOP_REG(RK3366_LIT_WIN1_ALPHA_CTRL, 0x1, 1),
|
||||
.alpha_pre_mul = VOP_REG(RK3366_LIT_WIN1_ALPHA_CTRL, 0x1, 2),
|
||||
.global_alpha_val = VOP_REG(RK3366_LIT_WIN1_ALPHA_CTRL, 0xff, 4),
|
||||
};
|
||||
|
||||
static const struct vop_win_data rk3506_vop_win_data[] = {
|
||||
{ .phy = NULL },
|
||||
{ .base = 0x00, .phy = &rk3506_lit_win1_data,
|
||||
.type = DRM_PLANE_TYPE_PRIMARY },
|
||||
};
|
||||
|
||||
static const struct vop_grf_ctrl rk3506_grf_ctrl = {
|
||||
.grf_dclk_inv = VOP_REG(RK3506_GRF_SOC_CON2, 0x1, 0),
|
||||
};
|
||||
|
||||
static const struct vop_data rk3506_vop = {
|
||||
.soc_id = 0x3506,
|
||||
.vop_id = 0,
|
||||
.version = VOP_VERSION(2, 0xe),
|
||||
.max_input = {1280, 1280},
|
||||
.max_output = {1280, 1280},
|
||||
.ctrl = &rk3506_ctrl_data,
|
||||
.intr = &rk3366_lit_intr,
|
||||
.grf = &rk3506_grf_ctrl,
|
||||
.win = rk3506_vop_win_data,
|
||||
.win_size = ARRAY_SIZE(rk3506_vop_win_data),
|
||||
};
|
||||
|
||||
static const struct vop_ctrl rk3576_lit_ctrl_data = {
|
||||
.cfg_done = VOP_REG(EBC_CONFIG_DONE, 0x1, 0),
|
||||
|
||||
@@ -2178,6 +2306,10 @@ static const struct of_device_id vop_driver_dt_match[] = {
|
||||
{ .compatible = "rockchip,rk3328-vop",
|
||||
.data = &rk3328_vop },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_CPU_RK3506)
|
||||
{ .compatible = "rockchip,rk3506-vop",
|
||||
.data = &rk3506_vop },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_CPU_RK3576)
|
||||
{ .compatible = "rockchip,rk3576-vop-lit",
|
||||
.data = &rk3576_vop_lit },
|
||||
|
||||
@@ -1039,6 +1039,8 @@
|
||||
|
||||
#define RV1126_GRF_IOFUNC_CON3 0x1026c
|
||||
|
||||
#define RK3506_GRF_SOC_CON2 0x0008
|
||||
|
||||
#define RK3562_GRF_IOC_VO_IO_CON 0x10500
|
||||
|
||||
/* rk3568 vop registers definition */
|
||||
|
||||
@@ -259,13 +259,13 @@ static int rockchip_flexbus_adc_init(struct rockchip_flexbus_adc *rkfb_adc)
|
||||
|
||||
switch (rkfb_adc->dfs) {
|
||||
case 4:
|
||||
val = FLEXBUS_DFS_4BIT;
|
||||
val = rkfb->dfs_reg->dfs_4bit;
|
||||
break;
|
||||
case 8:
|
||||
val = FLEXBUS_DFS_8BIT;
|
||||
val = rkfb->dfs_reg->dfs_8bit;
|
||||
break;
|
||||
case 16:
|
||||
val = FLEXBUS_DFS_16BIT;
|
||||
val = rkfb->dfs_reg->dfs_16bit;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
@@ -288,13 +288,13 @@ static int rockchip_flexbus_dac_init(struct rockchip_flexbus_dac *rkfb_dac)
|
||||
|
||||
switch (rkfb_dac->dfs) {
|
||||
case 4:
|
||||
val = FLEXBUS_DFS_4BIT;
|
||||
val = rkfb->dfs_reg->dfs_4bit;
|
||||
break;
|
||||
case 8:
|
||||
val = FLEXBUS_DFS_8BIT;
|
||||
val = rkfb->dfs_reg->dfs_8bit;
|
||||
break;
|
||||
case 16:
|
||||
val = FLEXBUS_DFS_16BIT;
|
||||
val = rkfb->dfs_reg->dfs_16bit;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
@@ -275,6 +275,7 @@ static int mh248_resume(struct device *dev)
|
||||
|
||||
if (mem_sleep_current == PM_SUSPEND_MEM_ULTRA) {
|
||||
if (g_mh248->is_hall_wakeup) {
|
||||
g_mh248->is_hall_wakeup = 0;
|
||||
gpio_value = gpio_get_value(g_mh248->gpio_pin);
|
||||
if ((gpio_value == g_mh248->active_value) &&
|
||||
(g_mh248->is_suspend == 1)) {
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
* V0.0X01.0X01 update sensor driver.
|
||||
* 1. adjust power sequence to suit spec.
|
||||
* 2. fix bayer pattern to suit setting.
|
||||
* V0.0X01.0X02 add mirror & flip support.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
@@ -81,6 +82,10 @@
|
||||
#define GC05A2_REG_VTS_H 0x0340
|
||||
#define GC05A2_REG_VTS_L 0x0341
|
||||
|
||||
#define GC05A2_FLIP_MIRROR_REG 0x0101
|
||||
#define MIRROR_BIT_MASK BIT(0)
|
||||
#define FLIP_BIT_MASK BIT(1)
|
||||
|
||||
#define REG_NULL 0xFFFF
|
||||
|
||||
#define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default"
|
||||
@@ -139,6 +144,9 @@ struct gc05a2 {
|
||||
struct v4l2_ctrl *hblank;
|
||||
struct v4l2_ctrl *vblank;
|
||||
struct v4l2_ctrl *link_freq;
|
||||
struct v4l2_ctrl *h_flip;
|
||||
struct v4l2_ctrl *v_flip;
|
||||
u8 flip_mirror;
|
||||
struct mutex mutex;
|
||||
bool streaming;
|
||||
unsigned int lane_num;
|
||||
@@ -157,49 +165,6 @@ struct gc05a2 {
|
||||
|
||||
#define to_gc05a2(sd) container_of(sd, struct gc05a2, subdev)
|
||||
|
||||
#undef GC05A2_MIRROR_NORMAL
|
||||
#undef GC05A2_MIRROR_H
|
||||
#undef GC05A2_MIRROR_V
|
||||
#undef GC05A2_MIRROR_HV
|
||||
|
||||
/* SENSOR MIRROR FLIP INFO */
|
||||
#define GC05A2_MIRROR_NORMAL 0
|
||||
#define GC05A2_MIRROR_H 1
|
||||
#define GC05A2_MIRROR_V 0
|
||||
#define GC05A2_MIRROR_HV 0
|
||||
|
||||
#if GC05A2_MIRROR_NORMAL
|
||||
#define GC05A2_MIRROR 0x00
|
||||
#define FULL_STARTY 0x06
|
||||
#define FULL_STARTX 0x08
|
||||
#define BINNING_STARTY 0x03
|
||||
#define BINNING_STARTX 0x03
|
||||
#elif GC05A2_MIRROR_H
|
||||
#define GC05A2_MIRROR 0x01
|
||||
#define FULL_STARTY 0x06
|
||||
#define FULL_STARTX 0x09
|
||||
#define BINNING_STARTY 0x03
|
||||
#define BINNING_STARTX 0x04
|
||||
#elif GC05A2_MIRROR_V
|
||||
#define GC05A2_MIRROR 0x02
|
||||
#define FULL_STARTY 0x07
|
||||
#define FULL_STARTX 0x08
|
||||
#define BINNING_STARTY 0x04
|
||||
#define BINNING_STARTX 0x03
|
||||
#elif GC05A2_MIRROR_HV
|
||||
#define GC05A2_MIRROR 0x03
|
||||
#define FULL_STARTY 0x07
|
||||
#define FULL_STARTX 0x09
|
||||
#define BINNING_STARTY 0x04
|
||||
#define BINNING_STARTX 0x04
|
||||
#else
|
||||
#define GC05A2_MIRROR 0x00
|
||||
#define FULL_STARTY 0x06
|
||||
#define FULL_STARTX 0x08
|
||||
#define BINNING_STARTY 0x03
|
||||
#define BINNING_STARTX 0x03
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Xclk 24Mhz
|
||||
*/
|
||||
@@ -1136,6 +1101,7 @@ static int gc05a2_s_power(struct v4l2_subdev *sd, int on)
|
||||
goto unlock_and_return;
|
||||
}
|
||||
|
||||
gc05a2->flip_mirror = 0;
|
||||
ret = gc05a2_write_array(gc05a2->client, gc05a2->cur_mode->global_reg_list);
|
||||
if (ret) {
|
||||
v4l2_err(sd, "could not set init registers\n");
|
||||
@@ -1421,15 +1387,15 @@ static int gc05a2_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_EXPOSURE:
|
||||
/* 4 least significant bits of expsoure are fractional part */
|
||||
dev_info(&client->dev, "set exposure value 0x%x\n", ctrl->val);
|
||||
dev_dbg(&client->dev, "set exposure value 0x%x\n", ctrl->val);
|
||||
ret = gc05a2_set_exposure_reg(gc05a2, ctrl->val);
|
||||
break;
|
||||
case V4L2_CID_ANALOGUE_GAIN:
|
||||
dev_info(&client->dev, "set analog gain value 0x%x\n", ctrl->val);
|
||||
dev_dbg(&client->dev, "set analog gain value 0x%x\n", ctrl->val);
|
||||
ret = gc05a2_set_gain_reg(gc05a2, ctrl->val);
|
||||
break;
|
||||
case V4L2_CID_VBLANK:
|
||||
dev_info(&client->dev, "set vb value 0x%x\n", ctrl->val);
|
||||
dev_dbg(&client->dev, "set vb value 0x%x\n", ctrl->val);
|
||||
ret = gc05a2_write_reg(gc05a2->client,
|
||||
GC05A2_REG_VTS_H,
|
||||
(ctrl->val + gc05a2->cur_mode->height)
|
||||
@@ -1439,6 +1405,27 @@ static int gc05a2_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
(ctrl->val + gc05a2->cur_mode->height)
|
||||
& 0xff);
|
||||
break;
|
||||
case V4L2_CID_HFLIP:
|
||||
dev_dbg(&client->dev, "set mirror value 0x%x\n", ctrl->val);
|
||||
|
||||
if (ctrl->val)
|
||||
gc05a2->flip_mirror |= MIRROR_BIT_MASK;
|
||||
else
|
||||
gc05a2->flip_mirror &= ~MIRROR_BIT_MASK;
|
||||
|
||||
ret |= gc05a2_write_reg(gc05a2->client, GC05A2_FLIP_MIRROR_REG,
|
||||
gc05a2->flip_mirror);
|
||||
break;
|
||||
case V4L2_CID_VFLIP:
|
||||
dev_dbg(&client->dev, "set flip value 0x%x\n", ctrl->val);
|
||||
if (ctrl->val)
|
||||
gc05a2->flip_mirror |= FLIP_BIT_MASK;
|
||||
else
|
||||
gc05a2->flip_mirror &= ~FLIP_BIT_MASK;
|
||||
|
||||
ret |= gc05a2_write_reg(gc05a2->client, GC05A2_FLIP_MIRROR_REG,
|
||||
gc05a2->flip_mirror);
|
||||
break;
|
||||
default:
|
||||
dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
|
||||
__func__, ctrl->id, ctrl->val);
|
||||
@@ -1501,6 +1488,11 @@ static int gc05a2_initialize_controls(struct gc05a2 *gc05a2)
|
||||
V4L2_CID_ANALOGUE_GAIN, GC05A2_AGAIN_MIN,
|
||||
GC05A2_AGAIN_MAX, GC05A2_AGAIN_STEP,
|
||||
GC05A2_AGAIN_DEFAULT);
|
||||
gc05a2->h_flip = v4l2_ctrl_new_std(handler, &gc05a2_ctrl_ops,
|
||||
V4L2_CID_HFLIP, 0, 1, 1, 0);
|
||||
|
||||
gc05a2->v_flip = v4l2_ctrl_new_std(handler, &gc05a2_ctrl_ops,
|
||||
V4L2_CID_VFLIP, 0, 1, 1, 0);
|
||||
|
||||
if (handler->error) {
|
||||
ret = handler->error;
|
||||
|
||||
@@ -12051,7 +12051,6 @@ unsigned int rkcif_irq_global(struct rkcif_device *cif_dev)
|
||||
intstat_glb);
|
||||
return 0;
|
||||
}
|
||||
rkcif_irq_handle_scale(cif_dev, intstat_glb);
|
||||
return intstat_glb;
|
||||
}
|
||||
|
||||
|
||||
@@ -1301,8 +1301,10 @@ static irqreturn_t rkcif_irq_handler(int irq, void *ctx)
|
||||
cif_hw->cif_dev[i]->err_state = 0;
|
||||
schedule_work(&cif_hw->cif_dev[i]->err_state_work.work);
|
||||
}
|
||||
if (cif_hw->chip_id >= CHIP_RK3588_CIF && intstat_glb)
|
||||
if (cif_hw->chip_id >= CHIP_RK3588_CIF && intstat_glb) {
|
||||
rkcif_irq_handle_toisp(cif_hw->cif_dev[i], intstat_glb);
|
||||
rkcif_irq_handle_scale(cif_hw->cif_dev[i], intstat_glb);
|
||||
}
|
||||
}
|
||||
}
|
||||
irq_stop = ktime_get_ns();
|
||||
|
||||
@@ -1037,7 +1037,7 @@ static int flexbus_cif_stream_start(struct flexbus_cif_stream *stream)
|
||||
flexbus_cif_write_register(dev, FLEXBUS_SLAVE_MODE, BIT(1) | BIT(0));
|
||||
val = flexbus_cif_read_register(dev, FLEXBUS_RX_CTL);
|
||||
val &= ~FLEXBUS_DST_WAT_LVL_MASK;
|
||||
val |= FLEXBUS_DFS_8BIT;
|
||||
val |= dev->fb_dev->dfs_reg->dfs_8bit;
|
||||
val |= FLEXBUS_CONTINUE_MODE;
|
||||
val |= FLEXBUS_AUTOPAD;
|
||||
flexbus_cif_write_register(dev, FLEXBUS_RX_CTL, val);
|
||||
@@ -1048,6 +1048,17 @@ static int flexbus_cif_stream_start(struct flexbus_cif_stream *stream)
|
||||
flexbus_cif_write_register(dev, FLEXBUS_DVP_ORDER, stream->cif_fmt_in->cif_yuv_order |
|
||||
stream->cif_fmt_out->cif_yuv_order);
|
||||
|
||||
if (dev->chip_id == RK_FLEXBUS_CIF_RK3506) {
|
||||
if (stream->cif_fmt_out->fourcc == V4L2_PIX_FMT_RGB24)
|
||||
flexbus_cif_write_register(dev, FLEXBUS_DVP_YUV2RGB,
|
||||
CIF_YUV2RGB_ENABLE | CIF_YUV2RGB_B_LSB | CIF_YUV2RGB_BT601_FULL);
|
||||
else if (stream->cif_fmt_out->fourcc == V4L2_PIX_FMT_BGR24)
|
||||
flexbus_cif_write_register(dev, FLEXBUS_DVP_YUV2RGB,
|
||||
CIF_YUV2RGB_ENABLE | CIF_YUV2RGB_BT601_FULL);
|
||||
else
|
||||
flexbus_cif_write_register(dev, FLEXBUS_DVP_YUV2RGB, 0);
|
||||
}
|
||||
|
||||
flexbus_cif_write_register_or(dev, FLEXBUS_IMR, CIF_FIFO_OVERFLOW |
|
||||
CIF_BANDWIDTH_LACK |
|
||||
CIF_DMA_END |
|
||||
@@ -1174,10 +1185,7 @@ static int flexbus_cif_init_vb2_queue(struct vb2_queue *q,
|
||||
q->io_modes = VB2_MMAP | VB2_DMABUF;
|
||||
q->drv_priv = stream;
|
||||
q->ops = &flexbus_cif_vb2_ops;
|
||||
if (stream->cif_dev->is_dma_sg_ops)
|
||||
q->mem_ops = &vb2_cma_sg_memops;
|
||||
else
|
||||
q->mem_ops = &vb2_dma_contig_memops;
|
||||
q->mem_ops = &vb2_cma_sg_memops;
|
||||
q->buf_struct_size = sizeof(struct flexbus_cif_buffer);
|
||||
q->min_buffers_needed = CIF_REQ_BUFS_MIN;
|
||||
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
||||
|
||||
@@ -513,14 +513,22 @@ static int flexbus_cif_plat_uninit(struct flexbus_cif_device *cif_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct flexbus_cif_match_data cif_match_data = {
|
||||
static const struct flexbus_cif_match_data rk3576_cif_match_data = {
|
||||
.chip_id = RK_FLEXBUS_CIF_RK3576,
|
||||
};
|
||||
|
||||
static const struct flexbus_cif_match_data rk3506_cif_match_data = {
|
||||
.chip_id = RK_FLEXBUS_CIF_RK3506,
|
||||
};
|
||||
|
||||
static const struct of_device_id flexbus_cif_plat_of_match[] = {
|
||||
{
|
||||
.compatible = "rockchip,flexbus-cif-rk3576",
|
||||
.data = &cif_match_data,
|
||||
.data = &rk3576_cif_match_data,
|
||||
},
|
||||
{
|
||||
.compatible = "rockchip,flexbus-cif-rk3506",
|
||||
.data = &rk3506_cif_match_data,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
@@ -82,6 +82,7 @@ enum flexbus_cif_crop_src {
|
||||
|
||||
enum flexbus_cif_chip_id {
|
||||
RK_FLEXBUS_CIF_RK3576,
|
||||
RK_FLEXBUS_CIF_RK3506,
|
||||
};
|
||||
|
||||
struct flexbus_cif_match_data {
|
||||
|
||||
@@ -65,6 +65,43 @@ void rockchip_flexbus_clrsetbits(struct rockchip_flexbus *rkfb, unsigned int reg
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_flexbus_clrsetbits);
|
||||
|
||||
static struct rockchip_flexbus_dfs_reg rockchip_flexbus_dfs_reg_v0 = {
|
||||
.dfs_2bit = 0x0,
|
||||
.dfs_4bit = 0x1,
|
||||
.dfs_8bit = 0x2,
|
||||
.dfs_16bit = 0x3,
|
||||
.dfs_mask = 0x3,
|
||||
};
|
||||
|
||||
static struct rockchip_flexbus_dfs_reg rockchip_flexbus_dfs_reg_v1 = {
|
||||
.dfs_1bit = (0x0 << 29),
|
||||
.dfs_2bit = (0x1 << 29),
|
||||
.dfs_4bit = (0x2 << 29),
|
||||
.dfs_8bit = (0x3 << 29),
|
||||
.dfs_16bit = (0x4 << 29),
|
||||
.dfs_mask = (0x7 << 29),
|
||||
};
|
||||
|
||||
#define RK3506_GRF_SOC_CON1 0x0004
|
||||
static void rk3506_flexbus_init_config(struct rockchip_flexbus *rkfb)
|
||||
{
|
||||
regmap_write(rkfb->regmap_grf, RK3506_GRF_SOC_CON1, BIT(4 + 16));
|
||||
}
|
||||
|
||||
static void rk3506_flexbus_grf_config(struct rockchip_flexbus *rkfb, bool slave_mode, bool cpol,
|
||||
bool cpha)
|
||||
{
|
||||
u32 val = 0x3 << 16;
|
||||
|
||||
if (slave_mode) {
|
||||
if ((!cpol && cpha) || (cpol && !cpha))
|
||||
val |= BIT(0);
|
||||
} else {
|
||||
val |= BIT(1);
|
||||
}
|
||||
regmap_write(rkfb->regmap_grf, RK3506_GRF_SOC_CON1, val);
|
||||
}
|
||||
|
||||
#define RK3576_VCCIO_IOC_MISC_CON0 0x6400
|
||||
static void rk3576_flexbus_grf_config(struct rockchip_flexbus *rkfb, bool slave_mode, bool cpol,
|
||||
bool cpha)
|
||||
@@ -146,8 +183,10 @@ static int rockchip_flexbus_probe(struct platform_device *pdev)
|
||||
|
||||
rkfb->regmap_grf = syscon_regmap_lookup_by_phandle_optional(pdev->dev.of_node,
|
||||
"rockchip,grf");
|
||||
if (!rkfb->regmap_grf)
|
||||
dev_warn(&pdev->dev, "failed to get rockchip,grf node.\n");
|
||||
if (!rkfb->regmap_grf) {
|
||||
dev_err(&pdev->dev, "failed to get rockchip,grf node.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rkfb->num_clks = devm_clk_bulk_get_all(&pdev->dev, &rkfb->clks);
|
||||
if (rkfb->num_clks <= 0) {
|
||||
@@ -166,6 +205,9 @@ static int rockchip_flexbus_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (rkfb->config->init_config)
|
||||
rkfb->config->init_config(rkfb);
|
||||
|
||||
if (rkfb->opmode0 != ROCKCHIP_FLEXBUS0_OPMODE_NULL &&
|
||||
rkfb->opmode1 != ROCKCHIP_FLEXBUS1_OPMODE_NULL)
|
||||
rockchip_flexbus_writel(rkfb, FLEXBUS_COM_CTL, FLEXBUS_TX_AND_RX);
|
||||
@@ -174,15 +216,35 @@ static int rockchip_flexbus_probe(struct platform_device *pdev)
|
||||
else
|
||||
rockchip_flexbus_writel(rkfb, FLEXBUS_COM_CTL, FLEXBUS_RX_ONLY);
|
||||
|
||||
switch (rockchip_flexbus_readl(rkfb, FLEXBUS_REVISION) >> 24 & 0xff) {
|
||||
case 0x0:
|
||||
rkfb->dfs_reg = &rockchip_flexbus_dfs_reg_v0;
|
||||
break;
|
||||
case 0x1:
|
||||
rkfb->dfs_reg = &rockchip_flexbus_dfs_reg_v1;
|
||||
break;
|
||||
default:
|
||||
dev_err(&pdev->dev, "failed to get large version.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return devm_of_platform_populate(&pdev->dev);
|
||||
}
|
||||
|
||||
static const struct rockchip_flexbus_config rk3506_flexbus_config = {
|
||||
.init_config = rk3506_flexbus_init_config,
|
||||
.grf_config = rk3506_flexbus_grf_config,
|
||||
.txwat_start_max = 255,
|
||||
};
|
||||
|
||||
static const struct rockchip_flexbus_config rk3576_flexbus_config = {
|
||||
.grf_config = rk3576_flexbus_grf_config,
|
||||
.txwat_start_max = 511,
|
||||
.init_config = NULL,
|
||||
.grf_config = rk3576_flexbus_grf_config,
|
||||
.txwat_start_max = 511,
|
||||
};
|
||||
|
||||
static const struct of_device_id rockchip_flexbus_of_match[] = {
|
||||
{ .compatible = "rockchip,rk3506-flexbus", .data = &rk3506_flexbus_config},
|
||||
{ .compatible = "rockchip,rk3576-flexbus", .data = &rk3576_flexbus_config},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
@@ -210,7 +210,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
|
||||
{
|
||||
u8 status2;
|
||||
struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2,
|
||||
&status2);
|
||||
spinand->scratchbuf);
|
||||
int ret;
|
||||
|
||||
switch (status & STATUS_ECC_MASK) {
|
||||
@@ -231,6 +231,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
|
||||
* report the maximum of 4 in this case
|
||||
*/
|
||||
/* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */
|
||||
status2 = *(spinand->scratchbuf);
|
||||
return ((status & STATUS_ECC_MASK) >> 2) |
|
||||
((status2 & STATUS_ECC_MASK) >> 4);
|
||||
|
||||
@@ -252,7 +253,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
|
||||
{
|
||||
u8 status2;
|
||||
struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2,
|
||||
&status2);
|
||||
spinand->scratchbuf);
|
||||
int ret;
|
||||
|
||||
switch (status & STATUS_ECC_MASK) {
|
||||
@@ -272,6 +273,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
|
||||
* 1 ... 4 bits are flipped (and corrected)
|
||||
*/
|
||||
/* bits sorted this way (1...0): ECCSE1, ECCSE0 */
|
||||
status2 = *(spinand->scratchbuf);
|
||||
return ((status2 & STATUS_ECC_MASK) >> 4) + 1;
|
||||
|
||||
case STATUS_ECC_UNCOR_ERROR:
|
||||
|
||||
@@ -830,7 +830,7 @@ static int rk3576_canfd_rx_poll(struct napi_struct *napi, int quota)
|
||||
while (work_done < rcan->quota)
|
||||
work_done += rk3576_canfd_rx(ndev, work_done);
|
||||
|
||||
if (work_done < rcan->rx_fifo_depth) {
|
||||
if (work_done <= rcan->rx_fifo_depth) {
|
||||
napi_complete_done(napi, work_done);
|
||||
rk3576_canfd_write(rcan, CANFD_INT_MASK, INT_ENABLE);
|
||||
}
|
||||
@@ -846,7 +846,7 @@ static int rk3576_canfd_rx_poll(struct napi_struct *napi, int quota)
|
||||
while (work_done < quota)
|
||||
work_done += rk3576_canfd_rx(ndev, CANFD_RXFRD);
|
||||
|
||||
if (work_done < rcan->rx_fifo_depth) {
|
||||
if (work_done <= rcan->rx_fifo_depth) {
|
||||
napi_complete_done(napi, work_done);
|
||||
rk3576_canfd_write(rcan, CANFD_INT_MASK, INT_ENABLE);
|
||||
}
|
||||
|
||||
@@ -1393,6 +1393,84 @@ static const struct rk_gmac_ops rk3399_ops = {
|
||||
.set_rmii_speed = rk3399_set_rmii_speed,
|
||||
};
|
||||
|
||||
#define RK3506_GRF_SOC_CON8 0X0020
|
||||
#define RK3506_GRF_SOC_CON11 0X002c
|
||||
|
||||
#define RK3506_GMAC_RMII_MODE GRF_BIT(1)
|
||||
|
||||
#define RK3506_GMAC_CLK_RMII_DIV2 GRF_BIT(3)
|
||||
#define RK3506_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(3)
|
||||
|
||||
#define RK3506_GMAC_CLK_SELET_CRU GRF_CLR_BIT(5)
|
||||
#define RK3506_GMAC_CLK_SELET_IO GRF_BIT(5)
|
||||
|
||||
#define RK3506_GMAC_CLK_RMII_GATE GRF_BIT(2)
|
||||
#define RK3506_GMAC_CLK_RMII_NOGATE GRF_CLR_BIT(2)
|
||||
|
||||
static void rk3506_set_to_rmii(struct rk_priv_data *bsp_priv)
|
||||
{
|
||||
struct device *dev = &bsp_priv->pdev->dev;
|
||||
unsigned int id = bsp_priv->id, offset;
|
||||
|
||||
if (IS_ERR(bsp_priv->grf)) {
|
||||
dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
offset = (id == 1) ? RK3506_GRF_SOC_CON11 : RK3506_GRF_SOC_CON8;
|
||||
regmap_write(bsp_priv->grf, offset, RK3506_GMAC_RMII_MODE);
|
||||
}
|
||||
|
||||
static void rk3506_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
|
||||
{
|
||||
struct device *dev = &bsp_priv->pdev->dev;
|
||||
unsigned int val, offset, id = bsp_priv->id;
|
||||
|
||||
switch (speed) {
|
||||
case 10:
|
||||
val = RK3506_GMAC_CLK_RMII_DIV20;
|
||||
break;
|
||||
case 100:
|
||||
val = RK3506_GMAC_CLK_RMII_DIV2;
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
offset = (id == 1) ? RK3506_GRF_SOC_CON11 : RK3506_GRF_SOC_CON8;
|
||||
regmap_write(bsp_priv->grf, offset, val);
|
||||
|
||||
return;
|
||||
err:
|
||||
dev_err(dev, "unknown RMII speed value for GMAC speed=%d", speed);
|
||||
}
|
||||
|
||||
static void rk3506_set_clock_selection(struct rk_priv_data *bsp_priv,
|
||||
bool input, bool enable)
|
||||
{
|
||||
unsigned int value, offset, id = bsp_priv->id;
|
||||
|
||||
offset = (id == 1) ? RK3506_GRF_SOC_CON11 : RK3506_GRF_SOC_CON8;
|
||||
|
||||
value = input ? RK3506_GMAC_CLK_SELET_IO :
|
||||
RK3506_GMAC_CLK_SELET_CRU;
|
||||
value |= enable ? RK3506_GMAC_CLK_RMII_NOGATE :
|
||||
RK3506_GMAC_CLK_RMII_GATE;
|
||||
regmap_write(bsp_priv->grf, offset, value);
|
||||
}
|
||||
|
||||
static const struct rk_gmac_ops rk3506_ops = {
|
||||
.set_to_rmii = rk3506_set_to_rmii,
|
||||
.set_rmii_speed = rk3506_set_rmii_speed,
|
||||
.set_clock_selection = rk3506_set_clock_selection,
|
||||
.regs_valid = true,
|
||||
.regs = {
|
||||
0xff4c8000, /* gmac0 */
|
||||
0xff4d0000, /* gmac1 */
|
||||
0x0, /* sentinel */
|
||||
},
|
||||
};
|
||||
|
||||
#define RK3528_VO_GRF_GMAC_CON 0X60018
|
||||
#define RK3528_VPU_GRF_GMAC_CON5 0X40018
|
||||
#define RK3528_VPU_GRF_GMAC_CON6 0X4001c
|
||||
@@ -3147,6 +3225,9 @@ static const struct of_device_id rk_gmac_dwmac_match[] = {
|
||||
#ifdef CONFIG_CPU_RK3399
|
||||
{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3506
|
||||
{ .compatible = "rockchip,rk3506-gmac", .data = &rk3506_ops },
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3528
|
||||
{ .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops },
|
||||
#endif
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#define PHY_ID_YT8511 0x0000010a
|
||||
#define PHY_ID_YT8512 0x00000118
|
||||
#define PHY_ID_YT8512B 0x00000128
|
||||
#define PHY_ID_YT8522 0x4f51e928
|
||||
#define PHY_ID_YT8531S 0x4f51e91a
|
||||
#define PHY_ID_YT8531 0x4f51e91b
|
||||
|
||||
@@ -43,7 +44,7 @@ struct yt8011_priv {
|
||||
#define REG_DEBUG_ADDR_OFFSET 0x1e
|
||||
#define REG_DEBUG_DATA 0x1f
|
||||
#define REG_MII_MMD_CTRL 0x0D /* MMD access control register */
|
||||
#define REG_MII_MMD_DATA 0x0E /* MMD access data register */
|
||||
#define REG_MII_MMD_DATA 0x0E /* MMD access data register */
|
||||
|
||||
#define YT8511_PAGE_SELECT 0x1e
|
||||
#define YT8511_PAGE 0x1f
|
||||
@@ -99,6 +100,22 @@ struct yt8011_priv {
|
||||
#define YT8512_DUPLEX_BIT 13
|
||||
#define YT8512_EN_SLEEP_SW_BIT 15
|
||||
|
||||
#define YT8522_TX_CLK_DELAY 0x4210
|
||||
#define YT8522_ANAGLOG_IF_CTRL 0x4008
|
||||
#define YT8522_DAC_CTRL 0x2057
|
||||
#define YT8522_INTERPOLATOR_FILTER_1 0x14
|
||||
#define YT8522_INTERPOLATOR_FILTER_2 0x15
|
||||
#define YT8522_EXTENDED_COMBO_CTRL_1 0x4000
|
||||
|
||||
#define YTXXXX_SPEED_MODE 0xc000
|
||||
#define YTXXXX_DUPLEX 0x2000
|
||||
#define YTXXXX_SPEED_MODE_BIT 14
|
||||
#define YTXXXX_DUPLEX_BIT 13
|
||||
#define YTXXXX_AUTO_NEGOTIATION_BIT 12
|
||||
#define YTXXXX_ASYMMETRIC_PAUSE_BIT 11
|
||||
#define YTXXXX_PAUSE_BIT 10
|
||||
#define YTXXXX_LINK_STATUS_BIT 10
|
||||
|
||||
/* if system depends on ethernet packet to restore from sleep,
|
||||
* please define this macro to 1 otherwise, define it to 0.
|
||||
*/
|
||||
@@ -114,6 +131,11 @@ struct yt8011_priv {
|
||||
#define SYS_WAKEUP_BASED_ON_ETH_PKT 1
|
||||
#endif
|
||||
|
||||
struct yt8xxx_priv {
|
||||
u8 polling_mode;
|
||||
u8 chip_mode;
|
||||
};
|
||||
|
||||
/* for YT8531 package A xtal init config */
|
||||
#define YTPHY8531A_XTAL_INIT 0
|
||||
|
||||
@@ -913,6 +935,109 @@ static int yt8521_resume(struct phy_device *phydev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int yt8522_read_status(struct phy_device *phydev)
|
||||
{
|
||||
int speed, speed_mode, duplex, val;
|
||||
|
||||
genphy_read_status(phydev);
|
||||
val = phy_read(phydev, REG_PHY_SPEC_STATUS);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
/* link up */
|
||||
if ((val & BIT(10)) >> YTXXXX_LINK_STATUS_BIT) {
|
||||
duplex = (val & BIT(13)) >> YTXXXX_DUPLEX_BIT;
|
||||
speed_mode = (val & (BIT(15) | BIT(14))) >> YTXXXX_SPEED_MODE_BIT;
|
||||
switch (speed_mode) {
|
||||
case 0:
|
||||
speed = SPEED_10;
|
||||
break;
|
||||
case 1:
|
||||
speed = SPEED_100;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
default:
|
||||
speed = SPEED_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
phydev->link = 1;
|
||||
phydev->speed = speed;
|
||||
phydev->duplex = duplex;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
phydev->link = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int yt8522_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
struct yt8xxx_priv *priv;
|
||||
int chip_config;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
phydev->priv = priv;
|
||||
|
||||
chip_config = ytphy_read_ext(phydev, YT8522_EXTENDED_COMBO_CTRL_1);
|
||||
|
||||
priv->chip_mode = ((chip_config & BIT(3)) >> 3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int yt8522_config_init(struct phy_device *phydev)
|
||||
{
|
||||
struct yt8xxx_priv *priv = phydev->priv;
|
||||
int ret;
|
||||
int val;
|
||||
|
||||
/* UTP */
|
||||
if (!priv->chip_mode) {
|
||||
val = ytphy_write_ext(phydev, YT8522_TX_CLK_DELAY, 0);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
val = ytphy_write_ext(phydev, YT8522_ANAGLOG_IF_CTRL, 0xbf2a);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
val = ytphy_write_ext(phydev, YT8522_DAC_CTRL, 0x297f);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
val = ytphy_write_ext(phydev, YT8522_INTERPOLATOR_FILTER_1, 0x1FE);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
val = ytphy_write_ext(phydev, YT8522_INTERPOLATOR_FILTER_2, 0x1FE);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
/* disable auto sleep */
|
||||
val = ytphy_read_ext(phydev, YT8512_EXTREG_SLEEP_CONTROL1);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
val &= (~BIT(YT8512_EN_SLEEP_SW_BIT));
|
||||
|
||||
ret = ytphy_write_ext(phydev, YT8512_EXTREG_SLEEP_CONTROL1, val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ytphy_soft_reset(phydev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int yt8531_rxclk_duty_init(struct phy_device *phydev)
|
||||
{
|
||||
unsigned int value = 0x9696;
|
||||
@@ -1045,6 +1170,17 @@ static struct phy_driver motorcomm_phy_drvs[] = {
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
}, {
|
||||
PHY_ID_MATCH_EXACT(PHY_ID_YT8522),
|
||||
.name = "YT8522 100M Ethernet",
|
||||
.features = PHY_BASIC_FEATURES,
|
||||
.probe = yt8522_probe,
|
||||
.soft_reset = ytphy_soft_reset,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.config_init = yt8522_config_init,
|
||||
.read_status = yt8522_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
}, {
|
||||
/* same as 8521 */
|
||||
PHY_ID_MATCH_EXACT(PHY_ID_YT8531S),
|
||||
.name = "YT8531S Gigabit Ethernet",
|
||||
@@ -1084,6 +1220,7 @@ static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8512) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8512B) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8522) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
|
||||
{ /* sentinal */ }
|
||||
|
||||
@@ -866,6 +866,12 @@ static const struct of_device_id rockchip_otp_match[] = {
|
||||
.data = (void *)&px30s_data,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3506
|
||||
{
|
||||
.compatible = "rockchip,rk3506-otp",
|
||||
.data = (void *)&rk3528_data,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3528
|
||||
{
|
||||
.compatible = "rockchip,rk3528-otp",
|
||||
|
||||
@@ -106,6 +106,30 @@
|
||||
#define VOD_MID_RANGE 0x3
|
||||
#define VOD_BIG_RANGE 0x7
|
||||
#define VOD_MAX_RANGE 0xf
|
||||
#define RK3506_VOD_MIN_RANGE 0x8
|
||||
#define RK3506_VOD_MID_RANGE 0xc
|
||||
#define RK3506_VOD_BIG_RANGE 0xe
|
||||
#define RK3506_VOD_MAX_RANGE 0xf
|
||||
/* Analog Register Part: reg18 */
|
||||
#define LANE0_PRE_EMPHASIS_ENABLE_MASK BIT(6)
|
||||
#define LANE0_PRE_EMPHASIS_ENABLE BIT(6)
|
||||
#define LANE0_PRE_EMPHASIS_DISABLE 0
|
||||
#define LANE1_PRE_EMPHASIS_ENABLE_MASK BIT(5)
|
||||
#define LANE1_PRE_EMPHASIS_ENABLE BIT(5)
|
||||
#define LANE1_PRE_EMPHASIS_DISABLE 0
|
||||
/* Analog Register Part: reg19 */
|
||||
#define PRE_EMPHASIS_RANGE_SET_MASK GENMASK(7, 6)
|
||||
#define PRE_EMPHASIS_RANGE_SET(x) UPDATE(x, 7, 6)
|
||||
/* Analog Register Part: reg1A */
|
||||
#define LANE0_PRE_EMPHASIS_RANGE_SET_MASK GENMASK(7, 6)
|
||||
#define LANE0_PRE_EMPHASIS_RANGE_SET(x) UPDATE(x, 7, 6)
|
||||
/* Analog Register Part: reg1B */
|
||||
#define LANE1_PRE_EMPHASIS_RANGE_SET_MASK GENMASK(7, 6)
|
||||
#define LANE1_PRE_EMPHASIS_RANGE_SET(x) UPDATE(x, 7, 6)
|
||||
#define PRE_EMPHASIS_MIN_RANGE 0x0
|
||||
#define PRE_EMPHASIS_MID_RANGE 0x1
|
||||
#define PRE_EMPHASIS_MAX_RANGE 0x2
|
||||
#define PRE_EMPHASIS_RESERVED_RANGE 0x3
|
||||
/* Analog Register Part: reg1E */
|
||||
#define PLL_MODE_SEL_MASK GENMASK(6, 5)
|
||||
#define PLL_MODE_SEL_LVDS_MODE 0
|
||||
@@ -208,6 +232,7 @@ enum soc_type {
|
||||
PX30S,
|
||||
RK3128,
|
||||
RK3368,
|
||||
RK3506,
|
||||
RK3562,
|
||||
RK3568,
|
||||
RV1126,
|
||||
@@ -215,6 +240,7 @@ enum soc_type {
|
||||
|
||||
enum phy_max_rate {
|
||||
MAX_1GHZ,
|
||||
MAX_1_5GHZ,
|
||||
MAX_2_5GHZ,
|
||||
};
|
||||
|
||||
@@ -223,6 +249,7 @@ struct inno_dsidphy_plat_data {
|
||||
const struct inno_mipi_dphy_timing *inno_mipi_dphy_timing_table;
|
||||
const unsigned int num_timings;
|
||||
enum phy_max_rate max_rate;
|
||||
unsigned int max_lanes;
|
||||
};
|
||||
|
||||
struct inno_dsidphy {
|
||||
@@ -283,6 +310,23 @@ struct inno_mipi_dphy_timing inno_mipi_dphy_timing_table_max_1ghz[] = {
|
||||
{1000, 0x0, 0x09, 0x20, 0x09, 0x27},
|
||||
};
|
||||
|
||||
struct inno_mipi_dphy_timing inno_mipi_dphy_timing_table_max_1_5ghz[] = {
|
||||
{ 110, 0x02, 0x7f, 0x16, 0x02, 0x02},
|
||||
{ 150, 0x02, 0x7f, 0x16, 0x03, 0x02},
|
||||
{ 200, 0x02, 0x7f, 0x17, 0x04, 0x02},
|
||||
{ 250, 0x02, 0x7f, 0x17, 0x05, 0x04},
|
||||
{ 300, 0x02, 0x7f, 0x18, 0x06, 0x04},
|
||||
{ 400, 0x03, 0x7e, 0x19, 0x07, 0x04},
|
||||
{ 500, 0x03, 0x7c, 0x1b, 0x07, 0x08},
|
||||
{ 600, 0x03, 0x70, 0x1d, 0x08, 0x10},
|
||||
{ 700, 0x05, 0x40, 0x1e, 0x08, 0x30},
|
||||
{ 800, 0x05, 0x02, 0x1f, 0x09, 0x30},
|
||||
{1000, 0x05, 0x08, 0x20, 0x09, 0x30},
|
||||
{1200, 0x06, 0x03, 0x32, 0x14, 0x0f},
|
||||
{1400, 0x09, 0x03, 0x32, 0x14, 0x0f},
|
||||
{1500, 0x0d, 0x42, 0x36, 0x0e, 0x0f},
|
||||
};
|
||||
|
||||
static const
|
||||
struct inno_mipi_dphy_timing inno_mipi_dphy_timing_table_max_2_5ghz[] = {
|
||||
{ 110, 0x02, 0x7f, 0x16, 0x02, 0x02},
|
||||
@@ -450,6 +494,35 @@ static void inno_mipi_dphy_max_2_5GHz_pll_enable(struct inno_dsidphy *inno)
|
||||
REG_LDOPD_POWER_ON | REG_PLLPD_POWER_ON);
|
||||
}
|
||||
|
||||
static void inno_mipi_dphy_max_1_5GHz_pll_enable(struct inno_dsidphy *inno)
|
||||
{
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x03,
|
||||
REG_PREDIV_MASK, REG_PREDIV(inno->pll.prediv));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x03,
|
||||
REG_FBDIV_HI_MASK, REG_FBDIV_HI(inno->pll.fbdiv));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x04,
|
||||
REG_FBDIV_LO_MASK, REG_FBDIV_LO(inno->pll.fbdiv));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x18,
|
||||
LANE0_PRE_EMPHASIS_ENABLE_MASK, LANE0_PRE_EMPHASIS_ENABLE);
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x18,
|
||||
LANE1_PRE_EMPHASIS_ENABLE_MASK, LANE1_PRE_EMPHASIS_ENABLE);
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x19,
|
||||
PRE_EMPHASIS_RANGE_SET_MASK,
|
||||
PRE_EMPHASIS_RANGE_SET(PRE_EMPHASIS_MID_RANGE));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x1a,
|
||||
LANE0_PRE_EMPHASIS_RANGE_SET_MASK,
|
||||
LANE0_PRE_EMPHASIS_RANGE_SET(PRE_EMPHASIS_MID_RANGE));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x1b,
|
||||
LANE1_PRE_EMPHASIS_RANGE_SET_MASK,
|
||||
LANE1_PRE_EMPHASIS_RANGE_SET(PRE_EMPHASIS_MID_RANGE));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x0b,
|
||||
CLOCK_LANE_VOD_RANGE_SET_MASK,
|
||||
CLOCK_LANE_VOD_RANGE_SET(RK3506_VOD_MAX_RANGE));
|
||||
phy_update_bits(inno, REGISTER_PART_ANALOG, 0x01,
|
||||
REG_LDOPD_MASK | REG_PLLPD_MASK,
|
||||
REG_LDOPD_POWER_ON | REG_PLLPD_POWER_ON);
|
||||
}
|
||||
|
||||
static void inno_mipi_dphy_max_1GHz_pll_enable(struct inno_dsidphy *inno)
|
||||
{
|
||||
/* Configure PLL */
|
||||
@@ -637,6 +710,8 @@ static void inno_dsidphy_mipi_mode_enable(struct inno_dsidphy *inno)
|
||||
|
||||
if (inno->pdata->max_rate == MAX_2_5GHZ)
|
||||
inno_mipi_dphy_max_2_5GHz_pll_enable(inno);
|
||||
else if (inno->pdata->max_rate == MAX_1_5GHZ)
|
||||
inno_mipi_dphy_max_1_5GHz_pll_enable(inno);
|
||||
else
|
||||
inno_mipi_dphy_max_1GHz_pll_enable(inno);
|
||||
|
||||
@@ -880,6 +955,7 @@ static const struct inno_dsidphy_plat_data px30_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_1ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_1ghz),
|
||||
.max_rate = MAX_1GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data px30s_video_phy_plat_data = {
|
||||
@@ -887,6 +963,7 @@ static const struct inno_dsidphy_plat_data px30s_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_2_5ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_2_5ghz),
|
||||
.max_rate = MAX_2_5GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data rk3128_video_phy_plat_data = {
|
||||
@@ -894,6 +971,7 @@ static const struct inno_dsidphy_plat_data rk3128_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_1ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_1ghz),
|
||||
.max_rate = MAX_1GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data rk3368_video_phy_plat_data = {
|
||||
@@ -901,6 +979,15 @@ static const struct inno_dsidphy_plat_data rk3368_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_1ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_1ghz),
|
||||
.max_rate = MAX_1GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data rk3506_video_phy_plat_data = {
|
||||
.soc_type = RK3506,
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_1_5ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_1_5ghz),
|
||||
.max_rate = MAX_1_5GHZ,
|
||||
.max_lanes = 2,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data rk3562_video_phy_plat_data = {
|
||||
@@ -908,6 +995,7 @@ static const struct inno_dsidphy_plat_data rk3562_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_2_5ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_2_5ghz),
|
||||
.max_rate = MAX_2_5GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data rk3568_video_phy_plat_data = {
|
||||
@@ -915,6 +1003,7 @@ static const struct inno_dsidphy_plat_data rk3568_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_2_5ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_2_5ghz),
|
||||
.max_rate = MAX_2_5GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static const struct inno_dsidphy_plat_data rv1126_video_phy_plat_data = {
|
||||
@@ -922,6 +1011,7 @@ static const struct inno_dsidphy_plat_data rv1126_video_phy_plat_data = {
|
||||
.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_2_5ghz,
|
||||
.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_2_5ghz),
|
||||
.max_rate = MAX_2_5GHZ,
|
||||
.max_lanes = 4,
|
||||
};
|
||||
|
||||
static int inno_dsidphy_probe(struct platform_device *pdev)
|
||||
@@ -993,7 +1083,9 @@ static int inno_dsidphy_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
if (device_property_read_u32(dev, "inno,lanes", &inno->lanes))
|
||||
inno->lanes = 4;
|
||||
inno->lanes = inno->pdata->max_lanes;
|
||||
else if (inno->lanes > inno->pdata->max_lanes)
|
||||
inno->lanes = inno->pdata->max_lanes;
|
||||
|
||||
if (device_property_read_u32(dev, "inno,lvds-vcom", &inno->lvds_vcom))
|
||||
inno->lvds_vcom = 950;
|
||||
@@ -1037,6 +1129,9 @@ static const struct of_device_id inno_dsidphy_of_match[] = {
|
||||
}, {
|
||||
.compatible = "rockchip,rk3368-dsi-dphy",
|
||||
.data = &rk3368_video_phy_plat_data,
|
||||
}, {
|
||||
.compatible = "rockchip,rk3506-dsi-dphy",
|
||||
.data = &rk3506_video_phy_plat_data,
|
||||
}, {
|
||||
.compatible = "rockchip,rk3562-dsi-dphy",
|
||||
.data = &rk3562_video_phy_plat_data,
|
||||
|
||||
@@ -247,6 +247,8 @@ struct rockchip_usb2phy_cfg {
|
||||
* @sel_pipe_phystatus: select pipe phystatus from grf.
|
||||
* @suspended: phy suspended flag.
|
||||
* @typec_vbus_det: Type-C otg vbus detect.
|
||||
* @gpio_vbus_det: gpio otg vbus detect.
|
||||
* @gpio_id_det: gpio otg id detect.
|
||||
* @utmi_avalid: utmi avalid status usage flag.
|
||||
* true - use avalid to get vbus status
|
||||
* false - use bvalid to get vbus status
|
||||
@@ -270,6 +272,8 @@ struct rockchip_usb2phy_cfg {
|
||||
* @sw: orientation switch, communicate with TCPM (Type-C Port Manager).
|
||||
* @port_cfg: port register configuration, assigned by driver data.
|
||||
* @event_nb: hold event notification callback.
|
||||
* @gpio_vbus_nb: hold extcon usb gpio vbus notification callback.
|
||||
* @gpio_id_nb: hold extcon usb gpio id notification callback.
|
||||
* @state: define OTG enumeration states before device reset.
|
||||
* @mode: the dr_mode of the controller.
|
||||
*/
|
||||
@@ -282,6 +286,8 @@ struct rockchip_usb2phy_port {
|
||||
bool sel_pipe_phystatus;
|
||||
bool suspended;
|
||||
bool typec_vbus_det;
|
||||
bool gpio_vbus_det;
|
||||
bool gpio_id_det;
|
||||
bool utmi_avalid;
|
||||
bool vbus_attached;
|
||||
bool vbus_always_on;
|
||||
@@ -302,6 +308,8 @@ struct rockchip_usb2phy_port {
|
||||
struct typec_switch_dev *sw;
|
||||
const struct rockchip_usb2phy_port_cfg *port_cfg;
|
||||
struct notifier_block event_nb;
|
||||
struct notifier_block gpio_vbus_nb;
|
||||
struct notifier_block gpio_id_nb;
|
||||
struct wake_lock wakelock;
|
||||
enum usb_otg_state state;
|
||||
enum usb_dr_mode mode;
|
||||
@@ -1250,6 +1258,9 @@ static void rockchip_usb2phy_otg_sm_work(struct work_struct *work)
|
||||
if (rport->port_cfg->bvalid_grf_con.enable && rport->typec_vbus_det)
|
||||
rport->vbus_attached =
|
||||
property_enabled(rphy->grf, &rport->port_cfg->bvalid_grf_con);
|
||||
else if (rport->gpio_vbus_det)
|
||||
rport->vbus_attached =
|
||||
extcon_get_state(rphy->edev, EXTCON_USB);
|
||||
else if (rport->utmi_avalid)
|
||||
rport->vbus_attached =
|
||||
property_enabled(rphy->grf, &rport->port_cfg->utmi_avalid);
|
||||
@@ -2053,6 +2064,88 @@ static void rockchip_usb2phy_usb_bvalid_enable(struct rockchip_usb2phy_port *rpo
|
||||
property_enable(rphy->grf, &cfg->bvalid_grf_con, enable);
|
||||
}
|
||||
|
||||
static int rockchip_usb2phy_gpio_vbus_notifier(struct notifier_block *nb,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct rockchip_usb2phy_port *rport =
|
||||
container_of(nb, struct rockchip_usb2phy_port, gpio_vbus_nb);
|
||||
struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent);
|
||||
|
||||
/* no need to control bvalid if USB_HOST state is true */
|
||||
if (extcon_get_state(rphy->edev, EXTCON_USB_HOST) > 0)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
rockchip_usb2phy_usb_bvalid_enable(rport,
|
||||
extcon_get_state(rphy->edev, EXTCON_USB));
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static int rockchip_usb2phy_gpio_id_notifier(struct notifier_block *nb,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct rockchip_usb2phy_port *rport =
|
||||
container_of(nb, struct rockchip_usb2phy_port, gpio_id_nb);
|
||||
struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent);
|
||||
struct regmap *base = get_reg_base(rphy);
|
||||
int state = extcon_get_state(rphy->edev, EXTCON_USB_HOST);
|
||||
bool iddig_output = property_enabled(base, &rport->port_cfg->iddig_output);
|
||||
bool iddig_en = property_enabled(base, &rport->port_cfg->iddig_en);
|
||||
|
||||
if (state < 0)
|
||||
state = 0;
|
||||
|
||||
dev_dbg(rphy->dev, "gpio id extcon state: %d\n", state);
|
||||
|
||||
if (iddig_en && ((state && !iddig_output) || (!state && iddig_output)))
|
||||
goto out;
|
||||
|
||||
if (state) {
|
||||
rockchip_usb2phy_set_mode(rport->phy, PHY_MODE_USB_HOST, 0);
|
||||
property_enable(base, &rport->port_cfg->iddig_output, false);
|
||||
property_enable(base, &rport->port_cfg->iddig_en, true);
|
||||
} else {
|
||||
rockchip_usb2phy_set_mode(rport->phy, PHY_MODE_USB_DEVICE, 0);
|
||||
property_enable(base, &rport->port_cfg->iddig_output, true);
|
||||
property_enable(base, &rport->port_cfg->iddig_en, true);
|
||||
}
|
||||
|
||||
out:
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static int rockchip_usb2phy_gpio_extcon_register_notifier(struct rockchip_usb2phy *rphy)
|
||||
{
|
||||
struct rockchip_usb2phy_port *rport = &rphy->ports[USB2PHY_PORT_OTG];
|
||||
struct extcon_dev *edev = rphy->edev;
|
||||
struct regmap *base = get_reg_base(rphy);
|
||||
int ret;
|
||||
|
||||
if (rport->gpio_vbus_det) {
|
||||
rport->gpio_vbus_nb.notifier_call = rockchip_usb2phy_gpio_vbus_notifier;
|
||||
ret = devm_extcon_register_notifier(rphy->dev, edev, EXTCON_USB,
|
||||
&rport->gpio_vbus_nb);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (rport->gpio_id_det) {
|
||||
rport->gpio_id_nb.notifier_call = rockchip_usb2phy_gpio_id_notifier;
|
||||
ret = devm_extcon_register_notifier(rphy->dev, edev, EXTCON_USB_HOST,
|
||||
&rport->gpio_id_nb);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (extcon_get_state(rphy->edev, EXTCON_USB_HOST) > 0) {
|
||||
rockchip_usb2phy_set_mode(rport->phy, PHY_MODE_USB_HOST, 0);
|
||||
property_enable(base, &rport->port_cfg->iddig_output, false);
|
||||
property_enable(base, &rport->port_cfg->iddig_en, true);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_usb2phy_orien_sw_set(struct typec_switch_dev *sw,
|
||||
enum typec_orientation orien)
|
||||
{
|
||||
@@ -2183,6 +2276,12 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
|
||||
rport->typec_vbus_det =
|
||||
of_property_read_bool(child_np, "rockchip,typec-vbus-det");
|
||||
|
||||
rport->gpio_vbus_det =
|
||||
of_property_read_bool(child_np, "rockchip,gpio-vbus-det");
|
||||
|
||||
rport->gpio_id_det =
|
||||
of_property_read_bool(child_np, "rockchip,gpio-id-det");
|
||||
|
||||
rport->sel_pipe_phystatus =
|
||||
of_property_read_bool(child_np, "rockchip,sel-pipe-phystatus");
|
||||
|
||||
@@ -2208,6 +2307,14 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
|
||||
rport->vbus = NULL;
|
||||
}
|
||||
|
||||
if (rport->gpio_vbus_det || rport->gpio_id_det) {
|
||||
ret = rockchip_usb2phy_gpio_extcon_register_notifier(rphy);
|
||||
if (ret) {
|
||||
dev_err(rphy->dev, "failed to register gpio extcon notifier\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
rport->mode = of_usb_get_dr_mode_by_phy(child_np, -1);
|
||||
iddig = property_enabled(rphy->grf, &rport->port_cfg->utmi_iddig);
|
||||
if (rphy->edev_self && (rport->mode == USB_DR_MODE_HOST ||
|
||||
@@ -3838,6 +3945,92 @@ static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = {
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const struct rockchip_usb2phy_cfg rk3506_phy_cfgs[] = {
|
||||
{
|
||||
.reg = 0xff2b0000,
|
||||
.num_ports = 2,
|
||||
.vbus_detect = rockchip_usb2phy_vbus_det_control,
|
||||
.clkout_ctl_phy = { 0x041c, 7, 2, 0, 0x27 },
|
||||
.port_cfgs = {
|
||||
[USB2PHY_PORT_OTG] = {
|
||||
.phy_sus = { 0x0060, 8, 0, 0, 0x1d1 },
|
||||
.bvalid_det_en = { 0x0150, 2, 2, 0, 1 },
|
||||
.bvalid_det_st = { 0x0154, 2, 2, 0, 1 },
|
||||
.bvalid_det_clr = { 0x0158, 2, 2, 0, 1 },
|
||||
.bvalid_grf_sel = { 0x0060, 14, 14, 0, 1 },
|
||||
.bvalid_grf_con = { 0x0060, 15, 14, 1, 3 },
|
||||
.iddig_output = { 0x0060, 10, 10, 0, 1 },
|
||||
.iddig_en = { 0x0060, 9, 9, 0, 1 },
|
||||
.idfall_det_en = { 0x0150, 5, 5, 0, 1 },
|
||||
.idfall_det_st = { 0x0154, 5, 5, 0, 1 },
|
||||
.idfall_det_clr = { 0x0158, 5, 5, 0, 1 },
|
||||
.idrise_det_en = { 0x0150, 4, 4, 0, 1 },
|
||||
.idrise_det_st = { 0x0154, 4, 4, 0, 1 },
|
||||
.idrise_det_clr = { 0x0158, 4, 4, 0, 1 },
|
||||
.ls_det_en = { 0x0150, 0, 0, 0, 1 },
|
||||
.ls_det_st = { 0x0154, 0, 0, 0, 1 },
|
||||
.ls_det_clr = { 0x0158, 0, 0, 0, 1 },
|
||||
.disfall_en = { 0x0150, 7, 7, 0, 1 },
|
||||
.disfall_st = { 0x0154, 7, 7, 0, 1 },
|
||||
.disfall_clr = { 0x0158, 7, 7, 0, 1 },
|
||||
.disrise_en = { 0x0150, 6, 6, 0, 1 },
|
||||
.disrise_st = { 0x0154, 6, 6, 0, 1 },
|
||||
.disrise_clr = { 0x0158, 6, 6, 0, 1 },
|
||||
.utmi_avalid = { 0x0118, 1, 1, 0, 1 },
|
||||
.utmi_bvalid = { 0x0118, 0, 0, 0, 1 },
|
||||
.utmi_iddig = { 0x0118, 6, 6, 0, 1 },
|
||||
.utmi_ls = { 0x0118, 5, 4, 0, 1 },
|
||||
.utmi_hstdet = { 0x0118, 7, 7, 0, 1 },
|
||||
.vbus_det_en = { 0x003c, 15, 15, 1, 0 },
|
||||
},
|
||||
[USB2PHY_PORT_HOST] = {
|
||||
.phy_sus = { 0x0070, 8, 0, 0, 0x1d1 },
|
||||
.bvalid_det_en = { 0x0170, 2, 2, 0, 1 },
|
||||
.bvalid_det_st = { 0x0174, 2, 2, 0, 1 },
|
||||
.bvalid_det_clr = { 0x0178, 2, 2, 0, 1 },
|
||||
.bvalid_grf_sel = { 0x0070, 14, 14, 0, 1 },
|
||||
.bvalid_grf_con = { 0x0070, 15, 14, 1, 3 },
|
||||
.iddig_output = { 0x0070, 10, 10, 0, 1 },
|
||||
.iddig_en = { 0x0070, 9, 9, 0, 1 },
|
||||
.idfall_det_en = { 0x0170, 5, 5, 0, 1 },
|
||||
.idfall_det_st = { 0x0174, 5, 5, 0, 1 },
|
||||
.idfall_det_clr = { 0x0178, 5, 5, 0, 1 },
|
||||
.idrise_det_en = { 0x0170, 4, 4, 0, 1 },
|
||||
.idrise_det_st = { 0x0174, 4, 4, 0, 1 },
|
||||
.idrise_det_clr = { 0x0178, 4, 4, 0, 1 },
|
||||
.ls_det_en = { 0x0170, 0, 0, 0, 1 },
|
||||
.ls_det_st = { 0x0174, 0, 0, 0, 1 },
|
||||
.ls_det_clr = { 0x0178, 0, 0, 0, 1 },
|
||||
.disfall_en = { 0x0170, 7, 7, 0, 1 },
|
||||
.disfall_st = { 0x0174, 7, 7, 0, 1 },
|
||||
.disfall_clr = { 0x0178, 7, 7, 0, 1 },
|
||||
.disrise_en = { 0x0170, 6, 6, 0, 1 },
|
||||
.disrise_st = { 0x0174, 6, 6, 0, 1 },
|
||||
.disrise_clr = { 0x0178, 6, 6, 0, 1 },
|
||||
.utmi_avalid = { 0x0118, 9, 9, 0, 1 },
|
||||
.utmi_bvalid = { 0x0118, 8, 8, 0, 1 },
|
||||
.utmi_iddig = { 0x0118, 14, 14, 0, 1 },
|
||||
.utmi_ls = { 0x0118, 13, 12, 0, 1 },
|
||||
.utmi_hstdet = { 0x0118, 15, 15, 0, 1 },
|
||||
.vbus_det_en = { 0x043c, 15, 15, 1, 0 },
|
||||
}
|
||||
},
|
||||
.chg_det = {
|
||||
.chg_mode = { 0x0060, 8, 0, 0, 0x1d7 },
|
||||
.cp_det = { 0x0118, 19, 19, 0, 1 },
|
||||
.dcp_det = { 0x0118, 18, 18, 0, 1 },
|
||||
.dp_det = { 0x0118, 20, 20, 0, 1 },
|
||||
.idm_sink_en = { 0x006c, 1, 1, 0, 1 },
|
||||
.idp_sink_en = { 0x006c, 0, 0, 0, 1 },
|
||||
.idp_src_en = { 0x006c, 2, 2, 0, 1 },
|
||||
.rdm_pdwn_en = { 0x006c, 3, 3, 0, 1 },
|
||||
.vdm_src_en = { 0x006c, 5, 5, 0, 1 },
|
||||
.vdp_src_en = { 0x006c, 4, 4, 0, 1 },
|
||||
},
|
||||
},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const struct rockchip_usb2phy_cfg rk3528_phy_cfgs[] = {
|
||||
{
|
||||
.reg = 0xffdf0000,
|
||||
@@ -4424,6 +4617,9 @@ static const struct of_device_id rockchip_usb2phy_dt_match[] = {
|
||||
#ifdef CONFIG_CPU_RK3399
|
||||
{ .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3506
|
||||
{ .compatible = "rockchip,rk3506-usb2phy", .data = &rk3506_phy_cfgs },
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3528
|
||||
{ .compatible = "rockchip,rk3528-usb2phy", .data = &rk3528_phy_cfgs },
|
||||
#endif
|
||||
|
||||
@@ -459,12 +459,96 @@ static struct tx_drv_ctrl tx_drv_ctrl_hbr2[4][4] = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct tx_drv_ctrl tx_drv_ctrl_r216_r243[4][4] = {
|
||||
/* voltage swing 0, pre-emphasis 0->3 */
|
||||
{
|
||||
{ 0x0, 0x1, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x1, 0x2, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
|
||||
{ 0x1, 0x3, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x3, 0x5, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 1, pre-emphasis 0->2 */
|
||||
{
|
||||
{ 0x1, 0x1, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
|
||||
{ 0x2, 0x3, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x3, 0x4, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 2, pre-emphasis 0->1 */
|
||||
{
|
||||
{ 0x1, 0x1, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x1, 0x2, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 3, pre-emphasis 0 */
|
||||
{
|
||||
{ 0x3, 0x2, 0x2, 0x2, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
}
|
||||
};
|
||||
|
||||
static struct tx_drv_ctrl tx_drv_ctrl_r324[4][4] = {
|
||||
/* voltage swing 0, pre-emphasis 0->3 */
|
||||
{
|
||||
{ 0x1, 0x2, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x2, 0x3, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x2, 0x4, 0x5, 0x5, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x4, 0x6, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 1, pre-emphasis 0->2 */
|
||||
{
|
||||
{ 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
|
||||
{ 0x2, 0x3, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x4, 0x5, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 2, pre-emphasis 0->1 */
|
||||
{
|
||||
{ 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x4, 0x4, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 3, pre-emphasis 0 */
|
||||
{
|
||||
{ 0x3, 0x2, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
}
|
||||
};
|
||||
|
||||
static struct tx_drv_ctrl tx_drv_ctrl_r432[4][4] = {
|
||||
/* voltage swing 0, pre-emphasis 0->3 */
|
||||
{
|
||||
{ 0x1, 0x2, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x2, 0x3, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x2, 0x4, 0x6, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x4, 0x6, 0x6, 0x6, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 1, pre-emphasis 0->2 */
|
||||
{
|
||||
{ 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
|
||||
{ 0x3, 0x4, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x5, 0x6, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 2, pre-emphasis 0->1 */
|
||||
{
|
||||
{ 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
{ 0x4, 0x4, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
|
||||
},
|
||||
|
||||
/* voltage swing 3, pre-emphasis 0 */
|
||||
{
|
||||
{ 0x5, 0x3, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
|
||||
}
|
||||
};
|
||||
|
||||
/* pll configurations for link rate R216/R243/R324/R432 */
|
||||
static struct tx_pll_ctrl tx_pll_ctrl_extra[4] = {
|
||||
{ 0x5a, 0x01, 0x32, 0x00, 0x00, 0x00, 0x01, 0x04, 0x0f, 0x18 }, /* R216 */
|
||||
{ 0x65, 0x01, 0x60, 0x00, 0x10, 0x01, 0x13, 0x18, 0x20, 0x0b }, /* R243 */
|
||||
{ 0x87, 0x01, 0x21, 0x00, 0x00, 0x02, 0x03, 0x08, 0x0e, 0x1a }, /* R324 */
|
||||
{ 0x5a, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x18 }, /* R432 */
|
||||
static const struct tx_pll_ctrl tx_pll_ctrl_extra[4] = {
|
||||
{ 0x5a, 0x01, 0x32, 0x00, 0x00, 0x00, 0x01, 0x04, 0x0d, 0x1d }, /* R216 */
|
||||
{ 0x65, 0x01, 0x60, 0x00, 0x10, 0x01, 0x13, 0x18, 0x1c, 0x0d }, /* R243 */
|
||||
{ 0x87, 0x01, 0x21, 0x00, 0x00, 0x02, 0x03, 0x08, 0x0d, 0x1c }, /* R324 */
|
||||
{ 0x5a, 0x00, 0x32, 0x00, 0x00, 0x01, 0x01, 0x01, 0x0e, 0x1a }, /* R432 */
|
||||
};
|
||||
|
||||
static int rockchip_hdptx_phy_parse_training_table(struct device *dev)
|
||||
@@ -580,6 +664,17 @@ static void rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy *hdptx,
|
||||
break;
|
||||
case 2160:
|
||||
case 2430:
|
||||
ctrl = &tx_drv_ctrl_r216_r243[dp->voltage[lane]][dp->pre[lane]];
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
|
||||
LN_TX_SER_40BIT_EN_HBR,
|
||||
FIELD_PREP(LN_TX_SER_40BIT_EN_HBR, 0x1));
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
|
||||
LN_TX_JEQ_EVEN_CTRL_HBR,
|
||||
FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR, ctrl->tx_jeq_even_ctrl));
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
|
||||
LN_TX_JEQ_ODD_CTRL_HBR,
|
||||
FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR, ctrl->tx_jeq_odd_ctrl));
|
||||
break;
|
||||
case 2700:
|
||||
ctrl = &tx_drv_ctrl_hbr[dp->voltage[lane]][dp->pre[lane]];
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
|
||||
@@ -593,7 +688,29 @@ static void rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy *hdptx,
|
||||
FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR, ctrl->tx_jeq_odd_ctrl));
|
||||
break;
|
||||
case 3240:
|
||||
ctrl = &tx_drv_ctrl_r324[dp->voltage[lane]][dp->pre[lane]];
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
|
||||
LN_TX_SER_40BIT_EN_HBR2,
|
||||
FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
|
||||
LN_TX_JEQ_EVEN_CTRL_HBR2,
|
||||
FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR2, ctrl->tx_jeq_even_ctrl));
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
|
||||
LN_TX_JEQ_ODD_CTRL_HBR2,
|
||||
FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR2, ctrl->tx_jeq_odd_ctrl));
|
||||
break;
|
||||
case 4320:
|
||||
ctrl = &tx_drv_ctrl_r432[dp->voltage[lane]][dp->pre[lane]];
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
|
||||
LN_TX_SER_40BIT_EN_HBR2,
|
||||
FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
|
||||
LN_TX_JEQ_EVEN_CTRL_HBR2,
|
||||
FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR2, ctrl->tx_jeq_even_ctrl));
|
||||
regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
|
||||
LN_TX_JEQ_ODD_CTRL_HBR2,
|
||||
FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR2, ctrl->tx_jeq_odd_ctrl));
|
||||
break;
|
||||
case 5400:
|
||||
default:
|
||||
ctrl = &tx_drv_ctrl_hbr2[dp->voltage[lane]][dp->pre[lane]];
|
||||
|
||||
@@ -123,6 +123,29 @@
|
||||
.pull_type[3] = pull3, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(id, pins, label, iom0, \
|
||||
iom1, iom2, iom3, \
|
||||
offset0, offset1, \
|
||||
offset2, offset3, drv0, \
|
||||
drv1, drv2, drv3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = offset0 }, \
|
||||
{ .type = iom1, .offset = offset1 }, \
|
||||
{ .type = iom2, .offset = offset2 }, \
|
||||
{ .type = iom3, .offset = offset3 }, \
|
||||
}, \
|
||||
.drv = { \
|
||||
{ .drv_type = drv0, .offset = -1 }, \
|
||||
{ .drv_type = drv1, .offset = -1 }, \
|
||||
{ .drv_type = drv2, .offset = -1 }, \
|
||||
{ .drv_type = drv3, .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
@@ -236,6 +259,35 @@
|
||||
.pull_type[3] = pull3, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS_PULL_FLAGS(id, pins, \
|
||||
label, iom0, iom1, \
|
||||
iom2, iom3, offset0, \
|
||||
offset1, offset2, \
|
||||
offset3, drv0, drv1, \
|
||||
drv2, drv3, pull0, \
|
||||
pull1, pull2, pull3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = offset0 }, \
|
||||
{ .type = iom1, .offset = offset1 }, \
|
||||
{ .type = iom2, .offset = offset2 }, \
|
||||
{ .type = iom3, .offset = offset3 }, \
|
||||
}, \
|
||||
.drv = { \
|
||||
{ .drv_type = drv0, .offset = -1 }, \
|
||||
{ .drv_type = drv1, .offset = -1 }, \
|
||||
{ .drv_type = drv2, .offset = -1 }, \
|
||||
{ .drv_type = drv3, .offset = -1 }, \
|
||||
}, \
|
||||
.pull_type[0] = pull0, \
|
||||
.pull_type[1] = pull1, \
|
||||
.pull_type[2] = pull2, \
|
||||
.pull_type[3] = pull3, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \
|
||||
{ \
|
||||
.bank_num = ID, \
|
||||
@@ -1134,6 +1186,13 @@ static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
|
||||
else
|
||||
regmap = info->regmap_base;
|
||||
|
||||
if (ctrl->type == RK3506) {
|
||||
if (bank->bank_num == 1)
|
||||
regmap = info->regmap_ioc1;
|
||||
else if (bank->bank_num == 4)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get basic quadrupel of mux registers and the correct reg inside */
|
||||
mux_type = bank->iomux[iomux_num].type;
|
||||
reg = bank->iomux[iomux_num].offset;
|
||||
@@ -1213,6 +1272,74 @@ static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_set_rmio(struct rockchip_pin_bank *bank, int pin, int *mux)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
struct rockchip_pin_ctrl *ctrl = info->ctrl;
|
||||
struct regmap *regmap;
|
||||
int reg, function;
|
||||
u32 data, rmask;
|
||||
int ret = 0;
|
||||
int iomux_num = (pin / 8);
|
||||
u32 iomux_max, mux_type;
|
||||
|
||||
mux_type = bank->iomux[iomux_num].type;
|
||||
if (mux_type & IOMUX_WIDTH_4BIT)
|
||||
iomux_max = (1 << 4) - 1;
|
||||
else if (mux_type & IOMUX_WIDTH_3BIT)
|
||||
iomux_max = (1 << 3) - 1;
|
||||
else
|
||||
iomux_max = (1 << 2) - 1;
|
||||
|
||||
if (*mux > iomux_max)
|
||||
function = *mux - iomux_max;
|
||||
else
|
||||
return 0;
|
||||
|
||||
switch (ctrl->type) {
|
||||
case RK3506:
|
||||
regmap = info->regmap_rmio;
|
||||
if (bank->bank_num == 0) {
|
||||
if (pin < 24)
|
||||
reg = 0x80 + 0x4 * pin;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
} else if (bank->bank_num == 1) {
|
||||
if (pin >= 9 && pin <= 11)
|
||||
reg = 0xbc + 0x4 * pin;
|
||||
else if (pin >= 18 && pin <= 19)
|
||||
reg = 0xa4 + 0x4 * pin;
|
||||
else if (pin >= 25 && pin <= 27)
|
||||
reg = 0x90 + 0x4 * pin;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
dev_err(info->dev,
|
||||
"rmio unsupported bank_num %d function %d\n",
|
||||
bank->bank_num, function);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rmask = 0x7f007f;
|
||||
data = 0x7f0000 | function;
|
||||
*mux = 7;
|
||||
ret = regmap_update_bits(regmap, reg, rmask, data);
|
||||
if (ret)
|
||||
return ret;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a new mux function for a pin.
|
||||
*
|
||||
@@ -1247,6 +1374,10 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
|
||||
dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
|
||||
|
||||
ret = rockchip_set_rmio(bank, pin, &mux);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
|
||||
regmap = info->regmap_pmu;
|
||||
else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
|
||||
@@ -1254,6 +1385,13 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
else
|
||||
regmap = info->regmap_base;
|
||||
|
||||
if (ctrl->type == RK3506) {
|
||||
if (bank->bank_num == 1)
|
||||
regmap = info->regmap_ioc1;
|
||||
else if (bank->bank_num == 4)
|
||||
return 0;
|
||||
}
|
||||
|
||||
regmap_sys = info->regmap_sys_grf;
|
||||
|
||||
/* get basic quadrupel of mux registers and the correct reg inside */
|
||||
@@ -2352,6 +2490,262 @@ static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RK3506_DRV_BITS_PER_PIN 8
|
||||
#define RK3506_DRV_PINS_PER_REG 2
|
||||
#define RK3506_DRV_GPIO0_A_OFFSET 0x100
|
||||
#define RK3506_DRV_GPIO0_D_OFFSET 0x830
|
||||
#define RK3506_DRV_GPIO1_OFFSET 0x140
|
||||
#define RK3506_DRV_GPIO2_OFFSET 0x180
|
||||
#define RK3506_DRV_GPIO3_OFFSET 0x1c0
|
||||
#define RK3506_DRV_GPIO4_OFFSET 0x840
|
||||
|
||||
static int rk3506_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
int ret = 0;
|
||||
|
||||
switch (bank->bank_num) {
|
||||
case 0:
|
||||
*regmap = info->regmap_pmu;
|
||||
if (pin_num > 24) {
|
||||
ret = -EINVAL;
|
||||
} else if (pin_num < 24) {
|
||||
*reg = RK3506_DRV_GPIO0_A_OFFSET;
|
||||
} else {
|
||||
*reg = RK3506_DRV_GPIO0_D_OFFSET;
|
||||
*bit = 3;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
*regmap = info->regmap_ioc1;
|
||||
if (pin_num < 28)
|
||||
*reg = RK3506_DRV_GPIO1_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 17)
|
||||
*reg = RK3506_DRV_GPIO2_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 15)
|
||||
*reg = RK3506_DRV_GPIO3_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 8 || pin_num > 11) {
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
*reg = RK3506_DRV_GPIO4_OFFSET;
|
||||
*bit = 10;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
*reg += ((pin_num / RK3506_DRV_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % RK3506_DRV_PINS_PER_REG;
|
||||
*bit *= RK3506_DRV_BITS_PER_PIN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RK3506_PULL_BITS_PER_PIN 2
|
||||
#define RK3506_PULL_PINS_PER_REG 8
|
||||
#define RK3506_PULL_GPIO0_A_OFFSET 0x200
|
||||
#define RK3506_PULL_GPIO0_D_OFFSET 0x830
|
||||
#define RK3506_PULL_GPIO1_OFFSET 0x210
|
||||
#define RK3506_PULL_GPIO2_OFFSET 0x220
|
||||
#define RK3506_PULL_GPIO3_OFFSET 0x230
|
||||
#define RK3506_PULL_GPIO4_OFFSET 0x840
|
||||
|
||||
static int rk3506_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
int ret = 0;
|
||||
|
||||
switch (bank->bank_num) {
|
||||
case 0:
|
||||
*regmap = info->regmap_pmu;
|
||||
if (pin_num > 24) {
|
||||
ret = -EINVAL;
|
||||
} else if (pin_num < 24) {
|
||||
*reg = RK3506_PULL_GPIO0_A_OFFSET;
|
||||
} else {
|
||||
*reg = RK3506_PULL_GPIO0_D_OFFSET;
|
||||
*bit = 5;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
*regmap = info->regmap_ioc1;
|
||||
if (pin_num < 28)
|
||||
*reg = RK3506_PULL_GPIO1_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 17)
|
||||
*reg = RK3506_PULL_GPIO2_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 15)
|
||||
*reg = RK3506_PULL_GPIO3_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 8 || pin_num > 11) {
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
*reg = RK3506_PULL_GPIO4_OFFSET;
|
||||
*bit = 13;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
*reg += ((pin_num / RK3506_PULL_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % RK3506_PULL_PINS_PER_REG;
|
||||
*bit *= RK3506_PULL_BITS_PER_PIN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RK3506_SMT_BITS_PER_PIN 1
|
||||
#define RK3506_SMT_PINS_PER_REG 8
|
||||
#define RK3506_SMT_GPIO0_A_OFFSET 0x400
|
||||
#define RK3506_SMT_GPIO0_D_OFFSET 0x830
|
||||
#define RK3506_SMT_GPIO1_OFFSET 0x410
|
||||
#define RK3506_SMT_GPIO2_OFFSET 0x420
|
||||
#define RK3506_SMT_GPIO3_OFFSET 0x430
|
||||
#define RK3506_SMT_GPIO4_OFFSET 0x840
|
||||
|
||||
static int rk3506_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num,
|
||||
struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
int ret = 0;
|
||||
|
||||
switch (bank->bank_num) {
|
||||
case 0:
|
||||
*regmap = info->regmap_pmu;
|
||||
if (pin_num > 24) {
|
||||
ret = -EINVAL;
|
||||
} else if (pin_num < 24) {
|
||||
*reg = RK3506_SMT_GPIO0_A_OFFSET;
|
||||
} else {
|
||||
*reg = RK3506_SMT_GPIO0_D_OFFSET;
|
||||
*bit = 9;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
*regmap = info->regmap_ioc1;
|
||||
if (pin_num < 28)
|
||||
*reg = RK3506_SMT_GPIO1_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 17)
|
||||
*reg = RK3506_SMT_GPIO2_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 15)
|
||||
*reg = RK3506_SMT_GPIO3_OFFSET;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
*regmap = info->regmap_base;
|
||||
if (pin_num < 8 || pin_num > 11) {
|
||||
ret = -EINVAL;
|
||||
} else {
|
||||
*reg = RK3506_SMT_GPIO4_OFFSET;
|
||||
*bit = 8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
*reg += ((pin_num / RK3506_SMT_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % RK3506_SMT_PINS_PER_REG;
|
||||
*bit *= RK3506_SMT_BITS_PER_PIN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define RK3528_DRV_BITS_PER_PIN 8
|
||||
#define RK3528_DRV_PINS_PER_REG 2
|
||||
#define RK3528_DRV_GPIO0_OFFSET 0x100
|
||||
@@ -3140,6 +3534,25 @@ static int rockchip_get_drive_perpin(struct rockchip_pin_bank *bank,
|
||||
case DRV_TYPE_IO_SMIC:
|
||||
rmask_bits = RK3288_DRV_BITS_PER_PIN;
|
||||
break;
|
||||
case DRV_TYPE_IO_LEVEL_2_BIT:
|
||||
ret = regmap_read(regmap, reg, &data);
|
||||
if (ret)
|
||||
return ret;
|
||||
data >>= bit;
|
||||
|
||||
return data & 0x3;
|
||||
case DRV_TYPE_IO_LEVEL_8_BIT:
|
||||
ret = regmap_read(regmap, reg, &data);
|
||||
if (ret)
|
||||
return ret;
|
||||
data >>= bit;
|
||||
data &= (1 << 8) - 1;
|
||||
|
||||
ret = hweight8(data);
|
||||
if (ret > 0)
|
||||
return ret - 1;
|
||||
else
|
||||
return -EINVAL;
|
||||
default:
|
||||
dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
|
||||
return -EINVAL;
|
||||
@@ -3193,6 +3606,7 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
|
||||
ret = strength;
|
||||
goto config;
|
||||
} else if (ctrl->type == RV1106 ||
|
||||
ctrl->type == RK3506 ||
|
||||
ctrl->type == RK3528 ||
|
||||
ctrl->type == RK3562 ||
|
||||
ctrl->type == RK3568) {
|
||||
@@ -3273,6 +3687,12 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
|
||||
}
|
||||
|
||||
config:
|
||||
if (ctrl->type == RK3506) {
|
||||
if ((bank->bank_num == 0 && pin_num == 24) || bank->bank_num == 4) {
|
||||
rmask_bits = 2;
|
||||
ret = strength;
|
||||
}
|
||||
}
|
||||
/* enable the write to the equivalent lower bits */
|
||||
data = ((1 << rmask_bits) - 1) << (bit + 16);
|
||||
rmask = data | (data >> 16);
|
||||
@@ -3371,6 +3791,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
|
||||
case RK3308:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
case RK3506:
|
||||
case RK3528:
|
||||
case RK3562:
|
||||
case RK3568:
|
||||
@@ -3434,6 +3855,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
|
||||
case RK3308:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
case RK3506:
|
||||
case RK3528:
|
||||
case RK3562:
|
||||
case RK3568:
|
||||
@@ -3554,6 +3976,10 @@ static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctrl->type == RK3506)
|
||||
if ((bank->bank_num == 0 && pin_num == 24) || bank->bank_num == 4)
|
||||
return data & 0x3;
|
||||
|
||||
return data & 0x1;
|
||||
}
|
||||
|
||||
@@ -3589,6 +4015,14 @@ static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctrl->type == RK3506) {
|
||||
if ((bank->bank_num == 0 && pin_num == 24) || bank->bank_num == 4) {
|
||||
data = 0x3 << (bit + 16);
|
||||
rmask = data | (data >> 16);
|
||||
data |= ((enable ? 0x3 : 0) << bit);
|
||||
}
|
||||
}
|
||||
|
||||
return regmap_update_bits(regmap, reg, rmask, data);
|
||||
}
|
||||
|
||||
@@ -3786,6 +4220,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
|
||||
case RK3308:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
case RK3506:
|
||||
case RK3528:
|
||||
case RK3562:
|
||||
case RK3568:
|
||||
@@ -4505,22 +4940,16 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* try to find the optional reference to the sys_grf syscon */
|
||||
node = of_parse_phandle(np, "rockchip,sys-grf", 0);
|
||||
if (node) {
|
||||
info->regmap_sys_grf = syscon_node_to_regmap(node);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(info->regmap_sys_grf))
|
||||
return PTR_ERR(info->regmap_sys_grf);
|
||||
}
|
||||
info->regmap_sys_grf = syscon_regmap_lookup_by_phandle_optional(np, "rockchip,sys-grf");
|
||||
|
||||
/* try to find the optional reference to the pmu syscon */
|
||||
node = of_parse_phandle(np, "rockchip,pmu", 0);
|
||||
if (node) {
|
||||
info->regmap_pmu = syscon_node_to_regmap(node);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(info->regmap_pmu))
|
||||
return PTR_ERR(info->regmap_pmu);
|
||||
}
|
||||
info->regmap_pmu = syscon_regmap_lookup_by_phandle_optional(np, "rockchip,pmu");
|
||||
|
||||
/* try to find the optional reference to the ioc1 syscon */
|
||||
info->regmap_ioc1 = syscon_regmap_lookup_by_phandle_optional(np, "rockchip,ioc1");
|
||||
|
||||
/* try to find the optional reference to the rmio syscon */
|
||||
info->regmap_rmio = syscon_regmap_lookup_by_phandle_optional(np, "rockchip,rmio");
|
||||
|
||||
if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
|
||||
ret = rk3308_soc_data_init(info);
|
||||
@@ -5093,6 +5522,71 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl __maybe_unused = {
|
||||
.drv_calc_reg = rk3399_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
||||
static struct rockchip_pin_bank rk3506_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS_PULL_FLAGS(0, 32, "gpio0",
|
||||
IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
|
||||
IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
|
||||
IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
|
||||
IOMUX_WIDTH_2BIT | IOMUX_SOURCE_PMU,
|
||||
0x0, 0x8, 0x10, 0x830,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_2_BIT,
|
||||
0, 0, 0, 1),
|
||||
PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(1, 32, "gpio1",
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
0x20, 0x28, 0x30, 0x38,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT),
|
||||
PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(2, 32, "gpio2",
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
0x40, 0x48, 0x50, 0x58,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT),
|
||||
PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(3, 32, "gpio3",
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
0x60, 0x68, 0x70, 0x78,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT),
|
||||
PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS_PULL_FLAGS(4, 32, "gpio4",
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
0x80, 0x88, 0x90, 0x98,
|
||||
DRV_TYPE_IO_LEVEL_2_BIT,
|
||||
DRV_TYPE_IO_LEVEL_2_BIT,
|
||||
DRV_TYPE_IO_LEVEL_2_BIT,
|
||||
DRV_TYPE_IO_LEVEL_2_BIT,
|
||||
1, 1, 1, 1),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3506_pin_ctrl __maybe_unused = {
|
||||
.pin_banks = rk3506_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3506_pin_banks),
|
||||
.label = "RK3506-GPIO",
|
||||
.type = RK3506,
|
||||
.pull_calc_reg = rk3506_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3506_calc_drv_reg_and_bit,
|
||||
.schmitt_calc_reg = rk3506_calc_schmitt_reg_and_bit,
|
||||
};
|
||||
|
||||
static struct rockchip_pin_bank rk3528_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
|
||||
IOMUX_WIDTH_4BIT,
|
||||
@@ -5338,6 +5832,10 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
|
||||
{ .compatible = "rockchip,rk3399-pinctrl",
|
||||
.data = &rk3399_pin_ctrl },
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3506
|
||||
{ .compatible = "rockchip,rk3506-pinctrl",
|
||||
.data = &rk3506_pin_ctrl },
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3528
|
||||
{ .compatible = "rockchip,rk3528-pinctrl",
|
||||
.data = &rk3528_pin_ctrl },
|
||||
|
||||
@@ -197,6 +197,7 @@ enum rockchip_pinctrl_type {
|
||||
RK3308,
|
||||
RK3368,
|
||||
RK3399,
|
||||
RK3506,
|
||||
RK3528,
|
||||
RK3562,
|
||||
RK3568,
|
||||
@@ -262,6 +263,8 @@ enum rockchip_pin_drv_type {
|
||||
DRV_TYPE_IO_1V8_3V0_AUTO,
|
||||
DRV_TYPE_IO_3V3_ONLY,
|
||||
DRV_TYPE_IO_SMIC,
|
||||
DRV_TYPE_IO_LEVEL_2_BIT,
|
||||
DRV_TYPE_IO_LEVEL_8_BIT,
|
||||
DRV_TYPE_MAX
|
||||
};
|
||||
|
||||
@@ -465,6 +468,8 @@ struct rockchip_pinctrl {
|
||||
struct regmap *regmap_pull;
|
||||
struct regmap *regmap_pmu;
|
||||
struct regmap *regmap_sys_grf;
|
||||
struct regmap *regmap_ioc1;
|
||||
struct regmap *regmap_rmio;
|
||||
struct device *dev;
|
||||
struct rockchip_pin_ctrl *ctrl;
|
||||
struct pinctrl_desc pctl;
|
||||
|
||||
@@ -490,16 +490,16 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
|
||||
|
||||
msleep(timeout_ms);
|
||||
|
||||
ret = rockchip_pwm_set_counter(pdev, 0, false);
|
||||
ret = rockchip_pwm_get_counter_result(pdev, &counter_res, true);
|
||||
if (ret) {
|
||||
pr_err("failed to disable %s mode for pwm%d_%d\n",
|
||||
pr_err("failed to get %s mode result for pwm%d_%d\n",
|
||||
cmd, controller_id, channel_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = rockchip_pwm_get_counter_result(pdev, &counter_res, true);
|
||||
ret = rockchip_pwm_set_counter(pdev, 0, false);
|
||||
if (ret) {
|
||||
pr_err("failed to get %s mode result for pwm%d_%d\n",
|
||||
pr_err("failed to disable %s mode for pwm%d_%d\n",
|
||||
cmd, controller_id, channel_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1084,9 +1084,11 @@ int rockchip_pwm_set_counter(struct pwm_device *pwm,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ret = clk_enable(pc->pclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (enable) {
|
||||
ret = clk_enable(pc->pclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = pinctrl_select_state(pc->pinctrl, pc->active_state);
|
||||
if (ret) {
|
||||
@@ -1101,8 +1103,14 @@ int rockchip_pwm_set_counter(struct pwm_device *pwm,
|
||||
goto err_disable_pclk;
|
||||
}
|
||||
|
||||
if (!enable)
|
||||
clk_disable(pc->pclk);
|
||||
|
||||
return ret;
|
||||
|
||||
err_disable_pclk:
|
||||
clk_disable(pc->pclk);
|
||||
if (enable)
|
||||
clk_disable(pc->pclk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1146,20 +1154,13 @@ int rockchip_pwm_get_counter_result(struct pwm_device *pwm,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = clk_enable(pc->pclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pc->data->funcs.get_counter_result(chip, pwm, counter_res, is_clear);
|
||||
if (ret) {
|
||||
dev_err(chip->dev, "Failed to get counter result for PWM%d\n",
|
||||
pc->channel_id);
|
||||
goto err_disable_pclk;
|
||||
return ret;
|
||||
}
|
||||
|
||||
err_disable_pclk:
|
||||
clk_disable(pc->pclk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_pwm_get_counter_result);
|
||||
@@ -1224,7 +1225,7 @@ static int rockchip_pwm_get_freq_meter_result_v4(struct pwm_chip *chip, struct p
|
||||
if (pc->freq_res_valid) {
|
||||
freq_res = readl_relaxed(pc->base + FREQ_RESULT_VALUE);
|
||||
freq_timer = readl_relaxed(pc->base + FREQ_TIMER_VALUE);
|
||||
*freq_hz = DIV_ROUND_CLOSEST_ULL(pc->clk_rate * freq_res, freq_timer);
|
||||
*freq_hz = DIV_ROUND_CLOSEST_ULL((u64)pc->clk_rate * freq_res, freq_timer);
|
||||
if (!*freq_hz)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -1765,7 +1766,7 @@ static int rockchip_pwm_get_biphasic_result_v4(struct pwm_chip *chip, struct pwm
|
||||
if (pc->biphasic_config->mode == PWM_BIPHASIC_COUNTER_MODE0_FREQ) {
|
||||
val = *biphasic_res;
|
||||
biphasic_timer = readl_relaxed(pc->base + BIPHASIC_TIMER_VALUE);
|
||||
*biphasic_res = DIV_ROUND_CLOSEST_ULL(pc->clk_rate * val,
|
||||
*biphasic_res = DIV_ROUND_CLOSEST_ULL((u64)pc->clk_rate * val,
|
||||
biphasic_timer);
|
||||
}
|
||||
|
||||
@@ -1842,7 +1843,7 @@ static int rockchip_pwm_debugfs_show(struct seq_file *s, void *data)
|
||||
|
||||
if (pc->main_version >= 4) {
|
||||
regs_start = (u32)pc->res->start;
|
||||
for (i = 0; i < 0x80; i += 4) {
|
||||
for (i = 0; i < 0x90; i += 4) {
|
||||
seq_printf(s, "%08x: %08x %08x %08x %08x\n", regs_start + i * 4,
|
||||
readl_relaxed(pc->base + (4 * i)),
|
||||
readl_relaxed(pc->base + (4 * (i + 1))),
|
||||
|
||||
@@ -61,6 +61,9 @@ config CPU_RK3368
|
||||
config CPU_RK3399
|
||||
bool "RK3399"
|
||||
|
||||
config CPU_RK3506
|
||||
bool "RK3506"
|
||||
|
||||
config CPU_RK3528
|
||||
bool "RK3528"
|
||||
|
||||
|
||||
@@ -232,8 +232,8 @@ static void debug_flush(struct platform_device *pdev)
|
||||
#ifdef CONFIG_RK_CONSOLE_THREAD
|
||||
#define FIFO_SIZE SZ_64K
|
||||
#define TTY_FIFO_SIZE SZ_64K
|
||||
static DEFINE_KFIFO(fifo, unsigned char, FIFO_SIZE);
|
||||
static DEFINE_KFIFO(tty_fifo, unsigned char, TTY_FIFO_SIZE);
|
||||
static struct kfifo fifo;
|
||||
static struct kfifo tty_fifo;
|
||||
static bool console_thread_stop; /* write on console_write */
|
||||
static bool console_thread_running; /* write on console_thread */
|
||||
static unsigned int console_dropped_messages;
|
||||
@@ -1110,7 +1110,17 @@ static int __init rk_fiqdbg_probe(struct platform_device *pdev)
|
||||
pr_err("fiq-debugger get clock fail\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
#ifdef CONFIG_RK_CONSOLE_THREAD
|
||||
if (kfifo_alloc(&fifo, FIFO_SIZE, GFP_KERNEL)) {
|
||||
pr_err("fiq-debugger alloc fifo fail\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (kfifo_alloc(&tty_fifo, TTY_FIFO_SIZE, GFP_KERNEL)) {
|
||||
pr_err("fiq-debugger alloc tty_fifo fail\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif
|
||||
clk_prepare_enable(clk);
|
||||
clk_prepare_enable(pclk);
|
||||
|
||||
|
||||
@@ -551,7 +551,7 @@ static int rockchip_hardlock_notify(struct notifier_block *nb,
|
||||
else
|
||||
pmpcsr &= 0x0fffffffffffffff;
|
||||
/* NOTE: no offset on ARMv8; see DBGDEVID1.PCSROffset */
|
||||
pc = (void *)(pmpcsr & ~1);
|
||||
pc = (void *)(uintptr_t)(pmpcsr & ~1);
|
||||
}
|
||||
|
||||
rockchip_debug_serror_enable();
|
||||
|
||||
@@ -178,6 +178,8 @@ static int rk_flexbus_fspi_init(struct rk_flexbus_fspi *fspi)
|
||||
{
|
||||
u32 ctrl;
|
||||
|
||||
fspi->fb->config->grf_config(fspi->fb, false, 0, 0);
|
||||
|
||||
fspi->version = rockchip_flexbus_readl(fspi->fb, FLEXBUS_REVISION) >> 16;
|
||||
fspi->max_iosize = FLEXBUS_MAX_IOSIZE;
|
||||
|
||||
@@ -185,7 +187,10 @@ static int rk_flexbus_fspi_init(struct rk_flexbus_fspi *fspi)
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_DMA_SRC_LEN0, fspi->max_iosize * FLEXBUS_TX_WIDTH);
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_DMA_DST_LEN0, fspi->max_iosize * FLEXBUS_TX_WIDTH);
|
||||
|
||||
ctrl = FLEXBUS_TX_CTL_MSB | (1 << FLEXBUS_DFS_SHIFT);
|
||||
if (fspi->version == FLEXBUS_REVISION_V9)
|
||||
ctrl = FLEXBUS_TX_CTL_MSB | fspi->fb->dfs_reg->dfs_4bit;
|
||||
else
|
||||
ctrl = FLEXBUS_TX_CTL_UNIT_BYTE | FLEXBUS_TX_CTL_MSB | fspi->fb->dfs_reg->dfs_1bit;
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_TX_CTL, ctrl);
|
||||
|
||||
/* Using internal clk as sample clock */
|
||||
@@ -262,7 +267,8 @@ static int rk_flexbus_fspi_send(struct rk_flexbus_fspi *fspi, struct rk_flexbus_
|
||||
}
|
||||
|
||||
static int rk_flexbus_fspi_send_then_recv_114(struct rk_flexbus_fspi *fspi,
|
||||
struct rk_flexbus_fspi_xfer *cfg)
|
||||
struct rk_flexbus_fspi_xfer *cfg,
|
||||
bool trick)
|
||||
{
|
||||
int ret = 0, timeout_ms = FLEXBUS_DMA_TIMEOUT_MS;
|
||||
u32 ctrl;
|
||||
@@ -279,7 +285,9 @@ static int rk_flexbus_fspi_send_then_recv_114(struct rk_flexbus_fspi *fspi,
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_TX_CMD1, ((u32 *)fspi->tx_buf)[1]);
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_TX_NUM, cfg->cmd_cycles);
|
||||
|
||||
ctrl = FLEXBUS_RXD_DY | FLEXBUS_AUTOPAD | FLEXBUS_RX_CTL_MSB | 1;
|
||||
ctrl = FLEXBUS_RXD_DY | FLEXBUS_AUTOPAD | FLEXBUS_RX_CTL_MSB | fspi->fb->dfs_reg->dfs_4bit;
|
||||
if (!trick)
|
||||
ctrl |= FLEXBUS_RX_CTL_UNIT_BYTE | FLEXBUS_RX_CTL_FILL_DUMMY;
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_RX_CTL, ctrl);
|
||||
rockchip_flexbus_writel(fspi->fb, FLEXBUS_RX_NUM, cfg->buf_cycles);
|
||||
|
||||
@@ -307,6 +315,7 @@ static int rk_flexbus_fspi_exec_mem(struct rk_flexbus_fspi *fspi, const struct s
|
||||
struct rk_flexbus_fspi_xfer cfg = { 0 };
|
||||
u32 cmd_cycles, data_cycles;
|
||||
int ret;
|
||||
bool format_trick;
|
||||
|
||||
/* format cmd_addr_dummy */
|
||||
switch (op->addr.nbytes) {
|
||||
@@ -340,11 +349,27 @@ static int rk_flexbus_fspi_exec_mem(struct rk_flexbus_fspi *fspi, const struct s
|
||||
dev_err(fspi->fb->dev, "op->addr.nbytes %d not support!\n", op->addr.nbytes);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* format data */
|
||||
data_cycles = op->data.nbytes * 8 / op->data.buswidth;
|
||||
if (op->data.buf.out) {
|
||||
if (fspi->version == FLEXBUS_REVISION_V9) {
|
||||
|
||||
/*
|
||||
* format data:
|
||||
* V9:
|
||||
* rx protocol 111 send_then_recv_114(trick!), then re-format data 4-to-1(trick!)
|
||||
* rx protocol 114 send_then_recv_114, then re-order data 4-to-4(trick!)
|
||||
* tx protocol 111 re-format data 1-to-4, then send(114 trick!)
|
||||
* New version:
|
||||
* rx protocol 111 send_then_recv_114(trick!), then re-format data 4-to-1(trick!)
|
||||
* rx protocol 114 send_then_recv_114
|
||||
* tx protocol 111 send(111)
|
||||
*/
|
||||
if ((fspi->version == FLEXBUS_REVISION_V9) ||
|
||||
(op->data.dir == SPI_MEM_DATA_IN && op->data.buswidth == 1))
|
||||
format_trick = true;
|
||||
else
|
||||
format_trick = false;
|
||||
|
||||
if (op->data.dir == SPI_MEM_DATA_OUT) {
|
||||
if (format_trick) {
|
||||
flexbus_fspi_data_format(fspi, op->data.buf.out, 1, fspi->temp_buf, 4,
|
||||
data_cycles, fspi->switch_buf);
|
||||
dma_sync_single_for_device(fspi->fb->dev, fspi->dma_temp_buf,
|
||||
@@ -362,7 +387,7 @@ static int rk_flexbus_fspi_exec_mem(struct rk_flexbus_fspi *fspi, const struct s
|
||||
cfg.buf_addr = fspi->dma_temp_buf;
|
||||
|
||||
if (op->data.dir == SPI_MEM_DATA_IN)
|
||||
ret = rk_flexbus_fspi_send_then_recv_114(fspi, &cfg);
|
||||
ret = rk_flexbus_fspi_send_then_recv_114(fspi, &cfg, format_trick);
|
||||
else
|
||||
ret = rk_flexbus_fspi_send(fspi, &cfg);
|
||||
if (ret) {
|
||||
@@ -371,11 +396,11 @@ static int rk_flexbus_fspi_exec_mem(struct rk_flexbus_fspi *fspi, const struct s
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (op->data.buf.in) {
|
||||
if (op->data.dir == SPI_MEM_DATA_IN) {
|
||||
if (op->data.buswidth == 4) {
|
||||
dma_sync_single_for_cpu(fspi->fb->dev, fspi->dma_temp_buf,
|
||||
op->data.nbytes, DMA_FROM_DEVICE);
|
||||
if (fspi->version == FLEXBUS_REVISION_V9)
|
||||
if (format_trick)
|
||||
flexbus_data_format_order(fspi, fspi->temp_buf,
|
||||
op->data.buf.in, op->data.nbytes);
|
||||
else
|
||||
@@ -387,6 +412,7 @@ static int rk_flexbus_fspi_exec_mem(struct rk_flexbus_fspi *fspi, const struct s
|
||||
data_cycles, fspi->switch_buf);
|
||||
}
|
||||
}
|
||||
dev_dbg(fspi->fb->dev, "cmd=%x addr=%llx nbytes=%x\n", op->cmd.opcode, op->addr.val, op->data.nbytes);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -122,6 +122,11 @@
|
||||
#define SFC_VER_5 0x5
|
||||
#define SFC_VER_6 0x6
|
||||
#define SFC_VER_8 0x8
|
||||
#define SFC_VER_9 0x9
|
||||
|
||||
/* Ext ctrl */
|
||||
#define SFC_EXT_CTRL 0x34
|
||||
#define SFC_SCLK_X2_BYPASS BIT(24)
|
||||
|
||||
/* Delay line controller resiter */
|
||||
#define SFC_DLL_CTRL0 0x3C
|
||||
@@ -205,6 +210,7 @@ struct rockchip_sfc {
|
||||
dma_addr_t dma_buffer;
|
||||
struct completion cp;
|
||||
bool use_dma;
|
||||
bool sclk_x2_bypass;
|
||||
u32 max_iosize;
|
||||
u32 dll_cells[SFC_MAX_CHIPSELECT_NUM];
|
||||
u16 version;
|
||||
@@ -273,18 +279,18 @@ static void rockchip_sfc_set_delay_lines(struct rockchip_sfc *sfc, u16 cells, u8
|
||||
|
||||
static int rockchip_sfc_clk_set_rate(struct rockchip_sfc *sfc, unsigned long speed)
|
||||
{
|
||||
if (sfc->version >= SFC_VER_8)
|
||||
return clk_set_rate(sfc->clk, speed * 2);
|
||||
else
|
||||
if (sfc->version < SFC_VER_8 || sfc->sclk_x2_bypass)
|
||||
return clk_set_rate(sfc->clk, speed);
|
||||
else
|
||||
return clk_set_rate(sfc->clk, speed * 2);
|
||||
}
|
||||
|
||||
static unsigned long rockchip_sfc_clk_get_rate(struct rockchip_sfc *sfc)
|
||||
{
|
||||
if (sfc->version >= SFC_VER_8)
|
||||
return clk_get_rate(sfc->clk) / 2;
|
||||
else
|
||||
if (sfc->version < SFC_VER_8 || sfc->sclk_x2_bypass)
|
||||
return clk_get_rate(sfc->clk);
|
||||
else
|
||||
return clk_get_rate(sfc->clk) / 2;
|
||||
}
|
||||
|
||||
static void rockchip_sfc_irq_unmask(struct rockchip_sfc *sfc, u32 mask)
|
||||
@@ -309,11 +315,18 @@ static void rockchip_sfc_irq_mask(struct rockchip_sfc *sfc, u32 mask)
|
||||
|
||||
static int rockchip_sfc_init(struct rockchip_sfc *sfc)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
writel(0, sfc->regbase + SFC_CTRL);
|
||||
writel(0xFFFFFFFF, sfc->regbase + SFC_ICLR);
|
||||
rockchip_sfc_irq_mask(sfc, 0xFFFFFFFF);
|
||||
if (rockchip_sfc_get_version(sfc) >= SFC_VER_4)
|
||||
writel(SFC_LEN_CTRL_TRB_SEL, sfc->regbase + SFC_LEN_CTRL);
|
||||
if (rockchip_sfc_get_version(sfc) >= SFC_VER_8 && sfc->sclk_x2_bypass) {
|
||||
reg = readl(sfc->regbase + SFC_EXT_CTRL);
|
||||
reg |= SFC_SCLK_X2_BYPASS;
|
||||
writel(reg, sfc->regbase + SFC_EXT_CTRL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -937,6 +950,8 @@ static int rockchip_sfc_probe(struct platform_device *pdev)
|
||||
|
||||
sfc->use_dma = !of_property_read_bool(sfc->dev->of_node,
|
||||
"rockchip,sfc-no-dma");
|
||||
sfc->sclk_x2_bypass = of_property_read_bool(sfc->dev->of_node,
|
||||
"rockchip,sclk-x2-bypass");
|
||||
|
||||
ret = rockchip_sfc_get_gpio_descs(master, sfc);
|
||||
if (ret) {
|
||||
@@ -985,6 +1000,8 @@ static int rockchip_sfc_probe(struct platform_device *pdev)
|
||||
goto err_irq;
|
||||
|
||||
sfc->version = rockchip_sfc_get_version(sfc);
|
||||
if (sfc->version == SFC_VER_9)
|
||||
sfc->version = SFC_VER_6;
|
||||
sfc->max_iosize = rockchip_sfc_get_max_iosize(sfc);
|
||||
|
||||
master->mode_bits = SPI_TX_QUAD | SPI_TX_DUAL | SPI_RX_QUAD | SPI_RX_DUAL;
|
||||
@@ -1125,6 +1142,7 @@ static const struct dev_pm_ops rockchip_sfc_pm_ops = {
|
||||
};
|
||||
|
||||
static const struct of_device_id rockchip_sfc_dt_ids[] = {
|
||||
{ .compatible = "rockchip,fspi"},
|
||||
{ .compatible = "rockchip,sfc"},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
@@ -274,8 +274,11 @@ struct rockchip_thermal_data {
|
||||
#define TSADCV7_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */
|
||||
#define TSADCV12_AUTO_PERIOD_TIME 3000 /* 2.5ms */
|
||||
#define TSADCV12_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */
|
||||
#define TSADCV13_AUTO_PERIOD_TIME 2500 /* 2.5ms */
|
||||
#define TSADCV13_AUTO_PERIOD_HT_TIME 2500 /* 2.5ms */
|
||||
#define TSADCV3_Q_MAX_VAL 0x7ff /* 11bit 2047 */
|
||||
#define TSADCV12_Q_MAX_VAL 0xfff /* 12bit 4095 */
|
||||
#define TSADCV13_Q_MAX_VAL 0x3ff /* 10bit 1023 */
|
||||
|
||||
#define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */
|
||||
#define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */
|
||||
@@ -293,6 +296,8 @@ struct rockchip_thermal_data {
|
||||
|
||||
#define RK1808_BUS_GRF_SOC_CON0 0x0400
|
||||
|
||||
#define RK3506_GRF_TSADC_CON 0x10
|
||||
|
||||
#define RK3528_GRF_TSADC_CON 0x40030
|
||||
|
||||
#define RK3562_GRF_TSADC_CON 0x0580
|
||||
@@ -644,6 +649,17 @@ static const struct tsadc_table rk3399_code_table[] = {
|
||||
{TSADCV3_DATA_MASK, MAX_TEMP},
|
||||
};
|
||||
|
||||
static const struct tsadc_table rk3506_code_table[] = {
|
||||
{0, MIN_TEMP},
|
||||
{362, MIN_TEMP},
|
||||
{395, -40000},
|
||||
{503, 25000},
|
||||
{604, 85000},
|
||||
{672, 125000},
|
||||
{757, MAX_TEMP},
|
||||
{TSADCV2_DATA_MASK, MAX_TEMP},
|
||||
};
|
||||
|
||||
static const struct tsadc_table rk3528_code_table[] = {
|
||||
{0, MIN_TEMP},
|
||||
{1386, MIN_TEMP},
|
||||
@@ -1213,6 +1229,33 @@ static void rk_tsadcv12_initialize(struct regmap *grf, void __iomem *regs,
|
||||
}
|
||||
}
|
||||
|
||||
static void rk_tsadcv13_initialize(struct regmap *grf, void __iomem *regs,
|
||||
enum tshut_polarity tshut_polarity)
|
||||
{
|
||||
regmap_write(grf, RK3506_GRF_TSADC_CON, RV1106_VOGRF_TSADC_TSEN);
|
||||
udelay(10);
|
||||
regmap_write(grf, RK3506_GRF_TSADC_CON, RV1106_VOGRF_TSADC_ANA);
|
||||
udelay(100);
|
||||
|
||||
writel_relaxed(TSADCV13_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD);
|
||||
writel_relaxed(TSADCV13_AUTO_PERIOD_TIME,
|
||||
regs + TSADCV3_AUTO_PERIOD_HT);
|
||||
writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
|
||||
regs + TSADCV3_HIGHT_INT_DEBOUNCE);
|
||||
writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
|
||||
regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
|
||||
writel_relaxed(TSADCV13_Q_MAX_VAL, regs + TSADCV9_Q_MAX);
|
||||
if (tshut_polarity == TSHUT_HIGH_ACTIVE)
|
||||
writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
|
||||
TSADCV2_AUTO_TSHUT_POLARITY_MASK,
|
||||
regs + TSADCV2_AUTO_CON);
|
||||
else
|
||||
writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
|
||||
regs + TSADCV2_AUTO_CON);
|
||||
writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
|
||||
regs + TSADCV2_AUTO_CON);
|
||||
}
|
||||
|
||||
static void rk_tsadcv2_irq_ack(void __iomem *regs)
|
||||
{
|
||||
u32 val;
|
||||
@@ -1855,6 +1898,27 @@ static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct rockchip_tsadc_chip rk3506_tsadc_data = {
|
||||
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
|
||||
.chn_num = 1, /* seven channels for tsadc */
|
||||
.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
|
||||
.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
|
||||
.tshut_temp = 95000,
|
||||
.initialize = rk_tsadcv13_initialize,
|
||||
.irq_ack = rk_tsadcv4_irq_ack,
|
||||
.control = rk_tsadcv4_control,
|
||||
.get_temp = rk_tsadcv4_get_temp,
|
||||
.set_alarm_temp = rk_tsadcv3_alarm_temp,
|
||||
.set_tshut_temp = rk_tsadcv3_tshut_temp,
|
||||
.set_tshut_mode = rk_tsadcv4_tshut_mode,
|
||||
.table = {
|
||||
.id = rk3506_code_table,
|
||||
.length = ARRAY_SIZE(rk3506_code_table),
|
||||
.data_mask = TSADCV3_DATA_MASK,
|
||||
.mode = ADC_INCREMENT,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct rockchip_tsadc_chip rk3528_tsadc_data = {
|
||||
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
|
||||
.chn_num = 1, /* one channels for tsadc */
|
||||
@@ -2057,6 +2121,12 @@ static const struct of_device_id of_rockchip_thermal_match[] = {
|
||||
.data = (void *)&rk3399_tsadc_data,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3506
|
||||
{
|
||||
.compatible = "rockchip,rk3506-tsadc",
|
||||
.data = (void *)&rk3506_tsadc_data,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_RK3528
|
||||
{
|
||||
.compatible = "rockchip,rk3528-tsadc",
|
||||
|
||||
@@ -159,6 +159,7 @@ enum {
|
||||
RGA_OSD = 0x1 << 11,
|
||||
RGA_PRE_INTR = 0x1 << 12,
|
||||
RGA_FULL_CSC = 0x1 << 13,
|
||||
RGA_GAUSS = 0x1 << 14,
|
||||
};
|
||||
|
||||
enum rga_surf_format {
|
||||
@@ -421,6 +422,11 @@ struct rga_mosaic_info {
|
||||
uint8_t mode;
|
||||
};
|
||||
|
||||
struct rga_gauss_config {
|
||||
uint32_t size;
|
||||
uint64_t coe_ptr;
|
||||
};
|
||||
|
||||
/* MAX(min, (max - channel_value)) */
|
||||
struct rga_osd_invert_factor {
|
||||
uint8_t alpha_max;
|
||||
@@ -745,7 +751,9 @@ struct rga_req {
|
||||
|
||||
struct rga_rgba5551_alpha rgba5551_alpha;
|
||||
|
||||
uint8_t reservr[39];
|
||||
struct rga_gauss_config gauss_config;
|
||||
|
||||
uint8_t reservr[27];
|
||||
};
|
||||
|
||||
struct rga_alpha_config {
|
||||
@@ -878,6 +886,8 @@ struct rga2_req {
|
||||
struct rga_iommu_prefetch iommu_prefetch;
|
||||
|
||||
struct rga_rgba5551_alpha rgba5551_alpha;
|
||||
|
||||
struct rga_gauss_config gauss_config;
|
||||
};
|
||||
|
||||
struct rga3_req {
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
#define RGA2_OSD_CTRL1_OFFSET 0x024 // repeat
|
||||
#define RGA2_SRC_BG_COLOR_OFFSET 0x028
|
||||
#define RGA2_OSD_COLOR0_OFFSET 0x028 // repeat
|
||||
#define RGA2_GAUSS_COE_OFFSET 0x028 // repeat
|
||||
#define RGA2_SRC_FG_COLOR_OFFSET 0x02c
|
||||
#define RGA2_OSD_COLOR1_OFFSET 0x02c // repeat
|
||||
#define RGA2_SRC_TR_COLOR0_OFFSET 0x030
|
||||
@@ -209,6 +210,7 @@
|
||||
#define m_RGA2_MODE_CTRL_SW_TILE4x4_IN_EN (0x1 << 12)
|
||||
#define m_RGA2_MODE_CTRL_SW_TILE4x4_OUT_EN (0x1 << 13)
|
||||
#define m_RGA2_MODE_CTRL_SW_FBC_IN_EN (0x1 << 16)
|
||||
#define m_RGA2_MODE_CTRL_SW_SRC_GAUSS_EN (0x1 << 17)
|
||||
#define m_RGA2_MODE_CTRL_SW_FBC_BSP_DIS (0x1 << 18)
|
||||
#define m_RGA2_MODE_CTRL_SW_TABLE_PRE_FETCH_DIS (0x1 << 19)
|
||||
#define m_RGA2_MODE_CTRL_SW_AXI_WR128_DIS (0x1 << 20)
|
||||
@@ -226,6 +228,7 @@
|
||||
#define s_RGA2_MODE_CTRL_SW_TILE4x4_IN_EN(x) ((x & 0x1) << 12)
|
||||
#define s_RGA2_MODE_CTRL_SW_TILE4x4_OUT_EN(x) ((x & 0x1) << 13)
|
||||
#define s_RGA2_MODE_CTRL_SW_FBC_IN_EN(x) ((x & 0x1) << 16)
|
||||
#define s_RGA2_MODE_CTRL_SW_SRC_GAUSS_EN(x) ((x & 0x1) << 17)
|
||||
#define s_RGA2_MODE_CTRL_SW_FBC_BSP_DIS(x) ((x & 0x1) << 18)
|
||||
#define s_RGA2_MODE_CTRL_SW_TABLE_PRE_FETCH_DIS(x) ((x & 0x1) << 19)
|
||||
#define s_RGA2_MODE_CTRL_SW_AXI_WR128_DIS(x) ((x & 0x1) << 20)
|
||||
@@ -312,6 +315,15 @@
|
||||
#define s_RGA2_OSD_CTRL0_SW_OSD_FIX_WIDTH(x) ((x & 0x3ff) << 20)
|
||||
#define s_RGA2_OSD_CTRL0_SW_OSD_2BPP_MODE(x) ((x & 0x1) << 30)
|
||||
|
||||
/* RGA2_GAUSS_COE */
|
||||
#define m_RGA2_GAUSS_COE_SW_COE0 (0x3f << 0)
|
||||
#define m_RGA2_GAUSS_COE_SW_COE1 (0x3f << 8)
|
||||
#define m_RGA2_GAUSS_COE_SW_COE2 (0xff << 16)
|
||||
|
||||
#define s_RGA2_GAUSS_COE_SW_COE0(x) ((x & 0x3f) << 0)
|
||||
#define s_RGA2_GAUSS_COE_SW_COE1(x) ((x & 0x3f) << 8)
|
||||
#define s_RGA2_GAUSS_COE_SW_COE2(x) ((x & 0xff) << 16)
|
||||
|
||||
/* RGA2_OSD_CTRL1 */
|
||||
#define m_RGA2_OSD_CTRL1_SW_OSD_COLOR_SEL (0x1 << 0)
|
||||
#define m_RGA2_OSD_CTRL1_SW_OSD_FLAG_SEL (0x1 << 1)
|
||||
|
||||
@@ -76,6 +76,7 @@ struct rga_hw_data {
|
||||
extern const struct rga_hw_data rga3_data;
|
||||
extern const struct rga_hw_data rga2e_data;
|
||||
extern const struct rga_hw_data rga2e_1106_data;
|
||||
extern const struct rga_hw_data rga2e_3506_data;
|
||||
extern const struct rga_hw_data rga2e_iommu_data;
|
||||
extern const struct rga_hw_data rga2p_iommu_data;
|
||||
extern const struct rga_hw_data rga2p_lite_1103b_data;
|
||||
|
||||
@@ -225,6 +225,10 @@ static void RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)
|
||||
reg = ((reg & (~m_RGA2_MODE_CTRL_SW_OSD_E)) |
|
||||
(s_RGA2_MODE_CTRL_SW_OSD_E(msg->osd_info.enable)));
|
||||
|
||||
if (msg->gauss_config.size > 0)
|
||||
reg = ((reg & (~m_RGA2_MODE_CTRL_SW_SRC_GAUSS_EN)) |
|
||||
(s_RGA2_MODE_CTRL_SW_SRC_GAUSS_EN(1)));
|
||||
|
||||
*bRGA_MODE_CTL = reg;
|
||||
}
|
||||
|
||||
@@ -252,9 +256,11 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
|
||||
u8 src0_cbcr_swp = 0;
|
||||
u8 pixel_width = 1;
|
||||
u8 plane_width = 0;
|
||||
u8 pixel_depth = 8;
|
||||
u32 stride = 0;
|
||||
u32 uv_stride = 0;
|
||||
u32 mask_stride = 0;
|
||||
u32 byte_stride = 0;
|
||||
u32 ydiv = 1, xdiv = 2;
|
||||
u8 yuv10 = 0;
|
||||
|
||||
@@ -562,6 +568,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
|
||||
case RGA_FORMAT_YCbCr_420_SP_10B:
|
||||
src0_format = 0xa;
|
||||
plane_width = 2;
|
||||
pixel_depth = 10;
|
||||
xdiv = 2;
|
||||
ydiv = 2;
|
||||
yuv10 = 1;
|
||||
@@ -569,6 +576,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
|
||||
case RGA_FORMAT_YCrCb_420_SP_10B:
|
||||
src0_format = 0xa;
|
||||
plane_width = 2;
|
||||
pixel_depth = 10;
|
||||
xdiv = 2;
|
||||
ydiv = 2;
|
||||
src0_cbcr_swp = 1;
|
||||
@@ -577,6 +585,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
|
||||
case RGA_FORMAT_YCbCr_422_SP_10B:
|
||||
src0_format = 0x8;
|
||||
plane_width = 2;
|
||||
pixel_depth = 10;
|
||||
xdiv = 2;
|
||||
ydiv = 1;
|
||||
yuv10 = 1;
|
||||
@@ -584,6 +593,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
|
||||
case RGA_FORMAT_YCrCb_422_SP_10B:
|
||||
src0_format = 0x8;
|
||||
plane_width = 2;
|
||||
pixel_depth = 10;
|
||||
xdiv = 2;
|
||||
ydiv = 1;
|
||||
src0_cbcr_swp = 1;
|
||||
@@ -615,12 +625,25 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
|
||||
|
||||
switch (msg->src.rd_mode) {
|
||||
case RGA_RASTER_MODE:
|
||||
stride = ALIGN(msg->src.vir_w * pixel_width, 4);
|
||||
if (msg->src.format == RGA_FORMAT_YCbCr_420_SP_10B ||
|
||||
msg->src.format == RGA_FORMAT_YCrCb_420_SP_10B ||
|
||||
msg->src.format == RGA_FORMAT_YCbCr_422_SP_10B ||
|
||||
msg->src.format == RGA_FORMAT_YCrCb_422_SP_10B)
|
||||
/*
|
||||
* Legacy: implicit semantics exist here, 10bit format
|
||||
* width_stride equals byte_stride.
|
||||
*/
|
||||
byte_stride = msg->src.vir_w;
|
||||
else
|
||||
byte_stride = msg->src.vir_w * pixel_width * pixel_depth / 8;
|
||||
|
||||
stride = ALIGN(byte_stride, 4);
|
||||
uv_stride = ALIGN(msg->src.vir_w / xdiv * plane_width, 4);
|
||||
|
||||
yrgb_offset = msg->src.y_offset * stride + msg->src.x_offset * pixel_width;
|
||||
yrgb_offset = msg->src.y_offset * stride +
|
||||
msg->src.x_offset * pixel_width * pixel_depth / 8;
|
||||
uv_offset = (msg->src.y_offset / ydiv) * uv_stride +
|
||||
(msg->src.x_offset / xdiv * plane_width);
|
||||
(msg->src.x_offset / xdiv * plane_width * pixel_depth / 8);
|
||||
v_offset = uv_offset;
|
||||
|
||||
break;
|
||||
@@ -1886,6 +1909,50 @@ static void RGA_set_reg_mosaic(u8 *base, struct rga2_req *msg)
|
||||
*bRGA_MOSAIC_MODE = (u32)(msg->mosaic_info.mode & 0x7);
|
||||
}
|
||||
|
||||
static int RGA_set_reg_gauss(u8 *base, struct rga2_req *msg)
|
||||
{
|
||||
uint32_t *bRGA_GAUSS_COE;
|
||||
uint32_t reg = 0;
|
||||
uint32_t *coe;
|
||||
|
||||
bRGA_GAUSS_COE = (u32 *)(base + RGA2_GAUSS_COE_OFFSET);
|
||||
|
||||
if (msg->gauss_config.size != 3) {
|
||||
pr_err("Gaussian blur only support 3x3\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
coe = kmalloc(sizeof(uint32_t) * msg->gauss_config.size, GFP_KERNEL);
|
||||
if (coe == NULL) {
|
||||
pr_err("Gaussian blur alloc coe buffer error!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (unlikely(copy_from_user(coe,
|
||||
u64_to_user_ptr(msg->gauss_config.coe_ptr),
|
||||
sizeof(uint32_t) * msg->gauss_config.size))) {
|
||||
pr_err("Gaussian blur coe copy_from_user failed\n");
|
||||
|
||||
kfree(coe);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
reg = ((reg & (~m_RGA2_GAUSS_COE_SW_COE0)) |
|
||||
(s_RGA2_GAUSS_COE_SW_COE0(coe[0])));
|
||||
|
||||
reg = ((reg & (~m_RGA2_GAUSS_COE_SW_COE1)) |
|
||||
(s_RGA2_GAUSS_COE_SW_COE1(coe[1])));
|
||||
|
||||
reg = ((reg & (~m_RGA2_GAUSS_COE_SW_COE2)) |
|
||||
(s_RGA2_GAUSS_COE_SW_COE2(coe[2])));
|
||||
|
||||
*bRGA_GAUSS_COE = reg;
|
||||
|
||||
kfree(coe);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void RGA2_set_reg_osd(u8 *base, struct rga2_req *msg)
|
||||
{
|
||||
u32 *bRGA_OSD_CTRL0;
|
||||
@@ -2194,6 +2261,7 @@ static void RGA2_set_mmu_reg_info(struct rga_scheduler_t *scheduler, u8 *base, s
|
||||
|
||||
static int rga2_gen_reg_info(struct rga_scheduler_t *scheduler, u8 *base, struct rga2_req *msg)
|
||||
{
|
||||
int ret;
|
||||
u8 dst_nn_quantize_en = 0;
|
||||
|
||||
RGA2_set_mode_ctrl(base, msg);
|
||||
@@ -2217,6 +2285,11 @@ static int rga2_gen_reg_info(struct rga_scheduler_t *scheduler, u8 *base, struct
|
||||
RGA_set_reg_mosaic(base, msg);
|
||||
if (msg->osd_info.enable)
|
||||
RGA2_set_reg_osd(base, msg);
|
||||
if (msg->gauss_config.size > 0) {
|
||||
ret = RGA_set_reg_gauss(base, msg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
break;
|
||||
case COLOR_FILL_MODE:
|
||||
@@ -2247,7 +2320,7 @@ static int rga2_gen_reg_info(struct rga_scheduler_t *scheduler, u8 *base, struct
|
||||
break;
|
||||
default:
|
||||
pr_err("ERROR msg render mode %d\n", msg->render_mode);
|
||||
break;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
RGA2_set_mmu_reg_info(scheduler, base, msg);
|
||||
@@ -2409,6 +2482,8 @@ static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler,
|
||||
/* RGA2 1106 add */
|
||||
memcpy(&req->mosaic_info, &req_rga->mosaic_info, sizeof(req_rga->mosaic_info));
|
||||
|
||||
memcpy(&req->gauss_config, &req_rga->gauss_config, sizeof(req_rga->gauss_config));
|
||||
|
||||
if ((scheduler->data->feature & RGA_YIN_YOUT) &&
|
||||
rga_is_only_y_format(req->src.format) &&
|
||||
rga_is_only_y_format(req->dst.format))
|
||||
@@ -2748,7 +2823,8 @@ static int rga2_init_reg(struct rga_job *job)
|
||||
if (scheduler->data->mmu == RGA_IOMMU)
|
||||
req.CMD_fin_int_enable = 1;
|
||||
|
||||
if (rga2_gen_reg_info(scheduler, (uint8_t *)job->cmd_buf->vaddr, &req) == -1) {
|
||||
ret = rga2_gen_reg_info(scheduler, (uint8_t *)job->cmd_buf->vaddr, &req);
|
||||
if (ret < 0) {
|
||||
pr_err("gen reg info error\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1371,6 +1371,8 @@ static int rga_drv_probe(struct platform_device *pdev)
|
||||
} else if (!strcmp(scheduler->version.str, "3.6.92812") ||
|
||||
!strcmp(scheduler->version.str, "3.7.93215")) {
|
||||
scheduler->data = &rga2e_iommu_data;
|
||||
} else if (!strcmp(scheduler->version.str, "3.a.07135")) {
|
||||
scheduler->data = &rga2e_3506_data;
|
||||
} else if (!strcmp(scheduler->version.str, "3.e.19357")) {
|
||||
scheduler->data = &rga2p_iommu_data;
|
||||
rga_hw_set_issue_mask(scheduler, RGA_HW_ISSUE_DIS_AUTO_RST);
|
||||
|
||||
@@ -399,6 +399,41 @@ const struct rga_win_data rga2e_win_data[] = {
|
||||
},
|
||||
};
|
||||
|
||||
const struct rga_win_data rga2e_3506_win_data[] = {
|
||||
{
|
||||
.name = "rga2e-src0",
|
||||
.formats[RGA_RASTER_INDEX] = rga2e_input_raster_format,
|
||||
.formats_count[RGA_RASTER_INDEX] = ARRAY_SIZE(rga2e_input_raster_format),
|
||||
.supported_rotations = RGA_MODE_ROTATE_MASK,
|
||||
.scale_up_mode = RGA_SCALE_UP_BIC,
|
||||
.scale_down_mode = RGA_SCALE_DOWN_AVG,
|
||||
.rd_mode = RGA_RASTER_MODE,
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
.name = "rga2e-src1",
|
||||
.formats[RGA_RASTER_INDEX] = rga2p_input_raster_format,
|
||||
.formats_count[RGA_RASTER_INDEX] = ARRAY_SIZE(rga2p_input_raster_format),
|
||||
.supported_rotations = RGA_MODE_ROTATE_MASK,
|
||||
.scale_up_mode = RGA_SCALE_UP_BIC,
|
||||
.scale_down_mode = RGA_SCALE_DOWN_AVG,
|
||||
.rd_mode = RGA_RASTER_MODE,
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
.name = "rga2-dst",
|
||||
.formats[RGA_RASTER_INDEX] = rga2e_output_raster_format,
|
||||
.formats_count[RGA_RASTER_INDEX] = ARRAY_SIZE(rga2e_output_raster_format),
|
||||
.supported_rotations = 0,
|
||||
.scale_up_mode = RGA_SCALE_UP_NONE,
|
||||
.scale_down_mode = RGA_SCALE_DOWN_NONE,
|
||||
.rd_mode = RGA_RASTER_MODE,
|
||||
|
||||
},
|
||||
};
|
||||
|
||||
const struct rga_win_data rga2p_win_data[] = {
|
||||
{
|
||||
.name = "rga2p-src0",
|
||||
@@ -537,6 +572,30 @@ const struct rga_hw_data rga2e_1106_data = {
|
||||
.mmu = RGA_NONE_MMU,
|
||||
};
|
||||
|
||||
const struct rga_hw_data rga2e_3506_data = {
|
||||
.version = 0,
|
||||
.input_range = {{2, 2}, {1280, 1280}},
|
||||
.output_range = {{2, 2}, {1280, 1280}},
|
||||
|
||||
.win = rga2e_3506_win_data,
|
||||
.win_size = ARRAY_SIZE(rga2e_3506_win_data),
|
||||
/* 1 << factor mean real factor */
|
||||
.max_upscale_factor = 4,
|
||||
.max_downscale_factor = 4,
|
||||
|
||||
.byte_stride_align = 4,
|
||||
.max_byte_stride = WORD_TO_BYTE(8192),
|
||||
|
||||
.feature = RGA_COLOR_FILL | RGA_COLOR_PALETTE |
|
||||
RGA_COLOR_KEY | RGA_YIN_YOUT | RGA_YUV_HDS | RGA_YUV_VDS |
|
||||
RGA_PRE_INTR | RGA_FULL_CSC | RGA_GAUSS,
|
||||
.csc_r2y_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
|
||||
RGA_MODE_CSC_BT709,
|
||||
.csc_y2r_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
|
||||
RGA_MODE_CSC_BT709,
|
||||
.mmu = RGA_NONE_MMU,
|
||||
};
|
||||
|
||||
const struct rga_hw_data rga2e_iommu_data = {
|
||||
.version = 0,
|
||||
.input_range = {{2, 2}, {8192, 8192}},
|
||||
|
||||
489
include/dt-bindings/clock/rockchip,rk3506-cru.h
Normal file
489
include/dt-bindings/clock/rockchip,rk3506-cru.h
Normal file
@@ -0,0 +1,489 @@
|
||||
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
||||
/*
|
||||
* Copyright (c) 2023 Rockchip Electronics Co. Ltd.
|
||||
* Author: Finley Xiao <finley.xiao@rock-chips.com>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3506_H
|
||||
#define _DT_BINDINGS_CLK_ROCKCHIP_RK3506_H
|
||||
|
||||
/* cru plls */
|
||||
#define PLL_GPLL 1
|
||||
#define PLL_V0PLL 2
|
||||
#define PLL_V1PLL 3
|
||||
|
||||
/* cru-clocks indices */
|
||||
#define ARMCLK 15
|
||||
#define CLK_DDR 16
|
||||
#define XIN24M_GATE 17
|
||||
#define CLK_GPLL_GATE 18
|
||||
#define CLK_V0PLL_GATE 19
|
||||
#define CLK_V1PLL_GATE 20
|
||||
#define CLK_GPLL_DIV 21
|
||||
#define CLK_GPLL_DIV_100M 22
|
||||
#define CLK_V0PLL_DIV 23
|
||||
#define CLK_V1PLL_DIV 24
|
||||
#define CLK_INT_VOICE_MATRIX0 25
|
||||
#define CLK_INT_VOICE_MATRIX1 26
|
||||
#define CLK_INT_VOICE_MATRIX2 27
|
||||
#define CLK_FRAC_UART_MATRIX0_MUX 28
|
||||
#define CLK_FRAC_UART_MATRIX1_MUX 29
|
||||
#define CLK_FRAC_VOICE_MATRIX0_MUX 30
|
||||
#define CLK_FRAC_VOICE_MATRIX1_MUX 31
|
||||
#define CLK_FRAC_COMMON_MATRIX0_MUX 32
|
||||
#define CLK_FRAC_COMMON_MATRIX1_MUX 33
|
||||
#define CLK_FRAC_COMMON_MATRIX2_MUX 34
|
||||
#define CLK_FRAC_UART_MATRIX0 35
|
||||
#define CLK_FRAC_UART_MATRIX1 36
|
||||
#define CLK_FRAC_VOICE_MATRIX0 37
|
||||
#define CLK_FRAC_VOICE_MATRIX1 38
|
||||
#define CLK_FRAC_COMMON_MATRIX0 39
|
||||
#define CLK_FRAC_COMMON_MATRIX1 40
|
||||
#define CLK_FRAC_COMMON_MATRIX2 41
|
||||
#define CLK_REF_USBPHY_TOP 42
|
||||
#define CLK_REF_DPHY_TOP 43
|
||||
#define ACLK_CORE_ROOT 44
|
||||
#define PCLK_CORE_ROOT 45
|
||||
#define PCLK_DBG 48
|
||||
#define PCLK_CORE_GRF 49
|
||||
#define PCLK_CORE_CRU 50
|
||||
#define CLK_CORE_EMA_DETECT 51
|
||||
#define CLK_REF_PVTPLL_CORE 52
|
||||
#define PCLK_GPIO1 53
|
||||
#define DBCLK_GPIO1 54
|
||||
#define ACLK_CORE_PERI_ROOT 55
|
||||
#define HCLK_CORE_PERI_ROOT 56
|
||||
#define PCLK_CORE_PERI_ROOT 57
|
||||
#define CLK_DSMC 58
|
||||
#define ACLK_DSMC 59
|
||||
#define PCLK_DSMC 60
|
||||
#define CLK_FLEXBUS_TX 61
|
||||
#define CLK_FLEXBUS_RX 62
|
||||
#define ACLK_FLEXBUS 63
|
||||
#define HCLK_FLEXBUS 64
|
||||
#define ACLK_DSMC_SLV 65
|
||||
#define HCLK_DSMC_SLV 66
|
||||
#define ACLK_BUS_ROOT 67
|
||||
#define HCLK_BUS_ROOT 68
|
||||
#define PCLK_BUS_ROOT 69
|
||||
#define ACLK_SYSRAM 70
|
||||
#define HCLK_SYSRAM 71
|
||||
#define ACLK_DMAC0 72
|
||||
#define ACLK_DMAC1 73
|
||||
#define HCLK_M0 74
|
||||
#define PCLK_BUS_GRF 75
|
||||
#define PCLK_TIMER 76
|
||||
#define CLK_TIMER0_CH0 77
|
||||
#define CLK_TIMER0_CH1 78
|
||||
#define CLK_TIMER0_CH2 79
|
||||
#define CLK_TIMER0_CH3 80
|
||||
#define CLK_TIMER0_CH4 81
|
||||
#define CLK_TIMER0_CH5 82
|
||||
#define PCLK_WDT0 83
|
||||
#define TCLK_WDT0 84
|
||||
#define PCLK_WDT1 85
|
||||
#define TCLK_WDT1 86
|
||||
#define PCLK_MAILBOX 87
|
||||
#define PCLK_INTMUX 88
|
||||
#define PCLK_SPINLOCK 89
|
||||
#define PCLK_DDRC 90
|
||||
#define HCLK_DDRPHY 91
|
||||
#define PCLK_DDRMON 92
|
||||
#define CLK_DDRMON_OSC 93
|
||||
#define PCLK_STDBY 94
|
||||
#define HCLK_USBOTG0 95
|
||||
#define HCLK_USBOTG0_PMU 96
|
||||
#define CLK_USBOTG0_ADP 97
|
||||
#define HCLK_USBOTG1 98
|
||||
#define HCLK_USBOTG1_PMU 99
|
||||
#define CLK_USBOTG1_ADP 100
|
||||
#define PCLK_USBPHY 101
|
||||
#define ACLK_DMA2DDR 102
|
||||
#define PCLK_DMA2DDR 103
|
||||
#define STCLK_M0 104
|
||||
#define CLK_DDRPHY 105
|
||||
#define CLK_DDRC_SRC 106
|
||||
#define ACLK_DDRC_0 107
|
||||
#define ACLK_DDRC_1 108
|
||||
#define CLK_DDRC 109
|
||||
#define CLK_DDRMON 110
|
||||
#define HCLK_LSPERI_ROOT 111
|
||||
#define PCLK_LSPERI_ROOT 112
|
||||
#define PCLK_UART0 113
|
||||
#define PCLK_UART1 114
|
||||
#define PCLK_UART2 115
|
||||
#define PCLK_UART3 116
|
||||
#define PCLK_UART4 117
|
||||
#define SCLK_UART0 118
|
||||
#define SCLK_UART1 119
|
||||
#define SCLK_UART2 120
|
||||
#define SCLK_UART3 121
|
||||
#define SCLK_UART4 122
|
||||
#define PCLK_I2C0 123
|
||||
#define CLK_I2C0 124
|
||||
#define PCLK_I2C1 125
|
||||
#define CLK_I2C1 126
|
||||
#define PCLK_I2C2 127
|
||||
#define CLK_I2C2 128
|
||||
#define PCLK_PWM1 129
|
||||
#define CLK_PWM1 130
|
||||
#define CLK_OSC_PWM1 131
|
||||
#define CLK_RC_PWM1 132
|
||||
#define CLK_FREQ_PWM1 133
|
||||
#define CLK_COUNTER_PWM1 134
|
||||
#define PCLK_SPI0 135
|
||||
#define CLK_SPI0 136
|
||||
#define PCLK_SPI1 137
|
||||
#define CLK_SPI1 138
|
||||
#define PCLK_GPIO2 139
|
||||
#define DBCLK_GPIO2 140
|
||||
#define PCLK_GPIO3 141
|
||||
#define DBCLK_GPIO3 142
|
||||
#define PCLK_GPIO4 143
|
||||
#define DBCLK_GPIO4 144
|
||||
#define HCLK_CAN0 145
|
||||
#define CLK_CAN0 146
|
||||
#define HCLK_CAN1 147
|
||||
#define CLK_CAN1 148
|
||||
#define HCLK_PDM 149
|
||||
#define MCLK_PDM 150
|
||||
#define CLKOUT_PDM 151
|
||||
#define MCLK_SPDIFTX 152
|
||||
#define HCLK_SPDIFTX 153
|
||||
#define HCLK_SPDIFRX 154
|
||||
#define MCLK_SPDIFRX 155
|
||||
#define MCLK_SAI0 156
|
||||
#define HCLK_SAI0 157
|
||||
#define MCLK_OUT_SAI0 158
|
||||
#define MCLK_SAI1 159
|
||||
#define HCLK_SAI1 160
|
||||
#define MCLK_OUT_SAI1 161
|
||||
#define HCLK_ASRC0 162
|
||||
#define CLK_ASRC0 163
|
||||
#define HCLK_ASRC1 164
|
||||
#define CLK_ASRC1 165
|
||||
#define PCLK_CRU 166
|
||||
#define PCLK_PMU_ROOT 167
|
||||
#define MCLK_ASRC0 168
|
||||
#define MCLK_ASRC1 169
|
||||
#define MCLK_ASRC2 170
|
||||
#define MCLK_ASRC3 171
|
||||
#define LRCK_ASRC0_SRC 172
|
||||
#define LRCK_ASRC0_DST 173
|
||||
#define LRCK_ASRC1_SRC 174
|
||||
#define LRCK_ASRC1_DST 175
|
||||
#define ACLK_HSPERI_ROOT 176
|
||||
#define HCLK_HSPERI_ROOT 177
|
||||
#define PCLK_HSPERI_ROOT 178
|
||||
#define CCLK_SRC_SDMMC 179
|
||||
#define HCLK_SDMMC 180
|
||||
#define HCLK_FSPI 181
|
||||
#define SCLK_FSPI 182
|
||||
#define PCLK_SPI2 183
|
||||
#define ACLK_MAC0 184
|
||||
#define ACLK_MAC1 185
|
||||
#define PCLK_MAC0 186
|
||||
#define PCLK_MAC1 187
|
||||
#define CLK_MAC_ROOT 188
|
||||
#define CLK_MAC0 189
|
||||
#define CLK_MAC1 190
|
||||
#define MCLK_SAI2 191
|
||||
#define HCLK_SAI2 192
|
||||
#define MCLK_OUT_SAI2 193
|
||||
#define MCLK_SAI3_SRC 194
|
||||
#define HCLK_SAI3 195
|
||||
#define MCLK_SAI3 196
|
||||
#define MCLK_OUT_SAI3 197
|
||||
#define MCLK_SAI4_SRC 198
|
||||
#define HCLK_SAI4 199
|
||||
#define MCLK_SAI4 200
|
||||
#define HCLK_DSM 201
|
||||
#define MCLK_DSM 202
|
||||
#define PCLK_AUDIO_ADC 203
|
||||
#define MCLK_AUDIO_ADC 204
|
||||
#define MCLK_AUDIO_ADC_DIV4 205
|
||||
#define PCLK_SARADC 206
|
||||
#define CLK_SARADC 207
|
||||
#define PCLK_OTPC_NS 208
|
||||
#define CLK_SBPI_OTPC_NS 209
|
||||
#define CLK_USER_OTPC_NS 210
|
||||
#define PCLK_UART5 211
|
||||
#define SCLK_UART5 212
|
||||
#define PCLK_GPIO234_IOC 213
|
||||
#define CLK_MAC_PTP_ROOT 214
|
||||
#define CLK_MAC0_PTP 215
|
||||
#define CLK_MAC1_PTP 216
|
||||
#define CLK_SPI2 217
|
||||
#define ACLK_VIO_ROOT 218
|
||||
#define HCLK_VIO_ROOT 219
|
||||
#define PCLK_VIO_ROOT 220
|
||||
#define HCLK_RGA 221
|
||||
#define ACLK_RGA 222
|
||||
#define CLK_CORE_RGA 223
|
||||
#define ACLK_VOP 224
|
||||
#define HCLK_VOP 225
|
||||
#define DCLK_VOP 226
|
||||
#define PCLK_DPHY 227
|
||||
#define PCLK_DSI_HOST 228
|
||||
#define PCLK_TSADC 229
|
||||
#define CLK_TSADC 230
|
||||
#define CLK_TSADC_TSEN 231
|
||||
#define PCLK_GPIO1_IOC 232
|
||||
#define PCLK_OTPC_S 233
|
||||
#define CLK_SBPI_OTPC_S 234
|
||||
#define CLK_USER_OTPC_S 235
|
||||
#define PCLK_OTP_MASK 236
|
||||
#define PCLK_KEYREADER 237
|
||||
#define HCLK_BOOTROM 238
|
||||
#define PCLK_DDR_SERVICE 239
|
||||
#define HCLK_CRYPTO_S 240
|
||||
#define HCLK_KEYLAD 241
|
||||
#define CLK_CORE_CRYPTO 242
|
||||
#define CLK_PKA_CRYPTO 243
|
||||
#define CLK_CORE_CRYPTO_S 244
|
||||
#define CLK_PKA_CRYPTO_S 245
|
||||
#define ACLK_CRYPTO_S 246
|
||||
#define HCLK_RNG_S 247
|
||||
#define CLK_CORE_CRYPTO_NS 248
|
||||
#define CLK_PKA_CRYPTO_NS 249
|
||||
#define ACLK_CRYPTO_NS 250
|
||||
#define HCLK_CRYPTO_NS 251
|
||||
#define HCLK_RNG 252
|
||||
#define CLK_PMU 253
|
||||
#define PCLK_PMU 254
|
||||
#define CLK_PMU_32K 255
|
||||
#define PCLK_PMU_CRU 256
|
||||
#define PCLK_PMU_GRF 257
|
||||
#define PCLK_GPIO0_IOC 258
|
||||
#define PCLK_GPIO0 259
|
||||
#define DBCLK_GPIO0 260
|
||||
#define PCLK_GPIO1_SHADOW 261
|
||||
#define DBCLK_GPIO1_SHADOW 262
|
||||
#define PCLK_PMU_HP_TIMER 263
|
||||
#define CLK_PMU_HP_TIMER 264
|
||||
#define CLK_PMU_HP_TIMER_32K 265
|
||||
#define PCLK_PWM0 266
|
||||
#define CLK_PWM0 267
|
||||
#define CLK_OSC_PWM0 268
|
||||
#define CLK_RC_PWM0 269
|
||||
#define CLK_MAC_OUT 270
|
||||
#define CLK_REF_OUT0 271
|
||||
#define CLK_REF_OUT1 272
|
||||
#define CLK_32K_FRAC 273
|
||||
#define CLK_32K_RC 274
|
||||
#define CLK_32K 275
|
||||
#define CLK_32K_PMU 276
|
||||
#define PCLK_TOUCH_KEY 277
|
||||
#define CLK_TOUCH_KEY 278
|
||||
#define CLK_REF_PHY_PLL 279
|
||||
#define CLK_REF_PHY_PMU_MUX 280
|
||||
#define CLK_WIFI_OUT 281
|
||||
#define CLK_V0PLL_REF 282
|
||||
#define CLK_V1PLL_REF 283
|
||||
|
||||
#define CLK_NR_CLKS (CLK_V1PLL_REF + 1)
|
||||
|
||||
/* soft-reset indices */
|
||||
|
||||
/********Name=SOFTRST_CON00,Offset=0xA00********/
|
||||
#define SRST_NCOREPORESET0_AC 0
|
||||
#define SRST_NCOREPORESET1_AC 1
|
||||
#define SRST_NCOREPORESET2_AC 2
|
||||
#define SRST_NCORESET0_AC 4
|
||||
#define SRST_NCORESET1_AC 5
|
||||
#define SRST_NCORESET2_AC 6
|
||||
#define SRST_NL2RESET_AC 8
|
||||
#define SRST_ARESETN_CORE_BIU_AC 9
|
||||
#define SRST_HRESETN_M0_AC 10
|
||||
|
||||
/********Name=SOFTRST_CON02,Offset=0xA08********/
|
||||
#define SRST_N_DBG 42
|
||||
#define SRST_P_CORE_BIU 46
|
||||
#define SRST_PMU 47
|
||||
|
||||
/********Name=SOFTRST_CON03,Offset=0xA0C********/
|
||||
#define SRST_P_DBG 49
|
||||
#define SRST_POT_DBG 50
|
||||
#define SRST_P_CORE_GRF 52
|
||||
#define SRST_CORE_EMA_DETECT 54
|
||||
#define SRST_REF_PVTPLL_CORE 55
|
||||
#define SRST_P_GPIO1 56
|
||||
#define SRST_DB_GPIO1 57
|
||||
|
||||
/********Name=SOFTRST_CON04,Offset=0xA10********/
|
||||
#define SRST_A_CORE_PERI_BIU 67
|
||||
#define SRST_A_DSMC 69
|
||||
#define SRST_P_DSMC 70
|
||||
#define SRST_FLEXBUS 71
|
||||
#define SRST_A_FLEXBUS 73
|
||||
#define SRST_H_FLEXBUS 74
|
||||
#define SRST_A_DSMC_SLV 75
|
||||
#define SRST_H_DSMC_SLV 76
|
||||
#define SRST_DSMC_SLV 77
|
||||
|
||||
/********Name=SOFTRST_CON05,Offset=0xA14********/
|
||||
#define SRST_A_BUS_BIU 83
|
||||
#define SRST_H_BUS_BIU 84
|
||||
#define SRST_P_BUS_BIU 85
|
||||
#define SRST_A_SYSTEM 86
|
||||
#define SRST_H_SySTEM 87
|
||||
#define SRST_A_DMAC0 88
|
||||
#define SRST_A_DMAC1 89
|
||||
#define SRST_H_M0 90
|
||||
#define SRST_M0_JTAG 91
|
||||
#define SRST_H_CRYPTO 95
|
||||
|
||||
/********Name=SOFTRST_CON06,Offset=0xA18********/
|
||||
#define SRST_H_RNG 96
|
||||
#define SRST_P_BUS_GRF 97
|
||||
#define SRST_P_TIMER0 98
|
||||
#define SRST_TIMER0_CH0 99
|
||||
#define SRST_TIMER0_CH1 100
|
||||
#define SRST_TIMER0_CH2 101
|
||||
#define SRST_TIMER0_CH3 102
|
||||
#define SRST_TIMER0_CH4 103
|
||||
#define SRST_TIMER0_CH5 104
|
||||
#define SRST_P_WDT0 105
|
||||
#define SRST_T_WDT0 106
|
||||
#define SRST_P_WDT1 107
|
||||
#define SRST_T_WDT1 108
|
||||
#define SRST_P_MAILBOX 109
|
||||
#define SRST_P_INTMUX 110
|
||||
#define SRST_P_SPINLOCK 111
|
||||
|
||||
/********Name=SOFTRST_CON07,Offset=0xA1C********/
|
||||
#define SRST_P_DDRC 112
|
||||
#define SRST_H_DDRPHY 113
|
||||
#define SRST_P_DDRMON 114
|
||||
#define SRST_DDRMON_OSC 115
|
||||
#define SRST_P_DDR_LPC 116
|
||||
#define SRST_H_USBOTG0 117
|
||||
#define SRST_USBOTG0_ADP 119
|
||||
#define SRST_H_USBOTG1 120
|
||||
#define SRST_USBOTG1_ADP 122
|
||||
#define SRST_P_USBPHY 123
|
||||
#define SRST_USBPHY_POR 124
|
||||
#define SRST_USBPHY_OTG0 125
|
||||
#define SRST_USBPHY_OTG1 126
|
||||
|
||||
/********Name=SOFTRST_CON08,Offset=0xA20********/
|
||||
#define SRST_A_DMA2DDR 128
|
||||
#define SRST_P_DMA2DDR 129
|
||||
|
||||
/********Name=SOFTRST_CON09,Offset=0xA24********/
|
||||
#define SRST_USBOTG0_UTMI 144
|
||||
#define SRST_USBOTG1_UTMI 145
|
||||
|
||||
/********Name=SOFTRST_CON10,Offset=0xA28********/
|
||||
#define SRST_A_DDRC_0 160
|
||||
#define SRST_A_DDRC_1 161
|
||||
#define SRST_A_DDR_BIU 162
|
||||
#define SRST_DDRC 163
|
||||
#define SRST_DDRMON 164
|
||||
|
||||
/********Name=SOFTRST_CON11,Offset=0xA2C********/
|
||||
#define SRST_H_LSPERI_BIU 178
|
||||
#define SRST_P_UART0 180
|
||||
#define SRST_P_UART1 181
|
||||
#define SRST_P_UART2 182
|
||||
#define SRST_P_UART3 183
|
||||
#define SRST_P_UART4 184
|
||||
#define SRST_UART0 185
|
||||
#define SRST_UART1 186
|
||||
#define SRST_UART2 187
|
||||
#define SRST_UART3 188
|
||||
#define SRST_UART4 189
|
||||
#define SRST_P_I2C0 190
|
||||
#define SRST_I2C0 191
|
||||
|
||||
/********Name=SOFTRST_CON12,Offset=0xA30********/
|
||||
#define SRST_P_I2C1 192
|
||||
#define SRST_I2C1 193
|
||||
#define SRST_P_I2C2 194
|
||||
#define SRST_I2C2 195
|
||||
#define SRST_P_PWM1 196
|
||||
#define SRST_PWM1 197
|
||||
#define SRST_P_SPI0 202
|
||||
#define SRST_SPI0 203
|
||||
#define SRST_P_SPI1 204
|
||||
#define SRST_SPI1 205
|
||||
#define SRST_P_GPIO2 206
|
||||
#define SRST_DB_GPIO2 207
|
||||
|
||||
/********Name=SOFTRST_CON13,Offset=0xA34********/
|
||||
#define SRST_P_GPIO3 208
|
||||
#define SRST_DB_GPIO3 209
|
||||
#define SRST_P_GPIO4 210
|
||||
#define SRST_DB_GPIO4 211
|
||||
#define SRST_H_CAN0 212
|
||||
#define SRST_CAN0 213
|
||||
#define SRST_H_CAN1 214
|
||||
#define SRST_CAN1 215
|
||||
#define SRST_H_PDM 216
|
||||
#define SRST_M_PDM 217
|
||||
#define SRST_PDM 218
|
||||
#define SRST_SPDIFTX 219
|
||||
#define SRST_H_SPDIFTX 220
|
||||
#define SRST_H_SPDIFRX 221
|
||||
#define SRST_SPDIFRX 222
|
||||
#define SRST_M_SAI0 223
|
||||
|
||||
/********Name=SOFTRST_CON14,Offset=0xA38********/
|
||||
#define SRST_H_SAI0 224
|
||||
#define SRST_M_SAI1 226
|
||||
#define SRST_H_SAI1 227
|
||||
#define SRST_H_ASRC0 229
|
||||
#define SRST_ASRC0 230
|
||||
#define SRST_H_ASRC1 231
|
||||
#define SRST_ASRC1 232
|
||||
|
||||
/********Name=SOFTRST_CON17,Offset=0xA44********/
|
||||
#define SRST_H_HSPERI_BIU 276
|
||||
#define SRST_H_SDMMC 279
|
||||
#define SRST_H_FSPI 280
|
||||
#define SRST_S_FSPI 281
|
||||
#define SRST_P_SPI2 282
|
||||
#define SRST_A_MAC0 283
|
||||
#define SRST_A_MAC1 284
|
||||
|
||||
/********Name=SOFTRST_CON18,Offset=0xA48********/
|
||||
#define SRST_M_SAI2 290
|
||||
#define SRST_H_SAI2 291
|
||||
#define SRST_H_SAI3 294
|
||||
#define SRST_M_SAI3 295
|
||||
#define SRST_H_SAI4 298
|
||||
#define SRST_M_SAI4 299
|
||||
#define SRST_H_DSM 300
|
||||
#define SRST_M_DSM 301
|
||||
#define SRST_P_AUDIO_ADC 302
|
||||
#define SRST_M_AUDIO_ADC 303
|
||||
|
||||
/********Name=SOFTRST_CON19,Offset=0xA4C********/
|
||||
#define SRST_P_SARADC 304
|
||||
#define SRST_SARADC 305
|
||||
#define SRST_SARADC_PHY 306
|
||||
#define SRST_P_OTPC_NS 307
|
||||
#define SRST_SBPI_OTPC_NS 308
|
||||
#define SRST_USER_OTPC_NS 309
|
||||
#define SRST_P_UART5 310
|
||||
#define SRST_UART5 311
|
||||
#define SRST_P_GPIO234_IOC 312
|
||||
|
||||
/********Name=SOFTRST_CON21,Offset=0xA54********/
|
||||
#define SRST_A_VIO_BIU 339
|
||||
#define SRST_H_VIO_BIU 340
|
||||
#define SRST_H_RGA 342
|
||||
#define SRST_A_RGA 343
|
||||
#define SRST_CORE_RGA 344
|
||||
#define SRST_A_VOP 345
|
||||
#define SRST_H_VOP 346
|
||||
#define SRST_VOP 347
|
||||
#define SRST_P_DPHY 348
|
||||
#define SRST_P_DSI_HOST 349
|
||||
#define SRST_P_TSADC 350
|
||||
#define SRST_TSADC 351
|
||||
|
||||
/********Name=SOFTRST_CON22,Offset=0xA58********/
|
||||
#define SRST_P_GPIO1_IOC 353
|
||||
|
||||
#endif
|
||||
@@ -17,10 +17,13 @@
|
||||
#define FLEXBUS_DVP_CROP_SIZE 0x020
|
||||
#define FLEXBUS_DVP_CROP_START 0x024
|
||||
#define FLEXBUS_DVP_ORDER 0x028
|
||||
#define FLEXBUS_DVP_YUV2RGB 0x02C
|
||||
#define FLEXBUS_TX_CTL 0x040
|
||||
#define FLEXBUS_TX_NUM 0x044
|
||||
#define FLEXBUS_TXWAT_START 0x048
|
||||
#define FLEXBUS_TXFIFO_DNUM 0x04C
|
||||
#define FLEXBUS_TX_WIDTH 0x050
|
||||
#define FLEXBUS_TX_CSN_DUMMY 0x054
|
||||
#define FLEXBUS_TX_CMD_LEN 0x058
|
||||
#define FLEXBUS_TX_CMD0 0x05C
|
||||
#define FLEXBUS_TX_CMD1 0x060
|
||||
@@ -49,8 +52,6 @@
|
||||
#define FLEXBUS_RISR 0x168
|
||||
#define FLEXBUS_ISR 0x16C
|
||||
#define FLEXBUS_ICR 0x170
|
||||
#define FLEXBUS_TESTCLK 0x190
|
||||
#define FLEXBUS_TESTDAT 0x194
|
||||
#define FLEXBUS_REVISION 0x1F0
|
||||
|
||||
/* Bit fields in ENR */
|
||||
@@ -79,12 +80,14 @@
|
||||
#define FLEXBUS_CONTINUE_MODE BIT(4)
|
||||
#define FLEXBUS_CPOL BIT(3)
|
||||
#define FLEXBUS_CPHA BIT(2)
|
||||
#define FLEXBUS_DFS_SHIFT 0
|
||||
|
||||
/* Bit fields in TX_CTL */
|
||||
#define FLEXBUS_TX_CTL_UNIT_BYTE BIT(14)
|
||||
#define FLEXBUS_TX_CTL_MSB BIT(13)
|
||||
|
||||
/* Bit fields in RX_CTL */
|
||||
#define FLEXBUS_RX_CTL_FILL_DUMMY BIT(17)
|
||||
#define FLEXBUS_RX_CTL_UNIT_BYTE BIT(16)
|
||||
#define FLEXBUS_RX_CTL_MSB BIT(15)
|
||||
#define FLEXBUS_AUTOPAD BIT(14)
|
||||
#define FLEXBUS_RXD_DY BIT(5)
|
||||
@@ -113,7 +116,17 @@
|
||||
|
||||
struct rockchip_flexbus;
|
||||
|
||||
struct rockchip_flexbus_dfs_reg {
|
||||
u32 dfs_1bit;
|
||||
u32 dfs_2bit;
|
||||
u32 dfs_4bit;
|
||||
u32 dfs_8bit;
|
||||
u32 dfs_16bit;
|
||||
u32 dfs_mask;
|
||||
};
|
||||
|
||||
struct rockchip_flexbus_config {
|
||||
void (*init_config)(struct rockchip_flexbus *rkfb);
|
||||
void (*grf_config)(struct rockchip_flexbus *rkfb, bool slave_mode, bool cpol, bool cpha);
|
||||
u32 txwat_start_max;
|
||||
};
|
||||
@@ -130,16 +143,10 @@ struct rockchip_flexbus {
|
||||
void *fb1_data;
|
||||
void (*fb0_isr)(struct rockchip_flexbus *rkfb, u32 isr);
|
||||
void (*fb1_isr)(struct rockchip_flexbus *rkfb, u32 isr);
|
||||
struct rockchip_flexbus_dfs_reg *dfs_reg;
|
||||
const struct rockchip_flexbus_config *config;
|
||||
};
|
||||
|
||||
enum rockchip_flexbus_dfs {
|
||||
FLEXBUS_DFS_2BIT = 0x0,
|
||||
FLEXBUS_DFS_4BIT,
|
||||
FLEXBUS_DFS_8BIT,
|
||||
FLEXBUS_DFS_16BIT,
|
||||
};
|
||||
|
||||
unsigned int rockchip_flexbus_readl(struct rockchip_flexbus *rkfb, unsigned int reg);
|
||||
void rockchip_flexbus_writel(struct rockchip_flexbus *rkfb, unsigned int reg, unsigned int val);
|
||||
void rockchip_flexbus_clrbits(struct rockchip_flexbus *rkfb, unsigned int reg,
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#define PSCI_SIP_VPU_RESET 0x8200000c
|
||||
#define SIP_BUS_CFG 0x8200000d
|
||||
#define SIP_LAST_LOG 0x8200000e
|
||||
#define SIP_ACCESS_MEM_OS_REG 0x8200000f
|
||||
#define SIP_SCMI_AGENT0 0x82000010
|
||||
#define SIP_SCMI_AGENT1 0x82000011
|
||||
#define SIP_SCMI_AGENT2 0x82000012
|
||||
@@ -120,6 +121,12 @@
|
||||
/* wakeup state */
|
||||
#define REMOTECTL_PWRKEY_WAKEUP 0xdeadbeaf
|
||||
|
||||
/* SIP_ACCESS_MEM_OS_REG child configs */
|
||||
enum {
|
||||
RK_MEM_OS_REG_READ = 0,
|
||||
RK_MEM_OS_REG_WRITE,
|
||||
};
|
||||
|
||||
/* SIP_MCU_CFG child configs, MCU ID */
|
||||
enum {
|
||||
RK_BUS_MCU,
|
||||
@@ -262,6 +269,7 @@ int sip_smc_secure_reg_write(u32 addr_phy, u32 val);
|
||||
u32 sip_smc_secure_reg_read(u32 addr_phy);
|
||||
struct arm_smccc_res sip_smc_bus_config(u32 arg0, u32 arg1, u32 arg2);
|
||||
struct dram_addrmap_info *sip_smc_get_dram_map(void);
|
||||
int sip_smc_access_mem_os_reg(u32 func, u32 id, u32 *val);
|
||||
int sip_smc_amp_config(u32 sub_func_id, u32 arg1, u32 arg2, u32 arg3);
|
||||
struct arm_smccc_res sip_smc_get_amp_info(u32 sub_func_id, u32 arg1);
|
||||
struct arm_smccc_res sip_smc_get_pvtpll_info(u32 sub_func_id, u32 arg1);
|
||||
@@ -360,6 +368,13 @@ static inline struct dram_addrmap_info *sip_smc_get_dram_map(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int sip_smc_access_mem_os_reg(u32 func,
|
||||
u32 id,
|
||||
u32 *val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int sip_smc_amp_config(u32 sub_func_id,
|
||||
u32 arg1,
|
||||
u32 arg2,
|
||||
|
||||
@@ -30,6 +30,10 @@ config SND_SOC_GENERIC_DMAENGINE_PCM
|
||||
bool
|
||||
select SND_DMAENGINE_PCM
|
||||
|
||||
config SND_SOC_DYNAMIC_DMA_CHAN
|
||||
bool "Request dma chan dynamically"
|
||||
depends on SND_SOC_GENERIC_DMAENGINE_PCM
|
||||
|
||||
config SND_SOC_COMPRESS
|
||||
bool
|
||||
select SND_COMPRESS_OFFLOAD
|
||||
|
||||
@@ -174,6 +174,7 @@ config SND_SOC_ALL_CODECS
|
||||
imply SND_SOC_RK3228
|
||||
imply SND_SOC_RK3308
|
||||
imply SND_SOC_RK3328
|
||||
imply SND_SOC_RK3506
|
||||
imply SND_SOC_RK3528
|
||||
imply SND_SOC_RK730
|
||||
imply SND_SOC_RK817
|
||||
@@ -1279,6 +1280,10 @@ config SND_SOC_RK3328
|
||||
tristate "Rockchip RK3328 audio CODEC"
|
||||
select REGMAP_MMIO
|
||||
|
||||
config SND_SOC_RK3506
|
||||
tristate "Rockchip RK3506 audio CODEC"
|
||||
select REGMAP_MMIO
|
||||
|
||||
config SND_SOC_RK3528
|
||||
tristate "Rockchip RK3528 audio CODEC"
|
||||
select REGMAP_MMIO
|
||||
|
||||
@@ -195,6 +195,7 @@ snd-soc-rk312x-objs := rk312x_codec.o
|
||||
snd-soc-rk3228-objs := rk3228_codec.o
|
||||
snd-soc-rk3308-objs := rk3308_codec.o
|
||||
snd-soc-rk3328-objs := rk3328_codec.o
|
||||
snd-soc-rk3506-objs := rk3506_codec.o
|
||||
snd-soc-rk3528-objs := rk3528_codec.o
|
||||
snd-soc-rk730-objs := rk730.o
|
||||
snd-soc-rk817-objs := rk817_codec.o
|
||||
@@ -569,6 +570,7 @@ obj-$(CONFIG_SND_SOC_RK312X) += snd-soc-rk312x.o
|
||||
obj-$(CONFIG_SND_SOC_RK3228) += snd-soc-rk3228.o
|
||||
obj-$(CONFIG_SND_SOC_RK3308) += snd-soc-rk3308.o
|
||||
obj-$(CONFIG_SND_SOC_RK3328) += snd-soc-rk3328.o
|
||||
obj-$(CONFIG_SND_SOC_RK3506) += snd-soc-rk3506.o
|
||||
obj-$(CONFIG_SND_SOC_RK3528) += snd-soc-rk3528.o
|
||||
obj-$(CONFIG_SND_SOC_RK730) += snd-soc-rk730.o
|
||||
obj-$(CONFIG_SND_SOC_RK817) += snd-soc-rk817.o
|
||||
|
||||
@@ -808,7 +808,6 @@ static int es8323_probe(struct snd_soc_component *component)
|
||||
snd_soc_component_write(component, 0x1B, 0x00);
|
||||
snd_soc_component_write(component, 0x27, 0xB8);
|
||||
snd_soc_component_write(component, 0x2A, 0xB8);
|
||||
snd_soc_component_write(component, 0x35, 0xA0);
|
||||
usleep_range(18000, 20000);
|
||||
snd_soc_component_write(component, 0x2E, 0x1E);
|
||||
snd_soc_component_write(component, 0x2F, 0x1E);
|
||||
|
||||
555
sound/soc/codecs/rk3506_codec.c
Normal file
555
sound/soc/codecs/rk3506_codec.c
Normal file
@@ -0,0 +1,555 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* rk3506_codec.c - Rockchip RK3506 SoC Codec Driver
|
||||
*
|
||||
* Copyright (C) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/reset.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/tlv.h>
|
||||
|
||||
#include "rk3506_codec.h"
|
||||
|
||||
#define CODEC_DRV_NAME "rk3506-acodec"
|
||||
|
||||
#define MCLK_REFERENCE_8000 32768000
|
||||
#define MCLK_REFERENCE_11025 45158400
|
||||
#define MCLK_REFERENCE_12000 49152000
|
||||
#define MCLK_I2S_REFERENCE_DIV 4
|
||||
#define I2S_MCLK_FS 64
|
||||
|
||||
struct rk3506_codec_priv {
|
||||
const struct device *plat_dev;
|
||||
struct reset_control *reset;
|
||||
struct regmap *regmap;
|
||||
struct clk *pclk;
|
||||
struct clk *mclk;
|
||||
struct snd_soc_component *component;
|
||||
};
|
||||
|
||||
static unsigned int samplerate_to_bit(unsigned int samplerate)
|
||||
{
|
||||
switch (samplerate) {
|
||||
case 8000:
|
||||
case 11025:
|
||||
case 12000:
|
||||
return 0;
|
||||
case 16000:
|
||||
case 22050:
|
||||
case 24000:
|
||||
return 1;
|
||||
case 32000:
|
||||
case 44100:
|
||||
case 48000:
|
||||
return 2;
|
||||
case 64000:
|
||||
case 88200:
|
||||
case 96000:
|
||||
return 3;
|
||||
case 128000:
|
||||
case 176400:
|
||||
case 192000:
|
||||
return 4;
|
||||
default:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void rk3506_codec_power_on(struct snd_soc_component *component)
|
||||
{
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_PGA0,
|
||||
PGA_PWD_MSK, PGA_PWD_EN);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_ADC0,
|
||||
ADC_PWD_MSK | ADC_DEM_CTRL, ADC_PWD_EN | ADC_DEM_DWA);
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
static void rk3506_codec_power_off(struct snd_soc_component *component)
|
||||
{
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_PGA0,
|
||||
PGA_PWD_MSK, PGA_PWD_DIS);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_ADC0,
|
||||
ADC_PWD_MSK, ADC_PWD_DIS);
|
||||
}
|
||||
|
||||
static void rk3506_codec_adc_enable(struct snd_soc_component *component)
|
||||
{
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_DIGEN_CLKE,
|
||||
ADC_MSK | ADC_CKE_MSK,
|
||||
ADC_EN | ADC_CKE_EN);
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
static void rk3506_codec_adc_disable(struct snd_soc_component *component)
|
||||
{
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_DIGEN_CLKE,
|
||||
ADC_MSK | ADC_CKE_MSK,
|
||||
ADC_DIS | ADC_CKE_DIS);
|
||||
}
|
||||
|
||||
static void rk3506_codec_tx_start(struct snd_soc_component *component)
|
||||
{
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_TXCR2_TXCMD,
|
||||
TXC_MSK | TXS_MSK,
|
||||
TXC_DIS | TXS_START);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_DIGEN_CLKE,
|
||||
I2STX_MSK | I2STX_CKE_MSK,
|
||||
I2STX_EN | I2STX_CKE_EN);
|
||||
}
|
||||
|
||||
static void rk3506_codec_tx_stop(struct snd_soc_component *component)
|
||||
{
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_TXCR2_TXCMD,
|
||||
TXC_MSK | TXS_MSK,
|
||||
TXC_EN | TXS_STOP);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_DIGEN_CLKE,
|
||||
I2STX_MSK | I2STX_CKE_MSK,
|
||||
I2STX_DIS | I2STX_CKE_DIS);
|
||||
}
|
||||
|
||||
static void rk3506_codec_capture_on(struct snd_soc_component *component)
|
||||
{
|
||||
rk3506_codec_adc_enable(component);
|
||||
rk3506_codec_tx_start(component);
|
||||
rk3506_codec_power_on(component);
|
||||
}
|
||||
|
||||
static void rk3506_codec_capture_off(struct snd_soc_component *component)
|
||||
{
|
||||
rk3506_codec_tx_stop(component);
|
||||
rk3506_codec_adc_disable(component);
|
||||
rk3506_codec_power_off(component);
|
||||
}
|
||||
|
||||
static int rk3506_codec_reset(struct snd_soc_component *component)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
clk_prepare_enable(rk3506->pclk);
|
||||
/* Auto clear reset */
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_DIGEN_CLKE,
|
||||
SRST_MSK, SRST_EN);
|
||||
udelay(10);
|
||||
|
||||
/* Set parameters */
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_LDO,
|
||||
ADC_IP_MSK | LDO_VSEL_MSK, ADC_IP_EN | LDO_VSEL_1_65V);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_PGA1,
|
||||
PGA_CHOP_SEL_MSK,
|
||||
PGA_CHOP_SEL_200K);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_HK0,
|
||||
HK_VAG_BUF_MSK | HK_ADC_BUF_MSK,
|
||||
HK_VAG_BUF_ON | HK_ADC_BUF_ON);
|
||||
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_ADC2,
|
||||
ADC_CHOP_MSK | ADC_CAPTRIM_MSK,
|
||||
ADC_CHOP_OFF | ADC_CAPTRIM_100_PCT);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_AGC0,
|
||||
ADC_BYPS_MSK | ADC_NG_MODE_MSK,
|
||||
ADC_BYPS_EN | ADC_NG_MODE_EN);
|
||||
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_HK1,
|
||||
HK_VREF_1P2V_SEL_MSK,
|
||||
HK_VREF_1P2V_SEL_N10M);
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_PGA2,
|
||||
PGA_BUF_IB_SEL_MSK | PGA_BUF_CHOP_SEL_MSK,
|
||||
PGA_BUF_IB_SEL_167_PCT | PGA_BUF_CHOP_SEL_400K);
|
||||
|
||||
clk_disable_unprepare(rk3506->pclk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3506_set_dai_fmt(struct snd_soc_dai *codec_dai,
|
||||
unsigned int fmt)
|
||||
{
|
||||
struct snd_soc_component *component = codec_dai->component;
|
||||
int val = 0;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||
case SND_SOC_DAIFMT_CBS_CFS:
|
||||
val = I2S_SLAVE;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_CBM_CFM:
|
||||
val = I2S_MASTER;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* I2S mode, MSB */
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_CKM,
|
||||
I2S_MST_MSK | SCK_MSK,
|
||||
val | SCK_EN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3506_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
unsigned int width, rate;
|
||||
int ratio;
|
||||
|
||||
if ((params_rate(params) % 12000) == 0) {
|
||||
clk_set_rate(rk3506->mclk, MCLK_REFERENCE_12000);
|
||||
ratio = MCLK_REFERENCE_12000 / MCLK_I2S_REFERENCE_DIV /
|
||||
(I2S_MCLK_FS * params_rate(params));
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_CKM,
|
||||
SCK_DIV_MSK, SCK_DIV(ratio));
|
||||
} else if ((params_rate(params) % 11025) == 0) {
|
||||
clk_set_rate(rk3506->mclk, MCLK_REFERENCE_11025);
|
||||
ratio = MCLK_REFERENCE_11025 / MCLK_I2S_REFERENCE_DIV /
|
||||
(I2S_MCLK_FS * params_rate(params));
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_CKM,
|
||||
SCK_DIV_MSK, SCK_DIV(ratio));
|
||||
} else if ((params_rate(params) % 8000) == 0) {
|
||||
clk_set_rate(rk3506->mclk, MCLK_REFERENCE_8000);
|
||||
ratio = MCLK_REFERENCE_8000 / MCLK_I2S_REFERENCE_DIV /
|
||||
(I2S_MCLK_FS * params_rate(params));
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_CKM,
|
||||
SCK_DIV_MSK, SCK_DIV(ratio));
|
||||
}
|
||||
|
||||
udelay(10);
|
||||
switch (params_rate(params)) {
|
||||
case 8000:
|
||||
case 11025:
|
||||
case 12000:
|
||||
case 64000:
|
||||
case 88200:
|
||||
case 96000:
|
||||
case 128000:
|
||||
case 176400:
|
||||
case 192000:
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_FILTER,
|
||||
AUDIO_ADC_FILTER_MSK,
|
||||
AUDIO_ADC_FILTER_MODE1);
|
||||
break;
|
||||
case 16000:
|
||||
case 24000:
|
||||
case 22050:
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_FILTER,
|
||||
AUDIO_ADC_FILTER_MSK,
|
||||
AUDIO_ADC_FILTER_MODE3);
|
||||
break;
|
||||
case 32000:
|
||||
case 44100:
|
||||
case 48000:
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_FILTER,
|
||||
AUDIO_ADC_FILTER_MSK,
|
||||
AUDIO_ADC_FILTER_MODE2);
|
||||
break;
|
||||
default:
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_FILTER,
|
||||
AUDIO_ADC_FILTER_MSK,
|
||||
AUDIO_ADC_FILTER_MODE2);
|
||||
}
|
||||
|
||||
width = min(params_width(params), 24);
|
||||
rate = samplerate_to_bit(params_rate(params));
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_I2S_TSD,
|
||||
VDW_TX_MSK, VDW_TX(width));
|
||||
snd_soc_component_update_bits(component, AUDIO_ADC_DIGEN_CLKE,
|
||||
ADCSRT_MSK, ADCSRT(rate));
|
||||
rk3506_codec_capture_on(component);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rk3506_pcm_shutdown(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
rk3506_codec_capture_off(component);
|
||||
regcache_cache_only(rk3506->regmap, false);
|
||||
regcache_sync(rk3506->regmap);
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops rk3506_dai_ops = {
|
||||
.hw_params = rk3506_hw_params,
|
||||
.set_fmt = rk3506_set_dai_fmt,
|
||||
.shutdown = rk3506_pcm_shutdown,
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver rk3506_dai[] = {
|
||||
{
|
||||
.name = "rk3506-hifi",
|
||||
.id = ACODEC_HIFI,
|
||||
.capture = {
|
||||
.stream_name = "HiFi Capture",
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
||||
.formats = (SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S24_LE |
|
||||
SNDRV_PCM_FMTBIT_S32_LE),
|
||||
},
|
||||
.ops = &rk3506_dai_ops,
|
||||
},
|
||||
};
|
||||
|
||||
static int rk3506_codec_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
rk3506->component = component;
|
||||
rk3506_codec_reset(component);
|
||||
regcache_cache_only(rk3506->regmap, false);
|
||||
regcache_sync(rk3506->regmap);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rk3506_codec_remove(struct snd_soc_component *component)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
regcache_cache_only(rk3506->regmap, false);
|
||||
regcache_sync(rk3506->regmap);
|
||||
}
|
||||
|
||||
static int rk3506_codec_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
regcache_cache_only(rk3506->regmap, true);
|
||||
clk_disable_unprepare(rk3506->mclk);
|
||||
clk_disable_unprepare(rk3506->pclk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3506_codec_resume(struct snd_soc_component *component)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506 = snd_soc_component_get_drvdata(component);
|
||||
int ret = 0;
|
||||
|
||||
ret = clk_prepare_enable(rk3506->pclk);
|
||||
if (ret < 0) {
|
||||
dev_err(rk3506->plat_dev,
|
||||
"Failed to enable acodec pclk: %d\n", ret);
|
||||
goto pclk_error;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(rk3506->mclk);
|
||||
if (ret < 0) {
|
||||
dev_err(rk3506->plat_dev,
|
||||
"Failed to enable acodec mclk: %d\n", ret);
|
||||
goto mclk_error;
|
||||
}
|
||||
|
||||
regcache_cache_only(rk3506->regmap, false);
|
||||
ret = regcache_sync(rk3506->regmap);
|
||||
if (ret)
|
||||
goto reg_error;
|
||||
|
||||
return 0;
|
||||
reg_error:
|
||||
clk_disable_unprepare(rk3506->mclk);
|
||||
mclk_error:
|
||||
clk_disable_unprepare(rk3506->pclk);
|
||||
pclk_error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(adc_dig_gain_tlv, -9500, 75, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(adc_pga_gain_tlv, 0, 300, 0);
|
||||
|
||||
static const char * const adc_hpf_cutoff_text[] = {
|
||||
"3.79Hz", "60Hz", "243Hz", "493Hz",
|
||||
};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(adc_hpf_cutoff_enum, AUDIO_ADC_FILTER,
|
||||
6, adc_hpf_cutoff_text);
|
||||
|
||||
static const struct snd_kcontrol_new rk3506_codec_dapm_controls[] = {
|
||||
SOC_ENUM("HPF Cutoff", adc_hpf_cutoff_enum),
|
||||
SOC_SINGLE("HPF Switch", AUDIO_ADC_FILTER, 4, 1, 0),
|
||||
SOC_SINGLE_RANGE_TLV("Digital Gain Volume",
|
||||
AUDIO_ADC_VOLL,
|
||||
ADCLV_SHIFT,
|
||||
ADCLV_MIN,
|
||||
ADCLV_MAX,
|
||||
0, adc_dig_gain_tlv),
|
||||
SOC_SINGLE_RANGE_TLV("PGA Gain Volume",
|
||||
AUDIO_ADC_PGA0,
|
||||
PGA_GAIN_SHIFT,
|
||||
PGA_GAIN_MIN,
|
||||
PGA_GAIN_MAX,
|
||||
0, adc_pga_gain_tlv),
|
||||
SOC_SINGLE("ADC Switch", AUDIO_ADC_AGC0, 0, 1, 0),
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver soc_codec_dev_rk3506 = {
|
||||
.probe = rk3506_codec_probe,
|
||||
.remove = rk3506_codec_remove,
|
||||
.suspend = rk3506_codec_suspend,
|
||||
.resume = rk3506_codec_resume,
|
||||
.controls = rk3506_codec_dapm_controls,
|
||||
.num_controls = ARRAY_SIZE(rk3506_codec_dapm_controls),
|
||||
};
|
||||
|
||||
/* Set the default value or reset value */
|
||||
static const struct reg_default rk3506_codec_reg_defaults[] = {
|
||||
{ AUDIO_ADC_BG_LPF0, 0x3 },
|
||||
};
|
||||
|
||||
static bool rk3506_codec_writeable_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case AUDIO_ADC_BG_LPF0 ... AUDIO_ADC_AGC8:
|
||||
return true;
|
||||
case AUDIO_ADC_FILTER ... AUDIO_ADC_I2S_TXCR2_TXCMD:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool rk3506_codec_readable_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
return reg >= AUDIO_ADC_BG_LPF0;
|
||||
}
|
||||
|
||||
static bool rk3506_codec_volatile_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
return reg >= AUDIO_ADC_BG_LPF0;
|
||||
}
|
||||
|
||||
static const struct regmap_config rk3506_codec_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = ACODEC_REG_MAX,
|
||||
.writeable_reg = rk3506_codec_writeable_reg,
|
||||
.readable_reg = rk3506_codec_readable_reg,
|
||||
.volatile_reg = rk3506_codec_volatile_reg,
|
||||
.reg_defaults = rk3506_codec_reg_defaults,
|
||||
.num_reg_defaults = ARRAY_SIZE(rk3506_codec_reg_defaults),
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
};
|
||||
|
||||
static const struct of_device_id rk3506_codec_of_match[] = {
|
||||
{ .compatible = "rockchip,rk3506-codec", },
|
||||
{},
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, rk3506_codec_of_match);
|
||||
|
||||
static int rk3506_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506;
|
||||
struct resource *res;
|
||||
void __iomem *base;
|
||||
int ret;
|
||||
|
||||
rk3506 = devm_kzalloc(&pdev->dev, sizeof(*rk3506), GFP_KERNEL);
|
||||
if (!rk3506)
|
||||
return -ENOMEM;
|
||||
|
||||
rk3506->plat_dev = &pdev->dev;
|
||||
rk3506->reset = devm_reset_control_get_optional_exclusive(&pdev->dev, "acodec");
|
||||
if (IS_ERR(rk3506->reset))
|
||||
return PTR_ERR(rk3506->reset);
|
||||
|
||||
rk3506->pclk = devm_clk_get(&pdev->dev, "pclk");
|
||||
if (IS_ERR(rk3506->pclk)) {
|
||||
dev_err(&pdev->dev, "Can't get acodec pclk\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rk3506->mclk = devm_clk_get(&pdev->dev, "mclk");
|
||||
if (IS_ERR(rk3506->mclk)) {
|
||||
dev_err(&pdev->dev, "Can't get acodec mclk\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(rk3506->pclk);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to enable acodec pclk: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(rk3506->mclk);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to enable acodec mclk: %d\n", ret);
|
||||
goto failed_1;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(base)) {
|
||||
ret = PTR_ERR(base);
|
||||
dev_err(&pdev->dev, "Failed to ioremap resource\n");
|
||||
goto failed;
|
||||
}
|
||||
|
||||
rk3506->regmap = devm_regmap_init_mmio(&pdev->dev, base,
|
||||
&rk3506_codec_regmap_config);
|
||||
if (IS_ERR(rk3506->regmap)) {
|
||||
ret = PTR_ERR(rk3506->regmap);
|
||||
dev_err(&pdev->dev, "Failed to regmap mmio\n");
|
||||
goto failed;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, rk3506);
|
||||
ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_dev_rk3506,
|
||||
rk3506_dai, ARRAY_SIZE(rk3506_dai));
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
failed:
|
||||
clk_disable_unprepare(rk3506->mclk);
|
||||
failed_1:
|
||||
clk_disable_unprepare(rk3506->pclk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rk3506_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct rk3506_codec_priv *rk3506 =
|
||||
(struct rk3506_codec_priv *)platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable_unprepare(rk3506->mclk);
|
||||
clk_disable_unprepare(rk3506->pclk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver rk3506_codec_driver = {
|
||||
.driver = {
|
||||
.name = CODEC_DRV_NAME,
|
||||
.of_match_table = of_match_ptr(rk3506_codec_of_match),
|
||||
},
|
||||
.probe = rk3506_platform_probe,
|
||||
.remove = rk3506_platform_remove,
|
||||
};
|
||||
module_platform_driver(rk3506_codec_driver);
|
||||
|
||||
MODULE_DESCRIPTION("ASoC RK3506 Codec Driver");
|
||||
MODULE_AUTHOR("Jason Zhu <jason.zhu@rock-chips.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
380
sound/soc/codecs/rk3506_codec.h
Normal file
380
sound/soc/codecs/rk3506_codec.h
Normal file
@@ -0,0 +1,380 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* rk3506_codec.h - Rockchip RK3506 SoC Codec Driver
|
||||
*
|
||||
* Copyright (C) 2024 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _RK3506_CODEC_H_
|
||||
#define _RK3506_CODEC_H_
|
||||
|
||||
#define AUDIO_ADC_BG_LPF0 0x00
|
||||
#define AUDIO_ADC_BG_LPF1 0x04
|
||||
#define AUDIO_ADC_ADC0 0x08
|
||||
#define AUDIO_ADC_ADC1 0x0c
|
||||
#define AUDIO_ADC_ADC2 0x10
|
||||
#define AUDIO_ADC_PGA0 0x14
|
||||
#define AUDIO_ADC_PGA1 0x18
|
||||
#define AUDIO_ADC_PGA2 0x1c
|
||||
#define AUDIO_ADC_LDO 0x20
|
||||
#define AUDIO_ADC_HK0 0x24
|
||||
#define AUDIO_ADC_HK1 0x28
|
||||
#define AUDIO_ADC_DIGEN_CLKE 0x2c
|
||||
#define AUDIO_ADC_VOLL 0x30
|
||||
#define AUDIO_ADC_AGC0 0x34
|
||||
#define AUDIO_ADC_AGC1 0x38
|
||||
#define AUDIO_ADC_AGC2 0x3c
|
||||
#define AUDIO_ADC_AGC3 0x40
|
||||
#define AUDIO_ADC_AGC4 0x44
|
||||
#define AUDIO_ADC_AGC5 0x48
|
||||
#define AUDIO_ADC_AGC6 0x4c
|
||||
#define AUDIO_ADC_AGC7 0x50
|
||||
#define AUDIO_ADC_AGC8 0x54
|
||||
#define AUDIO_ADC_READ1 0x58
|
||||
#define AUDIO_ADC_READ2 0x5c
|
||||
#define AUDIO_ADC_FILTER 0x60
|
||||
#define AUDIO_ADC_I2S_CKM 0x64
|
||||
#define AUDIO_ADC_I2S_TSD 0x68
|
||||
#define AUDIO_ADC_I2S_TXCR1 0x6c
|
||||
#define AUDIO_ADC_I2S_TXCR2_TXCMD 0x70
|
||||
|
||||
#define ACODEC_REG_MAX AUDIO_ADC_I2S_TXCR2_TXCMD
|
||||
#define ACODEC_HIFI 0x0
|
||||
|
||||
/* AUDIO_ADC_BG_LPF0 */
|
||||
#define LPF_PWD_MSK (0x1 << 0)
|
||||
#define LPF_PWD_EN (0x0 << 0)
|
||||
#define LPF_PWD_DIS (0x1 << 0)
|
||||
#define LPF_CHOP_MSK (0x1 << 1)
|
||||
#define LPF_CHOP_EN (0x0 << 1)
|
||||
#define LPF_CHOP_DIS (0x1 << 1)
|
||||
#define LPF_SW_TIME_MSK (0x1 << 2)
|
||||
#define LPF_SW_TIME_124US (0x1 << 2)
|
||||
#define LPF_SW_TIME_64US (0x0 << 2)
|
||||
#define LPF_CLK_MSK (0x1 << 3)
|
||||
#define LPF_CLK_EN (0x1 << 3)
|
||||
#define LPF_CLK_DIS (0x0 << 3)
|
||||
#define LPF_DELAY_TIME_MSK (0x7 << 4)
|
||||
#define LPF_DELAY_TIME_2MS (0x0 << 4)
|
||||
#define LPF_DELAY_TIME_4MS (0x1 << 4)
|
||||
#define LPF_DELAY_TIME_8MS (0x2 << 4)
|
||||
#define LPF_DELAY_TIME_16MS (0x3 << 4)
|
||||
#define LPF_DELAY_TIME_32MS (0x4 << 4)
|
||||
#define LPF_DELAY_TIME_64MS (0x5 << 4)
|
||||
#define LPF_DELAY_TIME_128MS (0x6 << 4)
|
||||
#define LPF_DELAY_TIME_256MS (0x7 << 4)
|
||||
|
||||
/* AUDIO_ADC_BG_LPF1 */
|
||||
#define LPF_FORCE_BG_CHARGE_MSK (0x1 << 0)
|
||||
#define LPF_FORCE_BG_CHARGE_EN (0x1 << 0)
|
||||
#define LPF_FORCE_BG_CHARGE_DIS (0x1 << 0)
|
||||
#define LPF_FORCE_RCFILT_MODE_MSK (0x1 << 1)
|
||||
#define LPF_FORCE_RCFILT_MODE_EN (0x1 << 1)
|
||||
#define LPF_FORCE_RCFILT_MODE_DIS (0x0 << 1)
|
||||
|
||||
/* AUDIO_ADC_ADC0 */
|
||||
#define ADC_PWD_MSK (0x1 << 0)
|
||||
#define ADC_PWD_EN (0x0 << 0)
|
||||
#define ADC_PWD_DIS (0x1 << 0)
|
||||
#define ADC_ZERO_MSK (0x1 << 1)
|
||||
#define ADC_ZERO_EN (0x1 << 1)
|
||||
#define ADC_ZERO_DIS (0x0 << 1)
|
||||
#define ADC_DEM_CTRL (0x3 << 2)
|
||||
#define ADC_DEM_DEFAULT (0x0 << 2)
|
||||
#define ADC_DEM_DWA (0x1 << 2)
|
||||
#define ADC_DEM_ONE (0x2 << 2)
|
||||
#define ADC_DEM_DUAL (0x3 << 2)
|
||||
#define ADC_DELAY_SARSEL_MSK (0x3 << 4)
|
||||
#define ADC_DELAY_SARSEL_100_PCT (0x0 << 4)
|
||||
#define ADC_DELAY_SARSEL_75_PCT (0x1 << 4)
|
||||
#define ADC_DELAY_SARSEL_50_PCT (0x2 << 4)
|
||||
#define ADC_DELAY_SARSEL_25_PCT (0x3 << 4)
|
||||
#define ADC_DELAY_CLKSEL_MSK (0x3 << 6)
|
||||
#define ADC_DELAY_CLKSEL_100_PCT (0x0 << 6)
|
||||
#define ADC_DELAY_CLKSEL_75_PCT (0x1 << 6)
|
||||
#define ADC_DELAY_CLKSEL_50_PCT (0x2 << 6)
|
||||
#define ADC_DELAY_CLKSEL_25_PCT (0x3 << 6)
|
||||
|
||||
/* AUDIO_ADC_ADC1 */
|
||||
#define ADC_IBOP1_CTRL_MSK (0x3 << 0)
|
||||
#define ADC_IBOP1_50_PCT (0x0 << 0)
|
||||
#define ADC_IBOP1_100_PCT (0x1 << 0)
|
||||
#define ADC_IBOP1_150_PCT (0x2 << 0)
|
||||
#define ADC_IBOP1_200_PCT (0x3 << 0)
|
||||
#define ADC_IBOP2_INC_MSK (0x1 << 2)
|
||||
#define ADC_IBOP2_INC_100_PCT (0x0 << 2)
|
||||
#define ADC_IBOP2_INC_200_PCT (0x1 << 2)
|
||||
#define ADC_IBOP3_INC_MSK (0x1 << 3)
|
||||
#define ADC_IBOP3_INC_100_PCT (0x0 << 3)
|
||||
#define ADC_IBOP3_INC_150_PCT (0x1 << 3)
|
||||
#define ADC_IBCTRL_MSK (0x7 << 4)
|
||||
#define ADC_IBCTRL_133_PCT (0x0 << 4)
|
||||
#define ADC_IBCTRL_114_PCT (0x1 << 4)
|
||||
#define ADC_IBCTRL_100_PCT (0x2 << 4)
|
||||
#define ADC_IBCTRL_89_PCT (0x3 << 4)
|
||||
#define ADC_IBCTRL_80_PCT (0x4 << 4)
|
||||
#define ADC_IBCTRL_73_PCT (0x5 << 4)
|
||||
#define ADC_IBCTRL_67_PCT (0x6 << 4)
|
||||
#define ADC_IBCTRL_62_PCT (0x7 << 4)
|
||||
#define ADC_STOP_RTZ_MSK (0x1 << 7)
|
||||
#define ADC_STOP_RTZ_ON (0x0 << 7)
|
||||
#define ADC_STOP_RTZ_OFF (0x1 << 7)
|
||||
|
||||
/* AUDIO_ADC_ADC2 */
|
||||
#define ADC_CAPTRIM_MSK (0x7 << 0)
|
||||
#define ADC_CAPTRIM_80_PCT (0x0 << 0)
|
||||
#define ADC_CAPTRIM_90_PCT (0x1 << 0)
|
||||
#define ADC_CAPTRIM_100_PCT (0x2 << 0)
|
||||
#define ADC_CAPTRIM_110_PCT (0x3 << 0)
|
||||
#define ADC_CAPTRIM_120_PCT (0x4 << 0)
|
||||
#define ADC_CAPTRIM_130_PCT (0x5 << 0)
|
||||
#define ADC_CAPTRIM_140_PCT (0x6 << 0)
|
||||
#define ADC_CAPTRIM_150_PCT (0x7 << 0)
|
||||
#define ADC_ELD_MSK (0x1 << 3)
|
||||
#define ADC_ELD_ON (0x0 << 3)
|
||||
#define ADC_ELD_OFF (0x1 << 3)
|
||||
#define ADC_CHOP_MSK (0x1 << 4)
|
||||
#define ADC_CHOP_ON (0x0 << 4)
|
||||
#define ADC_CHOP_OFF (0x1 << 4)
|
||||
#define ADC_CHOP_SEL_MSK (0x1 << 5)
|
||||
#define ADC_CHOP_SEL_FS_50_PCT (0x0 << 5)
|
||||
#define ADC_CHOP_SEL_FS_6_25_PCT (0x1 << 5)
|
||||
#define ADC_OUT_SEL_MSK (0x1 << 6)
|
||||
#define ADC_OUT_SEL_SDM (0x0 << 6)
|
||||
#define ADC_OUT_SEL_6K_CLK (0x1 << 6)
|
||||
|
||||
/* AUDIO_ADC_PGA0 */
|
||||
#define PGA_PWD_MSK (0x1 << 0)
|
||||
#define PGA_PWD_EN (0x0 << 0)
|
||||
#define PGA_PWD_DIS (0x1 << 0)
|
||||
#define PGA_INPUT_DEC_MSK (0x3 << 1)
|
||||
#define PGA_INPUT_DEC_N1_34DB (0x0 << 1)
|
||||
#define PGA_INPUT_DEC_N4_34DB (0x1 << 1)
|
||||
#define PGA_INPUT_DEC_N7_34DB (0x2 << 1)
|
||||
#define PGA_INPUT_DEC_N10_34DB (0x3 << 1)
|
||||
#define PGA_GAIN_SHIFT (0x3)
|
||||
#define PGA_GAIN_MIN (0x0)
|
||||
#define PGA_GAIN_MAX (0x1f)
|
||||
|
||||
/* AUDIO_ADC_PGA1 */
|
||||
#define PGA_CHOP_SEL_MSK (0x3 << 0)
|
||||
#define PGA_CHOP_SEL_NONE (0x0 << 0)
|
||||
#define PGA_CHOP_SEL_200K (0x1 << 0)
|
||||
#define PGA_CHOP_SEL_400K (0x2 << 0)
|
||||
#define PGA_CHOP_SEL_800K (0x3 << 0)
|
||||
#define PGA_IBIAS_CTRL_MSK (0x3 << 2)
|
||||
#define PGA_IBIAS_100_PCT (0x0 << 2)
|
||||
#define PGA_IBIAS_67_PCT (0x1 << 1)
|
||||
#define PGA_IBIAS_133_PCT (0x2 << 1)
|
||||
#define PGA_IBIAS_167_PCT (0x3 << 1)
|
||||
|
||||
/* AUDIO_ADC_PGA2 */
|
||||
#define PGA_BUF_GAIN_MSK (0x1 << 0)
|
||||
#define PGA_BUF_GAIN_0DB (0x0 << 0)
|
||||
#define PGA_BUF_GAIN_6DB (0x1 << 0)
|
||||
#define PGA_BUF_IB_SEL_MSK (0x3 << 1)
|
||||
#define PGA_BUF_IB_SEL_100_PCT (0x0 << 1)
|
||||
#define PGA_BUF_IB_SEL_67_PCT (0x1 << 1)
|
||||
#define PGA_BUF_IB_SEL_133_PCT (0x2 << 1)
|
||||
#define PGA_BUF_IB_SEL_167_PCT (0x3 << 1)
|
||||
#define PGA_BUF_CHOP_SEL_MSK (0x3 << 3)
|
||||
#define PGA_BUF_CHOP_SEL_200K (0x1 << 3)
|
||||
#define PGA_BUF_CHOP_SEL_400K (0x2 << 3)
|
||||
#define PGA_BUF_CHOP_SEL_800K (0x3 << 3)
|
||||
|
||||
/* AUDIO_ADC_LDO */
|
||||
#define LDO_MSK (0x1 << 0)
|
||||
#define LDO_EN (0x1 << 0)
|
||||
#define LDO_DIS (0x0 << 0)
|
||||
#define LDO_BYPASS_MSK (0x1 << 1)
|
||||
#define LDO_BYPASS_ON (0x1 << 1)
|
||||
#define LDO_BYPASS_OFF (0x0 << 1)
|
||||
#define LDO_VSEL_MSK (0x3 << 2)
|
||||
#define LDO_VSEL_1_5V (0x0 << 2)
|
||||
#define LDO_VSEL_1_55V (0x1 << 2)
|
||||
#define LDO_VSEL_1_6V (0x2 << 2)
|
||||
#define LDO_VSEL_1_65V (0x3 << 2)
|
||||
#define ADC_IP_MSK (0x1 << 7)
|
||||
#define ADC_IP_EN (0x1 << 7)
|
||||
#define ADC_IP_DIS (0x0 << 7)
|
||||
|
||||
/* AUDIO_ADC_HK0 */
|
||||
#define HK_HALF_VAG_BUF_MSK (0x1 << 0)
|
||||
#define HK_HALF_VAG_BUF_ON (0x1 << 0)
|
||||
#define HK_HALF_VAG_BUF_OFF (0x0 << 0)
|
||||
#define HK_HALF_ADC_BUF_MSK (0x1 << 1)
|
||||
#define HK_HALF_ADC_BUF_ON (0x1 << 1)
|
||||
#define HK_HALF_ADC_BUF_OFF (0x0 << 1)
|
||||
#define HK_VAG_BUF_MSK (0x1 << 2)
|
||||
#define HK_VAG_BUF_ON (0x1 << 2)
|
||||
#define HK_VAG_BUF_OFF (0x0 << 2)
|
||||
#define HK_ADC_BUF_MSK (0x1 << 3)
|
||||
#define HK_ADC_BUF_ON (0x1 << 3)
|
||||
#define HK_ADC_BUF_OFF (0x0 << 3)
|
||||
#define HK_IBIAS_SEL_MSK (0xf << 4)
|
||||
#define HK_IBIAS_SEL_200_PCT (0x8 << 4)
|
||||
#define HK_IBIAS_SEL_160_PCT (0x9 << 4)
|
||||
#define HK_IBIAS_SEL_133_PCT (0xa << 4)
|
||||
#define HK_IBIAS_SEL_114_PCT (0xb << 4)
|
||||
#define HK_IBIAS_SEL_100_PCT (0x0 << 4)
|
||||
#define HK_IBIAS_SEL_80_PCT (0x1 << 4)
|
||||
#define HK_IBIAS_SEL_66_PCT (0x2 << 4)
|
||||
#define HK_IBIAS_SEL_36_PCT (0x7 << 4)
|
||||
|
||||
/* AUDIO_ADC_HK1 */
|
||||
#define HK_VREF_1P2V_SEL_MSK (0x3 << 0)
|
||||
#define HK_VREF_1P2V_SEL_NORMAL (0x0 << 0)
|
||||
#define HK_VREF_1P2V_SEL_P10M (0x1 << 0)
|
||||
#define HK_VREF_1P2V_SEL_N10M (0x2 << 0)
|
||||
#define HK_VREF_1P2V_SEL_N20M (0x3 << 0)
|
||||
#define HL_VAG_CUR_SEL_MSK (0x3 << 2)
|
||||
#define HL_VAG_CUR_SEL_6UA (0x0 << 2)
|
||||
#define HL_VAG_CUR_SEL_4UA (0x1 << 2)
|
||||
#define HL_VAG_CUR_SEL_3UA (0x2 << 2)
|
||||
#define HL_VAG_CUR_SEL_1UA (0x3 << 2)
|
||||
|
||||
/* AUDIO_ADC_DIGEN_CLKE */
|
||||
#define ADCSRT_MSK (0x7 << 0)
|
||||
#define ADCSRT(x) (x)
|
||||
#define SRST_MSK (0x1 << 3)
|
||||
#define SRST_EN (0x1 << 3)
|
||||
#define SRST_DIS (0x0 << 3)
|
||||
#define I2STX_MSK (0x1 << 4)
|
||||
#define I2STX_EN (0x1 << 4)
|
||||
#define I2STX_DIS (0x0 << 4)
|
||||
#define ADC_MSK (0x1 << 5)
|
||||
#define ADC_EN (0x1 << 5)
|
||||
#define ADC_DIS (0x0 << 5)
|
||||
#define I2STX_CKE_MSK (0x1 << 6)
|
||||
#define I2STX_CKE_EN (0x1 << 6)
|
||||
#define I2STX_CKE_DIS (0x0 << 6)
|
||||
#define ADC_CKE_MSK (0x1 << 7)
|
||||
#define ADC_CKE_EN (0x1 << 7)
|
||||
#define ADC_CKE_DIS (0x0 << 7)
|
||||
|
||||
/* AUDIO_ADC_VOLL */
|
||||
#define ADCLV_MSK (0xff << 0)
|
||||
#define ADCLV_MIN (0x0)
|
||||
#define ADCLV_MAX (0x7f)
|
||||
#define ADCLV_SHIFT (0x1)
|
||||
|
||||
/* AUDIO_ADC_AGC0 */
|
||||
#define ADC_AGC_MSK (0x1 << 0)
|
||||
#define ADC_AGC_EN (0x1 << 0)
|
||||
#define ADC_AGC_DIS (0x0 << 0)
|
||||
#define ADC_NG_MODE_MSK (0x1 << 1)
|
||||
#define ADC_NG_MODE_EN (0x1 << 1)
|
||||
#define ADC_NG_MODE_DIS (0x0 << 1)
|
||||
#define AGC_ZEROCREN_MSK (0x1 << 2)
|
||||
#define AGC_ZEROCREN_EN (0x1 << 2)
|
||||
#define AGC_ZEROCREN_DIS (0x0 << 2)
|
||||
#define ADC_BYPS_MSK (0x1 << 3)
|
||||
#define ADC_BYPS_EN (0x1 << 3)
|
||||
#define ADC_BYPS_DIS (0x0 << 3)
|
||||
#define ADC_AGC_OFFSET_LOW4_MSK (0xf << 4)
|
||||
|
||||
/* AUDIO_ADC_AGC1 */
|
||||
#define ADC_AGC_OFFSET_HIGH4_MSK (0xf << 4)
|
||||
|
||||
/* AUDIO_ADC_AGC2 */
|
||||
#define ADC_NG_RSSI_DB_LOW8_MSK (0xff << 0)
|
||||
|
||||
/* AUDIO_ADC_AGC3 */
|
||||
#define ADC_NG_RSSI_DB_HIGH3_MSK (0x7 << 0)
|
||||
#define ADC_NG_PGA_GAIN_MSK (0x1f << 3)
|
||||
|
||||
/* AUDIO_ADC_AGC4 */
|
||||
#define ADC_TAR_DB_LOW8_MSK (0xff << 0)
|
||||
|
||||
/* AUDIO_ADC_AGC5 */
|
||||
#define ADC_TAR_DB_HIGH3_MSK (0x7 << 0)
|
||||
#define ADC_INI_PGA_GAIN_MSK (0x1f << 3)
|
||||
|
||||
/* AUDIO_ADC_AGC6 */
|
||||
#define ADC_NG_VOL_CTRL_MSK (0xff << 0)
|
||||
|
||||
/* AUDIO_ADC_AGC7 */
|
||||
#define ADC_INI_VOL_CTRL_MSK (0xff << 0)
|
||||
|
||||
/* AUDIO_ADC_AGC8 */
|
||||
#define ADC_POWDET_WIN_MSK (0xf << 0)
|
||||
#define ADC_PRATTRATE_WIN_MSK (0xf << 0)
|
||||
|
||||
/* AUDIO_ADC_FILTER */
|
||||
#define CICCOMP_EN32_MSK (0x1 << 0)
|
||||
#define CICCOMP_EN32_EN (0x1 << 0)
|
||||
#define CICCOMP_EN32_DIS (0x0 << 0)
|
||||
#define CICCOMP_EN64_MSK (0x1 << 1)
|
||||
#define CICCOMP_EN64_EN (0x1 << 1)
|
||||
#define CICCOMP_EN64_DIS (0x0 << 1)
|
||||
#define CICCOMP_CF_MSK (0x3 << 2)
|
||||
#define CICCOMP_CF_37_5_PCT (0x0 << 2)
|
||||
#define CICCOMP_CF_75_PCT (0x1 << 2)
|
||||
#define CICCOMP_CF_100_PCT (0x2 << 2)
|
||||
#define HPF_MSK (0x1 << 4)
|
||||
#define HPF_EN (0x1 << 4)
|
||||
#define HPF_DIS (0x0 << 4)
|
||||
#define HPF_CF_MSK (0x3 << 6)
|
||||
#define HPF_CF_3_79HZ (0x0 << 6)
|
||||
#define HPF_CF_60HZ (0x1 << 6)
|
||||
#define HPF_CF_243HZ (0x2 << 6)
|
||||
#define HPF_CF_493HZ (0x3 << 6)
|
||||
#define AUDIO_ADC_FILTER_MSK (0xff)
|
||||
#define AUDIO_ADC_FILTER_MODE1 (HPF_CF_60HZ)
|
||||
#define AUDIO_ADC_FILTER_MODE2 (HPF_CF_60HZ | CICCOMP_CF_100_PCT | CICCOMP_EN32_EN)
|
||||
#define AUDIO_ADC_FILTER_MODE3 (HPF_CF_60HZ | CICCOMP_CF_100_PCT | CICCOMP_EN64_EN)
|
||||
|
||||
/* AUDIO_ADC_I2S_CKM */
|
||||
#define I2S_MST_MSK (0x1 << 0)
|
||||
#define I2S_MASTER (0x1 << 0)
|
||||
#define I2S_SLAVE (0x0 << 0)
|
||||
#define SCK_P_MSK (0x1 << 1)
|
||||
#define SCK_P (0x0 << 1)
|
||||
#define SCK_N (0x1 << 1)
|
||||
#define SCK_MSK (0x1 << 2)
|
||||
#define SCK_EN (0x1 << 2)
|
||||
#define SCK_DIS (0x0 << 2)
|
||||
#define SCK_DIV_MSK (0xf << 4)
|
||||
#define SCK_DIV(x) ((x - 1) << 4)
|
||||
|
||||
/* AUDIO_ADC_I2S_TSD */
|
||||
#define TXRL_MSK (0x1 << 0)
|
||||
#define TXRL_P (0x0 << 0)
|
||||
#define TXRL_N (0x1 << 0)
|
||||
#define SCKD_TX_MSK (0x3 << 1)
|
||||
#define SCKD_TX_64 (0x0 << 1)
|
||||
#define SCKD_TX_128 (0x1 << 1)
|
||||
#define SCKD_TX_256 (0x2 << 1)
|
||||
#define VDW_TX_MSK (0x1f << 3)
|
||||
#define VDW_TX(x) ((x - 1) << 3)
|
||||
|
||||
/* AUDIO_ADC_I2S_TXCR1 */
|
||||
#define LSB_TX_MSK (0x1 << 0)
|
||||
#define LSB_TX_MSB (0x0 << 0)
|
||||
#define LSB_TX_LSB (0x1 << 0)
|
||||
#define EXRL_TX_MSK (0x1 << 1)
|
||||
#define EXRL_TX_LEFT (0x0 << 1)
|
||||
#define EXRL_TX_RIGHT (0x1 << 1)
|
||||
#define IBM_TX_MSK (0x3 << 2)
|
||||
#define IBM_TX_NORMAL (0x0 << 2)
|
||||
#define IBM_TX_LEFT (0x1 << 2)
|
||||
#define IBM_TX_RIGHT (0x2 << 2)
|
||||
#define PDM_TX_MSK (0x3 << 4)
|
||||
#define PDM_TX_NO_DELAY (0x0 << 4)
|
||||
#define PDM_TX_1_DELAY (0x1 << 4)
|
||||
#define PDM_TX_2_DELAY (0x2 << 4)
|
||||
#define PDM_TX_3_DELAY (0x3 << 4)
|
||||
#define TFS_TX_MSK (0x1 << 6)
|
||||
#define TFS_TX_I2S (0x0 << 6)
|
||||
#define TFS_TX_PCM (0x1 << 6)
|
||||
|
||||
/* AUDIO_ADC_I2S_TXCR2_TXCMD */
|
||||
#define RCNT_TX_MSK (0x3f << 0)
|
||||
#define TXC_MSK (0x1 << 6)
|
||||
#define TXC_EN (0x1 << 6)
|
||||
#define TXC_DIS (0x0 << 6)
|
||||
#define TXS_MSK (0x1 << 7)
|
||||
#define TXS_START (0x1 << 7)
|
||||
#define TXS_STOP (0x0 << 7)
|
||||
|
||||
#endif
|
||||
@@ -23,6 +23,8 @@
|
||||
#include <sound/tlv.h>
|
||||
#include "rk_dsm.h"
|
||||
|
||||
#define RK3506_GRF_SOC_CON0 (0x0)
|
||||
#define RK3506_DSM_SEL (9)
|
||||
#define RK3562_GRF_PERI_AUDIO_CON (0x0070)
|
||||
#define RK3576_SYS_GRF_SOC_CON2 (0x0008)
|
||||
#define RK3576_DSM_SEL (0x0)
|
||||
@@ -460,6 +462,27 @@ static const struct regmap_config rd_regmap_config = {
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
};
|
||||
|
||||
static int rk3506_soc_init(struct device *dev)
|
||||
{
|
||||
struct rk_dsm_priv *rd = dev_get_drvdata(dev);
|
||||
|
||||
/* enable internal codec to sai3 */
|
||||
return regmap_write(rd->grf, RK3506_GRF_SOC_CON0,
|
||||
BIT(RK3506_DSM_SEL) << 16 | BIT(RK3506_DSM_SEL));
|
||||
}
|
||||
|
||||
static void rk3506_soc_deinit(struct device *dev)
|
||||
{
|
||||
struct rk_dsm_priv *rd = dev_get_drvdata(dev);
|
||||
|
||||
regmap_write(rd->grf, RK3506_GRF_SOC_CON0, BIT(RK3506_DSM_SEL) << 16);
|
||||
}
|
||||
|
||||
static const struct rk_dsm_soc_data rk3506_data = {
|
||||
.init = rk3506_soc_init,
|
||||
.deinit = rk3506_soc_deinit,
|
||||
};
|
||||
|
||||
static int rk3562_soc_init(struct device *dev)
|
||||
{
|
||||
struct rk_dsm_priv *rd = dev_get_drvdata(dev);
|
||||
@@ -504,6 +527,7 @@ static const struct rk_dsm_soc_data rk3576_data = {
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id rd_of_match[] = {
|
||||
{ .compatible = "rockchip,rk3506-dsm", .data = &rk3506_data },
|
||||
{ .compatible = "rockchip,rk3562-dsm", .data = &rk3562_data },
|
||||
{ .compatible = "rockchip,rk3576-dsm", .data = &rk3576_data },
|
||||
{},
|
||||
|
||||
@@ -139,7 +139,7 @@ config SND_SOC_ROCKCHIP_MAX98090
|
||||
|
||||
config SND_SOC_ROCKCHIP_MULTICODECS
|
||||
tristate "ASoC support for Rockchip multicodecs"
|
||||
depends on SND_SOC_ROCKCHIP && HAVE_CLK
|
||||
depends on SND_SOC_ROCKCHIP && HAVE_CLK && INPUT && EXTCON
|
||||
help
|
||||
Say Y or M here if you want to add support for SoC audio on Rockchip
|
||||
boards using multicodecs, such as RK3308 boards.
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
|
||||
#define QUIRK_ALWAYS_ON BIT(0)
|
||||
|
||||
#define RK3506_PDM 0x2311
|
||||
#define RK3576_PDM 0x2302
|
||||
|
||||
struct rk_pdm_v2_clkref {
|
||||
unsigned int sr;
|
||||
unsigned int clk;
|
||||
@@ -65,6 +68,7 @@ struct rk_pdm_v2_dev {
|
||||
unsigned int start_delay_ms;
|
||||
unsigned int clk_ref_frq;
|
||||
unsigned int quirks;
|
||||
unsigned int version;
|
||||
};
|
||||
|
||||
static int get_pdm_v2_clkref(struct rk_pdm_v2_dev *pdm, unsigned int sr)
|
||||
@@ -205,9 +209,18 @@ static int rockchip_pdm_v2_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_CTRL,
|
||||
PDM_V2_SJM_SEL_MSK, PDM_V2_SJM_SEL_L);
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_FILTER_CTRL,
|
||||
PDM_V2_HPF_R_MSK | PDM_V2_HPF_L_MSK | PDM_V2_HPF_FREQ_MSK,
|
||||
PDM_V2_HPF_R_EN | PDM_V2_HPF_L_EN | PDM_V2_HPF_FREQ_60);
|
||||
if (pdm->version == RK3506_PDM) {
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_FILTER_CTRL,
|
||||
PDM_V2_HPF_V2_R_MSK | PDM_V2_HPF_V2_L_MSK |
|
||||
PDM_V2_HPF_V2_FREQ_MSK,
|
||||
PDM_V2_HPF_V2_R_EN | PDM_V2_HPF_V2_L_EN |
|
||||
PDM_V2_HPF_V2_FREQ_60);
|
||||
} else if (pdm->version == RK3576_PDM) {
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_FILTER_CTRL,
|
||||
PDM_V2_HPF_R_MSK | PDM_V2_HPF_L_MSK | PDM_V2_HPF_FREQ_MSK,
|
||||
PDM_V2_HPF_R_EN | PDM_V2_HPF_L_EN | PDM_V2_HPF_FREQ_60);
|
||||
}
|
||||
|
||||
rockchip_pdm_v2_set_samplerate(pdm, params_rate(params));
|
||||
switch (params_format(params)) {
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
@@ -317,12 +330,20 @@ static int rockchip_pdm_v2_prepare(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new rk3506_controls[];
|
||||
static const struct snd_kcontrol_new rk3576_controls[];
|
||||
|
||||
static int rockchip_pdm_v2_dai_probe(struct snd_soc_dai *dai)
|
||||
{
|
||||
struct rk_pdm_v2_dev *pdm = to_info(dai);
|
||||
|
||||
dai->capture_dma_data = &pdm->capture_dma_data;
|
||||
|
||||
if (pdm->version == RK3506_PDM)
|
||||
snd_soc_add_component_controls(dai->component, rk3506_controls, 1);
|
||||
else if (pdm->version == RK3576_PDM)
|
||||
snd_soc_add_component_controls(dai->component, rk3576_controls, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -411,9 +432,16 @@ static const char * const hpf_cutoff_text[] = {
|
||||
"3.79Hz", "60Hz", "243Hz", "493Hz",
|
||||
};
|
||||
|
||||
static const char * const hpf_v2_cutoff_text[] = {
|
||||
"0.234Hz", "0.468Hz", "0.937Hz", "1.875Hz", "3.75Hz",
|
||||
"7.5Hz", "15Hz", "30Hz", "60Hz", "122Hz", "251Hz",
|
||||
"528Hz", "1183Hz", "3152Hz",
|
||||
};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(hpf_cutoff_enum, PDM_V2_FILTER_CTRL,
|
||||
19, hpf_cutoff_text);
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(hpf_v2_cutoff_enum, PDM_V2_FILTER_CTRL,
|
||||
21, hpf_v2_cutoff_text);
|
||||
static const DECLARE_TLV_DB_SCALE(pdm_v2_digtal_gain_tlv, -6563, 75, 0);
|
||||
|
||||
static const struct snd_kcontrol_new rockchip_pdm_v2_controls[] = {
|
||||
@@ -422,17 +450,6 @@ static const struct snd_kcontrol_new rockchip_pdm_v2_controls[] = {
|
||||
SOC_ENUM("Receive PATH1 Source Select", rpath1_enum),
|
||||
SOC_ENUM("Receive PATH0 Source Select", rpath0_enum),
|
||||
|
||||
SOC_ENUM("HPF Cutoff", hpf_cutoff_enum),
|
||||
SOC_SINGLE("HPFL Switch", PDM_V2_FILTER_CTRL, 22, 1, 0),
|
||||
SOC_SINGLE("HPFR Switch", PDM_V2_FILTER_CTRL, 21, 1, 0),
|
||||
|
||||
SOC_SINGLE_RANGE_TLV("Gain Volume",
|
||||
PDM_V2_FILTER_CTRL,
|
||||
PDM_V2_GAIN_CTRL_SHIFT,
|
||||
PDM_V2_GAIN_MIN,
|
||||
PDM_V2_GAIN_MAX,
|
||||
0, pdm_v2_digtal_gain_tlv),
|
||||
|
||||
SOC_SINGLE_EXT("Start Delay Ms", 0, 0, PDM_V2_START_DELAY_MS_MAX, 0,
|
||||
rockchip_pdm_v2_start_delay_get,
|
||||
rockchip_pdm_v2_start_delay_put),
|
||||
@@ -442,6 +459,30 @@ static const struct snd_kcontrol_new rockchip_pdm_v2_controls[] = {
|
||||
rockchip_pdm_v2_clk_ref_frq_put),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new rk3506_controls[] = {
|
||||
SOC_SINGLE_RANGE_TLV("Gain Volume",
|
||||
PDM_V2_GAIN_CTRL,
|
||||
PDM_V2_GAIN_CTRL_SHIFT,
|
||||
PDM_V2_GAIN_CTRL_MIN,
|
||||
PDM_V2_GAIN_CTRL_MAX,
|
||||
0, pdm_v2_digtal_gain_tlv),
|
||||
SOC_ENUM("HPF Cutoff", hpf_v2_cutoff_enum),
|
||||
SOC_SINGLE("HPFL Switch", PDM_V2_FILTER_CTRL, 20, 1, 0),
|
||||
SOC_SINGLE("HPFR Switch", PDM_V2_FILTER_CTRL, 19, 1, 0),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new rk3576_controls[] = {
|
||||
SOC_SINGLE_RANGE_TLV("Gain Volume",
|
||||
PDM_V2_FILTER_CTRL,
|
||||
PDM_V2_GAIN_SHIFT,
|
||||
PDM_V2_GAIN_MIN,
|
||||
PDM_V2_GAIN_MAX,
|
||||
0, pdm_v2_digtal_gain_tlv),
|
||||
SOC_ENUM("HPF Cutoff", hpf_cutoff_enum),
|
||||
SOC_SINGLE("HPFL Switch", PDM_V2_FILTER_CTRL, 22, 1, 0),
|
||||
SOC_SINGLE("HPFR Switch", PDM_V2_FILTER_CTRL, 21, 1, 0),
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver rockchip_pdm_v2_component = {
|
||||
.name = "rockchip-pdm-v2",
|
||||
.controls = rockchip_pdm_v2_controls,
|
||||
@@ -534,6 +575,7 @@ static bool rockchip_pdm_v2_volatile_reg(struct device *dev, unsigned int reg)
|
||||
switch (reg) {
|
||||
case PDM_V2_FIFO_CTRL:
|
||||
case PDM_V2_RXFIFO_DATA:
|
||||
case PDM_V2_VERSION:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@@ -553,7 +595,6 @@ static bool rockchip_pdm_v2_precious_reg(struct device *dev, unsigned int reg)
|
||||
static const struct reg_default rockchip_pdm_v2_reg_defaults[] = {
|
||||
{ PDM_V2_SYSCONFIG, 0x00000002 },
|
||||
{ PDM_V2_CTRL, 0x001C8797 },
|
||||
{ PDM_V2_FILTER_CTRL, 0x57800000 },
|
||||
{ PDM_V2_FIFO_CTRL, 0x0003E000 },
|
||||
};
|
||||
|
||||
@@ -561,7 +602,7 @@ static const struct regmap_config rockchip_pdm_v2_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = PDM_V2_VERSION,
|
||||
.max_register = PDM_V2_GAIN_CTRL,
|
||||
.reg_defaults = rockchip_pdm_v2_reg_defaults,
|
||||
.num_reg_defaults = ARRAY_SIZE(rockchip_pdm_v2_reg_defaults),
|
||||
.writeable_reg = rockchip_pdm_v2_wr_reg,
|
||||
@@ -572,6 +613,7 @@ static const struct regmap_config rockchip_pdm_v2_regmap_config = {
|
||||
};
|
||||
|
||||
static const struct of_device_id rockchip_pdm_v2_match[] __maybe_unused = {
|
||||
{ .compatible = "rockchip,rk3506-pdm", },
|
||||
{ .compatible = "rockchip,rk3576-pdm", },
|
||||
{},
|
||||
};
|
||||
@@ -723,6 +765,15 @@ static int rockchip_pdm_v2_probe(struct platform_device *pdev)
|
||||
|
||||
rockchip_pdm_v2_set_samplerate(pdm, PDM_V2_DEFAULT_RATE);
|
||||
rockchip_pdm_v2_rxctrl(pdm, 0);
|
||||
regmap_read(pdm->regmap, PDM_V2_VERSION, &pdm->version);
|
||||
/*
|
||||
* The pdm version rule:
|
||||
* Low 16bit is soc number.
|
||||
* High 16bit is PDM release time.
|
||||
* The Only soc number is changed with every chips. So use the
|
||||
* release time here.
|
||||
*/
|
||||
pdm->version = (pdm->version >> 16) & 0xffff;
|
||||
/*
|
||||
* Set the default gain 24dB, this parameter can get better
|
||||
* performance if the voice energy is lower. In other words this
|
||||
@@ -732,8 +783,13 @@ static int rockchip_pdm_v2_probe(struct platform_device *pdev)
|
||||
* If you want to record stronger sound intensity, you must set
|
||||
* PDM gain register but not soft gain-controller.
|
||||
*/
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_FILTER_CTRL, PDM_V2_GAIN_CTRL_MSK,
|
||||
PDM_V2_GAIN_24DB);
|
||||
if (pdm->version == RK3506_PDM) {
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_GAIN_CTRL, PDM_V2_GAIN_CTRL_MSK,
|
||||
PDM_V2_GAIN_CTRL_24DB);
|
||||
} else if (pdm->version == RK3576_PDM) {
|
||||
regmap_update_bits(pdm->regmap, PDM_V2_FILTER_CTRL, PDM_V2_GAIN_MSK,
|
||||
PDM_V2_GAIN_24DB);
|
||||
}
|
||||
|
||||
ret = rockchip_pdm_v2_path_parse(pdm, node);
|
||||
if (ret != 0 && ret != -ENOENT)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define PDM_V2_DATA3R 0x0030
|
||||
#define PDM_V2_DATA3L 0x0034
|
||||
#define PDM_V2_VERSION 0x0038
|
||||
#define PDM_V2_GAIN_CTRL 0x003c
|
||||
#define PDM_V2_INCR_RXDR 0x0400
|
||||
|
||||
/* PDM_V2_SYSCONFIG */
|
||||
@@ -75,8 +76,29 @@
|
||||
|
||||
/* PDM_V2_FILTER_CTRL */
|
||||
/* 0.375dB every step. 0: mute, 1: -65.25dB, 255: 30dB */
|
||||
#define PDM_V2_GAIN_CTRL_MSK (0xff << 23)
|
||||
#define PDM_V2_GAIN_CTRL_SHIFT 24
|
||||
#define PDM_V2_HPF_V2_R_MSK (0x1 << 19)
|
||||
#define PDM_V2_HPF_V2_R_EN (0x1 << 19)
|
||||
#define PDM_V2_HPF_V2_R_DIS (0x0 << 19)
|
||||
#define PDM_V2_HPF_V2_L_MSK (0x1 << 20)
|
||||
#define PDM_V2_HPF_V2_L_EN (0x1 << 20)
|
||||
#define PDM_V2_HPF_V2_L_DIS (0x0 << 20)
|
||||
#define PDM_V2_HPF_V2_FREQ_MSK (0xf << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_0_234 (0x0 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_0_468 (0x1 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_0_937 (0x2 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_1_875 (0x3 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_3_75 (0x4 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_7_5 (0x5 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_15 (0x6 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_30 (0x7 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_60 (0x8 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_122 (0x9 << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_251 (0xa << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_528 (0xb << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_1183 (0xc << 21)
|
||||
#define PDM_V2_HPF_V2_FREQ_3152 (0xd << 21)
|
||||
#define PDM_V2_GAIN_MSK (0xff << 23)
|
||||
#define PDM_V2_GAIN_SHIFT 24
|
||||
#define PDM_V2_GAIN_MIN 0
|
||||
#define PDM_V2_GAIN_MAX 0x7f
|
||||
#define PDM_V2_GAIN_0DB (175 << 23)
|
||||
@@ -123,4 +145,12 @@
|
||||
/* PDM FIFO CTRL */
|
||||
#define PDM_V2_FIFO_CNT(x) (((x) >> 20) & 0xff)
|
||||
|
||||
/* PDM_V2_GAIN_CTRL */
|
||||
/* 0.375dB every step. 0: mute, 1: -65.25dB, 255: 30dB */
|
||||
#define PDM_V2_GAIN_CTRL_MSK (0xff << 0)
|
||||
#define PDM_V2_GAIN_CTRL_SHIFT 1
|
||||
#define PDM_V2_GAIN_CTRL_MIN 0
|
||||
#define PDM_V2_GAIN_CTRL_MAX 0x7f
|
||||
#define PDM_V2_GAIN_CTRL_24DB (239 << 0)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -156,12 +156,23 @@ static int dmaengine_pcm_open(struct snd_soc_component *component,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_DYNAMIC_DMA_CHAN)) {
|
||||
chan = dma_request_chan(component->dev, substream->stream ? "rx" : "tx");
|
||||
if (IS_ERR(chan)) {
|
||||
dev_err(component->dev, "No DMA channel available\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
}
|
||||
|
||||
return snd_dmaengine_pcm_open(substream, chan);
|
||||
}
|
||||
|
||||
static int dmaengine_pcm_close(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_DYNAMIC_DMA_CHAN))
|
||||
return snd_dmaengine_pcm_close_release_chan(substream);
|
||||
|
||||
return snd_dmaengine_pcm_close(substream);
|
||||
}
|
||||
|
||||
@@ -458,6 +469,9 @@ int snd_dmaengine_pcm_register(struct device *dev,
|
||||
if (ret)
|
||||
goto err_free_dma;
|
||||
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_DYNAMIC_DMA_CHAN))
|
||||
dmaengine_pcm_release_chan(pcm);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_dma:
|
||||
|
||||
Reference in New Issue
Block a user