Merge commit '50fa63ad687063f05b451dfb3cdd4e6c2e326350'

* commit '50fa63ad687063f05b451dfb3cdd4e6c2e326350':
  PCI: dw: rockchip: Disable RC's BAR into rk_pcie_host_config()
  ARM: dts: rockchip: Add rk3506b-test2-v10
  spi: rockchip-sfc: Add rockchip,rk3506-fspi compatible
  ARM: dts: rockchip: rk3502: Change rockchip,fspi to rockchip,rk3506-fspi
  dt-bindings: spi: rockchip-sfc: Add rockchip,rk3506-fspi compatible

Change-Id: Ida9af6e6986beacc91fa3f043402bd24a08b1354
This commit is contained in:
Tao Huang
2024-11-01 18:07:54 +08:00
6 changed files with 812 additions and 16 deletions

View File

@@ -17,6 +17,7 @@ properties:
compatible:
enum:
- rockchip,fspi
- rockchip,rk3506-fspi
- rockchip,sfc
description:

View File

@@ -1224,6 +1224,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
rk3502g-evb1-v10.dtb \
rk3503g-evb1-v10.dtb \
rk3506b-evb1-v10.dtb \
rk3506b-test2-v10.dtb \
rk3506g-demo-display-control.dtb \
rk3506g-evb1-v10.dtb \
rk3506g-evb1-v10-amp.dtb \

View File

@@ -929,11 +929,12 @@
};
fspi: spi@ff488000 {
compatible = "rockchip,fspi";
compatible = "rockchip,rk3506-fspi", "rockchip,fspi";
reg = <0xff488000 0x4000>;
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru SCLK_FSPI>, <&cru HCLK_FSPI>;
clock-names = "clk_sfc", "hclk_sfc";
rockchip,grf = <&grf_pmu>;
rockchip,max-dll = <0x17F>;
#address-cells = <1>;
#size-cells = <0>;

View File

@@ -0,0 +1,753 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
*/
/dts-v1/;
#include "rk3506.dtsi"
#include "rk3506-rk801.dtsi"
#include <dt-bindings/input/rk-input.h>
#include <dt-bindings/display/drm_mipi_dsi.h>
/* TODO: Codec: Miss spk-con-gpio */
/ {
model = "Rockchip RK3506B TEST2 V10 Board";
compatible = "rockchip,rk3506b-test2-v10", "rockchip,rk3506";
chosen {
bootargs = "earlycon=uart8250,mmio32,0xff0a0000 console=ttyFIQ0 ubi.mtd=5 ubi.block=0,rootfs root=/dev/ubiblock0_0 rootfstype=squashfs snd_aloop.index=7 snd_aloop.use_raw_jiffies=1";
};
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";
};
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>;
};
leds {
compatible = "gpio-leds";
pinctrl-name = "default";
pinctrl-0 = <&work_led>;
red-led {
default-state = "on";
gpios = <&gpio0 RK_PD0 GPIO_ACTIVE_HIGH>;
label = "rockchip:work_led:power";
linux,default-trigger = "heartbeat";
};
};
rk730_sound: rk730-sound {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip-rk730";
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 = <&rk730>;
rockchip,audio-routing =
"Headphone", "LOUT1",
"Headphone", "ROUT1",
"Speaker", "LOUT2",
"Speaker", "ROUT2",
"Headphone", "Headphone Power",
"Headphone", "Headphone Power",
"Speaker", "Speaker Power",
"Speaker", "Speaker Power",
"MIC2", "Main Mic",
"MIC1", "Headset Mic";
};
vcc3v3_lcd: vcc3v3-lcd {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_lcd";
enable-active-high;
gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&lcd_pwren_h>;
vin-supply = <&vcc_3v3>;
};
vcc3v3_sd: vcc3v3-sd {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_sd";
gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_pwren>;
vin-supply = <&vcc_3v3>;
};
vcc5v0_usb20_otg0: vcc5v0-usb20-otg0 {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_usb20_otg0";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&usb20_otg0_drv_h>;
vin-supply = <&vcc5v0_sys>;
};
vcc5v0_usb20_otg1: vcc5v0-usb20-otg1 {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_usb20_otg1";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&usb20_otg1_drv_h>;
vin-supply = <&vcc5v0_sys>;
};
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>;
};
vdd_0v9: vdd-0v9 {
compatible = "regulator-fixed";
regulator-name = "vdd_0v9";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <900000>;
regulator-max-microvolt = <900000>;
vin-supply = <&vcc3v3_sys>;
};
};
&cma {
size = <0x1600000>;
};
&cpu0 {
cpu-supply = <&vdd_cpu>;
status = "okay";
};
&display_subsystem {
logo-memory-region = <&drm_logo>;
status = "okay";
};
&dsi {
status = "okay";
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>;
power-supply = <&vcc3v3_lcd>;
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_dphy {
status = "okay";
};
&dsi_in_vop {
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>;
};
};
&gmac0 {
phy-mode = "rmii";
clock_in_out = "output";
snps,reset-gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <&eth_rmii0_miim_pins
&eth_rmii0_tx_bus2_pins
&eth_rmii0_rx_bus2_pins
&eth_rmii0_clk_pins
&rmii0_rstn>;
phy-handle = <&rmii_phy0>;
status = "okay";
};
&gmac1 {
phy-mode = "rmii";
clock_in_out = "output";
snps,reset-gpio = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <&eth_rmii1_miim_pins
&eth_rmii1_tx_bus2_pins
&eth_rmii1_rx_bus2_pins
&eth_rmii1_clk_pins
&rmii1_rstn>;
phy-handle = <&rmii_phy1>;
status = "okay";
};
&i2c0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&rm_io13_i2c0_scl
&rm_io14_i2c0_sda>;
};
&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>;
power-supply = <&vcc3v3_lcd>;
status = "okay";
};
rk730: rk730@17 {
#sound-dai-cells = <0>;
compatible = "rockchip,rk730";
reg = <0x17>;
clocks = <&mclkout_sai1>;
clock-names = "mclk";
assigned-clocks = <&mclkout_sai1>;
assigned-clock-rates = <12288000>;
pinctrl-names = "default";
pinctrl-0 = <&rm_io8_sai1_mclk>;
status = "okay";
};
};
&mdio0 {
rmii_phy0: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
};
};
&mdio1 {
rmii_phy1: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
};
};
&mmc {
no-sdio;
no-mmc;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_bus4_pins &sdmmc_clk_pins &sdmmc_cmd_pins &sd_det>;
cd-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
// cd-debounce-delay-ms = <5>;
disable-wp;
vmmc-supply = <&vcc3v3_sd>;
vqmmc-supply = <&vcc_3v3>;
status = "okay";
};
&pinctrl {
ethernet {
rmii0_rstn: rmii0-rstn {
rockchip,pins = <0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
};
rmii1_rstn: rmii1-rstn {
rockchip,pins = <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
lcd {
lcd_pwren_h: lcd-pwren-h {
rockchip,pins = <0 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
led {
work_led: work-led {
rockchip,pins = <0 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
pmic {
pmic_int: pmic-int {
rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
sdcard {
sdmmc_pwren: sdmmc-pwren {
rockchip,pins = <0 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
};
sd_det: sd-det {
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
tsadc {
wdt_tsadc_gpio: wdt-tsadc-gpio {
rockchip,pins = <0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
usb {
usb20_otg0_drv_h: usb20-otg0-drv-h {
rockchip,pins = <4 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
};
usb20_otg1_drv_h: usb20-otg1-drv-h {
rockchip,pins = <4 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
};
&pwm0_4ch_2 {
pinctrl-names = "active";
pinctrl-0 = <&rm_io3_pwm0_ch2>;
status = "okay";
};
&rga2 {
status = "okay";
};
&rk801 {
interrupts = <RK_PA2 IRQ_TYPE_LEVEL_LOW>;
};
&rng {
status = "okay";
};
&rockchip_suspend {
rockchip,sleep-mode-config = <
(0
| RKPM_ARMOFF_DDRPD
| RKPM_24M_OSC_DIS
| RKPM_32K_CLK
| RKPM_32K_SRC_RC
| RKPM_PWM0_CH0_REGULATOR
)
>;
rockchip,apios-suspend = <
(0
| RKPM_PWREN_CORE_GPIO0A2 | RKPM_PWREN_CORE_ACT_LOW
| RKPM_PWREN_SLEEP_GPIO0A0 | RKPM_PWREN_SLEEP_ACT_LOW
)
>;
};
&route_dsi{
status = "okay";
};
&sai1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&rm_io9_sai1_sclk
&rm_io10_sai1_lrck
&rm_io11_sai1_sdi
&rm_io12_sai1_sdo0>;
};
&saradc {
vref-supply = <&vcc_1v8>;
status = "okay";
};
&tsadc {
pinctrl-names = "gpio", "otpout";
pinctrl-0 = <&wdt_tsadc_gpio>;
pinctrl-1 = <&rm_io21_wdt_tsadc_shut>;
status = "okay";
};
&usb2phy {
status = "okay";
};
&u2phy_otg0 {
/* Only switch date-role manually */
vbus-supply = <&vcc5v0_usb20_otg0>;
status = "okay";
};
&usb20_otg0 {
status = "okay";
};
&u2phy_otg1 {
phy-supply = <&vcc5v0_usb20_otg1>;
status = "okay";
};
&usb20_otg1 {
dr_mode = "host";
status = "okay";
};
&vop {
status = "okay";
};

View File

@@ -628,10 +628,6 @@ static int rk_add_pcie_port(struct rk_pcie *rk_pcie, struct platform_device *pde
return ret;
}
/* Disable BAR0 BAR1 */
dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_0, 0x0);
dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_1, 0x0);
return 0;
}
@@ -1566,6 +1562,10 @@ static int rk_pcie_host_config(struct rk_pcie *rk_pcie)
rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK_LEGACY,
rk_pcie->intx | 0xffff0000);
/* Disable BAR0 BAR1 */
dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_0, 0x0);
dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_1, 0x0);
return 0;
}
@@ -1993,10 +1993,6 @@ static int __maybe_unused rockchip_dw_pcie_resume(struct device *dev)
goto unconfig_host;
}
/* Disable BAR0 BAR1 */
dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_0, 0x0);
dw_pcie_writel_dbi2(pci, PCI_BASE_ADDRESS_1, 0x0);
dw_pcie_dbi_ro_wr_dis(pci);
rk_pcie->in_suspend = false;
if (rk_pcie->skip_scan_in_resume)

View File

@@ -15,12 +15,14 @@
#include <linux/dma-mapping.h>
#include <linux/iopoll.h>
#include <linux/interrupt.h>
#include <linux/mfd/syscon.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include <linux/slab.h>
#include <linux/spi/spi-mem.h>
#include <linux/of_gpio.h>
@@ -197,6 +199,16 @@
#define ROCKCHIP_AUTOSUSPEND_DELAY 2000
struct rockchip_sfc_powergood {
bool valid;
u32 grf_offset;
u8 bits_mask;
};
struct rockchip_sfc_data {
struct rockchip_sfc_powergood powergood;
};
struct rockchip_sfc {
struct device *dev;
void __iomem *regbase;
@@ -218,6 +230,8 @@ struct rockchip_sfc {
struct gpio_desc *rst_gpio;
struct gpio_desc **cs_gpiods;
struct spi_master *master;
struct regmap *grf;
struct rockchip_sfc_data *data;
};
static int rockchip_sfc_reset(struct rockchip_sfc *sfc)
@@ -392,6 +406,7 @@ static int rockchip_sfc_xfer_setup(struct rockchip_sfc *sfc,
{
u32 ctrl = 0, cmd = 0, cmd_ext = 0, dummy_ext = 0;
u8 cs = mem->spi->chip_select;
u32 voltage;
/* set CMD */
if (op->cmd.nbytes == 2) {
@@ -461,6 +476,15 @@ static int rockchip_sfc_xfer_setup(struct rockchip_sfc *sfc,
dev_dbg(sfc->dev, "sfc ctrl=%x cmd=%x cmd_ext=%x addr=%llx dummy_ext=%x len=%x cs=%d\n",
ctrl, cmd, cmd_ext, op->addr.val, cmd_ext, len, cs);
if (sfc->data && sfc->data->powergood.valid) {
if (regmap_read_poll_timeout(sfc->grf, sfc->data->powergood.grf_offset,
voltage, voltage & sfc->data->powergood.bits_mask,
1000, jiffies_to_usecs(HZ))) {
dev_err(sfc->dev, "wait for powergood failed\n");
return -EIO;
}
}
if (cmd_ext)
writel(cmd_ext, sfc->regbase + SFC_CMD_EXT);
if (sfc->version >= SFC_VER_8)
@@ -900,6 +924,22 @@ static int rockchip_sfc_get_gpio_descs(struct spi_controller *ctlr, struct rockc
return 0;
}
static const struct rockchip_sfc_data rk3506_fspi_data = {
.powergood = {
.valid = true,
.grf_offset = 0x100,
.bits_mask = BIT(0),
},
};
static const struct of_device_id rockchip_sfc_dt_ids[] = {
{ .compatible = "rockchip,fspi",},
{ .compatible = "rockchip,rk3506-fspi", .data = &rk3506_fspi_data},
{ .compatible = "rockchip,sfc"},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, rockchip_sfc_dt_ids);
static int rockchip_sfc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -992,6 +1032,17 @@ static int rockchip_sfc_probe(struct platform_device *pdev)
goto err_irq;
}
sfc->data = (struct rockchip_sfc_data *)device_get_match_data(&pdev->dev);
if (sfc->data) {
sfc->grf = syscon_regmap_lookup_by_phandle_optional(dev->of_node, "rockchip,grf");
if (IS_ERR_OR_NULL(sfc->grf)) {
ret = -EINVAL;
dev_err(dev, "Failed to find grf\n");
goto err_irq;
}
}
platform_set_drvdata(pdev, sfc);
if (IS_ENABLED(CONFIG_ROCKCHIP_THUNDER_BOOT)) {
@@ -1149,13 +1200,6 @@ static const struct dev_pm_ops rockchip_sfc_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(rockchip_sfc_suspend, rockchip_sfc_resume)
};
static const struct of_device_id rockchip_sfc_dt_ids[] = {
{ .compatible = "rockchip,fspi"},
{ .compatible = "rockchip,sfc"},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, rockchip_sfc_dt_ids);
static struct platform_driver rockchip_sfc_driver = {
.driver = {
.name = "rockchip-sfc",