u-boot-rockchip changes for 2019.04-rc1:
* support for Chromebook Bob * full pinctrl driver using DTS properties * documentation improvements * I2S support for some Rockchip SoCs -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJcVG0IAAoJECaAFcEOcohNKVAIAJd3DN/qudcVQdkuvAGK6WIk Umxkm6rxHwur7oU+wxvK1p1l/0YTFBeCfo15quH1DkSc/WIUnmBlLmDvqpGVmPmh ydZNE9ZChn0OKRIaM6pKJr+3p155cQDe6Mgg2j/5CnNx28KxT+vu7EqZbZvbQPag wcZEK6Z6E5jMVHVn2lbLgmsBPmY7ksX168IqpvzTxIj0a4J3n0DcJUnO4RBBS0Q2 PGEvFhTvigVWs6r6GL0gLn3VwnQX30xQlIuKKORPcdhjk97cJcS4+bRxdTENTKD9 j3+pgyl1n04O8sPONZS7pH3fvJwtC6SwnoxTYxGrvjedw1LxbyHG3cqcGDg/TJ8= =ik3X -----END PGP SIGNATURE----- Merge tag 'for-master-20190201' of git://git.denx.de/u-boot-rockchip u-boot-rockchip changes for 2019.04-rc1: * support for Chromebook Bob * full pinctrl driver using DTS properties * documentation improvements * I2S support for some Rockchip SoCs
This commit is contained in:
commit
e5fd39c886
@ -40,6 +40,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
|
||||
rk3288-veyron-jerry.dtb \
|
||||
rk3288-veyron-mickey.dtb \
|
||||
rk3288-veyron-minnie.dtb \
|
||||
rk3288-veyron-speedy.dtb \
|
||||
rk3288-vyasa.dtb \
|
||||
rk3328-evb.dtb \
|
||||
rk3399-ficus.dtb \
|
||||
|
@ -206,7 +206,7 @@
|
||||
clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
|
||||
clock-names = "baudclk", "apb_pclk";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_xfer>;
|
||||
pinctrl-0 = <&uart21_xfer>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
status = "disabled";
|
||||
@ -748,7 +748,7 @@
|
||||
|
||||
uart2 {
|
||||
uart2_xfer: uart2-xfer {
|
||||
rockchip,pins = <1 RK_PC2 RK_FUNC_2 &pcfg_pull_none>,
|
||||
rockchip,pins = <1 RK_PC2 RK_FUNC_2 &pcfg_pull_up>,
|
||||
<1 RK_PC3 RK_FUNC_2 &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
@ -760,6 +760,13 @@
|
||||
rockchip,pins = <0 RK_PD0 RK_FUNC_1 &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
uart2-1 {
|
||||
uart21_xfer: uart21-xfer {
|
||||
rockchip,pins = <1 10 RK_FUNC_2 &pcfg_pull_up>,
|
||||
<1 9 RK_FUNC_2 &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
dmc: dmc@11200000 {
|
||||
|
@ -52,6 +52,18 @@
|
||||
vin-supply = <&vcc33_sys>;
|
||||
startup-delay-us = <15000>;
|
||||
};
|
||||
|
||||
sound {
|
||||
compatible = "rockchip,audio-max98090-jerry";
|
||||
|
||||
cpu {
|
||||
sound-dai = <&i2s 0>;
|
||||
};
|
||||
|
||||
codec {
|
||||
sound-dai = <&max98090 0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&dmc {
|
||||
|
31
arch/arm/dts/rk3288-veyron-speedy-u-boot.dtsi
Normal file
31
arch/arm/dts/rk3288-veyron-speedy-u-boot.dtsi
Normal file
@ -0,0 +1,31 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright 2015 Google, Inc
|
||||
*/
|
||||
|
||||
&dmc {
|
||||
rockchip,pctl-timing = <0x215 0xc8 0x0 0x35 0x26 0x2 0x70 0x2000d
|
||||
0x6 0x0 0x8 0x4 0x17 0x24 0xd 0x6
|
||||
0x4 0x8 0x4 0x76 0x4 0x0 0x30 0x0
|
||||
0x1 0x2 0x2 0x4 0x0 0x0 0xc0 0x4
|
||||
0x8 0x1f4>;
|
||||
rockchip,phy-timing = <0x48d7dd93 0x187008d8 0x121076
|
||||
0x0 0xc3 0x6 0x1>;
|
||||
rockchip,sdram-params = <0x20D266A4 0x5B6 6 533000000 6 13 0>;
|
||||
};
|
||||
|
||||
&sdmmc {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
|
||||
&emmc {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
|
||||
&uart2 {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
143
arch/arm/dts/rk3288-veyron-speedy.dts
Normal file
143
arch/arm/dts/rk3288-veyron-speedy.dts
Normal file
@ -0,0 +1,143 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Google Veyron Speedy Rev 1+ board device tree source
|
||||
*
|
||||
* Copyright 2015 Google, Inc
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "rk3288-veyron-chromebook.dtsi"
|
||||
#include "cros-ec-sbs.dtsi"
|
||||
#include "rk3288-veyron-speedy-u-boot.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Google Speedy";
|
||||
compatible = "google,veyron-speedy-rev9", "google,veyron-speedy-rev8",
|
||||
"google,veyron-speedy-rev7", "google,veyron-speedy-rev6",
|
||||
"google,veyron-speedy-rev5", "google,veyron-speedy-rev4",
|
||||
"google,veyron-speedy-rev3", "google,veyron-speedy-rev2",
|
||||
"google,veyron-speedy", "google,veyron", "rockchip,rk3288";
|
||||
|
||||
panel_regulator: panel-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio7 RK_PB6 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&lcd_enable_h>;
|
||||
regulator-name = "panel_regulator";
|
||||
startup-delay-us = <100000>;
|
||||
vin-supply = <&vcc33_sys>;
|
||||
};
|
||||
|
||||
vcc18_lcd: vcc18-lcd {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&avdd_1v8_disp_en>;
|
||||
regulator-name = "vcc18_lcd";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
vin-supply = <&vcc18_wl>;
|
||||
};
|
||||
|
||||
backlight_regulator: backlight-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&bl_pwr_en>;
|
||||
regulator-name = "backlight_regulator";
|
||||
vin-supply = <&vcc33_sys>;
|
||||
startup-delay-us = <15000>;
|
||||
};
|
||||
};
|
||||
|
||||
&backlight {
|
||||
power-supply = <&backlight_regulator>;
|
||||
};
|
||||
|
||||
&cpu_alert0 {
|
||||
temperature = <65000>;
|
||||
};
|
||||
|
||||
&cpu_alert1 {
|
||||
temperature = <70000>;
|
||||
};
|
||||
|
||||
&edp {
|
||||
/delete-property/pinctrl-names;
|
||||
/delete-property/pinctrl-0;
|
||||
|
||||
force-hpd;
|
||||
};
|
||||
|
||||
&panel {
|
||||
power-supply = <&panel_regulator>;
|
||||
};
|
||||
|
||||
&rk808 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pmic_int_l>;
|
||||
};
|
||||
|
||||
&sdmmc {
|
||||
disable-wp;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd_disabled &sdmmc_cd_gpio
|
||||
&sdmmc_bus4>;
|
||||
};
|
||||
|
||||
&vcc_5v {
|
||||
enable-active-high;
|
||||
gpio = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&drv_5v>;
|
||||
};
|
||||
|
||||
&vcc50_hdmi {
|
||||
enable-active-high;
|
||||
gpio = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc50_hdmi_en>;
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
backlight {
|
||||
bl_pwr_en: bl_pwr_en {
|
||||
rockchip,pins = <2 12 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
buck-5v {
|
||||
drv_5v: drv-5v {
|
||||
rockchip,pins = <7 21 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
hdmi {
|
||||
vcc50_hdmi_en: vcc50-hdmi-en {
|
||||
rockchip,pins = <5 19 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
lcd {
|
||||
lcd_enable_h: lcd-en {
|
||||
rockchip,pins = <7 14 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
avdd_1v8_disp_en: avdd-1v8-disp-en {
|
||||
rockchip,pins = <2 13 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
pmic {
|
||||
dvs_1: dvs-1 {
|
||||
rockchip,pins = <7 12 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
|
||||
dvs_2: dvs-2 {
|
||||
rockchip,pins = <7 15 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
};
|
||||
};
|
@ -484,6 +484,7 @@
|
||||
max98090: max98090@10 {
|
||||
compatible = "maxim,max98090";
|
||||
reg = <0x10>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio6>;
|
||||
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||
pinctrl-names = "default";
|
||||
|
@ -649,6 +649,7 @@
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#sound-dai-cells = <1>;
|
||||
dmas = <&dmac_bus_s 0>, <&dmac_bus_s 1>;
|
||||
dma-names = "tx", "rx";
|
||||
clock-names = "i2s_hclk", "i2s_clk";
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
chosen {
|
||||
stdout-path = &uart2;
|
||||
u-boot,spl-boot-order = &sdhci, &sdmmc;
|
||||
u-boot,spl-boot-order = "same-as-spl", &sdhci, &sdmmc;
|
||||
};
|
||||
|
||||
backlight: backlight {
|
||||
|
80
arch/arm/dts/rk3399-gru-bob.dts
Normal file
80
arch/arm/dts/rk3399-gru-bob.dts
Normal file
@ -0,0 +1,80 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Google Gru-Bob Rev 4+ board device tree source
|
||||
*
|
||||
* Copyright 2018 Google, Inc
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "rk3399-gru-chromebook.dtsi"
|
||||
#include "rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Google Bob";
|
||||
compatible = "google,bob-rev13", "google,bob-rev12",
|
||||
"google,bob-rev11", "google,bob-rev10",
|
||||
"google,bob-rev9", "google,bob-rev8",
|
||||
"google,bob-rev7", "google,bob-rev6",
|
||||
"google,bob-rev5", "google,bob-rev4",
|
||||
"google,bob", "google,gru", "rockchip,rk3399";
|
||||
|
||||
edp_panel: edp-panel {
|
||||
compatible = "boe,nv101wxmn51", "simple-panel";
|
||||
backlight = <&backlight>;
|
||||
power-supply = <&pp3300_disp>;
|
||||
|
||||
ports {
|
||||
panel_in_edp: endpoint {
|
||||
remote-endpoint = <&edp_out_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&ap_i2c_ts {
|
||||
touchscreen: touchscreen@10 {
|
||||
compatible = "elan,ekth3500";
|
||||
reg = <0x10>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
interrupts = <13 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&touch_int_l &touch_reset_l>;
|
||||
reset-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
&ap_i2c_tp {
|
||||
trackpad: trackpad@15 {
|
||||
compatible = "elan,ekth3000";
|
||||
reg = <0x15>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&trackpad_int_l>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&backlight {
|
||||
pwms = <&cros_ec_pwm 0>;
|
||||
};
|
||||
|
||||
&cpu_alert0 {
|
||||
temperature = <65000>;
|
||||
};
|
||||
|
||||
&cpu_alert1 {
|
||||
temperature = <70000>;
|
||||
};
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
tpm {
|
||||
h1_int_od_l: h1-int-od-l {
|
||||
rockchip,pins = <0 5 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
398
arch/arm/dts/rk3399-gru-chromebook.dtsi
Normal file
398
arch/arm/dts/rk3399-gru-chromebook.dtsi
Normal file
@ -0,0 +1,398 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Google Gru-Chromebook shared properties
|
||||
*
|
||||
* Copyright 2018 Google, Inc
|
||||
*/
|
||||
|
||||
#include "rk3399-gru.dtsi"
|
||||
|
||||
/ {
|
||||
pp900_ap: pp900-ap {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp900_ap";
|
||||
|
||||
/* EC turns on w/ pp900_ap_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <900000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp900_usb_en */
|
||||
pp900_usb: pp900-ap {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp900_pcie_en */
|
||||
pp900_pcie: pp900-ap {
|
||||
};
|
||||
|
||||
pp3000: pp3000 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp3000";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pp3000_en>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 12 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
ppvar_centerlogic_pwm: ppvar-centerlogic-pwm {
|
||||
compatible = "pwm-regulator";
|
||||
regulator-name = "ppvar_centerlogic_pwm";
|
||||
|
||||
pwms = <&pwm3 0 3337 0>;
|
||||
pwm-supply = <&ppvar_sys>;
|
||||
pwm-dutycycle-range = <100 0>;
|
||||
pwm-dutycycle-unit = <100>;
|
||||
|
||||
/* EC turns on w/ ppvar_centerlogic_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <799434>;
|
||||
regulator-max-microvolt = <1049925>;
|
||||
};
|
||||
|
||||
ppvar_centerlogic: ppvar-centerlogic {
|
||||
compatible = "vctrl-regulator";
|
||||
regulator-name = "ppvar_centerlogic";
|
||||
|
||||
regulator-min-microvolt = <799434>;
|
||||
regulator-max-microvolt = <1049925>;
|
||||
|
||||
ctrl-supply = <&ppvar_centerlogic_pwm>;
|
||||
ctrl-voltage-range = <799434 1049925>;
|
||||
|
||||
regulator-settling-time-up-us = <378>;
|
||||
min-slew-down-rate = <225>;
|
||||
ovp-threshold-percent = <16>;
|
||||
};
|
||||
|
||||
/* Schematics call this PPVAR even though it's fixed */
|
||||
ppvar_logic: ppvar-logic {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "ppvar_logic";
|
||||
|
||||
/* EC turns on w/ ppvar_logic_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <900000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
pp1800_audio: pp1800-audio {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp1800_audio";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pp1800_audio_en>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 2 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
|
||||
vin-supply = <&pp1800>;
|
||||
};
|
||||
|
||||
/* gpio is shared with pp3300_wifi_bt */
|
||||
pp1800_pcie: pp1800-pcie {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp1800_pcie";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wlan_module_pd_l>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 4 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
/*
|
||||
* Need to wait 1ms + ramp-up time before we can power on WiFi.
|
||||
* This has been approximated as 8ms total.
|
||||
*/
|
||||
regulator-enable-ramp-delay = <8000>;
|
||||
|
||||
vin-supply = <&pp1800>;
|
||||
};
|
||||
|
||||
/* Always on; plain and simple */
|
||||
pp3000_ap: pp3000_emmc: pp3000 {
|
||||
};
|
||||
|
||||
pp1500_ap_io: pp1500-ap-io {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp1500_ap_io";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pp1500_en>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 10 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1500000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
|
||||
vin-supply = <&pp1800>;
|
||||
};
|
||||
|
||||
pp3300_disp: pp3300-disp {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp3300_disp";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pp3300_disp_en>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio4 27 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
startup-delay-us = <2000>;
|
||||
vin-supply = <&pp3300>;
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp3300_usb_en_l */
|
||||
pp3300_usb: pp3300 {
|
||||
};
|
||||
|
||||
/* gpio is shared with pp1800_pcie and pinctrl is set there */
|
||||
pp3300_wifi_bt: pp3300-wifi-bt {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp3300_wifi_bt";
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 4 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
vin-supply = <&pp3300>;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is a bit of a hack. The WiFi module should be reset at least
|
||||
* 1ms after its regulators have ramped up (max rampup time is ~7ms).
|
||||
* With some stretching of the imagination, we can call the 1.8V
|
||||
* regulator a supply.
|
||||
*/
|
||||
wlan_pd_n: wlan-pd-n {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "wlan_pd_n";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wlan_module_reset_l>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
vin-supply = <&pp1800_pcie>;
|
||||
};
|
||||
|
||||
backlight: backlight {
|
||||
compatible = "pwm-backlight";
|
||||
brightness-levels = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
||||
17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
||||
31 32 33 34 35 36 37 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>;
|
||||
default-brightness-level = <51>;
|
||||
enable-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
|
||||
power-supply = <&pp3300_disp>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&bl_en>;
|
||||
pwm-delay-us = <10000>;
|
||||
};
|
||||
};
|
||||
|
||||
&ppvar_bigcpu {
|
||||
min-slew-down-rate = <225>;
|
||||
ovp-threshold-percent = <16>;
|
||||
};
|
||||
|
||||
&ppvar_litcpu {
|
||||
min-slew-down-rate = <225>;
|
||||
ovp-threshold-percent = <16>;
|
||||
};
|
||||
|
||||
&ppvar_gpu {
|
||||
min-slew-down-rate = <225>;
|
||||
ovp-threshold-percent = <16>;
|
||||
};
|
||||
|
||||
&cdn_dp {
|
||||
extcon = <&usbc_extcon0>, <&usbc_extcon1>;
|
||||
};
|
||||
|
||||
&edp {
|
||||
status = "okay";
|
||||
|
||||
rockchip,panel = <&edp_panel>;
|
||||
ports {
|
||||
edp_out: port@1 {
|
||||
reg = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
edp_out_panel: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&panel_in_edp>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ap_i2c_mic: &i2c1 {
|
||||
status = "okay";
|
||||
|
||||
clock-frequency = <400000>;
|
||||
|
||||
/* These are relatively safe rise/fall times */
|
||||
i2c-scl-falling-time-ns = <50>;
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
|
||||
headsetcodec: rt5514@57 {
|
||||
compatible = "realtek,rt5514";
|
||||
reg = <0x57>;
|
||||
realtek,dmic-init-delay-ms = <20>;
|
||||
};
|
||||
};
|
||||
|
||||
ap_i2c_tp: &i2c5 {
|
||||
status = "okay";
|
||||
|
||||
clock-frequency = <400000>;
|
||||
|
||||
/* These are relatively safe rise/fall times */
|
||||
i2c-scl-falling-time-ns = <50>;
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
|
||||
/*
|
||||
* Note strange pullup enable. Apparently this avoids leakage but
|
||||
* still allows us to get nice 4.7K pullups for high speed i2c
|
||||
* transfers. Basically we want the pullup on whenever the ap is
|
||||
* alive, so the "en" pin just gets set to output high.
|
||||
*/
|
||||
pinctrl-0 = <&i2c5_xfer &ap_i2c_tp_pu_en>;
|
||||
};
|
||||
|
||||
&cros_ec {
|
||||
cros_ec_pwm: ec-pwm {
|
||||
compatible = "google,cros-ec-pwm";
|
||||
#pwm-cells = <1>;
|
||||
};
|
||||
|
||||
usbc_extcon1: extcon@1 {
|
||||
compatible = "google,extcon-usbc-cros-ec";
|
||||
google,usb-port-id = <1>;
|
||||
|
||||
#extcon-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&sound {
|
||||
rockchip,codec = <&max98357a &headsetcodec
|
||||
&codec &wacky_spi_audio &cdn_dp>;
|
||||
};
|
||||
|
||||
&spi2 {
|
||||
wacky_spi_audio: spi2@0 {
|
||||
compatible = "realtek,rt5514";
|
||||
reg = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mic_int>;
|
||||
/* May run faster once verified. */
|
||||
spi-max-frequency = <10000000>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&pci_rootport {
|
||||
mvl_wifi: wifi@0,0 {
|
||||
compatible = "pci1b4b,2b42";
|
||||
reg = <0x83010000 0x0 0x00000000 0x0 0x00100000
|
||||
0x83010000 0x0 0x00100000 0x0 0x00100000>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <8 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wlan_host_wake_l>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&tcphy1 {
|
||||
status = "okay";
|
||||
extcon = <&usbc_extcon1>;
|
||||
};
|
||||
|
||||
&u2phy1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb_host0_ehci {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb_host1_ehci {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb_host1_ohci {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usbdrd3_1 {
|
||||
status = "okay";
|
||||
extcon = <&usbc_extcon1>;
|
||||
};
|
||||
|
||||
&usbdrd_dwc3_1 {
|
||||
status = "okay";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
discrete-regulators {
|
||||
pp1500_en: pp1500-en {
|
||||
rockchip,pins = <RK_GPIO0 10 RK_FUNC_GPIO
|
||||
&pcfg_pull_none>;
|
||||
};
|
||||
|
||||
pp1800_audio_en: pp1800-audio-en {
|
||||
rockchip,pins = <RK_GPIO0 2 RK_FUNC_GPIO
|
||||
&pcfg_pull_down>;
|
||||
};
|
||||
|
||||
pp3000_en: pp3000-en {
|
||||
rockchip,pins = <RK_GPIO0 12 RK_FUNC_GPIO
|
||||
&pcfg_pull_none>;
|
||||
};
|
||||
|
||||
pp3300_disp_en: pp3300-disp-en {
|
||||
rockchip,pins = <RK_GPIO4 27 RK_FUNC_GPIO
|
||||
&pcfg_pull_none>;
|
||||
};
|
||||
|
||||
wlan_module_pd_l: wlan-module-pd-l {
|
||||
rockchip,pins = <RK_GPIO0 4 RK_FUNC_GPIO
|
||||
&pcfg_pull_down>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&wifi {
|
||||
wifi_perst_l: wifi-perst-l {
|
||||
rockchip,pins = <2 27 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
wlan_host_wake_l: wlan-host-wake-l {
|
||||
rockchip,pins = <0 8 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
309
arch/arm/dts/rk3399-gru-kevin.dts
Normal file
309
arch/arm/dts/rk3399-gru-kevin.dts
Normal file
@ -0,0 +1,309 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Google Gru-Kevin Rev 6+ board device tree source
|
||||
*
|
||||
* Copyright 2016-2017 Google, Inc
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "rk3399-gru-chromebook.dtsi"
|
||||
#include <dt-bindings/input/linux-event-codes.h>
|
||||
|
||||
/*
|
||||
* Kevin-specific things
|
||||
*
|
||||
* Things in this section should use names from Kevin schematic since no
|
||||
* equivalent exists in Gru schematic. If referring to signals that exist
|
||||
* in Gru we use the Gru names, though. Confusing enough for you?
|
||||
*/
|
||||
/ {
|
||||
model = "Google Kevin";
|
||||
compatible = "google,kevin-rev15", "google,kevin-rev14",
|
||||
"google,kevin-rev13", "google,kevin-rev12",
|
||||
"google,kevin-rev11", "google,kevin-rev10",
|
||||
"google,kevin-rev9", "google,kevin-rev8",
|
||||
"google,kevin-rev7", "google,kevin-rev6",
|
||||
"google,kevin", "google,gru", "rockchip,rk3399";
|
||||
|
||||
/* Power tree */
|
||||
|
||||
p3_3v_dig: p3-3v-dig {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "p3.3v_dig";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cpu3_pen_pwr_en>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
|
||||
vin-supply = <&pp3300>;
|
||||
};
|
||||
|
||||
edp_panel: edp-panel {
|
||||
compatible = "sharp,lq123p1jx31", "simple-panel";
|
||||
backlight = <&backlight>;
|
||||
power-supply = <&pp3300_disp>;
|
||||
|
||||
ports {
|
||||
panel_in_edp: endpoint {
|
||||
remote-endpoint = <&edp_out_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
thermistor_ppvar_bigcpu: thermistor-ppvar-bigcpu {
|
||||
compatible = "murata,ncp15wb473";
|
||||
pullup-uv = <1800000>;
|
||||
pullup-ohm = <25500>;
|
||||
pulldown-ohm = <0>;
|
||||
io-channels = <&saradc 2>;
|
||||
#thermal-sensor-cells = <0>;
|
||||
};
|
||||
|
||||
thermistor_ppvar_litcpu: thermistor-ppvar-litcpu {
|
||||
compatible = "murata,ncp15wb473";
|
||||
pullup-uv = <1800000>;
|
||||
pullup-ohm = <25500>;
|
||||
pulldown-ohm = <0>;
|
||||
io-channels = <&saradc 3>;
|
||||
#thermal-sensor-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&backlight {
|
||||
pwms = <&cros_ec_pwm 1>;
|
||||
};
|
||||
|
||||
&gpio_keys {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&bt_host_wake_l>, <&cpu1_pen_eject>;
|
||||
|
||||
pen-insert {
|
||||
label = "Pen Insert";
|
||||
/* Insert = low, eject = high */
|
||||
gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <SW_PEN_INSERTED>;
|
||||
linux,input-type = <EV_SW>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&thermal_zones {
|
||||
bigcpu_reg_thermal: bigcpu-reg-thermal {
|
||||
polling-delay-passive = <100>; /* milliseconds */
|
||||
polling-delay = <1000>; /* milliseconds */
|
||||
thermal-sensors = <&thermistor_ppvar_bigcpu 0>;
|
||||
sustainable-power = <4000>;
|
||||
|
||||
ppvar_bigcpu_trips: trips {
|
||||
ppvar_bigcpu_on: ppvar-bigcpu-on {
|
||||
temperature = <40000>; /* millicelsius */
|
||||
hysteresis = <2000>; /* millicelsius */
|
||||
type = "passive";
|
||||
};
|
||||
|
||||
ppvar_bigcpu_alert: ppvar-bigcpu-alert {
|
||||
temperature = <50000>; /* millicelsius */
|
||||
hysteresis = <2000>; /* millicelsius */
|
||||
type = "passive";
|
||||
};
|
||||
|
||||
ppvar_bigcpu_crit: ppvar-bigcpu-crit {
|
||||
temperature = <90000>; /* millicelsius */
|
||||
hysteresis = <0>; /* millicelsius */
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
|
||||
cooling-maps {
|
||||
map0 {
|
||||
trip = <&ppvar_bigcpu_alert>;
|
||||
cooling-device =
|
||||
<&cpu_l0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
contribution = <4096>;
|
||||
};
|
||||
map1 {
|
||||
trip = <&ppvar_bigcpu_alert>;
|
||||
cooling-device =
|
||||
<&cpu_b0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||
contribution = <1024>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
litcpu_reg_thermal: litcpu-reg-thermal {
|
||||
polling-delay-passive = <100>; /* milliseconds */
|
||||
polling-delay = <1000>; /* milliseconds */
|
||||
thermal-sensors = <&thermistor_ppvar_litcpu 0>;
|
||||
sustainable-power = <4000>;
|
||||
|
||||
ppvar_litcpu_trips: trips {
|
||||
ppvar_litcpu_on: ppvar-litcpu-on {
|
||||
temperature = <40000>; /* millicelsius */
|
||||
hysteresis = <2000>; /* millicelsius */
|
||||
type = "passive";
|
||||
};
|
||||
|
||||
ppvar_litcpu_alert: ppvar-litcpu-alert {
|
||||
temperature = <50000>; /* millicelsius */
|
||||
hysteresis = <2000>; /* millicelsius */
|
||||
type = "passive";
|
||||
};
|
||||
|
||||
ppvar_litcpu_crit: ppvar-litcpu-crit {
|
||||
temperature = <90000>; /* millicelsius */
|
||||
hysteresis = <0>; /* millicelsius */
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ap_i2c_tpm: &i2c0 {
|
||||
status = "okay";
|
||||
|
||||
clock-frequency = <400000>;
|
||||
|
||||
/* These are relatively safe rise/fall times. */
|
||||
i2c-scl-falling-time-ns = <50>;
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
|
||||
tpm: tpm@20 {
|
||||
compatible = "infineon,slb9645tt";
|
||||
reg = <0x20>;
|
||||
powered-while-suspended;
|
||||
};
|
||||
};
|
||||
|
||||
ap_i2c_dig: &i2c2 {
|
||||
status = "okay";
|
||||
|
||||
clock-frequency = <400000>;
|
||||
|
||||
/* These are relatively safe rise/fall times. */
|
||||
i2c-scl-falling-time-ns = <50>;
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
|
||||
digitizer: digitizer@9 {
|
||||
/* wacom,w9013 */
|
||||
compatible = "hid-over-i2c";
|
||||
reg = <0x9>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cpu1_dig_irq_l &cpu1_dig_pdct_l>;
|
||||
|
||||
vdd-supply = <&p3_3v_dig>;
|
||||
post-power-on-delay-ms = <100>;
|
||||
|
||||
interrupt-parent = <&gpio2>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||
|
||||
hid-descr-addr = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Adjustments to things in the gru baseboard */
|
||||
|
||||
&ap_i2c_tp {
|
||||
trackpad@4a {
|
||||
compatible = "atmel,maxtouch";
|
||||
reg = <0x4a>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&trackpad_int_l>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||
linux,gpio-keymap = <KEY_RESERVED
|
||||
KEY_RESERVED
|
||||
KEY_RESERVED
|
||||
BTN_LEFT>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
&ap_i2c_ts {
|
||||
touchscreen@4b {
|
||||
compatible = "atmel,maxtouch";
|
||||
reg = <0x4b>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&touch_int_l>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
interrupts = <13 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
&ppvar_bigcpu_pwm {
|
||||
regulator-min-microvolt = <798674>;
|
||||
regulator-max-microvolt = <1302172>;
|
||||
};
|
||||
|
||||
&ppvar_bigcpu {
|
||||
regulator-min-microvolt = <798674>;
|
||||
regulator-max-microvolt = <1302172>;
|
||||
ctrl-voltage-range = <798674 1302172>;
|
||||
};
|
||||
|
||||
&ppvar_litcpu_pwm {
|
||||
regulator-min-microvolt = <799065>;
|
||||
regulator-max-microvolt = <1303738>;
|
||||
};
|
||||
|
||||
&ppvar_litcpu {
|
||||
regulator-min-microvolt = <799065>;
|
||||
regulator-max-microvolt = <1303738>;
|
||||
ctrl-voltage-range = <799065 1303738>;
|
||||
};
|
||||
|
||||
&ppvar_gpu_pwm {
|
||||
regulator-min-microvolt = <785782>;
|
||||
regulator-max-microvolt = <1217729>;
|
||||
};
|
||||
|
||||
&ppvar_gpu {
|
||||
regulator-min-microvolt = <785782>;
|
||||
regulator-max-microvolt = <1217729>;
|
||||
ctrl-voltage-range = <785782 1217729>;
|
||||
};
|
||||
|
||||
&ppvar_centerlogic_pwm {
|
||||
regulator-min-microvolt = <800069>;
|
||||
regulator-max-microvolt = <1049692>;
|
||||
};
|
||||
|
||||
&ppvar_centerlogic {
|
||||
regulator-min-microvolt = <800069>;
|
||||
regulator-max-microvolt = <1049692>;
|
||||
ctrl-voltage-range = <800069 1049692>;
|
||||
};
|
||||
|
||||
&saradc {
|
||||
status = "okay";
|
||||
vref-supply = <&pp1800_ap_io>;
|
||||
};
|
||||
|
||||
&mvl_wifi {
|
||||
marvell,wakeup-pin = <14>; /* GPIO_14 on Marvell */
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
digitizer {
|
||||
/* Has external pullup */
|
||||
cpu1_dig_irq_l: cpu1-dig-irq-l {
|
||||
rockchip,pins = <2 4 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
/* Has external pullup */
|
||||
cpu1_dig_pdct_l: cpu1-dig-pdct-l {
|
||||
rockchip,pins = <2 5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
discrete-regulators {
|
||||
cpu3_pen_pwr_en: cpu3-pen-pwr-en {
|
||||
rockchip,pins = <4 30 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
pen {
|
||||
cpu1_pen_eject: cpu1-pen-eject {
|
||||
rockchip,pins = <0 13 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
844
arch/arm/dts/rk3399-gru.dtsi
Normal file
844
arch/arm/dts/rk3399-gru.dtsi
Normal file
@ -0,0 +1,844 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Google Gru (and derivatives) board device tree source
|
||||
*
|
||||
* Copyright 2016-2017 Google, Inc
|
||||
*/
|
||||
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include "rk3399.dtsi"
|
||||
#include "rk3399-op1-opp.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
u-boot,dm-pre-reloc;
|
||||
stdout-path = "serial2:115200n8";
|
||||
u-boot,spl-boot-order = &spi_flash;
|
||||
};
|
||||
|
||||
config {
|
||||
u-boot,spl-payload-offset = <0x40000>;
|
||||
};
|
||||
|
||||
/*
|
||||
* Power Tree
|
||||
*
|
||||
* In general an attempt is made to include all rails called out by
|
||||
* the schematic as long as those rails interact in some way with
|
||||
* the AP. AKA:
|
||||
* - Rails that only connect to the EC (or devices that the EC talks to)
|
||||
* are not included.
|
||||
* - Rails _are_ included if the rails go to the AP even if the AP
|
||||
* doesn't currently care about them / they are always on. The idea
|
||||
* here is that it makes it easier to map to the schematic or extend
|
||||
* later.
|
||||
*
|
||||
* If two rails are substantially the same from the AP's point of
|
||||
* view, though, we won't create a full fixed regulator. We'll just
|
||||
* put the child rail as an alias of the parent rail. Sometimes rails
|
||||
* look the same to the AP because one of these is true:
|
||||
* - The EC controls the enable and the EC always enables a rail as
|
||||
* long as the AP is running.
|
||||
* - The rails are actually connected to each other by a jumper and
|
||||
* the distinction is just there to add clarity/flexibility to the
|
||||
* schematic.
|
||||
*/
|
||||
|
||||
ppvar_sys: ppvar-sys {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "ppvar_sys";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
pp1200_lpddr: pp1200-lpddr {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp1200_lpddr";
|
||||
|
||||
/* EC turns on w/ lpddr_pwr_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
pp1800: pp1800 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp1800";
|
||||
|
||||
/* Always on when ppvar_sys shows power good */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
pp3300: pp3300 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp3300";
|
||||
|
||||
/* Always on; plain and simple */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
pp5000: pp5000 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp5000";
|
||||
|
||||
/* EC turns on w/ pp5000_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
|
||||
vin-supply = <&ppvar_sys>;
|
||||
};
|
||||
|
||||
ppvar_bigcpu_pwm: ppvar-bigcpu-pwm {
|
||||
compatible = "pwm-regulator";
|
||||
regulator-name = "ppvar_bigcpu_pwm";
|
||||
|
||||
pwms = <&pwm1 0 3337 0>;
|
||||
pwm-supply = <&ppvar_sys>;
|
||||
pwm-dutycycle-range = <100 0>;
|
||||
pwm-dutycycle-unit = <100>;
|
||||
|
||||
/* EC turns on w/ ap_core_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <800107>;
|
||||
regulator-max-microvolt = <1302232>;
|
||||
};
|
||||
|
||||
ppvar_bigcpu: ppvar-bigcpu {
|
||||
compatible = "vctrl-regulator";
|
||||
regulator-name = "ppvar_bigcpu";
|
||||
|
||||
regulator-min-microvolt = <800107>;
|
||||
regulator-max-microvolt = <1302232>;
|
||||
|
||||
ctrl-supply = <&ppvar_bigcpu_pwm>;
|
||||
ctrl-voltage-range = <800107 1302232>;
|
||||
|
||||
regulator-settling-time-up-us = <322>;
|
||||
};
|
||||
|
||||
ppvar_litcpu_pwm: ppvar-litcpu-pwm {
|
||||
compatible = "pwm-regulator";
|
||||
regulator-name = "ppvar_litcpu_pwm";
|
||||
|
||||
pwms = <&pwm2 0 3337 0>;
|
||||
pwm-supply = <&ppvar_sys>;
|
||||
pwm-dutycycle-range = <100 0>;
|
||||
pwm-dutycycle-unit = <100>;
|
||||
|
||||
/* EC turns on w/ ap_core_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <797743>;
|
||||
regulator-max-microvolt = <1307837>;
|
||||
};
|
||||
|
||||
ppvar_litcpu: ppvar-litcpu {
|
||||
compatible = "vctrl-regulator";
|
||||
regulator-name = "ppvar_litcpu";
|
||||
|
||||
regulator-min-microvolt = <797743>;
|
||||
regulator-max-microvolt = <1307837>;
|
||||
|
||||
ctrl-supply = <&ppvar_litcpu_pwm>;
|
||||
ctrl-voltage-range = <797743 1307837>;
|
||||
|
||||
regulator-settling-time-up-us = <384>;
|
||||
};
|
||||
|
||||
ppvar_gpu_pwm: ppvar-gpu-pwm {
|
||||
compatible = "pwm-regulator";
|
||||
regulator-name = "ppvar_gpu_pwm";
|
||||
|
||||
pwms = <&pwm0 0 3337 0>;
|
||||
pwm-supply = <&ppvar_sys>;
|
||||
pwm-dutycycle-range = <100 0>;
|
||||
pwm-dutycycle-unit = <100>;
|
||||
|
||||
/* EC turns on w/ ap_core_en; always on for AP */
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <786384>;
|
||||
regulator-max-microvolt = <1217747>;
|
||||
};
|
||||
|
||||
ppvar_gpu: ppvar-gpu {
|
||||
compatible = "vctrl-regulator";
|
||||
regulator-name = "ppvar_gpu";
|
||||
|
||||
regulator-min-microvolt = <786384>;
|
||||
regulator-max-microvolt = <1217747>;
|
||||
|
||||
ctrl-supply = <&ppvar_gpu_pwm>;
|
||||
ctrl-voltage-range = <786384 1217747>;
|
||||
|
||||
regulator-settling-time-up-us = <390>;
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp900_ddrpll_en */
|
||||
pp900_ddrpll: pp900-ap {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp900_pll_en */
|
||||
pp900_pll: pp900-ap {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp900_pmu_en */
|
||||
pp900_pmu: pp900-ap {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp1800_s0_en_l */
|
||||
pp1800_ap_io: pp1800_emmc: pp1800_nfc: pp1800_s0: pp1800 {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp1800_avdd_en_l */
|
||||
pp1800_avdd: pp1800 {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp1800_lid_en_l */
|
||||
pp1800_lid: pp1800_mic: pp1800 {
|
||||
};
|
||||
|
||||
/* EC turns on w/ lpddr_pwr_en */
|
||||
pp1800_lpddr: pp1800 {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp1800_pmu_en_l */
|
||||
pp1800_pmu: pp1800 {
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp1800_usb_en_l */
|
||||
pp1800_usb: pp1800 {
|
||||
};
|
||||
|
||||
pp3000_sd_slot: pp3000-sd-slot {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "pp3000_sd_slot";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sd_slot_pwr_en>;
|
||||
|
||||
enable-active-high;
|
||||
gpio = <&gpio4 29 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
vin-supply = <&pp3000>;
|
||||
};
|
||||
|
||||
/*
|
||||
* Technically, this is a small abuse of 'regulator-gpio'; this
|
||||
* regulator is a mux between pp1800 and pp3300. pp1800 and pp3300 are
|
||||
* always on though, so it is sufficient to simply control the mux
|
||||
* here.
|
||||
*/
|
||||
ppvar_sd_card_io: ppvar-sd-card-io {
|
||||
compatible = "regulator-gpio";
|
||||
regulator-name = "ppvar_sd_card_io";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sd_io_pwr_en &sd_pwr_1800_sel>;
|
||||
|
||||
enable-active-high;
|
||||
enable-gpio = <&gpio2 2 GPIO_ACTIVE_HIGH>;
|
||||
gpios = <&gpio2 28 GPIO_ACTIVE_HIGH>;
|
||||
states = <1800000 0x1
|
||||
3000000 0x0>;
|
||||
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
};
|
||||
|
||||
/* EC turns on w/ pp3300_trackpad_en_l */
|
||||
pp3300_trackpad: pp3300-trackpad {
|
||||
};
|
||||
|
||||
/* EC turns on w/ usb_a_en */
|
||||
pp5000_usb_a_vbus: pp5000 {
|
||||
};
|
||||
|
||||
gpio_keys: gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&bt_host_wake_l>;
|
||||
|
||||
wake_on_bt: wake-on-bt {
|
||||
label = "Wake-on-Bluetooth";
|
||||
gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <KEY_WAKEUP>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
max98357a: max98357a {
|
||||
compatible = "maxim,max98357a";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmode_en>;
|
||||
sdmode-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
||||
sdmode-delay = <2>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
sound: sound {
|
||||
compatible = "rockchip,rk3399-gru-sound";
|
||||
rockchip,cpu = <&i2s0 &i2s2>;
|
||||
};
|
||||
};
|
||||
|
||||
&cdn_dp {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/*
|
||||
* Set some suspend operating points to avoid OVP in suspend
|
||||
*
|
||||
* When we go into S3 ARM Trusted Firmware will transition our PWM regulators
|
||||
* from wherever they're at back to the "default" operating point (whatever
|
||||
* voltage we get when we set the PWM pins to "input").
|
||||
*
|
||||
* This quick transition under light load has the possibility to trigger the
|
||||
* regulator "over voltage protection" (OVP).
|
||||
*
|
||||
* To make extra certain that we don't hit this OVP at suspend time, we'll
|
||||
* transition to a voltage that's much closer to the default (~1.0 V) so that
|
||||
* there will not be a big jump. Technically we only need to get within 200 mV
|
||||
* of the default voltage, but the speed here should be fast enough and we need
|
||||
* suspend/resume to be rock solid.
|
||||
*/
|
||||
|
||||
&cluster0_opp {
|
||||
opp05 {
|
||||
opp-suspend;
|
||||
};
|
||||
};
|
||||
|
||||
&cluster1_opp {
|
||||
opp06 {
|
||||
opp-suspend;
|
||||
};
|
||||
};
|
||||
|
||||
&cpu_l0 {
|
||||
cpu-supply = <&ppvar_litcpu>;
|
||||
};
|
||||
|
||||
&cpu_l1 {
|
||||
cpu-supply = <&ppvar_litcpu>;
|
||||
};
|
||||
|
||||
&cpu_l2 {
|
||||
cpu-supply = <&ppvar_litcpu>;
|
||||
};
|
||||
|
||||
&cpu_l3 {
|
||||
cpu-supply = <&ppvar_litcpu>;
|
||||
};
|
||||
|
||||
&cpu_b0 {
|
||||
cpu-supply = <&ppvar_bigcpu>;
|
||||
};
|
||||
|
||||
&cpu_b1 {
|
||||
cpu-supply = <&ppvar_bigcpu>;
|
||||
};
|
||||
|
||||
&cru {
|
||||
assigned-clocks =
|
||||
<&cru PLL_GPLL>, <&cru PLL_CPLL>,
|
||||
<&cru PLL_NPLL>,
|
||||
<&cru ACLK_PERIHP>, <&cru HCLK_PERIHP>,
|
||||
<&cru PCLK_PERIHP>,
|
||||
<&cru ACLK_PERILP0>, <&cru HCLK_PERILP0>,
|
||||
<&cru PCLK_PERILP0>, <&cru ACLK_CCI>,
|
||||
<&cru HCLK_PERILP1>, <&cru PCLK_PERILP1>,
|
||||
<&cru ACLK_VIO>, <&cru ACLK_HDCP>,
|
||||
<&cru ACLK_GIC_PRE>,
|
||||
<&cru PCLK_DDR>;
|
||||
assigned-clock-rates =
|
||||
<600000000>, <800000000>,
|
||||
<1000000000>,
|
||||
<150000000>, <75000000>,
|
||||
<37500000>,
|
||||
<100000000>, <100000000>,
|
||||
<50000000>, <800000000>,
|
||||
<100000000>, <50000000>,
|
||||
<400000000>, <400000000>,
|
||||
<200000000>,
|
||||
<200000000>;
|
||||
};
|
||||
|
||||
&emmc_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&gpu {
|
||||
mali-supply = <&ppvar_gpu>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ap_i2c_ts: &i2c3 {
|
||||
status = "okay";
|
||||
|
||||
clock-frequency = <400000>;
|
||||
|
||||
/* These are relatively safe rise/fall times */
|
||||
i2c-scl-falling-time-ns = <50>;
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
};
|
||||
|
||||
ap_i2c_audio: &i2c8 {
|
||||
status = "okay";
|
||||
|
||||
clock-frequency = <400000>;
|
||||
|
||||
/* These are relatively safe rise/fall times */
|
||||
i2c-scl-falling-time-ns = <50>;
|
||||
i2c-scl-rising-time-ns = <300>;
|
||||
|
||||
codec: da7219@1a {
|
||||
compatible = "dlg,da7219";
|
||||
reg = <0x1a>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <23 IRQ_TYPE_LEVEL_LOW>;
|
||||
clocks = <&cru SCLK_I2S_8CH_OUT>;
|
||||
clock-names = "mclk";
|
||||
dlg,micbias-lvl = <2600>;
|
||||
dlg,mic-amp-in-sel = "diff";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&headset_int_l>;
|
||||
VDD-supply = <&pp1800>;
|
||||
VDDMIC-supply = <&pp3300>;
|
||||
VDDIO-supply = <&pp1800>;
|
||||
|
||||
da7219_aad {
|
||||
dlg,adc-1bit-rpt = <1>;
|
||||
dlg,btn-avg = <4>;
|
||||
dlg,btn-cfg = <50>;
|
||||
dlg,mic-det-thr = <500>;
|
||||
dlg,jack-ins-deb = <20>;
|
||||
dlg,jack-det-rate = "32ms_64ms";
|
||||
dlg,jack-rem-deb = <1>;
|
||||
|
||||
dlg,a-d-btn-thr = <0xa>;
|
||||
dlg,d-b-btn-thr = <0x16>;
|
||||
dlg,b-c-btn-thr = <0x21>;
|
||||
dlg,c-mic-btn-thr = <0x3E>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2s0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2s2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&io_domains {
|
||||
status = "okay";
|
||||
|
||||
audio-supply = <&pp1800_audio>; /* APIO5_VDD; 3d 4a */
|
||||
bt656-supply = <&pp1800_ap_io>; /* APIO2_VDD; 2a 2b */
|
||||
gpio1830-supply = <&pp3000_ap>; /* APIO4_VDD; 4c 4d */
|
||||
sdmmc-supply = <&ppvar_sd_card_io>; /* SDMMC0_VDD; 4b */
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
status = "okay";
|
||||
|
||||
ep-gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_clkreqn_cpm>, <&wifi_perst_l>;
|
||||
vpcie3v3-supply = <&pp3300_wifi_bt>;
|
||||
vpcie1v8-supply = <&wlan_pd_n>; /* HACK: see &wlan_pd_n */
|
||||
vpcie0v9-supply = <&pp900_pcie>;
|
||||
|
||||
pci_rootport: pcie@0,0 {
|
||||
reg = <0x83000000 0x0 0x00000000 0x0 0x00000000>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
};
|
||||
};
|
||||
|
||||
&pcie_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pmu_io_domains {
|
||||
status = "okay";
|
||||
|
||||
pmu1830-supply = <&pp1800_pmu>; /* PMUIO2_VDD */
|
||||
};
|
||||
|
||||
&pwm0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sdhci {
|
||||
/*
|
||||
* Signal integrity isn't great at 200 MHz and 150 MHz (DDR) gives the
|
||||
* same (or nearly the same) performance for all eMMC that are intended
|
||||
* to be used.
|
||||
*/
|
||||
assigned-clock-rates = <150000000>;
|
||||
|
||||
bus-width = <8>;
|
||||
mmc-hs400-1_8v;
|
||||
mmc-hs400-enhanced-strobe;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sdmmc {
|
||||
status = "okay";
|
||||
|
||||
/*
|
||||
* Note: configure "sdmmc_cd" as card detect even though it's actually
|
||||
* hooked to ground. Because we specified "cd-gpios" below dw_mmc
|
||||
* should be ignoring card detect anyway. Specifying the pin as
|
||||
* sdmmc_cd means that even if you've got GRF_SOC_CON7[12] (force_jtag)
|
||||
* turned on that the system will still make sure the port is
|
||||
* configured as SDMMC and not JTAG.
|
||||
*/
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_cd_gpio
|
||||
&sdmmc_bus4>;
|
||||
|
||||
bus-width = <4>;
|
||||
cap-mmc-highspeed;
|
||||
cap-sd-highspeed;
|
||||
cd-gpios = <&gpio4 24 GPIO_ACTIVE_LOW>;
|
||||
disable-wp;
|
||||
sd-uhs-sdr12;
|
||||
sd-uhs-sdr25;
|
||||
sd-uhs-sdr50;
|
||||
sd-uhs-sdr104;
|
||||
vmmc-supply = <&pp3000_sd_slot>;
|
||||
vqmmc-supply = <&ppvar_sd_card_io>;
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
status = "okay";
|
||||
u-boot,dm-pre-reloc;
|
||||
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-1 = <&spi1_sleep>;
|
||||
|
||||
spi_flash: spiflash@0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
compatible = "jedec,spi-nor", "spi-flash";
|
||||
reg = <0>;
|
||||
|
||||
/* May run faster once verified. */
|
||||
spi-max-frequency = <10000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&spi2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&spi5 {
|
||||
status = "okay";
|
||||
spi-activate-delay = <100>;
|
||||
spi-max-frequency = <3000000>;
|
||||
spi-deactivate-delay = <200>;
|
||||
|
||||
cros_ec: ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
|
||||
ec-interrupt = <&gpio0 1 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ec_ap_int_l>;
|
||||
spi-max-frequency = <3000000>;
|
||||
|
||||
i2c_tunnel: i2c-tunnel {
|
||||
compatible = "google,cros-ec-i2c-tunnel";
|
||||
google,remote-bus = <4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
usbc_extcon0: extcon@0 {
|
||||
compatible = "google,extcon-usbc-cros-ec";
|
||||
google,usb-port-id = <0>;
|
||||
|
||||
#extcon-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&tsadc {
|
||||
status = "okay";
|
||||
|
||||
rockchip,hw-tshut-mode = <1>; /* tshut mode 0:CRU 1:GPIO */
|
||||
rockchip,hw-tshut-polarity = <1>; /* tshut polarity 0:LOW 1:HIGH */
|
||||
};
|
||||
|
||||
&tcphy0 {
|
||||
status = "okay";
|
||||
extcon = <&usbc_extcon0>;
|
||||
};
|
||||
|
||||
&u2phy0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy0_host {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy1_host {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy0_otg {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&u2phy1_otg {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart2 {
|
||||
status = "okay";
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
|
||||
&usb_host0_ohci {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usbdrd3_0 {
|
||||
status = "okay";
|
||||
extcon = <&usbc_extcon0>;
|
||||
};
|
||||
|
||||
&usbdrd_dwc3_0 {
|
||||
status = "okay";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
&vopb {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vopb_mmu {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vopl {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vopl_mmu {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
#include <cros-ec-keyboard.dtsi>
|
||||
#include <cros-ec-sbs.dtsi>
|
||||
|
||||
&pinctrl {
|
||||
/*
|
||||
* pinctrl settings for pins that have no real owners.
|
||||
*
|
||||
* At the moment settings are identical for S0 and S3, but if we later
|
||||
* need to configure things differently for S3 we'll adjust here.
|
||||
*/
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <
|
||||
&ap_pwroff /* AP will auto-assert this when in S3 */
|
||||
&clk_32k /* This pin is always 32k on gru boards */
|
||||
>;
|
||||
|
||||
pcfg_output_low: pcfg-output-low {
|
||||
output-low;
|
||||
};
|
||||
|
||||
pcfg_output_high: pcfg-output-high {
|
||||
output-high;
|
||||
};
|
||||
|
||||
pcfg_pull_none_8ma: pcfg-pull-none-8ma {
|
||||
bias-disable;
|
||||
drive-strength = <8>;
|
||||
};
|
||||
|
||||
backlight-enable {
|
||||
bl_en: bl-en {
|
||||
rockchip,pins = <1 17 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
cros-ec {
|
||||
ec_ap_int_l: ec-ap-int-l {
|
||||
rockchip,pins = <RK_GPIO0 1 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
|
||||
discrete-regulators {
|
||||
sd_io_pwr_en: sd-io-pwr-en {
|
||||
rockchip,pins = <RK_GPIO2 2 RK_FUNC_GPIO
|
||||
&pcfg_pull_none>;
|
||||
};
|
||||
|
||||
sd_pwr_1800_sel: sd-pwr-1800-sel {
|
||||
rockchip,pins = <RK_GPIO2 28 RK_FUNC_GPIO
|
||||
&pcfg_pull_none>;
|
||||
};
|
||||
|
||||
sd_slot_pwr_en: sd-slot-pwr-en {
|
||||
rockchip,pins = <RK_GPIO4 29 RK_FUNC_GPIO
|
||||
&pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
codec {
|
||||
/* Has external pullup */
|
||||
headset_int_l: headset-int-l {
|
||||
rockchip,pins = <1 23 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
mic_int: mic-int {
|
||||
rockchip,pins = <1 13 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
};
|
||||
|
||||
max98357a {
|
||||
sdmode_en: sdmode-en {
|
||||
rockchip,pins = <1 2 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
};
|
||||
|
||||
pcie {
|
||||
pcie_clkreqn_cpm: pci-clkreqn-cpm {
|
||||
/*
|
||||
* Since our pcie doesn't support ClockPM(CPM), we want
|
||||
* to hack this as gpio, so the EP could be able to
|
||||
* de-assert it along and make ClockPM(CPM) work.
|
||||
*/
|
||||
rockchip,pins = <2 26 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
sdmmc {
|
||||
/*
|
||||
* We run sdmmc at max speed; bump up drive strength.
|
||||
* We also have external pulls, so disable the internal ones.
|
||||
*/
|
||||
sdmmc_bus4: sdmmc-bus4 {
|
||||
rockchip,pins =
|
||||
<4 8 RK_FUNC_1 &pcfg_pull_none_8ma>,
|
||||
<4 9 RK_FUNC_1 &pcfg_pull_none_8ma>,
|
||||
<4 10 RK_FUNC_1 &pcfg_pull_none_8ma>,
|
||||
<4 11 RK_FUNC_1 &pcfg_pull_none_8ma>;
|
||||
};
|
||||
|
||||
sdmmc_clk: sdmmc-clk {
|
||||
rockchip,pins =
|
||||
<4 12 RK_FUNC_1 &pcfg_pull_none_8ma>;
|
||||
};
|
||||
|
||||
sdmmc_cmd: sdmmc-cmd {
|
||||
rockchip,pins =
|
||||
<4 13 RK_FUNC_1 &pcfg_pull_none_8ma>;
|
||||
};
|
||||
|
||||
/*
|
||||
* In our case the official card detect is hooked to ground
|
||||
* to avoid getting access to JTAG just by sticking something
|
||||
* in the SD card slot (see the force_jtag bit in the TRM).
|
||||
*
|
||||
* We still configure it as card detect because it doesn't
|
||||
* hurt and dw_mmc will ignore it. We make sure to disable
|
||||
* the pull though so we don't burn needless power.
|
||||
*/
|
||||
sdmmc_cd: sdmmc-cd {
|
||||
rockchip,pins =
|
||||
<0 7 RK_FUNC_1 &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
/* This is where we actually hook up CD; has external pull */
|
||||
sdmmc_cd_gpio: sdmmc-cd-gpio {
|
||||
rockchip,pins = <4 24 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
spi1 {
|
||||
spi1_sleep: spi1-sleep {
|
||||
/*
|
||||
* Pull down SPI1 CLK/CS/RX/TX during suspend, to
|
||||
* prevent leakage.
|
||||
*/
|
||||
rockchip,pins = <1 9 RK_FUNC_GPIO &pcfg_pull_down>,
|
||||
<1 10 RK_FUNC_GPIO &pcfg_pull_down>,
|
||||
<1 7 RK_FUNC_GPIO &pcfg_pull_down>,
|
||||
<1 8 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
};
|
||||
|
||||
touchscreen {
|
||||
touch_int_l: touch-int-l {
|
||||
rockchip,pins = <3 13 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
touch_reset_l: touch-reset-l {
|
||||
rockchip,pins = <4 26 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
trackpad {
|
||||
ap_i2c_tp_pu_en: ap-i2c-tp-pu-en {
|
||||
rockchip,pins = <3 12 RK_FUNC_GPIO &pcfg_output_high>;
|
||||
};
|
||||
|
||||
trackpad_int_l: trackpad-int-l {
|
||||
rockchip,pins = <1 4 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
|
||||
wifi: wifi {
|
||||
wlan_module_reset_l: wlan-module-reset-l {
|
||||
rockchip,pins = <1 11 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
bt_host_wake_l: bt-host-wake-l {
|
||||
/* Kevin has an external pull up, but Gru does not */
|
||||
rockchip,pins = <0 3 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
|
||||
write-protect {
|
||||
ap_fw_wp: ap-fw-wp {
|
||||
rockchip,pins = <1 18 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
};
|
141
arch/arm/dts/rk3399-op1-opp.dtsi
Normal file
141
arch/arm/dts/rk3399-op1-opp.dtsi
Normal file
@ -0,0 +1,141 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
/ {
|
||||
cluster0_opp: opp-table0 {
|
||||
compatible = "operating-points-v2";
|
||||
opp-shared;
|
||||
|
||||
opp00 {
|
||||
opp-hz = /bits/ 64 <408000000>;
|
||||
opp-microvolt = <800000>;
|
||||
clock-latency-ns = <40000>;
|
||||
};
|
||||
opp01 {
|
||||
opp-hz = /bits/ 64 <600000000>;
|
||||
opp-microvolt = <825000>;
|
||||
};
|
||||
opp02 {
|
||||
opp-hz = /bits/ 64 <816000000>;
|
||||
opp-microvolt = <850000>;
|
||||
};
|
||||
opp03 {
|
||||
opp-hz = /bits/ 64 <1008000000>;
|
||||
opp-microvolt = <900000>;
|
||||
};
|
||||
opp04 {
|
||||
opp-hz = /bits/ 64 <1200000000>;
|
||||
opp-microvolt = <975000>;
|
||||
};
|
||||
opp05 {
|
||||
opp-hz = /bits/ 64 <1416000000>;
|
||||
opp-microvolt = <1100000>;
|
||||
};
|
||||
opp06 {
|
||||
opp-hz = /bits/ 64 <1512000000>;
|
||||
opp-microvolt = <1150000>;
|
||||
};
|
||||
};
|
||||
|
||||
cluster1_opp: opp-table1 {
|
||||
compatible = "operating-points-v2";
|
||||
opp-shared;
|
||||
|
||||
opp00 {
|
||||
opp-hz = /bits/ 64 <408000000>;
|
||||
opp-microvolt = <800000>;
|
||||
clock-latency-ns = <40000>;
|
||||
};
|
||||
opp01 {
|
||||
opp-hz = /bits/ 64 <600000000>;
|
||||
opp-microvolt = <800000>;
|
||||
};
|
||||
opp02 {
|
||||
opp-hz = /bits/ 64 <816000000>;
|
||||
opp-microvolt = <825000>;
|
||||
};
|
||||
opp03 {
|
||||
opp-hz = /bits/ 64 <1008000000>;
|
||||
opp-microvolt = <850000>;
|
||||
};
|
||||
opp04 {
|
||||
opp-hz = /bits/ 64 <1200000000>;
|
||||
opp-microvolt = <900000>;
|
||||
};
|
||||
opp05 {
|
||||
opp-hz = /bits/ 64 <1416000000>;
|
||||
opp-microvolt = <975000>;
|
||||
};
|
||||
opp06 {
|
||||
opp-hz = /bits/ 64 <1608000000>;
|
||||
opp-microvolt = <1050000>;
|
||||
};
|
||||
opp07 {
|
||||
opp-hz = /bits/ 64 <1800000000>;
|
||||
opp-microvolt = <1150000>;
|
||||
};
|
||||
opp08 {
|
||||
opp-hz = /bits/ 64 <2016000000>;
|
||||
opp-microvolt = <1250000>;
|
||||
};
|
||||
};
|
||||
|
||||
gpu_opp_table: opp-table2 {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp00 {
|
||||
opp-hz = /bits/ 64 <200000000>;
|
||||
opp-microvolt = <800000>;
|
||||
};
|
||||
opp01 {
|
||||
opp-hz = /bits/ 64 <297000000>;
|
||||
opp-microvolt = <800000>;
|
||||
};
|
||||
opp02 {
|
||||
opp-hz = /bits/ 64 <400000000>;
|
||||
opp-microvolt = <825000>;
|
||||
};
|
||||
opp03 {
|
||||
opp-hz = /bits/ 64 <500000000>;
|
||||
opp-microvolt = <850000>;
|
||||
};
|
||||
opp04 {
|
||||
opp-hz = /bits/ 64 <600000000>;
|
||||
opp-microvolt = <925000>;
|
||||
};
|
||||
opp05 {
|
||||
opp-hz = /bits/ 64 <800000000>;
|
||||
opp-microvolt = <1075000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&cpu_l0 {
|
||||
operating-points-v2 = <&cluster0_opp>;
|
||||
};
|
||||
|
||||
&cpu_l1 {
|
||||
operating-points-v2 = <&cluster0_opp>;
|
||||
};
|
||||
|
||||
&cpu_l2 {
|
||||
operating-points-v2 = <&cluster0_opp>;
|
||||
};
|
||||
|
||||
&cpu_l3 {
|
||||
operating-points-v2 = <&cluster0_opp>;
|
||||
};
|
||||
|
||||
&cpu_b0 {
|
||||
operating-points-v2 = <&cluster1_opp>;
|
||||
};
|
||||
|
||||
&cpu_b1 {
|
||||
operating-points-v2 = <&cluster1_opp>;
|
||||
};
|
||||
|
||||
&gpu {
|
||||
operating-points-v2 = <&gpu_opp_table>;
|
||||
};
|
1542
arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi
Normal file
1542
arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi
Normal file
File diff suppressed because it is too large
Load Diff
@ -349,45 +349,105 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dwc3_typec0: usb@fe800000 {
|
||||
compatible = "rockchip,rk3399-xhci";
|
||||
reg = <0x0 0xfe800000 0x0 0x100000>;
|
||||
status = "disabled";
|
||||
snps,dis-enblslpm-quirk;
|
||||
snps,phyif-utmi-bits = <16>;
|
||||
snps,dis-u2-freeclk-exists-quirk;
|
||||
snps,dis-u2-susphy-quirk;
|
||||
|
||||
usbdrd3_0: dwc3_typec0: usb@fe800000 {
|
||||
compatible = "rockchip,rk3399-dwc3";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
hub {
|
||||
compatible = "usb-hub";
|
||||
usb,device-class = <USB_CLASS_HUB>;
|
||||
};
|
||||
typec_phy0 {
|
||||
compatible = "rockchip,rk3399-usb3-phy";
|
||||
reg = <0x0 0xff7c0000 0x0 0x40000>;
|
||||
ranges;
|
||||
clocks = <&cru SCLK_USB3OTG0_REF>, <&cru SCLK_USB3OTG0_SUSPEND>,
|
||||
<&cru ACLK_USB3OTG0>, <&cru ACLK_USB3_RKSOC_AXI_PERF>,
|
||||
<&cru ACLK_USB3>, <&cru ACLK_USB3_GRF>;
|
||||
clock-names = "ref_clk", "suspend_clk",
|
||||
"bus_clk", "aclk_usb3_rksoc_axi_perf",
|
||||
"aclk_usb3", "grf_clk";
|
||||
resets = <&cru SRST_A_USB3_OTG0>;
|
||||
reset-names = "usb3-otg";
|
||||
status = "disabled";
|
||||
|
||||
usbdrd_dwc3_0: dwc3 {
|
||||
compatible = "snps,dwc3";
|
||||
reg = <0x0 0xfe800000 0x0 0x100000>;
|
||||
interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
dr_mode = "otg";
|
||||
phys = <&u2phy0_otg>, <&tcphy0_usb3>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
phy_type = "utmi_wide";
|
||||
snps,dis_enblslpm_quirk;
|
||||
snps,dis-u2-freeclk-exists-quirk;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
snps,dis-del-phy-power-chg-quirk;
|
||||
snps,dis-tx-ipgap-linecheck-quirk;
|
||||
power-domains = <&power RK3399_PD_USB3>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
dwc3_typec1: usb@fe900000 {
|
||||
compatible = "rockchip,rk3399-xhci";
|
||||
reg = <0x0 0xfe900000 0x0 0x100000>;
|
||||
status = "disabled";
|
||||
snps,dis-enblslpm-quirk;
|
||||
snps,phyif-utmi-bits = <16>;
|
||||
snps,dis-u2-freeclk-exists-quirk;
|
||||
snps,dis-u2-susphy-quirk;
|
||||
|
||||
dwc3_typec1: usbdrd3_1: usb@fe900000 {
|
||||
compatible = "rockchip,rk3399-dwc3";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
hub {
|
||||
compatible = "usb-hub";
|
||||
usb,device-class = <USB_CLASS_HUB>;
|
||||
ranges;
|
||||
clocks = <&cru SCLK_USB3OTG1_REF>, <&cru SCLK_USB3OTG1_SUSPEND>,
|
||||
<&cru ACLK_USB3OTG1>, <&cru ACLK_USB3_RKSOC_AXI_PERF>,
|
||||
<&cru ACLK_USB3>, <&cru ACLK_USB3_GRF>;
|
||||
clock-names = "ref_clk", "suspend_clk",
|
||||
"bus_clk", "aclk_usb3_rksoc_axi_perf",
|
||||
"aclk_usb3", "grf_clk";
|
||||
resets = <&cru SRST_A_USB3_OTG1>;
|
||||
reset-names = "usb3-otg";
|
||||
status = "disabled";
|
||||
|
||||
usbdrd_dwc3_1: dwc3 {
|
||||
compatible = "snps,dwc3";
|
||||
reg = <0x0 0xfe900000 0x0 0x100000>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
dr_mode = "otg";
|
||||
phys = <&u2phy1_otg>, <&tcphy1_usb3>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
phy_type = "utmi_wide";
|
||||
snps,dis_enblslpm_quirk;
|
||||
snps,dis-u2-freeclk-exists-quirk;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
snps,dis-del-phy-power-chg-quirk;
|
||||
snps,dis-tx-ipgap-linecheck-quirk;
|
||||
power-domains = <&power RK3399_PD_USB3>;
|
||||
status = "disabled";
|
||||
};
|
||||
typec_phy1 {
|
||||
compatible = "rockchip,rk3399-usb3-phy";
|
||||
reg = <0x0 0xff800000 0x0 0x40000>;
|
||||
};
|
||||
|
||||
cdn_dp: dp@fec00000 {
|
||||
compatible = "rockchip,rk3399-cdn-dp";
|
||||
reg = <0x0 0xfec00000 0x0 0x100000>;
|
||||
interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
assigned-clocks = <&cru SCLK_DP_CORE>, <&cru SCLK_SPDIF_REC_DPTX>;
|
||||
assigned-clock-rates = <100000000>, <200000000>;
|
||||
clocks = <&cru SCLK_DP_CORE>, <&cru PCLK_DP_CTRL>,
|
||||
<&cru SCLK_SPDIF_REC_DPTX>, <&cru PCLK_VIO_GRF>;
|
||||
clock-names = "core-clk", "pclk", "spdif", "grf";
|
||||
phys = <&tcphy0_dp>, <&tcphy1_dp>;
|
||||
power-domains = <&power RK3399_PD_HDCP>;
|
||||
resets = <&cru SRST_DPTX_SPDIF_REC>, <&cru SRST_P_UPHY0_DPTX>,
|
||||
<&cru SRST_P_UPHY0_APB>, <&cru SRST_DP_CORE>;
|
||||
reset-names = "spdif", "dptx", "apb", "core";
|
||||
rockchip,grf = <&grf>;
|
||||
#sound-dai-cells = <1>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
dp_in: port {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
dp_in_vopb: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&vopb_out_dp>;
|
||||
};
|
||||
|
||||
dp_in_vopl: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&vopl_out_dp>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@ -1054,6 +1114,21 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@ff3c0000 {
|
||||
compatible = "rockchip,rk3399-i2c";
|
||||
reg = <0x0 0xff3c0000 0x0 0x1000>;
|
||||
assigned-clocks = <&pmucru SCLK_I2C0_PMU>;
|
||||
assigned-clock-rates = <200000000>;
|
||||
clocks = <&pmucru SCLK_I2C0_PMU>, <&pmucru PCLK_I2C0_PMU>;
|
||||
clock-names = "i2c", "pclk";
|
||||
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c0_xfer>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c4: i2c@ff3d0000 {
|
||||
compatible = "rockchip,rk3399-i2c";
|
||||
reg = <0x0 0xff3d0000 0x0 0x1000>;
|
||||
@ -1217,7 +1292,10 @@
|
||||
<&cru PCLK_PERIHP>,
|
||||
<&cru ACLK_PERILP0>, <&cru HCLK_PERILP0>,
|
||||
<&cru PCLK_PERILP0>, <&cru ACLK_CCI>,
|
||||
<&cru HCLK_PERILP1>, <&cru PCLK_PERILP1>;
|
||||
<&cru HCLK_PERILP1>, <&cru PCLK_PERILP1>,
|
||||
<&cru ACLK_VIO>, <&cru ACLK_HDCP>,
|
||||
<&cru ACLK_GIC_PRE>,
|
||||
<&cru PCLK_DDR>;
|
||||
assigned-clock-rates =
|
||||
<594000000>, <800000000>,
|
||||
<1000000000>,
|
||||
@ -1225,7 +1303,10 @@
|
||||
<37500000>,
|
||||
<100000000>, <100000000>,
|
||||
<50000000>, <600000000>,
|
||||
<100000000>, <50000000>;
|
||||
<100000000>, <50000000>,
|
||||
<400000000>, <400000000>,
|
||||
<200000000>,
|
||||
<200000000>;
|
||||
};
|
||||
|
||||
grf: syscon@ff770000 {
|
||||
@ -1314,6 +1395,56 @@
|
||||
};
|
||||
};
|
||||
|
||||
tcphy0: phy@ff7c0000 {
|
||||
compatible = "rockchip,rk3399-typec-phy";
|
||||
reg = <0x0 0xff7c0000 0x0 0x40000>;
|
||||
clocks = <&cru SCLK_UPHY0_TCPDCORE>,
|
||||
<&cru SCLK_UPHY0_TCPDPHY_REF>;
|
||||
clock-names = "tcpdcore", "tcpdphy-ref";
|
||||
assigned-clocks = <&cru SCLK_UPHY0_TCPDCORE>;
|
||||
assigned-clock-rates = <50000000>;
|
||||
power-domains = <&power RK3399_PD_TCPD0>;
|
||||
resets = <&cru SRST_UPHY0>,
|
||||
<&cru SRST_UPHY0_PIPE_L00>,
|
||||
<&cru SRST_P_UPHY0_TCPHY>;
|
||||
reset-names = "uphy", "uphy-pipe", "uphy-tcphy";
|
||||
rockchip,grf = <&grf>;
|
||||
status = "disabled";
|
||||
|
||||
tcphy0_dp: dp-port {
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
tcphy0_usb3: usb3-port {
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
tcphy1: phy@ff800000 {
|
||||
compatible = "rockchip,rk3399-typec-phy";
|
||||
reg = <0x0 0xff800000 0x0 0x40000>;
|
||||
clocks = <&cru SCLK_UPHY1_TCPDCORE>,
|
||||
<&cru SCLK_UPHY1_TCPDPHY_REF>;
|
||||
clock-names = "tcpdcore", "tcpdphy-ref";
|
||||
assigned-clocks = <&cru SCLK_UPHY1_TCPDCORE>;
|
||||
assigned-clock-rates = <50000000>;
|
||||
power-domains = <&power RK3399_PD_TCPD1>;
|
||||
resets = <&cru SRST_UPHY1>,
|
||||
<&cru SRST_UPHY1_PIPE_L00>,
|
||||
<&cru SRST_P_UPHY1_TCPHY>;
|
||||
reset-names = "uphy", "uphy-pipe", "uphy-tcphy";
|
||||
rockchip,grf = <&grf>;
|
||||
status = "disabled";
|
||||
|
||||
tcphy1_dp: dp-port {
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
tcphy1_usb3: usb3-port {
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
watchdog@ff848000 {
|
||||
compatible = "snps,dw-wdt";
|
||||
reg = <0x0 0xff848000 0x0 0x100>;
|
||||
@ -1340,6 +1471,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spdif_bus>;
|
||||
power-domains = <&power RK3399_PD_SDIOAUDIO>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1355,6 +1487,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2s0_8ch_bus>;
|
||||
power-domains = <&power RK3399_PD_SDIOAUDIO>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1369,6 +1502,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2s1_2ch_bus>;
|
||||
power-domains = <&power RK3399_PD_SDIOAUDIO>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1381,21 +1515,7 @@
|
||||
clock-names = "i2s_clk", "i2s_hclk";
|
||||
clocks = <&cru SCLK_I2S2_8CH>, <&cru HCLK_I2S2_8CH>;
|
||||
power-domains = <&power RK3399_PD_SDIOAUDIO>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@ff3c0000 {
|
||||
compatible = "rockchip,rk3399-i2c";
|
||||
reg = <0x0 0xff3c0000 0x0 0x1000>;
|
||||
assigned-clocks = <&pmucru SCLK_I2C0_PMU>;
|
||||
assigned-clock-rates = <200000000>;
|
||||
clocks = <&pmucru SCLK_I2C0_PMU>, <&pmucru PCLK_I2C0_PMU>;
|
||||
clock-names = "i2c", "pclk";
|
||||
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2c0_xfer>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1404,69 +1524,177 @@
|
||||
compatible = "rockchip,rk3399-vop-lit";
|
||||
reg = <0x0 0xff8f0000 0x0 0x3efc>;
|
||||
interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
assigned-clocks = <&cru ACLK_VOP1>, <&cru HCLK_VOP1>;
|
||||
assigned-clock-rates = <400000000>, <100000000>;
|
||||
clocks = <&cru ACLK_VOP1>, <&cru DCLK_VOP1>, <&cru HCLK_VOP1>;
|
||||
clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
|
||||
iommus = <&vopl_mmu>;
|
||||
power-domains = <&power RK3399_PD_VOPL>;
|
||||
resets = <&cru SRST_A_VOP1>, <&cru SRST_H_VOP1>, <&cru SRST_D_VOP1>;
|
||||
reset-names = "axi", "ahb", "dclk";
|
||||
status = "disabled";
|
||||
|
||||
vopl_out: port {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
vopl_out_mipi: endpoint@0 {
|
||||
reg = <3>;
|
||||
reg = <0>;
|
||||
remote-endpoint = <&mipi_in_vopl>;
|
||||
};
|
||||
|
||||
vopl_out_hdmi: endpoint@1 {
|
||||
vopl_out_edp: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&edp_in_vopl>;
|
||||
};
|
||||
|
||||
vopl_out_hdmi: endpoint@2 {
|
||||
reg = <2>;
|
||||
remote-endpoint = <&hdmi_in_vopl>;
|
||||
};
|
||||
|
||||
vopl_out_mipi1: endpoint@3 {
|
||||
reg = <3>;
|
||||
remote-endpoint = <&mipi1_in_vopl>;
|
||||
};
|
||||
|
||||
vopl_out_dp: endpoint@4 {
|
||||
reg = <4>;
|
||||
remote-endpoint = <&dp_in_vopl>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
vopl_mmu: iommu@ff8f3f00 {
|
||||
compatible = "rockchip,iommu";
|
||||
reg = <0x0 0xff8f3f00 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
interrupt-names = "vopl_mmu";
|
||||
clocks = <&cru ACLK_VOP1>, <&cru HCLK_VOP1>;
|
||||
clock-names = "aclk", "iface";
|
||||
power-domains = <&power RK3399_PD_VOPL>;
|
||||
#iommu-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
vopb: vop@ff900000 {
|
||||
u-boot,dm-pre-reloc;
|
||||
compatible = "rockchip,rk3399-vop-big";
|
||||
reg = <0x0 0xff900000 0x0 0x3efc>;
|
||||
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
assigned-clocks = <&cru ACLK_VOP0>, <&cru HCLK_VOP0>;
|
||||
assigned-clock-rates = <400000000>, <100000000>;
|
||||
clocks = <&cru ACLK_VOP0>, <&cru DCLK_VOP0>, <&cru HCLK_VOP0>;
|
||||
#clock-cells = <0>;
|
||||
clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
|
||||
iommus = <&vopb_mmu>;
|
||||
power-domains = <&power RK3399_PD_VOPB>;
|
||||
resets = <&cru SRST_A_VOP0>, <&cru SRST_H_VOP0>, <&cru SRST_D_VOP0>;
|
||||
reset-names = "axi", "ahb", "dclk";
|
||||
status = "disabled";
|
||||
|
||||
vopb_out: port {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
vopb_out_mipi: endpoint@0 {
|
||||
reg = <3>;
|
||||
|
||||
vopb_out_edp: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&edp_in_vopb>;
|
||||
};
|
||||
|
||||
vopb_out_mipi: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&mipi_in_vopb>;
|
||||
};
|
||||
|
||||
vopb_out_hdmi: endpoint@1 {
|
||||
reg = <1>;
|
||||
vopb_out_hdmi: endpoint@2 {
|
||||
reg = <2>;
|
||||
remote-endpoint = <&hdmi_in_vopb>;
|
||||
};
|
||||
|
||||
vopb_out_mipi1: endpoint@3 {
|
||||
reg = <3>;
|
||||
remote-endpoint = <&mipi1_in_vopb>;
|
||||
};
|
||||
|
||||
vopb_out_dp: endpoint@4 {
|
||||
reg = <4>;
|
||||
remote-endpoint = <&dp_in_vopb>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
vopb_mmu: iommu@ff903f00 {
|
||||
compatible = "rockchip,iommu";
|
||||
reg = <0x0 0xff903f00 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
interrupt-names = "vopb_mmu";
|
||||
clocks = <&cru ACLK_VOP0>, <&cru HCLK_VOP0>;
|
||||
clock-names = "aclk", "iface";
|
||||
power-domains = <&power RK3399_PD_VOPB>;
|
||||
#iommu-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
isp0_mmu: iommu@ff914000 {
|
||||
compatible = "rockchip,iommu";
|
||||
reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
interrupt-names = "isp0_mmu";
|
||||
clocks = <&cru ACLK_ISP0_NOC>, <&cru HCLK_ISP0_NOC>;
|
||||
clock-names = "aclk", "iface";
|
||||
#iommu-cells = <0>;
|
||||
rockchip,disable-mmu-reset;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
isp1_mmu: iommu@ff924000 {
|
||||
compatible = "rockchip,iommu";
|
||||
reg = <0x0 0xff924000 0x0 0x100>, <0x0 0xff925000 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
interrupt-names = "isp1_mmu";
|
||||
clocks = <&cru ACLK_ISP1_NOC>, <&cru HCLK_ISP1_NOC>;
|
||||
clock-names = "aclk", "iface";
|
||||
#iommu-cells = <0>;
|
||||
rockchip,disable-mmu-reset;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hdmi_sound: hdmi-sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,mclk-fs = <256>;
|
||||
simple-audio-card,name = "hdmi-sound";
|
||||
status = "disabled";
|
||||
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&i2s2>;
|
||||
};
|
||||
simple-audio-card,codec {
|
||||
sound-dai = <&hdmi>;
|
||||
};
|
||||
};
|
||||
|
||||
hdmi: hdmi@ff940000 {
|
||||
compatible = "rockchip,rk3399-dw-hdmi";
|
||||
reg = <0x0 0xff940000 0x0 0x20000>;
|
||||
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&cru PCLK_HDMI_CTRL>,
|
||||
<&cru SCLK_HDMI_SFR>,
|
||||
<&cru PLL_VPLL>,
|
||||
<&cru PCLK_VIO_GRF>,
|
||||
<&cru SCLK_HDMI_CEC>;
|
||||
clock-names = "iahb", "isfr", "vpll", "grf", "cec";
|
||||
power-domains = <&power RK3399_PD_HDCP>;
|
||||
reg-io-width = <4>;
|
||||
rockchip,grf = <&grf>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&hdmi_i2c_xfer>;
|
||||
power-domains = <&power RK3399_PD_HDCP>;
|
||||
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_SFR>, <&cru PLL_VPLL>, <&cru PCLK_VIO_GRF>;
|
||||
clock-names = "iahb", "isfr", "vpll", "grf";
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
hdmi_in: port {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
hdmi_in_vopb: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&vopb_out_hdmi>;
|
||||
@ -1507,6 +1735,88 @@
|
||||
};
|
||||
};
|
||||
|
||||
mipi_dsi1: mipi@ff968000 {
|
||||
compatible = "rockchip,rk3399-mipi-dsi", "snps,dw-mipi-dsi";
|
||||
reg = <0x0 0xff968000 0x0 0x8000>;
|
||||
interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&cru SCLK_DPHY_PLL>, <&cru PCLK_MIPI_DSI1>,
|
||||
<&cru SCLK_DPHY_TX1RX1_CFG>, <&cru PCLK_VIO_GRF>;
|
||||
clock-names = "ref", "pclk", "phy_cfg", "grf";
|
||||
power-domains = <&power RK3399_PD_VIO>;
|
||||
resets = <&cru SRST_P_MIPI_DSI1>;
|
||||
reset-names = "apb";
|
||||
rockchip,grf = <&grf>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
mipi1_in: port@0 {
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
mipi1_in_vopb: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&vopb_out_mipi1>;
|
||||
};
|
||||
|
||||
mipi1_in_vopl: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&vopl_out_mipi1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
edp: edp@ff970000 {
|
||||
compatible = "rockchip,rk3399-edp";
|
||||
reg = <0x0 0xff970000 0x0 0x8000>;
|
||||
interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&cru PCLK_EDP>, <&cru PCLK_EDP_CTRL>, <&cru PCLK_VIO_GRF>;
|
||||
clock-names = "dp", "pclk", "grf";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&edp_hpd>;
|
||||
power-domains = <&power RK3399_PD_EDP>;
|
||||
resets = <&cru SRST_P_EDP_CTRL>;
|
||||
reset-names = "dp";
|
||||
rockchip,grf = <&grf>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
edp_in: port@0 {
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
edp_in_vopb: endpoint@0 {
|
||||
reg = <0>;
|
||||
remote-endpoint = <&vopb_out_edp>;
|
||||
};
|
||||
|
||||
edp_in_vopl: endpoint@1 {
|
||||
reg = <1>;
|
||||
remote-endpoint = <&vopl_out_edp>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
gpu: gpu@ff9a0000 {
|
||||
compatible = "rockchip,rk3399-mali", "arm,mali-t860";
|
||||
reg = <0x0 0xff9a0000 0x0 0x10000>;
|
||||
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH 0>,
|
||||
<GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH 0>,
|
||||
<GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
interrupt-names = "gpu", "job", "mmu";
|
||||
clocks = <&cru ACLK_GPU>;
|
||||
power-domains = <&power RK3399_PD_GPU>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
pinctrl: pinctrl {
|
||||
u-boot,dm-pre-reloc;
|
||||
compatible = "rockchip,rk3399-pinctrl";
|
||||
@ -1911,7 +2221,7 @@
|
||||
<4 RK_PB5 RK_FUNC_1 &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
sdmmc_cd: sdmcc-cd {
|
||||
sdmmc_cd: sdmmc-cd {
|
||||
rockchip,pins =
|
||||
<0 RK_PA7 RK_FUNC_1 &pcfg_pull_up>;
|
||||
};
|
||||
|
@ -75,6 +75,14 @@ enum {
|
||||
MMC0_DIV_MASK = 0x3f << MMC0_DIV_SHIFT,
|
||||
};
|
||||
|
||||
/* CRU_CLKSEL8_CON */
|
||||
enum {
|
||||
I2S0_FRAC_DENOM_SHIFT = 0,
|
||||
I2S0_FRAC_DENOM_MASK = 0xffff << I2S0_FRAC_DENOM_SHIFT,
|
||||
I2S0_FRAC_NUMER_SHIFT = 16,
|
||||
I2S0_FRAC_NUMER_MASK = 0xffffu << I2S0_FRAC_NUMER_SHIFT,
|
||||
};
|
||||
|
||||
/* CRU_CLKSEL12_CON */
|
||||
enum {
|
||||
EMMC_PLL_SHIFT = 0xe,
|
||||
|
@ -24,4 +24,34 @@ struct rockchip_gpio_regs {
|
||||
};
|
||||
check_member(rockchip_gpio_regs, ls_sync, 0x60);
|
||||
|
||||
enum gpio_pu_pd {
|
||||
GPIO_PULL_NORMAL = 0,
|
||||
GPIO_PULL_UP,
|
||||
GPIO_PULL_DOWN,
|
||||
GPIO_PULL_REPEAT,
|
||||
};
|
||||
|
||||
/* These defines are only used by spl_gpio.h */
|
||||
enum {
|
||||
/* Banks have 8 GPIOs, so 3 bits, and there are 4 banks, so 2 bits */
|
||||
GPIO_BANK_SHIFT = 3,
|
||||
GPIO_BANK_MASK = 3 << GPIO_BANK_SHIFT,
|
||||
|
||||
GPIO_OFFSET_MASK = 0x1f,
|
||||
};
|
||||
|
||||
#define GPIO(bank, offset) ((bank) << GPIO_BANK_SHIFT | (offset))
|
||||
|
||||
enum gpio_bank_t {
|
||||
BANK_A = 0,
|
||||
BANK_B,
|
||||
BANK_C,
|
||||
BANK_D,
|
||||
};
|
||||
|
||||
enum gpio_dir_t {
|
||||
GPIO_INPUT = 0,
|
||||
GPIO_OUTPUT,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -561,6 +561,49 @@ enum {
|
||||
GPIO5C0_TS0_SYNC,
|
||||
};
|
||||
|
||||
/* GRF_GPIO6A_IOMUX */
|
||||
enum {
|
||||
GPIO6A7_SHIFT = 0xe,
|
||||
GPIO6A7_MASK = 1,
|
||||
GPIO6A7_GPIO = 0,
|
||||
GPIO6A7_I2S_SDO3,
|
||||
|
||||
GPIO6A6_SHIFT = 0xc,
|
||||
GPIO6A6_MASK = 1,
|
||||
GPIO6A6_GPIO = 0,
|
||||
GPIO6A6_I2S_SDO2,
|
||||
|
||||
GPIO6A5_SHIFT = 0xa,
|
||||
GPIO6A5_MASK = 1,
|
||||
GPIO6A5_GPIO = 0,
|
||||
GPIO6A5_I2S_SDO1,
|
||||
|
||||
GPIO6A4_SHIFT = 8,
|
||||
GPIO6A4_MASK = 1,
|
||||
GPIO6A4_GPIO = 0,
|
||||
GPIO6A4_I2S_SDO0,
|
||||
|
||||
GPIO6A3_SHIFT = 6,
|
||||
GPIO6A3_MASK = 1,
|
||||
GPIO6A3_GPIO = 0,
|
||||
GPIO6A3_I2S_SDI,
|
||||
|
||||
GPIO6A2_SHIFT = 4,
|
||||
GPIO6A2_MASK = 1,
|
||||
GPIO6A2_GPIO = 0,
|
||||
GPIO6A2_I2S_LRCKTX,
|
||||
|
||||
GPIO6A1_SHIFT = 2,
|
||||
GPIO6A1_MASK = 1,
|
||||
GPIO6A1_GPIO = 0,
|
||||
GPIO6A1_I2S_LRCKRX,
|
||||
|
||||
GPIO6A0_SHIFT = 0,
|
||||
GPIO6A0_MASK = 1,
|
||||
GPIO6A0_GPIO = 0,
|
||||
GPIO6A0_I2S_SCLK,
|
||||
};
|
||||
|
||||
/* GRF_GPIO6B_IOMUX */
|
||||
enum {
|
||||
GPIO6B3_SHIFT = 6,
|
||||
@ -1042,6 +1085,59 @@ enum GRF_SOC_CON8 {
|
||||
RK3288_DPHY_TX0_TURNREQUEST_DIS = 0,
|
||||
};
|
||||
|
||||
/* GRF_IO_VSEL */
|
||||
enum {
|
||||
GPIO1830_V18SEL_SHIFT = 9,
|
||||
GPIO1830_V18SEL_MASK = 1,
|
||||
GPIO1830_V18SEL_3_3V = 0,
|
||||
GPIO1830_V18SEL_1_8V,
|
||||
|
||||
GPIO30_V18SEL_SHIFT = 8,
|
||||
GPIO30_V18SEL_MASK = 1,
|
||||
GPIO30_V18SEL_3_3V = 0,
|
||||
GPIO30_V18SEL_1_8V,
|
||||
|
||||
SDCARD_V18SEL_SHIFT = 7,
|
||||
SDCARD_V18SEL_MASK = 1,
|
||||
SDCARD_V18SEL_3_3V = 0,
|
||||
SDCARD_V18SEL_1_8V,
|
||||
|
||||
AUDIO_V18SEL_SHIFT = 6,
|
||||
AUDIO_V18SEL_MASK = 1,
|
||||
AUDIO_V18SEL_3_3V = 0,
|
||||
AUDIO_V18SEL_1_8V,
|
||||
|
||||
BB_V18SEL_SHIFT = 5,
|
||||
BB_V18SEL_MASK = 1,
|
||||
BB_V18SEL_3_3V = 0,
|
||||
BB_V18SEL_1_8V,
|
||||
|
||||
WIFI_V18SEL_SHIFT = 4,
|
||||
WIFI_V18SEL_MASK = 1,
|
||||
WIFI_V18SEL_3_3V = 0,
|
||||
WIFI_V18SEL_1_8V,
|
||||
|
||||
FLASH1_V18SEL_SHIFT = 3,
|
||||
FLASH1_V18SEL_MASK = 1,
|
||||
FLASH1_V18SEL_3_3V = 0,
|
||||
FLASH1_V18SEL_1_8V,
|
||||
|
||||
FLASH0_V18SEL_SHIFT = 2,
|
||||
FLASH0_V18SEL_MASK = 1,
|
||||
FLASH0_V18SEL_3_3V = 0,
|
||||
FLASH0_V18SEL_1_8V,
|
||||
|
||||
DVP_V18SEL_SHIFT = 1,
|
||||
DVP_V18SEL_MASK = 1,
|
||||
DVP_V18SEL_3_3V = 0,
|
||||
DVP_V18SEL_1_8V,
|
||||
|
||||
LCDC_V18SEL_SHIFT = 0,
|
||||
LCDC_V18SEL_MASK = 1,
|
||||
LCDC_V18SEL_3_3V = 0,
|
||||
LCDC_V18SEL_1_8V,
|
||||
};
|
||||
|
||||
/* GPIO Bias settings */
|
||||
enum GPIO_BIAS {
|
||||
GPIO_BIAS_2MA = 0,
|
||||
@ -1053,13 +1149,6 @@ enum GPIO_BIAS {
|
||||
#define GPIO_BIAS_MASK 0x3
|
||||
#define GPIO_BIAS_SHIFT(x) ((x) * 2)
|
||||
|
||||
enum GPIO_PU_PD {
|
||||
GPIO_PULL_NORMAL = 0,
|
||||
GPIO_PULL_UP,
|
||||
GPIO_PULL_DOWN,
|
||||
GPIO_PULL_REPEAT,
|
||||
};
|
||||
|
||||
#define GPIO_PULL_MASK 0x3
|
||||
#define GPIO_PULL_SHIFT(x) ((x) * 2)
|
||||
|
||||
|
@ -45,6 +45,7 @@ enum periph_id {
|
||||
PERIPH_ID_HDMI,
|
||||
PERIPH_ID_GMAC,
|
||||
PERIPH_ID_SFC,
|
||||
PERIPH_ID_I2S,
|
||||
|
||||
PERIPH_ID_COUNT,
|
||||
|
||||
|
@ -29,4 +29,7 @@ static void configure_l2ctlr(void)
|
||||
}
|
||||
#endif /* CONFIG_ROCKCHIP_RK3288 */
|
||||
|
||||
/* provided to defeat compiler optimisation in board_init_f() */
|
||||
void gru_dummy_function(int i);
|
||||
|
||||
#endif /* _ASM_ARCH_SYS_PROTO_H */
|
||||
|
@ -29,7 +29,6 @@ config ROCKCHIP_RK3188
|
||||
select SUPPORT_SPL
|
||||
select SPL
|
||||
select SPL_CLK
|
||||
select SPL_PINCTRL
|
||||
select SPL_REGMAP
|
||||
select SPL_SYSCON
|
||||
select SPL_RAM
|
||||
|
@ -61,7 +61,13 @@ int setup_boot_mode(void)
|
||||
void *reg = (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG;
|
||||
int boot_mode = readl(reg);
|
||||
|
||||
rockchip_dnl_mode_check();
|
||||
/*
|
||||
* This should be handled using a driver-tree property and a suitable
|
||||
* driver which can read the appropriate settings. As it is, this
|
||||
* breaks chromebook_minnie.\
|
||||
*
|
||||
* rockchip_dnl_mode_check();
|
||||
*/
|
||||
|
||||
boot_mode = readl(reg);
|
||||
debug("%s: boot mode 0x%08x\n", __func__, boot_mode);
|
||||
|
@ -7,13 +7,13 @@
|
||||
#include <clk.h>
|
||||
#include <dm.h>
|
||||
#include <ram.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/grf_rk3036.h>
|
||||
#include <asm/arch/boot_mode.h>
|
||||
#include <asm/arch/sdram_rk3036.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <malloc.h>
|
||||
#include <ram.h>
|
||||
#include <spl.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/bootrom.h>
|
||||
@ -27,7 +28,6 @@
|
||||
#include <dm/test.h>
|
||||
#include <dm/util.h>
|
||||
#include <power/regulator.h>
|
||||
#include <syscon.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
@ -120,7 +120,7 @@ void board_debug_uart_init(void)
|
||||
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
struct udevice *pinctrl, *dev;
|
||||
struct udevice *dev;
|
||||
int ret;
|
||||
|
||||
#define EARLY_UART
|
||||
@ -134,10 +134,7 @@ void board_init_f(ulong dummy)
|
||||
* printascii("string");
|
||||
*/
|
||||
debug_uart_init();
|
||||
printch('s');
|
||||
printch('p');
|
||||
printch('l');
|
||||
printch('\n');
|
||||
printascii("U-Boot SPL board init");
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ROCKCHIP_USB_UART
|
||||
@ -171,12 +168,6 @@ void board_init_f(ulong dummy)
|
||||
return;
|
||||
}
|
||||
|
||||
ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
|
||||
if (ret) {
|
||||
debug("Pinctrl init failed: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = uclass_get_device(UCLASS_RAM, 0, &dev);
|
||||
if (ret) {
|
||||
debug("DRAM init failed: %d\n", ret);
|
||||
@ -214,7 +205,6 @@ static int setup_led(void)
|
||||
|
||||
void spl_board_init(void)
|
||||
{
|
||||
struct udevice *pinctrl;
|
||||
int ret;
|
||||
|
||||
ret = setup_led();
|
||||
@ -223,36 +213,9 @@ void spl_board_init(void)
|
||||
hang();
|
||||
}
|
||||
|
||||
ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
|
||||
if (ret) {
|
||||
debug("%s: Cannot find pinctrl device\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_MMC_SUPPORT
|
||||
ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
|
||||
if (ret) {
|
||||
debug("%s: Failed to set up SD card\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Enable debug UART */
|
||||
ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_UART_DBG);
|
||||
if (ret) {
|
||||
debug("%s: Failed to set up console UART\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
|
||||
preloader_console_init();
|
||||
#if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM)
|
||||
back_to_bootrom(BROM_BOOT_NEXTSTAGE);
|
||||
#endif
|
||||
return;
|
||||
|
||||
err:
|
||||
printf("spl_board_init: Error %d\n", ret);
|
||||
|
||||
/* No way to report error here */
|
||||
hang();
|
||||
}
|
||||
|
@ -8,13 +8,13 @@
|
||||
#include <dm.h>
|
||||
#include <ram.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk3188.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/pmu_rk3288.h>
|
||||
#include <asm/arch/boot_mode.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
__weak int rk_board_late_init(void)
|
||||
|
@ -8,10 +8,10 @@
|
||||
#include <ram.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/boot_mode.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/grf_rk322x.h>
|
||||
#include <asm/arch/boot_mode.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
|
@ -71,51 +71,13 @@ u32 spl_boot_device(void)
|
||||
fallback:
|
||||
#elif defined(CONFIG_TARGET_CHROMEBOOK_JERRY) || \
|
||||
defined(CONFIG_TARGET_CHROMEBIT_MICKEY) || \
|
||||
defined(CONFIG_TARGET_CHROMEBOOK_MINNIE)
|
||||
defined(CONFIG_TARGET_CHROMEBOOK_MINNIE) || \
|
||||
defined(CONFIG_TARGET_CHROMEBOOK_SPEEDY)
|
||||
return BOOT_DEVICE_SPI;
|
||||
#endif
|
||||
return BOOT_DEVICE_MMC1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_MMC_SUPPORT
|
||||
static int configure_emmc(struct udevice *pinctrl)
|
||||
{
|
||||
#if defined(CONFIG_TARGET_CHROMEBOOK_JERRY)
|
||||
|
||||
struct gpio_desc desc;
|
||||
int ret;
|
||||
|
||||
pinctrl_request_noflags(pinctrl, PERIPH_ID_EMMC);
|
||||
|
||||
/*
|
||||
* TODO(sjg@chromium.org): Pick this up from device tree or perhaps
|
||||
* use the EMMC_PWREN setting.
|
||||
*/
|
||||
ret = dm_gpio_lookup_name("D9", &desc);
|
||||
if (ret) {
|
||||
debug("gpio ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = dm_gpio_request(&desc, "emmc_pwren");
|
||||
if (ret) {
|
||||
debug("gpio_request ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = dm_gpio_set_dir_flags(&desc, GPIOD_IS_OUT);
|
||||
if (ret) {
|
||||
debug("gpio dir ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = dm_gpio_set_value(&desc, 1);
|
||||
if (ret) {
|
||||
debug("gpio value ret=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_SPL_OF_PLATDATA)
|
||||
static int phycore_init(void)
|
||||
{
|
||||
@ -144,7 +106,6 @@ static int phycore_init(void)
|
||||
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
struct udevice *pinctrl;
|
||||
struct udevice *dev;
|
||||
int ret;
|
||||
|
||||
@ -183,12 +144,6 @@ void board_init_f(ulong dummy)
|
||||
return;
|
||||
}
|
||||
|
||||
ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
|
||||
if (ret) {
|
||||
debug("Pinctrl init failed: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_SPL_OF_PLATDATA)
|
||||
if (of_machine_is_compatible("phytec,rk3288-phycore-som")) {
|
||||
ret = phycore_init();
|
||||
@ -239,52 +194,19 @@ static int setup_led(void)
|
||||
|
||||
void spl_board_init(void)
|
||||
{
|
||||
struct udevice *pinctrl;
|
||||
int ret;
|
||||
|
||||
ret = setup_led();
|
||||
|
||||
if (ret) {
|
||||
debug("LED ret=%d\n", ret);
|
||||
hang();
|
||||
}
|
||||
|
||||
ret = uclass_get_device(UCLASS_PINCTRL, 0, &pinctrl);
|
||||
if (ret) {
|
||||
debug("%s: Cannot find pinctrl device\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_MMC_SUPPORT
|
||||
ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_SDCARD);
|
||||
if (ret) {
|
||||
debug("%s: Failed to set up SD card\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
ret = configure_emmc(pinctrl);
|
||||
if (ret) {
|
||||
debug("%s: Failed to set up eMMC\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Enable debug UART */
|
||||
ret = pinctrl_request_noflags(pinctrl, PERIPH_ID_UART_DBG);
|
||||
if (ret) {
|
||||
debug("%s: Failed to set up console UART\n", __func__);
|
||||
goto err;
|
||||
}
|
||||
|
||||
preloader_console_init();
|
||||
#if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM)
|
||||
back_to_bootrom(BROM_BOOT_NEXTSTAGE);
|
||||
#endif
|
||||
return;
|
||||
err:
|
||||
printf("spl_board_init: Error %d\n", ret);
|
||||
|
||||
/* No way to report error here */
|
||||
hang();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_OS_BOOT
|
||||
|
@ -30,6 +30,17 @@ config TARGET_CHROMEBOOK_MINNIE
|
||||
functions. It includes 2 or 4GB of SDRAM and 16 or 32GB of
|
||||
internal MMC. The product name is ASUS Chromebook Flip.
|
||||
|
||||
config TARGET_CHROMEBOOK_SPEEDY
|
||||
bool "Google/Rockchip Veyron-Speedy Chromebook"
|
||||
select BOARD_LATE_INIT
|
||||
help
|
||||
Speedy is a RK3288-based clamshell device with 2 USB 2.0 ports,
|
||||
micro HDMI, an 11.6 inch display, micro-SD card,
|
||||
HD camera, touchpad, wifi and Bluetooth. It includes a Chrome OS
|
||||
EC (Cortex-M3) to provide access to the keyboard and battery
|
||||
functions. It includes 2 or 4GB of SDRAM and 16GB of internal MMC.
|
||||
The product name is Asus Chromebook C201PA.
|
||||
|
||||
config TARGET_EVB_RK3288
|
||||
bool "Evb-RK3288"
|
||||
select BOARD_LATE_INIT
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <common.h>
|
||||
#include <debug_uart.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <ram.h>
|
||||
#include <spl.h>
|
||||
#include <asm/io.h>
|
||||
@ -15,6 +14,7 @@
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/timer.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
void board_debug_uart_init(void)
|
||||
{
|
||||
|
@ -4,18 +4,18 @@
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <debug_uart.h>
|
||||
#include <dm.h>
|
||||
#include <ram.h>
|
||||
#include <spl.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/bootrom.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/cru_rk3368.h>
|
||||
#include <asm/arch/grf_rk3368.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/timer.h>
|
||||
#include <syscon.h>
|
||||
|
||||
/*
|
||||
* The SPL (and also the full U-Boot stage on the RK3368) will run in
|
||||
|
@ -5,18 +5,20 @@
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <debug_uart.h>
|
||||
#include <dm.h>
|
||||
#include <ram.h>
|
||||
#include <spl.h>
|
||||
#include <spl_gpio.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/bootrom.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk3399.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/io.h>
|
||||
#include <debug_uart.h>
|
||||
#include <dm.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <ram.h>
|
||||
#include <spl.h>
|
||||
#include <syscon.h>
|
||||
|
||||
void board_return_to_bootrom(void)
|
||||
{
|
||||
@ -128,7 +130,13 @@ void secure_timer_init(void)
|
||||
void board_debug_uart_init(void)
|
||||
{
|
||||
#define GRF_BASE 0xff770000
|
||||
#define GPIO0_BASE 0xff720000
|
||||
#define PMUGRF_BASE 0xff320000
|
||||
struct rk3399_grf_regs * const grf = (void *)GRF_BASE;
|
||||
#ifdef CONFIG_TARGET_CHROMEBOOK_BOB
|
||||
struct rk3399_pmugrf_regs * const pmugrf = (void *)PMUGRF_BASE;
|
||||
struct rockchip_gpio_regs * const gpio = (void *)GPIO0_BASE;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff180000)
|
||||
/* Enable early UART0 on the RK3399 */
|
||||
@ -139,6 +147,20 @@ void board_debug_uart_init(void)
|
||||
GRF_GPIO2C1_SEL_MASK,
|
||||
GRF_UART0BT_SOUT << GRF_GPIO2C1_SEL_SHIFT);
|
||||
#else
|
||||
# ifdef CONFIG_TARGET_CHROMEBOOK_BOB
|
||||
rk_setreg(&grf->io_vsel, 1 << 0);
|
||||
|
||||
/*
|
||||
* Let's enable these power rails here, we are already running the SPI
|
||||
* Flash based code.
|
||||
*/
|
||||
spl_gpio_output(gpio, GPIO(BANK_B, 2), 1); /* PP1500_EN */
|
||||
spl_gpio_set_pull(&pmugrf->gpio0_p, GPIO(BANK_B, 2), GPIO_PULL_NORMAL);
|
||||
|
||||
spl_gpio_output(gpio, GPIO(BANK_B, 4), 1); /* PP3000_EN */
|
||||
spl_gpio_set_pull(&pmugrf->gpio0_p, GPIO(BANK_B, 4), GPIO_PULL_NORMAL);
|
||||
#endif /* CONFIG_TARGET_CHROMEBOOK_BOB */
|
||||
|
||||
/* Enable early UART2 channel C on the RK3399 */
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C3_SEL_MASK,
|
||||
@ -163,6 +185,22 @@ void board_init_f(ulong dummy)
|
||||
|
||||
#define EARLY_UART
|
||||
#ifdef EARLY_UART
|
||||
debug_uart_init();
|
||||
|
||||
# ifdef CONFIG_TARGET_CHROMEBOOK_BOB
|
||||
int sum, i;
|
||||
|
||||
/*
|
||||
* Add a delay and ensure that the compiler does not optimise this out.
|
||||
* This is needed since the power rails tail a while to turn on, and
|
||||
* we get garbage serial output otherwise.
|
||||
*/
|
||||
sum = 0;
|
||||
for (i = 0; i < 150000; i++)
|
||||
sum += i;
|
||||
gru_dummy_function(sum);
|
||||
#endif /* CONFIG_TARGET_CHROMEBOOK_BOB */
|
||||
|
||||
/*
|
||||
* Debug UART can be used from here if required:
|
||||
*
|
||||
@ -171,7 +209,6 @@ void board_init_f(ulong dummy)
|
||||
* printhex8(0x1234);
|
||||
* printascii("string");
|
||||
*/
|
||||
debug_uart_init();
|
||||
printascii("U-Boot SPL board init\n");
|
||||
#endif
|
||||
|
||||
|
@ -53,6 +53,15 @@ config TARGET_ROCK960_RK3399
|
||||
* 2x USB 3.0 type A, 2x USB 2.0 type A (host mode only),
|
||||
1x USB 3.0 type C OTG
|
||||
|
||||
config TARGET_CHROMEBOOK_BOB
|
||||
bool "Asus Flip C101PA Chromebook (RK3399)"
|
||||
help
|
||||
Bob is a small RK3299-based device similar in apperance to Minnie.
|
||||
It has two USB 3.0 type-C ports, 4GB of SDRAM, WiFi and a 10.1",
|
||||
1280x800 display. It uses its USB ports for both power and external
|
||||
display. It includes a Chrome OS EC (Cortex-M3) to provide access to
|
||||
the keyboard and battery functions.
|
||||
|
||||
endchoice
|
||||
|
||||
config SYS_SOC
|
||||
@ -64,5 +73,6 @@ config SYS_MALLOC_F_LEN
|
||||
source "board/rockchip/evb_rk3399/Kconfig"
|
||||
source "board/theobroma-systems/puma_rk3399/Kconfig"
|
||||
source "board/vamrs/rock960_rk3399/Kconfig"
|
||||
source "board/google/gru/Kconfig"
|
||||
|
||||
endif
|
||||
|
@ -61,6 +61,9 @@ static int spl_node_to_boot_device(int node)
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
} else if (!uclass_get_device_by_of_offset(UCLASS_SPI_FLASH, node,
|
||||
&parent)) {
|
||||
return BOOT_DEVICE_SPI;
|
||||
}
|
||||
|
||||
/*
|
||||
|
15
board/google/gru/Kconfig
Normal file
15
board/google/gru/Kconfig
Normal file
@ -0,0 +1,15 @@
|
||||
if TARGET_CHROMEBOOK_BOB
|
||||
|
||||
config SYS_BOARD
|
||||
default "gru"
|
||||
|
||||
config SYS_VENDOR
|
||||
default "google"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "gru"
|
||||
|
||||
config BOARD_SPECIFIC_OPTIONS # dummy
|
||||
def_bool y
|
||||
|
||||
endif
|
6
board/google/gru/MAINTAINERS
Normal file
6
board/google/gru/MAINTAINERS
Normal file
@ -0,0 +1,6 @@
|
||||
CHROMEBOOK BOB BOARD
|
||||
M: Simon Glass <sjg@chromium.org>
|
||||
S: Maintained
|
||||
F: board/google/gru/
|
||||
F: include/configs/gru.h
|
||||
F: configs/chromebook_bob_defconfig
|
5
board/google/gru/Makefile
Normal file
5
board/google/gru/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Copyright 2019 Google LLC
|
||||
|
||||
obj-y += gru.o
|
16
board/google/gru/gru.c
Normal file
16
board/google/gru/gru.c
Normal file
@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2018 Google
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
|
||||
int board_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* provided to defeat compiler optimisation in board_init_f() */
|
||||
void gru_dummy_function(int i)
|
||||
{
|
||||
}
|
@ -45,3 +45,19 @@ config BOARD_SPECIFIC_OPTIONS # dummy
|
||||
def_bool y
|
||||
|
||||
endif
|
||||
|
||||
if TARGET_CHROMEBOOK_SPEEDY
|
||||
|
||||
config SYS_BOARD
|
||||
default "veyron"
|
||||
|
||||
config SYS_VENDOR
|
||||
default "google"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "veyron"
|
||||
|
||||
config BOARD_SPECIFIC_OPTIONS # dummy
|
||||
def_bool y
|
||||
|
||||
endif
|
||||
|
@ -18,3 +18,10 @@ S: Maintained
|
||||
F: board/google/veyron/
|
||||
F: include/configs/veyron.h
|
||||
F: configs/chromebook_minnie_defconfig
|
||||
|
||||
CHROMEBOOK SPEEDY BOARD
|
||||
M: Simon Glass <sjg@chromium.org>
|
||||
S: Maintained
|
||||
F: board/google/veyron/
|
||||
F: include/configs/veyron.h
|
||||
F: configs/chromebook_speedy_defconfig
|
||||
|
@ -35,21 +35,29 @@ Get the Source and prebuild binary
|
||||
> git clone https://github.com/rockchip-linux/rkbin.git
|
||||
> git clone https://github.com/rockchip-linux/rkdeveloptool.git
|
||||
|
||||
Compile the ATF
|
||||
===============
|
||||
Get some prerequisites
|
||||
======================
|
||||
|
||||
You need the Python elftools.elf.elffile library for make_fit_atf.py to work:
|
||||
|
||||
> sudo apt-get install python-pyelftools
|
||||
|
||||
Compile ATF
|
||||
===========
|
||||
|
||||
> cd arm-trusted-firmware
|
||||
> make realclean
|
||||
> make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399 bl31
|
||||
|
||||
Or you can get the bl31.elf directly from Rockchip:
|
||||
cp rkbin/rk33/rk3399_bl31_v1.00.elf ../u-boot/bl31.elf
|
||||
|
||||
Get bl31.elf in this step, copy it to U-Boot root dir:
|
||||
> cp bl31.elf ../u-boot/
|
||||
> cp build/rk3399/release/bl31/bl31.elf ../u-boot/
|
||||
|
||||
Compile the U-Boot
|
||||
==================
|
||||
Or you can get the bl31.elf directly from Rockchip:
|
||||
> cp rkbin/rk33/rk3399_bl31_v1.00.elf ../u-boot/bl31.elf
|
||||
|
||||
|
||||
Compile U-Boot
|
||||
==============
|
||||
|
||||
> cd ../u-boot
|
||||
> export ARCH=arm64
|
||||
@ -62,17 +70,18 @@ Compile the U-Boot
|
||||
|
||||
Get spl/u-boot-spl.bin and u-boot.itb in this step.
|
||||
|
||||
Compile the rkdeveloptool
|
||||
=======================
|
||||
Follow instructions in latest README
|
||||
Compile rkdeveloptool
|
||||
=====================
|
||||
|
||||
Get rkdeveloptool installed on your Host in this step.
|
||||
|
||||
Follow instructions in latest README, example:
|
||||
> cd ../rkdeveloptool
|
||||
> autoreconf -i
|
||||
> ./configure
|
||||
> make
|
||||
> sudo make install
|
||||
|
||||
Get rkdeveloptool in you Host in this step.
|
||||
|
||||
Both origin binaries and Tool are ready now, choose either option 1 or
|
||||
option 2 to deploy U-Boot.
|
||||
|
||||
|
37
cmd/gpio.c
37
cmd/gpio.c
@ -18,10 +18,10 @@ __weak int name_to_gpio(const char *name)
|
||||
}
|
||||
|
||||
enum gpio_cmd {
|
||||
GPIO_INPUT,
|
||||
GPIO_SET,
|
||||
GPIO_CLEAR,
|
||||
GPIO_TOGGLE,
|
||||
GPIOC_INPUT,
|
||||
GPIOC_SET,
|
||||
GPIOC_CLEAR,
|
||||
GPIOC_TOGGLE,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DM_GPIO) && !defined(gpio_status)
|
||||
@ -158,11 +158,20 @@ static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
|
||||
/* parse the behavior */
|
||||
switch (*str_cmd) {
|
||||
case 'i': sub_cmd = GPIO_INPUT; break;
|
||||
case 's': sub_cmd = GPIO_SET; break;
|
||||
case 'c': sub_cmd = GPIO_CLEAR; break;
|
||||
case 't': sub_cmd = GPIO_TOGGLE; break;
|
||||
default: goto show_usage;
|
||||
case 'i':
|
||||
sub_cmd = GPIOC_INPUT;
|
||||
break;
|
||||
case 's':
|
||||
sub_cmd = GPIOC_SET;
|
||||
break;
|
||||
case 'c':
|
||||
sub_cmd = GPIOC_CLEAR;
|
||||
break;
|
||||
case 't':
|
||||
sub_cmd = GPIOC_TOGGLE;
|
||||
break;
|
||||
default:
|
||||
goto show_usage;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DM_GPIO)
|
||||
@ -192,18 +201,18 @@ static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
}
|
||||
|
||||
/* finally, let's do it: set direction and exec command */
|
||||
if (sub_cmd == GPIO_INPUT) {
|
||||
if (sub_cmd == GPIOC_INPUT) {
|
||||
gpio_direction_input(gpio);
|
||||
value = gpio_get_value(gpio);
|
||||
} else {
|
||||
switch (sub_cmd) {
|
||||
case GPIO_SET:
|
||||
case GPIOC_SET:
|
||||
value = 1;
|
||||
break;
|
||||
case GPIO_CLEAR:
|
||||
case GPIOC_CLEAR:
|
||||
value = 0;
|
||||
break;
|
||||
case GPIO_TOGGLE:
|
||||
case GPIOC_TOGGLE:
|
||||
value = gpio_get_value(gpio);
|
||||
if (!IS_ERR_VALUE(value))
|
||||
value = !value;
|
||||
@ -218,7 +227,7 @@ static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
printf("unknown (ret=%d)\n", value);
|
||||
else
|
||||
printf("%d\n", value);
|
||||
if (sub_cmd != GPIO_INPUT && !IS_ERR_VALUE(value)) {
|
||||
if (sub_cmd != GPIOC_INPUT && !IS_ERR_VALUE(value)) {
|
||||
int nval = gpio_get_value(gpio);
|
||||
|
||||
if (IS_ERR_VALUE(nval))
|
||||
|
@ -38,7 +38,6 @@ CONFIG_SPL_PARTITION_UUIDS=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3288-veyron-mickey"
|
||||
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
|
||||
CONFIG_SPL_OF_PLATDATA=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_SPL_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
@ -62,8 +61,6 @@ CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
@ -92,4 +89,3 @@ CONFIG_DISPLAY_ROCKCHIP_HDMI=y
|
||||
CONFIG_USE_TINY_PRINTF=y
|
||||
CONFIG_CMD_DHRYSTONE=y
|
||||
CONFIG_ERRNO_STR=y
|
||||
# CONFIG_SPL_OF_LIBFDT is not set
|
||||
|
100
configs/chromebook_bob_defconfig
Normal file
100
configs/chromebook_bob_defconfig
Normal file
@ -0,0 +1,100 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_ROCKCHIP=y
|
||||
CONFIG_SYS_TEXT_BASE=0x00200000
|
||||
CONFIG_SPL_GPIO_SUPPORT=y
|
||||
CONFIG_SPL_LIBCOMMON_SUPPORT=y
|
||||
CONFIG_SPL_LIBGENERIC_SUPPORT=y
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x4000
|
||||
CONFIG_ROCKCHIP_RK3399=y
|
||||
CONFIG_ROCKCHIP_BOOT_MODE_REG=0
|
||||
CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x4000
|
||||
# CONFIG_SPL_MMC_SUPPORT is not set
|
||||
CONFIG_TARGET_CHROMEBOOK_BOB=y
|
||||
CONFIG_DEBUG_UART_BASE=0xff1a0000
|
||||
CONFIG_DEBUG_UART_CLOCK=24000000
|
||||
CONFIG_SPL_STACK_R_ADDR=0x80000
|
||||
CONFIG_SPL_SPI_FLASH_SUPPORT=y
|
||||
CONFIG_SPL_SPI_SUPPORT=y
|
||||
CONFIG_DEBUG_UART=y
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
CONFIG_FIT=y
|
||||
CONFIG_SPL_LOAD_FIT=y
|
||||
CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
|
||||
CONFIG_LOG_DEFAULT_LEVEL=7
|
||||
CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-gru-bob.dtb"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||
CONFIG_SPL_STACK_R=y
|
||||
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x4000
|
||||
CONFIG_SPL_SPI_LOAD=y
|
||||
CONFIG_SPL_ATF=y
|
||||
CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
|
||||
CONFIG_CMD_BOOTZ=y
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_GPT=y
|
||||
CONFIG_CMD_I2C=y
|
||||
CONFIG_CMD_MMC=y
|
||||
CONFIG_CMD_SF=y
|
||||
CONFIG_CMD_SF_TEST=y
|
||||
CONFIG_CMD_SPI=y
|
||||
CONFIG_CMD_USB=y
|
||||
# CONFIG_CMD_SETEXPR is not set
|
||||
CONFIG_CMD_TIME=y
|
||||
CONFIG_CMD_PMIC=y
|
||||
CONFIG_CMD_REGULATOR=y
|
||||
CONFIG_CMD_LOG=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3399-gru-bob"
|
||||
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
|
||||
CONFIG_ENV_IS_IN_MMC=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_SPL_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
CONFIG_SPL_SYSCON=y
|
||||
CONFIG_CLK=y
|
||||
CONFIG_SPL_CLK=y
|
||||
CONFIG_ROCKCHIP_GPIO=y
|
||||
CONFIG_I2C_CROS_EC_TUNNEL=y
|
||||
CONFIG_SYS_I2C_ROCKCHIP=y
|
||||
CONFIG_I2C_MUX=y
|
||||
CONFIG_DM_KEYBOARD=y
|
||||
CONFIG_CROS_EC_KEYB=y
|
||||
CONFIG_CROS_EC=y
|
||||
CONFIG_CROS_EC_SPI=y
|
||||
CONFIG_PWRSEQ=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_ROCKCHIP=y
|
||||
CONFIG_SPI_FLASH=y
|
||||
CONFIG_SPI_FLASH_GIGADEVICE=y
|
||||
CONFIG_DM_ETH=y
|
||||
CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_REGULATOR_PWM=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
CONFIG_REGULATOR_RK8XX=y
|
||||
CONFIG_PWM_ROCKCHIP=y
|
||||
CONFIG_RAM=y
|
||||
CONFIG_SPL_RAM=y
|
||||
CONFIG_DEBUG_UART_SHIFT=2
|
||||
CONFIG_ROCKCHIP_SPI=y
|
||||
CONFIG_SYSRESET=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_DWC3=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_GENERIC=y
|
||||
CONFIG_USB_HOST_ETHER=y
|
||||
CONFIG_USB_ETHER_ASIX=y
|
||||
CONFIG_USB_ETHER_ASIX88179=y
|
||||
CONFIG_USB_ETHER_MCS7830=y
|
||||
CONFIG_USB_ETHER_RTL8152=y
|
||||
CONFIG_USB_ETHER_SMSC95XX=y
|
||||
CONFIG_USE_TINY_PRINTF=y
|
||||
CONFIG_CMD_DHRYSTONE=y
|
||||
CONFIG_ERRNO_STR=y
|
@ -14,6 +14,8 @@ CONFIG_DEBUG_UART=y
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
# CONFIG_ANDROID_BOOT_IMAGE is not set
|
||||
CONFIG_SILENT_CONSOLE=y
|
||||
CONFIG_LOG=y
|
||||
CONFIG_LOG_DEFAULT_LEVEL=7
|
||||
CONFIG_DEFAULT_FDT_FILE="rk3288-veyron-jerry.dtb"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||
@ -32,6 +34,7 @@ CONFIG_CMD_USB=y
|
||||
# CONFIG_CMD_SETEXPR is not set
|
||||
CONFIG_CMD_CACHE=y
|
||||
CONFIG_CMD_TIME=y
|
||||
CONFIG_CMD_SOUND=y
|
||||
CONFIG_CMD_PMIC=y
|
||||
CONFIG_CMD_REGULATOR=y
|
||||
# CONFIG_SPL_DOS_PARTITION is not set
|
||||
@ -40,7 +43,6 @@ CONFIG_SPL_PARTITION_UUIDS=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3288-veyron-jerry"
|
||||
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
|
||||
CONFIG_SPL_OF_PLATDATA=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_SPL_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
@ -64,8 +66,6 @@ CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
@ -76,6 +76,10 @@ CONFIG_RAM=y
|
||||
CONFIG_SPL_RAM=y
|
||||
CONFIG_DEBUG_UART_SHIFT=2
|
||||
CONFIG_ROCKCHIP_SERIAL=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_I2S=y
|
||||
CONFIG_I2S_ROCKCHIP=y
|
||||
CONFIG_SOUND_MAX98090=y
|
||||
CONFIG_ROCKCHIP_SPI=y
|
||||
CONFIG_SYSRESET=y
|
||||
CONFIG_USB=y
|
||||
@ -96,4 +100,3 @@ CONFIG_DISPLAY_ROCKCHIP_HDMI=y
|
||||
CONFIG_USE_TINY_PRINTF=y
|
||||
CONFIG_CMD_DHRYSTONE=y
|
||||
CONFIG_ERRNO_STR=y
|
||||
# CONFIG_SPL_OF_LIBFDT is not set
|
||||
|
@ -39,7 +39,6 @@ CONFIG_SPL_PARTITION_UUIDS=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3288-veyron-minnie"
|
||||
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
|
||||
CONFIG_SPL_OF_PLATDATA=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_SPL_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
@ -63,8 +62,6 @@ CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
@ -94,4 +91,3 @@ CONFIG_CONSOLE_SCROLL_LINES=10
|
||||
CONFIG_USE_TINY_PRINTF=y
|
||||
CONFIG_CMD_DHRYSTONE=y
|
||||
CONFIG_ERRNO_STR=y
|
||||
# CONFIG_SPL_OF_LIBFDT is not set
|
||||
|
100
configs/chromebook_speedy_defconfig
Normal file
100
configs/chromebook_speedy_defconfig
Normal file
@ -0,0 +1,100 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_ROCKCHIP=y
|
||||
CONFIG_SYS_TEXT_BASE=0x00100000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_ROCKCHIP_RK3288=y
|
||||
# CONFIG_SPL_MMC_SUPPORT is not set
|
||||
CONFIG_TARGET_CHROMEBOOK_SPEEDY=y
|
||||
CONFIG_DEBUG_UART_BASE=0xff690000
|
||||
CONFIG_DEBUG_UART_CLOCK=24000000
|
||||
CONFIG_SPL_STACK_R_ADDR=0x80000
|
||||
CONFIG_SPL_SPI_FLASH_SUPPORT=y
|
||||
CONFIG_SPL_SPI_SUPPORT=y
|
||||
CONFIG_DEBUG_UART=y
|
||||
CONFIG_NR_DRAM_BANKS=1
|
||||
# CONFIG_ANDROID_BOOT_IMAGE is not set
|
||||
CONFIG_SILENT_CONSOLE=y
|
||||
CONFIG_DEFAULT_FDT_FILE="rk3288-veyron-speedy.dtb"
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||
CONFIG_BOARD_EARLY_INIT_F=y
|
||||
CONFIG_SPL_STACK_R=y
|
||||
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
|
||||
CONFIG_SPL_SPI_LOAD=y
|
||||
CONFIG_CMD_GPIO=y
|
||||
CONFIG_CMD_GPT=y
|
||||
CONFIG_CMD_I2C=y
|
||||
CONFIG_CMD_MMC=y
|
||||
CONFIG_CMD_SF=y
|
||||
CONFIG_CMD_SF_TEST=y
|
||||
CONFIG_CMD_SPI=y
|
||||
CONFIG_CMD_USB=y
|
||||
# CONFIG_CMD_SETEXPR is not set
|
||||
CONFIG_CMD_CACHE=y
|
||||
CONFIG_CMD_TIME=y
|
||||
CONFIG_CMD_PMIC=y
|
||||
CONFIG_CMD_REGULATOR=y
|
||||
# CONFIG_SPL_DOS_PARTITION is not set
|
||||
# CONFIG_SPL_EFI_PARTITION is not set
|
||||
CONFIG_SPL_PARTITION_UUIDS=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3288-veyron-speedy"
|
||||
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
|
||||
CONFIG_SPL_OF_PLATDATA=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_SPL_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
CONFIG_SPL_SYSCON=y
|
||||
# CONFIG_SPL_SIMPLE_BUS is not set
|
||||
CONFIG_CLK=y
|
||||
CONFIG_SPL_CLK=y
|
||||
CONFIG_FASTBOOT_FLASH=y
|
||||
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
|
||||
CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
|
||||
CONFIG_ROCKCHIP_GPIO=y
|
||||
CONFIG_I2C_CROS_EC_TUNNEL=y
|
||||
CONFIG_SYS_I2C_ROCKCHIP=y
|
||||
CONFIG_I2C_MUX=y
|
||||
CONFIG_DM_KEYBOARD=y
|
||||
CONFIG_CROS_EC_KEYB=y
|
||||
CONFIG_CROS_EC=y
|
||||
CONFIG_CROS_EC_SPI=y
|
||||
CONFIG_PWRSEQ=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
CONFIG_REGULATOR_RK8XX=y
|
||||
CONFIG_PWM_ROCKCHIP=y
|
||||
CONFIG_RAM=y
|
||||
CONFIG_SPL_RAM=y
|
||||
CONFIG_DEBUG_UART_SHIFT=2
|
||||
CONFIG_ROCKCHIP_SERIAL=y
|
||||
CONFIG_ROCKCHIP_SPI=y
|
||||
CONFIG_SYSRESET=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_ROCKCHIP_USB2_PHY=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
|
||||
CONFIG_USB_GADGET_VENDOR_NUM=0x2207
|
||||
CONFIG_USB_GADGET_PRODUCT_NUM=0x320a
|
||||
CONFIG_USB_GADGET_DWC2_OTG=y
|
||||
CONFIG_USB_FUNCTION_MASS_STORAGE=y
|
||||
CONFIG_DM_VIDEO=y
|
||||
CONFIG_CONSOLE_TRUETYPE=y
|
||||
CONFIG_DISPLAY=y
|
||||
CONFIG_VIDEO_ROCKCHIP=y
|
||||
CONFIG_DISPLAY_ROCKCHIP_EDP=y
|
||||
CONFIG_DISPLAY_ROCKCHIP_HDMI=y
|
||||
# CONFIG_USE_PRIVATE_LIBGCC is not set
|
||||
CONFIG_USE_TINY_PRINTF=y
|
||||
CONFIG_CMD_DHRYSTONE=y
|
||||
CONFIG_ERRNO_STR=y
|
||||
# CONFIG_SPL_OF_LIBFDT is not set
|
@ -22,7 +22,6 @@ CONFIG_CLK=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3368=y
|
||||
CONFIG_RAM=y
|
||||
CONFIG_DEBUG_UART_SHIFT=2
|
||||
CONFIG_DEBUG_UART_ANNOUNCE=y
|
||||
|
@ -31,7 +31,6 @@ CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PHY=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3128=y
|
||||
CONFIG_REGULATOR_PWM=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
CONFIG_RAM=y
|
||||
|
@ -44,7 +44,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PHY=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK322X=y
|
||||
CONFIG_RAM=y
|
||||
CONFIG_SPL_RAM=y
|
||||
CONFIG_BAUDRATE=1500000
|
||||
|
@ -57,8 +57,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_ACT8846=y
|
||||
CONFIG_REGULATOR_ACT8846=y
|
||||
|
@ -31,7 +31,6 @@ CONFIG_CMD_TIME=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3399-evb"
|
||||
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
|
||||
CONFIG_SPL_OF_PLATDATA=y
|
||||
CONFIG_ENV_IS_IN_MMC=y
|
||||
CONFIG_NET_RANDOM_ETHADDR=y
|
||||
CONFIG_REGMAP=y
|
||||
@ -50,7 +49,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3399=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_REGULATOR_PWM=y
|
||||
|
@ -37,7 +37,6 @@ CONFIG_DM_ETH=y
|
||||
CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RV1108=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
CONFIG_BAUDRATE=1500000
|
||||
# CONFIG_SPL_SERIAL_PRESENT is not set
|
||||
|
@ -56,8 +56,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
|
@ -59,8 +59,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_ACT8846=y
|
||||
|
@ -49,7 +49,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3399=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_REGULATOR_PWM=y
|
||||
|
@ -17,7 +17,6 @@ CONFIG_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
CONFIG_CLK=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3368=y
|
||||
CONFIG_RAM=y
|
||||
CONFIG_DEBUG_UART_SHIFT=2
|
||||
CONFIG_DEBUG_UART_ANNOUNCE=y
|
||||
|
@ -41,7 +41,6 @@ CONFIG_LED=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3036=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
# CONFIG_SPL_DM_SERIAL is not set
|
||||
CONFIG_SYSRESET=y
|
||||
|
10
configs/kylin-rk3036_defconfig.rej
Normal file
10
configs/kylin-rk3036_defconfig.rej
Normal file
@ -0,0 +1,10 @@
|
||||
--- configs/kylin-rk3036_defconfig
|
||||
+++ configs/kylin-rk3036_defconfig
|
||||
@@ -8,6 +8,7 @@ CONFIG_ROCKCHIP_RK3036=y
|
||||
CONFIG_TARGET_KYLIN_RK3036=y
|
||||
CONFIG_SPL_STACK_R_ADDR=0x80000
|
||||
CONFIG_DEFAULT_DEVICE_TREE="rk3036-sdk"
|
||||
+CONFIG_DEBUG_UART=y
|
||||
CONFIG_SPL_SYS_MALLOC_F_LEN=0x0
|
||||
# CONFIG_ANDROID_BOOT_IMAGE is not set
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
@ -79,7 +79,6 @@ CONFIG_RGMII=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3368=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
|
@ -56,8 +56,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_ACT8846=y
|
||||
CONFIG_REGULATOR_ACT8846=y
|
||||
|
@ -60,8 +60,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
|
@ -56,8 +56,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
|
@ -32,6 +32,7 @@ CONFIG_SPL_I2C_SUPPORT=y
|
||||
CONFIG_SPL_POWER_SUPPORT=y
|
||||
CONFIG_SPL_SPI_LOAD=y
|
||||
CONFIG_SPL_ATF=y
|
||||
CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
|
||||
CONFIG_CMD_BOOTZ=y
|
||||
CONFIG_CMD_GPT=y
|
||||
CONFIG_CMD_I2C=y
|
||||
@ -74,8 +75,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3399=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3399_FULL=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_DM_PMIC_FAN53555=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
|
10
configs/puma-rk3399_defconfig.rej
Normal file
10
configs/puma-rk3399_defconfig.rej
Normal file
@ -0,0 +1,10 @@
|
||||
--- configs/puma-rk3399_defconfig
|
||||
+++ configs/puma-rk3399_defconfig
|
||||
@@ -74,7 +74,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
-CONFIG_PINCTRL_ROCKCHIP_RK3399=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_DM_PMIC_FAN53555=y
|
||||
CONFIG_PMIC_RK8XX=y
|
@ -56,8 +56,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_ACT8846=y
|
||||
|
@ -41,7 +41,6 @@ CONFIG_LED=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3188=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_ACT8846=y
|
||||
|
@ -149,8 +149,6 @@ CONFIG_PHY=y
|
||||
CONFIG_PHY_SANDBOX=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3036=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_PINCTRL_SANDBOX=y
|
||||
CONFIG_POWER_DOMAIN=y
|
||||
CONFIG_SANDBOX_POWER_DOMAIN=y
|
||||
|
@ -119,8 +119,6 @@ CONFIG_PHY=y
|
||||
CONFIG_PHY_SANDBOX=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3036=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_PINCTRL_SANDBOX=y
|
||||
CONFIG_POWER_DOMAIN=y
|
||||
CONFIG_SANDBOX_POWER_DOMAIN=y
|
||||
|
@ -121,8 +121,6 @@ CONFIG_PHY=y
|
||||
CONFIG_PHY_SANDBOX=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCONF=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3036=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_PINCTRL_SANDBOX=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_ACT8846=y
|
||||
|
@ -20,7 +20,6 @@ CONFIG_CLK=y
|
||||
CONFIG_MMC_DW=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3368=y
|
||||
CONFIG_RAM=y
|
||||
CONFIG_DEBUG_UART_SHIFT=2
|
||||
CONFIG_DEBUG_UART_ANNOUNCE=y
|
||||
|
@ -59,8 +59,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
|
@ -54,8 +54,6 @@ CONFIG_ETH_DESIGNWARE=y
|
||||
CONFIG_GMAC_ROCKCHIP=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
# CONFIG_SPL_PINCTRL_FULL is not set
|
||||
CONFIG_PINCTRL_ROCKCHIP_RK3288=y
|
||||
CONFIG_DM_PMIC=y
|
||||
# CONFIG_SPL_PMIC_CHILDREN is not set
|
||||
CONFIG_PMIC_RK8XX=y
|
||||
|
@ -6,13 +6,7 @@
|
||||
U-Boot on Rockchip
|
||||
==================
|
||||
|
||||
There are several repositories available with versions of U-Boot that support
|
||||
many Rockchip devices [1] [2].
|
||||
|
||||
The current mainline support is experimental only and is not useful for
|
||||
anything. It should provide a base on which to build.
|
||||
|
||||
So far only support for the RK3288 and RK3036 is provided.
|
||||
A wide range of Rockchip SoCs are supported in mainline U-Boot
|
||||
|
||||
|
||||
Prerequisites
|
||||
@ -34,23 +28,64 @@ You will need:
|
||||
Building
|
||||
========
|
||||
|
||||
At present nine RK3288 boards are supported:
|
||||
At present 12 RK3288 boards are supported:
|
||||
|
||||
- EVB RK3288 - use evb-rk3288 configuration
|
||||
- Fennec RK3288 - use fennec-rk3288 configuration
|
||||
- Firefly RK3288 - use firefly-rk3288 configuration
|
||||
- Hisense Chromebook - use chromebook_jerry configuration
|
||||
- Asus C100P Chromebook - use chromebook_minnie configuration
|
||||
- Asus Chromebit - use chromebook_mickey configuration
|
||||
- MiQi RK3288 - use miqi-rk3288 configuration
|
||||
- phyCORE-RK3288 RDK - use phycore-rk3288 configuration
|
||||
- PopMetal RK3288 - use popmetal-rk3288 configuration
|
||||
- Radxa Rock 2 - use rock2 configuration
|
||||
- Tinker RK3288 - use tinker-rk3288 configuration
|
||||
- Vyasa RK3288 - use vyasa-rk3288 configuration
|
||||
|
||||
Two RK3036 board are supported:
|
||||
Two RK3036 boards are supported:
|
||||
|
||||
- EVB RK3036 - use evb-rk3036 configuration
|
||||
- Kylin - use kylin_rk3036 configuration
|
||||
|
||||
One RK3328 board is supported:
|
||||
|
||||
- EVB RK3328
|
||||
|
||||
Size RK3399 boards are supported (aarch64):
|
||||
|
||||
- EBV RK3399 - use evb_rk3399 configuration
|
||||
- Firefly RK3399 - use the firefly_rk3399 configuration
|
||||
- Puma - use puma_rk3399 configuration
|
||||
- Ficus - use ficus-rk3399 configuration
|
||||
- Rock960 (Vamrs) - use rock960-rk3399 configuration
|
||||
- Bob - use chromebook_bob configuration
|
||||
|
||||
Four RK3368 boards are supported:
|
||||
|
||||
- Sheep - use sheep-rk3368 configuration
|
||||
- Lion - use lion-rk3368 configuration
|
||||
- Geekbox - use geekbox configuration
|
||||
- EVB PX5 - use evb-px5 configuration
|
||||
|
||||
One RK3128 board is supported:
|
||||
|
||||
- EVB RK3128 - use evb-rk3128 configuration
|
||||
|
||||
One RK3229 board is supported:
|
||||
|
||||
- EVB RK3229 - use evb-rk3229 configuration
|
||||
|
||||
Two RV1108 boards are supported:
|
||||
|
||||
- EVB RV1108 - use evb-rv1108 configuration
|
||||
- Elgin R1 - use elgin-rv1108 configuration
|
||||
|
||||
One RV3188 baord is supported:
|
||||
|
||||
- Raxda Rock - use rock configuration
|
||||
|
||||
|
||||
For example:
|
||||
|
||||
CROSS_COMPILE=arm-linux-gnueabi- make O=firefly firefly-rk3288_defconfig all
|
||||
@ -219,7 +254,8 @@ You should see something like:
|
||||
Booting from SPI
|
||||
================
|
||||
|
||||
To write an image that boots from SPI flash (e.g. for the Haier Chromebook):
|
||||
To write an image that boots from SPI flash (e.g. for the Haier Chromebook or
|
||||
Bob):
|
||||
|
||||
./chromebook_jerry/tools/mkimage -n rk3288 -T rkspi \
|
||||
-d chromebook_jerry/spl/u-boot-spl-dtb.bin spl.bin && \
|
||||
@ -228,7 +264,7 @@ To write an image that boots from SPI flash (e.g. for the Haier Chromebook):
|
||||
dd if=out.bin of=out.bin.pad bs=4M conv=sync
|
||||
|
||||
This converts the SPL image to the required SPI format by adding the Rockchip
|
||||
header and skipping every 2KB block. Then the U-Boot image is written at
|
||||
header and skipping every second 2KB block. Then the U-Boot image is written at
|
||||
offset 128KB and the whole image is padded to 4MB which is the SPI flash size.
|
||||
The position of U-Boot is controlled with this setting in U-Boot:
|
||||
|
||||
@ -264,7 +300,6 @@ Immediate priorities are:
|
||||
- USB device
|
||||
- Run CPU at full speed (code exists but we only see ~60 DMIPS maximum)
|
||||
- NAND flash
|
||||
- Support for other Rockchip parts
|
||||
- Boot U-Boot proper over USB OTG (at present only SPL works)
|
||||
|
||||
|
||||
|
@ -228,8 +228,8 @@ static int clk_set_default_rates(struct udevice *dev)
|
||||
|
||||
ret = clk_set_rate(&clk, rates[index]);
|
||||
if (ret < 0) {
|
||||
debug("%s: failed to set rate on clock %d for %s\n",
|
||||
__func__, index, dev_read_name(dev));
|
||||
debug("%s: failed to set rate on clock index %d (%ld) for %s\n",
|
||||
__func__, index, clk.id, dev_read_name(dev));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <common.h>
|
||||
#include <bitfield.h>
|
||||
#include <clk-uclass.h>
|
||||
#include <div64.h>
|
||||
#include <dm.h>
|
||||
#include <dt-structs.h>
|
||||
#include <errno.h>
|
||||
@ -371,6 +372,50 @@ static int rockchip_vop_set_clk(struct rk3288_cru *cru, struct rk3288_grf *grf,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 rockchip_clk_gcd(u32 a, u32 b)
|
||||
{
|
||||
while (b != 0) {
|
||||
int r = b;
|
||||
|
||||
b = a % b;
|
||||
a = r;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
static ulong rockchip_i2s_get_clk(struct rk3288_cru *cru, uint gclk_rate)
|
||||
{
|
||||
unsigned long long rate;
|
||||
uint val;
|
||||
int n, d;
|
||||
|
||||
val = readl(&cru->cru_clksel_con[8]);
|
||||
n = (val & I2S0_FRAC_NUMER_MASK) >> I2S0_FRAC_NUMER_SHIFT;
|
||||
d = (val & I2S0_FRAC_DENOM_MASK) >> I2S0_FRAC_DENOM_SHIFT;
|
||||
|
||||
rate = (unsigned long long)gclk_rate * n;
|
||||
do_div(rate, d);
|
||||
|
||||
return (ulong)rate;
|
||||
}
|
||||
|
||||
static ulong rockchip_i2s_set_clk(struct rk3288_cru *cru, uint gclk_rate,
|
||||
uint freq)
|
||||
{
|
||||
int n, d;
|
||||
int v;
|
||||
|
||||
/* set frac divider */
|
||||
v = rockchip_clk_gcd(gclk_rate, freq);
|
||||
n = gclk_rate / v;
|
||||
d = freq / v;
|
||||
assert(freq == gclk_rate / n * d);
|
||||
writel(d << I2S0_FRAC_NUMER_SHIFT | n << I2S0_FRAC_DENOM_SHIFT,
|
||||
&cru->cru_clksel_con[8]);
|
||||
|
||||
return rockchip_i2s_get_clk(cru, gclk_rate);
|
||||
}
|
||||
#endif /* CONFIG_SPL_BUILD */
|
||||
|
||||
static void rkclk_init(struct rk3288_cru *cru, struct rk3288_grf *grf)
|
||||
@ -769,6 +814,9 @@ static ulong rk3288_clk_set_rate(struct clk *clk, ulong rate)
|
||||
new_rate = rockchip_spi_set_clk(cru, gclk_rate, clk->id, rate);
|
||||
break;
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
case SCLK_I2S0:
|
||||
new_rate = rockchip_i2s_set_clk(cru, gclk_rate, rate);
|
||||
break;
|
||||
case SCLK_MAC:
|
||||
new_rate = rockchip_mac_set_clk(priv->cru, rate);
|
||||
break;
|
||||
|
@ -925,7 +925,13 @@ static ulong rk3399_clk_get_rate(struct clk *clk)
|
||||
case SCLK_SARADC:
|
||||
rate = rk3399_saradc_get_clk(priv->cru);
|
||||
break;
|
||||
case ACLK_VIO:
|
||||
case ACLK_HDCP:
|
||||
case ACLK_GIC_PRE:
|
||||
case PCLK_DDR:
|
||||
break;
|
||||
default:
|
||||
log_debug("Unknown clock %lu\n", clk->id);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@ -993,7 +999,13 @@ static ulong rk3399_clk_set_rate(struct clk *clk, ulong rate)
|
||||
case SCLK_SARADC:
|
||||
ret = rk3399_saradc_set_clk(priv->cru, rate);
|
||||
break;
|
||||
case ACLK_VIO:
|
||||
case ACLK_HDCP:
|
||||
case ACLK_GIC_PRE:
|
||||
case PCLK_DDR:
|
||||
return 0;
|
||||
default:
|
||||
log_debug("Unknown clock %lu\n", clk->id);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
@ -91,6 +91,52 @@ static int rockchip_gpio_get_function(struct udevice *dev, unsigned offset)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Simple SPL interface to GPIOs */
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
|
||||
enum {
|
||||
PULL_NONE_1V8 = 0,
|
||||
PULL_DOWN_1V8 = 1,
|
||||
PULL_UP_1V8 = 3,
|
||||
};
|
||||
|
||||
int spl_gpio_set_pull(void *vregs, uint gpio, int pull)
|
||||
{
|
||||
u32 *regs = vregs;
|
||||
uint val;
|
||||
|
||||
regs += gpio >> GPIO_BANK_SHIFT;
|
||||
gpio &= GPIO_OFFSET_MASK;
|
||||
switch (pull) {
|
||||
case GPIO_PULL_UP:
|
||||
val = PULL_UP_1V8;
|
||||
break;
|
||||
case GPIO_PULL_DOWN:
|
||||
val = PULL_DOWN_1V8;
|
||||
break;
|
||||
case GPIO_PULL_NORMAL:
|
||||
default:
|
||||
val = PULL_NONE_1V8;
|
||||
break;
|
||||
}
|
||||
clrsetbits_le32(regs, 3 << (gpio * 2), val << (gpio * 2));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int spl_gpio_output(void *vregs, uint gpio, int value)
|
||||
{
|
||||
struct rockchip_gpio_regs * const regs = vregs;
|
||||
|
||||
clrsetbits_le32(®s->swport_dr, 1 << gpio, value << gpio);
|
||||
|
||||
/* Set direction */
|
||||
clrsetbits_le32(®s->swport_ddr, 1 << gpio, 1 << gpio);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SPL_BUILD */
|
||||
|
||||
static int rockchip_gpio_probe(struct udevice *dev)
|
||||
{
|
||||
struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||
|
@ -158,96 +158,6 @@ config PINCTRL_QCA953X
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3036
|
||||
bool "Rockchip rk3036 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3036 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3128
|
||||
bool "Rockchip rk3128 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3128 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3188
|
||||
bool "Rockchip rk3188 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3188 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK322X
|
||||
bool "Rockchip rk322x pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk322x SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3288
|
||||
bool "Rockchip rk3288 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3288 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3328
|
||||
bool "Rockchip rk3328 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3328 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3368
|
||||
bool "Rockchip RK3368 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3368 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3399
|
||||
bool "Rockchip rk3399 pin control driver"
|
||||
depends on DM
|
||||
help
|
||||
Support pin multiplexing control on Rockchip rk3399 SoCs.
|
||||
|
||||
The driver is controlled by a device tree node which contains both
|
||||
the GPIO definitions and pin control functions for each available
|
||||
multiplex function.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RK3399_FULL
|
||||
bool "Rockchip rk3399 pin control driver (full)"
|
||||
depends on PINCTRL_FULL && PINCTRL_ROCKCHIP_RK3399
|
||||
help
|
||||
Support full pin multiplexing control on Rockchip rk3399 SoCs.
|
||||
|
||||
This enables the full pinctrl driver for the RK3399.
|
||||
Contrary to the non-full pinctrl driver, this will evaluate
|
||||
the board DTB to get the pinctrl settings.
|
||||
|
||||
config PINCTRL_ROCKCHIP_RV1108
|
||||
bool "Rockchip rv1108 pin control driver"
|
||||
depends on DM
|
||||
@ -310,14 +220,15 @@ config ASPEED_AST2500_PINCTRL
|
||||
|
||||
endif
|
||||
|
||||
source "drivers/pinctrl/meson/Kconfig"
|
||||
source "drivers/pinctrl/mediatek/Kconfig"
|
||||
source "drivers/pinctrl/nxp/Kconfig"
|
||||
source "drivers/pinctrl/renesas/Kconfig"
|
||||
source "drivers/pinctrl/uniphier/Kconfig"
|
||||
source "drivers/pinctrl/broadcom/Kconfig"
|
||||
source "drivers/pinctrl/exynos/Kconfig"
|
||||
source "drivers/pinctrl/mediatek/Kconfig"
|
||||
source "drivers/pinctrl/meson/Kconfig"
|
||||
source "drivers/pinctrl/mscc/Kconfig"
|
||||
source "drivers/pinctrl/mvebu/Kconfig"
|
||||
source "drivers/pinctrl/broadcom/Kconfig"
|
||||
source "drivers/pinctrl/nxp/Kconfig"
|
||||
source "drivers/pinctrl/renesas/Kconfig"
|
||||
source "drivers/pinctrl/rockchip/Kconfig"
|
||||
source "drivers/pinctrl/uniphier/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
@ -6,10 +6,10 @@ obj-$(CONFIG_$(SPL_)PINCTRL_GENERIC) += pinctrl-generic.o
|
||||
obj-$(CONFIG_PINCTRL_AT91) += pinctrl-at91.o
|
||||
obj-$(CONFIG_PINCTRL_AT91PIO4) += pinctrl-at91-pio4.o
|
||||
obj-y += nxp/
|
||||
obj-$(CONFIG_$(SPL_)PINCTRL_ROCKCHIP) += rockchip/
|
||||
obj-$(CONFIG_ARCH_ASPEED) += aspeed/
|
||||
obj-$(CONFIG_ARCH_ATH79) += ath79/
|
||||
obj-$(CONFIG_ARCH_RMOBILE) += renesas/
|
||||
obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
|
||||
obj-$(CONFIG_PINCTRL_SANDBOX) += pinctrl-sandbox.o
|
||||
|
||||
obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
|
||||
|
17
drivers/pinctrl/rockchip/Kconfig
Normal file
17
drivers/pinctrl/rockchip/Kconfig
Normal file
@ -0,0 +1,17 @@
|
||||
if ARCH_ROCKCHIP
|
||||
|
||||
config PINCTRL_ROCKCHIP
|
||||
bool "Rockchip pin control drivers"
|
||||
depends on ARCH_ROCKCHIP && PINCTRL_GENERIC
|
||||
default y
|
||||
help
|
||||
Enable support pin control functions for Rockchip SoCs.
|
||||
|
||||
config SPL_PINCTRL_ROCKCHIP
|
||||
bool "Support Rockchip pin controllers in SPL"
|
||||
depends on ARCH_ROCKCHIP && SPL_PINCTRL_GENERIC
|
||||
default y
|
||||
help
|
||||
This option is an SPL-variant of the PINCTRL_ROCKCHIP option.
|
||||
|
||||
endif
|
@ -2,12 +2,13 @@
|
||||
#
|
||||
# Copyright (c) 2017 Rockchip Electronics Co., Ltd
|
||||
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3036) += pinctrl_rk3036.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3128) += pinctrl_rk3128.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3188) += pinctrl_rk3188.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK322X) += pinctrl_rk322x.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3288) += pinctrl_rk3288.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3328) += pinctrl_rk3328.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3368) += pinctrl_rk3368.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RK3399) += pinctrl_rk3399.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP_RV1108) += pinctrl_rv1108.o
|
||||
obj-y += pinctrl-rockchip-core.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3036) += pinctrl-rk3036.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3128) += pinctrl-rk3128.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3188) += pinctrl-rk3188.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK322X) += pinctrl-rk322x.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3288) += pinctrl-rk3288.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3328) += pinctrl-rk3328.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3368) += pinctrl-rk3368.o
|
||||
obj-$(CONFIG_ROCKCHIP_RK3399) += pinctrl-rk3399.o
|
||||
obj-$(CONFIG_ROCKCHIP_RV1108) += pinctrl-rv1108.o
|
||||
|
65
drivers/pinctrl/rockchip/pinctrl-rk3036.c
Normal file
65
drivers/pinctrl/rockchip/pinctrl-rk3036.c
Normal file
@ -0,0 +1,65 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
#define RK3036_PULL_OFFSET 0x118
|
||||
#define RK3036_PULL_PINS_PER_REG 16
|
||||
#define RK3036_PULL_BANK_STRIDE 8
|
||||
|
||||
static void rk3036_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3036_PULL_OFFSET;
|
||||
*reg += bank->bank_num * RK3036_PULL_BANK_STRIDE;
|
||||
*reg += (pin_num / RK3036_PULL_PINS_PER_REG) * 4;
|
||||
|
||||
*bit = pin_num % RK3036_PULL_PINS_PER_REG;
|
||||
};
|
||||
|
||||
static struct rockchip_pin_bank rk3036_pin_banks[] = {
|
||||
PIN_BANK(0, 32, "gpio0"),
|
||||
PIN_BANK(1, 32, "gpio1"),
|
||||
PIN_BANK(2, 32, "gpio2"),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3036_pin_ctrl = {
|
||||
.pin_banks = rk3036_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3036_pin_banks),
|
||||
.label = "RK3036-GPIO",
|
||||
.type = RK3036,
|
||||
.grf_mux_offset = 0xa8,
|
||||
.pull_calc_reg = rk3036_calc_pull_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3036_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3036-pinctrl",
|
||||
.data = (ulong)&rk3036_pin_ctrl
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rockchip) = {
|
||||
.name = "rk3036-pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3036_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
155
drivers/pinctrl/rockchip/pinctrl-rk3128.c
Normal file
155
drivers/pinctrl/rockchip/pinctrl-rk3128.c
Normal file
@ -0,0 +1,155 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
|
||||
{
|
||||
.num = 2,
|
||||
.pin = 20,
|
||||
.reg = 0xe8,
|
||||
.bit = 0,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
.num = 2,
|
||||
.pin = 21,
|
||||
.reg = 0xe8,
|
||||
.bit = 4,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
.num = 2,
|
||||
.pin = 22,
|
||||
.reg = 0xe8,
|
||||
.bit = 8,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
.num = 2,
|
||||
.pin = 23,
|
||||
.reg = 0xe8,
|
||||
.bit = 12,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
.num = 2,
|
||||
.pin = 24,
|
||||
.reg = 0xd4,
|
||||
.bit = 12,
|
||||
.mask = 0x7
|
||||
},
|
||||
};
|
||||
|
||||
static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
|
||||
{
|
||||
/* spi-0 */
|
||||
.bank_num = 1,
|
||||
.pin = 10,
|
||||
.func = 1,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 3) | BIT(16 + 4),
|
||||
}, {
|
||||
/* spi-1 */
|
||||
.bank_num = 1,
|
||||
.pin = 27,
|
||||
.func = 3,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
|
||||
}, {
|
||||
/* spi-2 */
|
||||
.bank_num = 0,
|
||||
.pin = 13,
|
||||
.func = 2,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
|
||||
}, {
|
||||
/* i2s-0 */
|
||||
.bank_num = 1,
|
||||
.pin = 5,
|
||||
.func = 1,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 5),
|
||||
}, {
|
||||
/* i2s-1 */
|
||||
.bank_num = 0,
|
||||
.pin = 14,
|
||||
.func = 1,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 5) | BIT(5),
|
||||
}, {
|
||||
/* emmc-0 */
|
||||
.bank_num = 1,
|
||||
.pin = 22,
|
||||
.func = 2,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 6),
|
||||
}, {
|
||||
/* emmc-1 */
|
||||
.bank_num = 2,
|
||||
.pin = 4,
|
||||
.func = 2,
|
||||
.route_offset = 0x144,
|
||||
.route_val = BIT(16 + 6) | BIT(6),
|
||||
},
|
||||
};
|
||||
|
||||
#define RK3128_PULL_OFFSET 0x118
|
||||
#define RK3128_PULL_PINS_PER_REG 16
|
||||
#define RK3128_PULL_BANK_STRIDE 8
|
||||
|
||||
static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3128_PULL_OFFSET;
|
||||
*reg += bank->bank_num * RK3128_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / RK3128_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = pin_num % RK3128_PULL_PINS_PER_REG;
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3128_pin_banks[] = {
|
||||
PIN_BANK(0, 32, "gpio0"),
|
||||
PIN_BANK(1, 32, "gpio1"),
|
||||
PIN_BANK(2, 32, "gpio2"),
|
||||
PIN_BANK(3, 32, "gpio3"),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3128_pin_ctrl = {
|
||||
.pin_banks = rk3128_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3128_pin_banks),
|
||||
.label = "RK3128-GPIO",
|
||||
.type = RK3128,
|
||||
.grf_mux_offset = 0xa8,
|
||||
.iomux_recalced = rk3128_mux_recalced_data,
|
||||
.niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data),
|
||||
.iomux_routes = rk3128_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3128_mux_route_data),
|
||||
.pull_calc_reg = rk3128_calc_pull_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3128_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3128-pinctrl",
|
||||
.data = (ulong)&rk3128_pin_ctrl },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3128) = {
|
||||
.name = "pinctrl_rk3128",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3128_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
82
drivers/pinctrl/rockchip/pinctrl-rk3188.c
Normal file
82
drivers/pinctrl/rockchip/pinctrl-rk3188.c
Normal file
@ -0,0 +1,82 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
#define RK3188_PULL_OFFSET 0x164
|
||||
#define RK3188_PULL_PMU_OFFSET 0x64
|
||||
|
||||
static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 12 pins of the first bank are located elsewhere */
|
||||
if (bank->bank_num == 0 && pin_num < 12) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RK3188_PULL_PMU_OFFSET;
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_PULL_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3188_PULL_OFFSET;
|
||||
|
||||
/* correct the offset, as it is the 2nd pull register */
|
||||
*reg -= 4;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
/*
|
||||
* The bits in these registers have an inverse ordering
|
||||
* with the lowest pin being in bits 15:14 and the highest
|
||||
* pin in bits 1:0
|
||||
*/
|
||||
*bit = 7 - (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3188_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
|
||||
PIN_BANK(1, 32, "gpio1"),
|
||||
PIN_BANK(2, 32, "gpio2"),
|
||||
PIN_BANK(3, 32, "gpio3"),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
|
||||
.pin_banks = rk3188_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3188_pin_banks),
|
||||
.label = "RK3188-GPIO",
|
||||
.type = RK3188,
|
||||
.grf_mux_offset = 0x60,
|
||||
.pull_calc_reg = rk3188_calc_pull_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3188_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3188-pinctrl",
|
||||
.data = (ulong)&rk3188_pin_ctrl },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3188) = {
|
||||
.name = "rockchip_rk3188_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3188_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
215
drivers/pinctrl/rockchip/pinctrl-rk322x.c
Normal file
215
drivers/pinctrl/rockchip/pinctrl-rk322x.c
Normal file
@ -0,0 +1,215 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
|
||||
{
|
||||
/* pwm0-0 */
|
||||
.bank_num = 0,
|
||||
.pin = 26,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16),
|
||||
}, {
|
||||
/* pwm0-1 */
|
||||
.bank_num = 3,
|
||||
.pin = 21,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16) | BIT(0),
|
||||
}, {
|
||||
/* pwm1-0 */
|
||||
.bank_num = 0,
|
||||
.pin = 27,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 1),
|
||||
}, {
|
||||
/* pwm1-1 */
|
||||
.bank_num = 0,
|
||||
.pin = 30,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 1) | BIT(1),
|
||||
}, {
|
||||
/* pwm2-0 */
|
||||
.bank_num = 0,
|
||||
.pin = 28,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 2),
|
||||
}, {
|
||||
/* pwm2-1 */
|
||||
.bank_num = 1,
|
||||
.pin = 12,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 2) | BIT(2),
|
||||
}, {
|
||||
/* pwm3-0 */
|
||||
.bank_num = 3,
|
||||
.pin = 26,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3),
|
||||
}, {
|
||||
/* pwm3-1 */
|
||||
.bank_num = 1,
|
||||
.pin = 11,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3) | BIT(3),
|
||||
}, {
|
||||
/* sdio-0_d0 */
|
||||
.bank_num = 1,
|
||||
.pin = 1,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 4),
|
||||
}, {
|
||||
/* sdio-1_d0 */
|
||||
.bank_num = 3,
|
||||
.pin = 2,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 4) | BIT(4),
|
||||
}, {
|
||||
/* spi-0_rx */
|
||||
.bank_num = 0,
|
||||
.pin = 13,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 5),
|
||||
}, {
|
||||
/* spi-1_rx */
|
||||
.bank_num = 2,
|
||||
.pin = 0,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 5) | BIT(5),
|
||||
}, {
|
||||
/* emmc-0_cmd */
|
||||
.bank_num = 1,
|
||||
.pin = 22,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 7),
|
||||
}, {
|
||||
/* emmc-1_cmd */
|
||||
.bank_num = 2,
|
||||
.pin = 4,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 7) | BIT(7),
|
||||
}, {
|
||||
/* uart2-0_rx */
|
||||
.bank_num = 1,
|
||||
.pin = 19,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 8),
|
||||
}, {
|
||||
/* uart2-1_rx */
|
||||
.bank_num = 1,
|
||||
.pin = 10,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 8) | BIT(8),
|
||||
}, {
|
||||
/* uart1-0_rx */
|
||||
.bank_num = 1,
|
||||
.pin = 10,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 11),
|
||||
}, {
|
||||
/* uart1-1_rx */
|
||||
.bank_num = 3,
|
||||
.pin = 13,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 11) | BIT(11),
|
||||
},
|
||||
};
|
||||
|
||||
#define RK3228_PULL_OFFSET 0x100
|
||||
|
||||
static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3228_PULL_OFFSET;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
|
||||
#define RK3228_DRV_GRF_OFFSET 0x200
|
||||
|
||||
static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3228_DRV_GRF_OFFSET;
|
||||
*reg += bank->bank_num * ROCKCHIP_DRV_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_DRV_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3228_pin_banks[] = {
|
||||
PIN_BANK(0, 32, "gpio0"),
|
||||
PIN_BANK(1, 32, "gpio1"),
|
||||
PIN_BANK(2, 32, "gpio2"),
|
||||
PIN_BANK(3, 32, "gpio3"),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
|
||||
.pin_banks = rk3228_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3228_pin_banks),
|
||||
.label = "RK3228-GPIO",
|
||||
.type = RK3288,
|
||||
.grf_mux_offset = 0x0,
|
||||
.iomux_routes = rk3228_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3228_mux_route_data),
|
||||
.pull_calc_reg = rk3228_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3228_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3228_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3228-pinctrl",
|
||||
.data = (ulong)&rk3228_pin_ctrl
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3228) = {
|
||||
.name = "rockchip_rk3228_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3228_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
157
drivers/pinctrl/rockchip/pinctrl-rk3288.c
Normal file
157
drivers/pinctrl/rockchip/pinctrl-rk3288.c
Normal file
@ -0,0 +1,157 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
|
||||
{
|
||||
/* edphdmi_cecinoutt1 */
|
||||
.bank_num = 7,
|
||||
.pin = 16,
|
||||
.func = 2,
|
||||
.route_offset = 0x264,
|
||||
.route_val = BIT(16 + 12) | BIT(12),
|
||||
}, {
|
||||
/* edphdmi_cecinout */
|
||||
.bank_num = 7,
|
||||
.pin = 23,
|
||||
.func = 4,
|
||||
.route_offset = 0x264,
|
||||
.route_val = BIT(16 + 12),
|
||||
},
|
||||
};
|
||||
|
||||
#define RK3288_PULL_OFFSET 0x140
|
||||
#define RK3288_PULL_PMU_OFFSET 0x64
|
||||
|
||||
static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 24 pins of the first bank are located in PMU */
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RK3288_PULL_PMU_OFFSET;
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_PULL_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3288_PULL_OFFSET;
|
||||
|
||||
/* correct the offset, as we're starting with the 2nd bank */
|
||||
*reg -= 0x10;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
#define RK3288_DRV_PMU_OFFSET 0x70
|
||||
#define RK3288_DRV_GRF_OFFSET 0x1c0
|
||||
|
||||
static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 24 pins of the first bank are located in PMU */
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RK3288_DRV_PMU_OFFSET;
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_DRV_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3288_DRV_GRF_OFFSET;
|
||||
|
||||
/* correct the offset, as we're starting with the 2nd bank */
|
||||
*reg -= 0x10;
|
||||
*reg += bank->bank_num * ROCKCHIP_DRV_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_DRV_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3288_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_UNROUTED
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
|
||||
IOMUX_UNROUTED,
|
||||
IOMUX_UNROUTED,
|
||||
0
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
|
||||
PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
|
||||
PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
0,
|
||||
0
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
|
||||
0,
|
||||
0,
|
||||
IOMUX_UNROUTED
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
|
||||
PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
|
||||
0,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_UNROUTED
|
||||
),
|
||||
PIN_BANK(8, 16, "gpio8"),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
|
||||
.pin_banks = rk3288_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3288_pin_banks),
|
||||
.label = "RK3288-GPIO",
|
||||
.type = RK3288,
|
||||
.grf_mux_offset = 0x0,
|
||||
.pmu_mux_offset = 0x84,
|
||||
.iomux_routes = rk3288_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3288_mux_route_data),
|
||||
.pull_calc_reg = rk3288_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3288_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3288_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3288-pinctrl",
|
||||
.data = (ulong)&rk3288_pin_ctrl
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3288) = {
|
||||
.name = "rockchip_rk3288_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3288_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
227
drivers/pinctrl/rockchip/pinctrl-rk3328.c
Normal file
227
drivers/pinctrl/rockchip/pinctrl-rk3328.c
Normal file
@ -0,0 +1,227 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
|
||||
{
|
||||
.num = 2,
|
||||
.pin = 12,
|
||||
.reg = 0x24,
|
||||
.bit = 8,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 2,
|
||||
.pin = 15,
|
||||
.reg = 0x28,
|
||||
.bit = 0,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
.num = 2,
|
||||
.pin = 23,
|
||||
.reg = 0x30,
|
||||
.bit = 14,
|
||||
.mask = 0x3
|
||||
},
|
||||
};
|
||||
|
||||
static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
|
||||
{
|
||||
/* uart2dbg_rxm0 */
|
||||
.bank_num = 1,
|
||||
.pin = 1,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16) | BIT(16 + 1),
|
||||
}, {
|
||||
/* uart2dbg_rxm1 */
|
||||
.bank_num = 2,
|
||||
.pin = 1,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
|
||||
}, {
|
||||
/* gmac-m1_rxd0 */
|
||||
.bank_num = 1,
|
||||
.pin = 11,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 2) | BIT(2),
|
||||
}, {
|
||||
/* gmac-m1-optimized_rxd3 */
|
||||
.bank_num = 1,
|
||||
.pin = 14,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 10) | BIT(10),
|
||||
}, {
|
||||
/* pdm_sdi0m0 */
|
||||
.bank_num = 2,
|
||||
.pin = 19,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3),
|
||||
}, {
|
||||
/* pdm_sdi0m1 */
|
||||
.bank_num = 1,
|
||||
.pin = 23,
|
||||
.func = 3,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3) | BIT(3),
|
||||
}, {
|
||||
/* spi_rxdm2 */
|
||||
.bank_num = 3,
|
||||
.pin = 2,
|
||||
.func = 4,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5),
|
||||
}, {
|
||||
/* i2s2_sdim0 */
|
||||
.bank_num = 1,
|
||||
.pin = 24,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 6),
|
||||
}, {
|
||||
/* i2s2_sdim1 */
|
||||
.bank_num = 3,
|
||||
.pin = 2,
|
||||
.func = 6,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 6) | BIT(6),
|
||||
}, {
|
||||
/* card_iom1 */
|
||||
.bank_num = 2,
|
||||
.pin = 22,
|
||||
.func = 3,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 7) | BIT(7),
|
||||
}, {
|
||||
/* tsp_d5m1 */
|
||||
.bank_num = 2,
|
||||
.pin = 16,
|
||||
.func = 3,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 8) | BIT(8),
|
||||
}, {
|
||||
/* cif_data5m1 */
|
||||
.bank_num = 2,
|
||||
.pin = 16,
|
||||
.func = 4,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 9) | BIT(9),
|
||||
},
|
||||
};
|
||||
|
||||
#define RK3328_PULL_OFFSET 0x100
|
||||
|
||||
static void rk3328_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3328_PULL_OFFSET;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
|
||||
#define RK3328_DRV_GRF_OFFSET 0x200
|
||||
|
||||
static void rk3328_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3328_DRV_GRF_OFFSET;
|
||||
*reg += bank->bank_num * ROCKCHIP_DRV_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_DRV_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
}
|
||||
|
||||
#define RK3328_SCHMITT_BITS_PER_PIN 1
|
||||
#define RK3328_SCHMITT_PINS_PER_REG 16
|
||||
#define RK3328_SCHMITT_BANK_STRIDE 8
|
||||
#define RK3328_SCHMITT_GRF_OFFSET 0x380
|
||||
|
||||
static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num,
|
||||
struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3328_SCHMITT_GRF_OFFSET;
|
||||
|
||||
*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
|
||||
*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3328_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
0),
|
||||
PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
|
||||
IOMUX_WIDTH_3BIT,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
0,
|
||||
0),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
|
||||
.pin_banks = rk3328_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3328_pin_banks),
|
||||
.label = "RK3328-GPIO",
|
||||
.type = RK3288,
|
||||
.grf_mux_offset = 0x0,
|
||||
.iomux_recalced = rk3328_mux_recalced_data,
|
||||
.niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data),
|
||||
.iomux_routes = rk3328_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3328_mux_route_data),
|
||||
.pull_calc_reg = rk3328_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3328_calc_drv_reg_and_bit,
|
||||
.schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3328_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3328-pinctrl",
|
||||
.data = (ulong)&rk3328_pin_ctrl
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3328) = {
|
||||
.name = "rockchip_rk3328_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3328_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
116
drivers/pinctrl/rockchip/pinctrl-rk3368.c
Normal file
116
drivers/pinctrl/rockchip/pinctrl-rk3368.c
Normal file
@ -0,0 +1,116 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
#define RK3368_PULL_GRF_OFFSET 0x100
|
||||
#define RK3368_PULL_PMU_OFFSET 0x10
|
||||
|
||||
static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 32 pins of the first bank are located in PMU */
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RK3368_PULL_PMU_OFFSET;
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_PULL_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3368_PULL_GRF_OFFSET;
|
||||
|
||||
/* correct the offset, as we're starting with the 2nd bank */
|
||||
*reg -= 0x10;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
#define RK3368_DRV_PMU_OFFSET 0x20
|
||||
#define RK3368_DRV_GRF_OFFSET 0x200
|
||||
|
||||
static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 32 pins of the first bank are located in PMU */
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RK3368_DRV_PMU_OFFSET;
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_DRV_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3368_DRV_GRF_OFFSET;
|
||||
|
||||
/* correct the offset, as we're starting with the 2nd bank */
|
||||
*reg -= 0x10;
|
||||
*reg += bank->bank_num * ROCKCHIP_DRV_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_DRV_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3368_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU
|
||||
),
|
||||
PIN_BANK(1, 32, "gpio1"),
|
||||
PIN_BANK(2, 32, "gpio2"),
|
||||
PIN_BANK(3, 32, "gpio3"),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3368_pin_ctrl = {
|
||||
.pin_banks = rk3368_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3368_pin_banks),
|
||||
.label = "RK3368-GPIO",
|
||||
.type = RK3368,
|
||||
.grf_mux_offset = 0x0,
|
||||
.pmu_mux_offset = 0x0,
|
||||
.pull_calc_reg = rk3368_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3368_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3368_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3368-pinctrl",
|
||||
.data = (ulong)&rk3368_pin_ctrl
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3368) = {
|
||||
.name = "rockchip_rk3368_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3368_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
193
drivers/pinctrl/rockchip/pinctrl-rk3399.c
Normal file
193
drivers/pinctrl/rockchip/pinctrl-rk3399.c
Normal file
@ -0,0 +1,193 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
|
||||
{
|
||||
/* uart2dbga_rx */
|
||||
.bank_num = 4,
|
||||
.pin = 8,
|
||||
.func = 2,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 10) | BIT(16 + 11),
|
||||
}, {
|
||||
/* uart2dbgb_rx */
|
||||
.bank_num = 4,
|
||||
.pin = 16,
|
||||
.func = 2,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
|
||||
}, {
|
||||
/* uart2dbgc_rx */
|
||||
.bank_num = 4,
|
||||
.pin = 19,
|
||||
.func = 1,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
|
||||
}, {
|
||||
/* pcie_clkreqn */
|
||||
.bank_num = 2,
|
||||
.pin = 26,
|
||||
.func = 2,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 14),
|
||||
}, {
|
||||
/* pcie_clkreqnb */
|
||||
.bank_num = 4,
|
||||
.pin = 24,
|
||||
.func = 1,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 14) | BIT(14),
|
||||
},
|
||||
};
|
||||
|
||||
#define RK3399_PULL_GRF_OFFSET 0xe040
|
||||
#define RK3399_PULL_PMU_OFFSET 0x40
|
||||
|
||||
static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The bank0:16 and bank1:32 pins are located in PMU */
|
||||
if (bank->bank_num == 0 || bank->bank_num == 1) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RK3399_PULL_PMU_OFFSET;
|
||||
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_PULL_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RK3399_PULL_GRF_OFFSET;
|
||||
|
||||
/* correct the offset, as we're starting with the 3rd bank */
|
||||
*reg -= 0x20;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
|
||||
*bit = (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
int drv_num = (pin_num / 8);
|
||||
|
||||
/* The bank0:16 and bank1:32 pins are located in PMU */
|
||||
if (bank->bank_num == 0 || bank->bank_num == 1)
|
||||
*regmap = priv->regmap_pmu;
|
||||
else
|
||||
*regmap = priv->regmap_base;
|
||||
|
||||
*reg = bank->drv[drv_num].offset;
|
||||
if (bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO ||
|
||||
bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)
|
||||
*bit = (pin_num % 8) * 3;
|
||||
else
|
||||
*bit = (pin_num % 8) * 2;
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3399_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
DRV_TYPE_IO_1V8_ONLY,
|
||||
DRV_TYPE_IO_1V8_ONLY,
|
||||
DRV_TYPE_IO_DEFAULT,
|
||||
DRV_TYPE_IO_DEFAULT,
|
||||
0x80,
|
||||
0x88,
|
||||
-1,
|
||||
-1,
|
||||
PULL_TYPE_IO_1V8_ONLY,
|
||||
PULL_TYPE_IO_1V8_ONLY,
|
||||
PULL_TYPE_IO_DEFAULT,
|
||||
PULL_TYPE_IO_DEFAULT
|
||||
),
|
||||
PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
0xa0,
|
||||
0xa8,
|
||||
0xb0,
|
||||
0xb8
|
||||
),
|
||||
PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_ONLY,
|
||||
DRV_TYPE_IO_1V8_ONLY,
|
||||
PULL_TYPE_IO_DEFAULT,
|
||||
PULL_TYPE_IO_DEFAULT,
|
||||
PULL_TYPE_IO_1V8_ONLY,
|
||||
PULL_TYPE_IO_1V8_ONLY
|
||||
),
|
||||
PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
|
||||
DRV_TYPE_IO_3V3_ONLY,
|
||||
DRV_TYPE_IO_3V3_ONLY,
|
||||
DRV_TYPE_IO_1V8_OR_3V0
|
||||
),
|
||||
PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_3V0_AUTO,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_OR_3V0
|
||||
),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
|
||||
.pin_banks = rk3399_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3399_pin_banks),
|
||||
.label = "RK3399-GPIO",
|
||||
.type = RK3399,
|
||||
.grf_mux_offset = 0xe000,
|
||||
.pmu_mux_offset = 0x0,
|
||||
.grf_drv_offset = 0xe100,
|
||||
.pmu_drv_offset = 0x80,
|
||||
.iomux_routes = rk3399_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3399_mux_route_data),
|
||||
.pull_calc_reg = rk3399_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3399_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rk3399_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rk3399-pinctrl",
|
||||
.data = (ulong)&rk3399_pin_ctrl
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3399) = {
|
||||
.name = "rockchip_rk3399_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3399_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
788
drivers/pinctrl/rockchip/pinctrl-rockchip-core.c
Normal file
788
drivers/pinctrl/rockchip/pinctrl-rockchip-core.c
Normal file
@ -0,0 +1,788 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
#include <fdtdec.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
#define MAX_ROCKCHIP_PINS_ENTRIES 30
|
||||
#define MAX_ROCKCHIP_GPIO_PER_BANK 32
|
||||
#define RK_FUNC_GPIO 0
|
||||
|
||||
static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
|
||||
if (bank >= ctrl->nr_banks) {
|
||||
debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
|
||||
debug("pin conf pin %d >= %d\n", pin,
|
||||
MAX_ROCKCHIP_GPIO_PER_BANK);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
|
||||
int *reg, u8 *bit, int *mask)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
struct rockchip_mux_recalced_data *data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ctrl->niomux_recalced; i++) {
|
||||
data = &ctrl->iomux_recalced[i];
|
||||
if (data->num == bank->bank_num &&
|
||||
data->pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= ctrl->niomux_recalced)
|
||||
return;
|
||||
|
||||
*reg = data->reg;
|
||||
*mask = data->mask;
|
||||
*bit = data->bit;
|
||||
}
|
||||
|
||||
static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
|
||||
int mux, u32 *reg, u32 *value)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
struct rockchip_mux_route_data *data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ctrl->niomux_routes; i++) {
|
||||
data = &ctrl->iomux_routes[i];
|
||||
if (data->bank_num == bank->bank_num &&
|
||||
data->pin == pin && data->func == mux)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= ctrl->niomux_routes)
|
||||
return false;
|
||||
|
||||
*reg = data->route_offset;
|
||||
*value = data->route_val;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int rockchip_get_mux_data(int mux_type, int pin, u8 *bit, int *mask)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
if (mux_type & IOMUX_WIDTH_4BIT) {
|
||||
if ((pin % 8) >= 4)
|
||||
offset = 0x4;
|
||||
*bit = (pin % 4) * 4;
|
||||
*mask = 0xf;
|
||||
} else if (mux_type & IOMUX_WIDTH_3BIT) {
|
||||
/*
|
||||
* pin0 ~ pin4 are at first register, and
|
||||
* pin5 ~ pin7 are at second register.
|
||||
*/
|
||||
if ((pin % 8) >= 5)
|
||||
offset = 0x4;
|
||||
*bit = (pin % 8 % 5) * 3;
|
||||
*mask = 0x7;
|
||||
} else {
|
||||
*bit = (pin % 8) * 2;
|
||||
*mask = 0x3;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
int iomux_num = (pin / 8);
|
||||
struct regmap *regmap;
|
||||
unsigned int val;
|
||||
int reg, ret, mask, mux_type;
|
||||
u8 bit;
|
||||
|
||||
if (iomux_num > 3)
|
||||
return -EINVAL;
|
||||
|
||||
if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
|
||||
debug("pin %d is unrouted\n", pin);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
|
||||
return RK_FUNC_GPIO;
|
||||
|
||||
regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
|
||||
? priv->regmap_pmu : priv->regmap_base;
|
||||
|
||||
/* get basic quadrupel of mux registers and the correct reg inside */
|
||||
mux_type = bank->iomux[iomux_num].type;
|
||||
reg = bank->iomux[iomux_num].offset;
|
||||
reg += rockchip_get_mux_data(mux_type, pin, &bit, &mask);
|
||||
|
||||
if (bank->recalced_mask & BIT(pin))
|
||||
rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask);
|
||||
|
||||
ret = regmap_read(regmap, reg, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ((val >> bit) & mask);
|
||||
}
|
||||
|
||||
static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
|
||||
int index)
|
||||
{ struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
|
||||
return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
|
||||
}
|
||||
|
||||
static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
|
||||
int pin, int mux)
|
||||
{
|
||||
int iomux_num = (pin / 8);
|
||||
|
||||
if (iomux_num > 3)
|
||||
return -EINVAL;
|
||||
|
||||
if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
|
||||
debug("pin %d is unrouted\n", pin);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
|
||||
if (mux != IOMUX_GPIO_ONLY) {
|
||||
debug("pin %d only supports a gpio mux\n", pin);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a new mux function for a pin.
|
||||
*
|
||||
* The register is divided into the upper and lower 16 bit. When changing
|
||||
* a value, the previous register value is not read and changed. Instead
|
||||
* it seems the changed bits are marked in the upper 16 bit, while the
|
||||
* changed value gets set in the same offset in the lower 16 bit.
|
||||
* All pin settings seem to be 2 bit wide in both the upper and lower
|
||||
* parts.
|
||||
* @bank: pin bank to change
|
||||
* @pin: pin to change
|
||||
* @mux: new mux function to set
|
||||
*/
|
||||
static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
int iomux_num = (pin / 8);
|
||||
struct regmap *regmap;
|
||||
int reg, ret, mask, mux_type;
|
||||
u8 bit;
|
||||
u32 data, route_reg, route_val;
|
||||
|
||||
ret = rockchip_verify_mux(bank, pin, mux);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
|
||||
return 0;
|
||||
|
||||
debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
|
||||
|
||||
regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
|
||||
? priv->regmap_pmu : priv->regmap_base;
|
||||
|
||||
/* get basic quadrupel of mux registers and the correct reg inside */
|
||||
mux_type = bank->iomux[iomux_num].type;
|
||||
reg = bank->iomux[iomux_num].offset;
|
||||
reg += rockchip_get_mux_data(mux_type, pin, &bit, &mask);
|
||||
|
||||
if (bank->recalced_mask & BIT(pin))
|
||||
rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask);
|
||||
|
||||
if (bank->route_mask & BIT(pin)) {
|
||||
if (rockchip_get_mux_route(bank, pin, mux, &route_reg,
|
||||
&route_val)) {
|
||||
ret = regmap_write(regmap, route_reg, route_val);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
data = (mask << (bit + 16));
|
||||
data |= (mux & mask) << bit;
|
||||
ret = regmap_write(regmap, reg, data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
|
||||
{ 2, 4, 8, 12, -1, -1, -1, -1 },
|
||||
{ 3, 6, 9, 12, -1, -1, -1, -1 },
|
||||
{ 5, 10, 15, 20, -1, -1, -1, -1 },
|
||||
{ 4, 6, 8, 10, 12, 14, 16, 18 },
|
||||
{ 4, 7, 10, 13, 16, 19, 22, 26 }
|
||||
};
|
||||
|
||||
static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
|
||||
int pin_num, int strength)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
struct regmap *regmap;
|
||||
int reg, ret, i;
|
||||
u32 data, rmask_bits, temp;
|
||||
u8 bit;
|
||||
int drv_type = bank->drv[pin_num / 8].drv_type;
|
||||
|
||||
debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
|
||||
pin_num, strength);
|
||||
|
||||
ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit);
|
||||
|
||||
ret = -EINVAL;
|
||||
for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
|
||||
if (rockchip_perpin_drv_list[drv_type][i] == strength) {
|
||||
ret = i;
|
||||
break;
|
||||
} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
|
||||
ret = rockchip_perpin_drv_list[drv_type][i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
debug("unsupported driver strength %d\n", strength);
|
||||
return ret;
|
||||
}
|
||||
|
||||
switch (drv_type) {
|
||||
case DRV_TYPE_IO_1V8_3V0_AUTO:
|
||||
case DRV_TYPE_IO_3V3_ONLY:
|
||||
rmask_bits = ROCKCHIP_DRV_3BITS_PER_PIN;
|
||||
switch (bit) {
|
||||
case 0 ... 12:
|
||||
/* regular case, nothing to do */
|
||||
break;
|
||||
case 15:
|
||||
/*
|
||||
* drive-strength offset is special, as it is spread
|
||||
* over 2 registers, the bit data[15] contains bit 0
|
||||
* of the value while temp[1:0] contains bits 2 and 1
|
||||
*/
|
||||
data = (ret & 0x1) << 15;
|
||||
temp = (ret >> 0x1) & 0x3;
|
||||
|
||||
data |= BIT(31);
|
||||
ret = regmap_write(regmap, reg, data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
temp |= (0x3 << 16);
|
||||
reg += 0x4;
|
||||
ret = regmap_write(regmap, reg, temp);
|
||||
|
||||
return ret;
|
||||
case 18 ... 21:
|
||||
/* setting fully enclosed in the second register */
|
||||
reg += 4;
|
||||
bit -= 16;
|
||||
break;
|
||||
default:
|
||||
debug("unsupported bit: %d for pinctrl drive type: %d\n",
|
||||
bit, drv_type);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case DRV_TYPE_IO_DEFAULT:
|
||||
case DRV_TYPE_IO_1V8_OR_3V0:
|
||||
case DRV_TYPE_IO_1V8_ONLY:
|
||||
rmask_bits = ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
break;
|
||||
default:
|
||||
debug("unsupported pinctrl drive type: %d\n",
|
||||
drv_type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* enable the write to the equivalent lower bits */
|
||||
data = ((1 << rmask_bits) - 1) << (bit + 16);
|
||||
data |= (ret << bit);
|
||||
|
||||
ret = regmap_write(regmap, reg, data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
|
||||
{
|
||||
PIN_CONFIG_BIAS_DISABLE,
|
||||
PIN_CONFIG_BIAS_PULL_UP,
|
||||
PIN_CONFIG_BIAS_PULL_DOWN,
|
||||
PIN_CONFIG_BIAS_BUS_HOLD
|
||||
},
|
||||
{
|
||||
PIN_CONFIG_BIAS_DISABLE,
|
||||
PIN_CONFIG_BIAS_PULL_DOWN,
|
||||
PIN_CONFIG_BIAS_DISABLE,
|
||||
PIN_CONFIG_BIAS_PULL_UP
|
||||
},
|
||||
};
|
||||
|
||||
static int rockchip_set_pull(struct rockchip_pin_bank *bank,
|
||||
int pin_num, int pull)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
struct regmap *regmap;
|
||||
int reg, ret, i, pull_type;
|
||||
u8 bit;
|
||||
u32 data;
|
||||
|
||||
debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
|
||||
pin_num, pull);
|
||||
|
||||
ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit);
|
||||
|
||||
switch (ctrl->type) {
|
||||
case RK3036:
|
||||
case RK3128:
|
||||
data = BIT(bit + 16);
|
||||
if (pull == PIN_CONFIG_BIAS_DISABLE)
|
||||
data |= BIT(bit);
|
||||
ret = regmap_write(regmap, reg, data);
|
||||
break;
|
||||
case RV1108:
|
||||
case RK3188:
|
||||
case RK3288:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
pull_type = bank->pull_type[pin_num / 8];
|
||||
ret = -EINVAL;
|
||||
for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
|
||||
i++) {
|
||||
if (rockchip_pull_list[pull_type][i] == pull) {
|
||||
ret = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
debug("unsupported pull setting %d\n", pull);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* enable the write to the equivalent lower bits */
|
||||
data = ((1 << ROCKCHIP_PULL_BITS_PER_PIN) - 1) << (bit + 16);
|
||||
data |= (ret << bit);
|
||||
|
||||
ret = regmap_write(regmap, reg, data);
|
||||
break;
|
||||
default:
|
||||
debug("unsupported pinctrl type\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
|
||||
int pin_num, int enable)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
struct regmap *regmap;
|
||||
int reg, ret;
|
||||
u8 bit;
|
||||
u32 data;
|
||||
|
||||
debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
|
||||
pin_num, enable);
|
||||
|
||||
ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* enable the write to the equivalent lower bits */
|
||||
data = BIT(bit + 16) | (enable << bit);
|
||||
|
||||
return regmap_write(regmap, reg, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pinconf_ops handling
|
||||
*/
|
||||
static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
|
||||
unsigned int pull)
|
||||
{
|
||||
switch (ctrl->type) {
|
||||
case RK3036:
|
||||
case RK3128:
|
||||
return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
|
||||
pull == PIN_CONFIG_BIAS_DISABLE);
|
||||
case RV1108:
|
||||
case RK3188:
|
||||
case RK3288:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* set the pin config settings for a specified pin */
|
||||
static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
|
||||
u32 pin, u32 param, u32 arg)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
int rc;
|
||||
|
||||
switch (param) {
|
||||
case PIN_CONFIG_BIAS_DISABLE:
|
||||
rc = rockchip_set_pull(bank, pin, param);
|
||||
if (rc)
|
||||
return rc;
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
|
||||
case PIN_CONFIG_BIAS_BUS_HOLD:
|
||||
if (!rockchip_pinconf_pull_valid(ctrl, param))
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (!arg)
|
||||
return -EINVAL;
|
||||
|
||||
rc = rockchip_set_pull(bank, pin, param);
|
||||
if (rc)
|
||||
return rc;
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_DRIVE_STRENGTH:
|
||||
if (!ctrl->drv_calc_reg)
|
||||
return -ENOTSUPP;
|
||||
|
||||
rc = rockchip_set_drive_perpin(bank, pin, arg);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
|
||||
if (!ctrl->schmitt_calc_reg)
|
||||
return -ENOTSUPP;
|
||||
|
||||
rc = rockchip_set_schmitt(bank, pin, arg);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pinconf_param rockchip_conf_params[] = {
|
||||
{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
|
||||
{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
|
||||
{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
|
||||
{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
|
||||
{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
|
||||
{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
|
||||
{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
|
||||
{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
|
||||
{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
|
||||
};
|
||||
|
||||
static int rockchip_pinconf_prop_name_to_param(const char *property,
|
||||
u32 *default_value)
|
||||
{
|
||||
const struct pinconf_param *p, *end;
|
||||
|
||||
p = rockchip_conf_params;
|
||||
end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
|
||||
|
||||
/* See if this pctldev supports this parameter */
|
||||
for (; p < end; p++) {
|
||||
if (!strcmp(property, p->property)) {
|
||||
*default_value = p->default_value;
|
||||
return p->param;
|
||||
}
|
||||
}
|
||||
|
||||
*default_value = 0;
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
static int rockchip_pinctrl_set_state(struct udevice *dev,
|
||||
struct udevice *config)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
struct rockchip_pin_ctrl *ctrl = priv->ctrl;
|
||||
u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
|
||||
u32 bank, pin, mux, conf, arg, default_val;
|
||||
int ret, count, i;
|
||||
const char *prop_name;
|
||||
const void *value;
|
||||
int prop_len, param;
|
||||
const u32 *data;
|
||||
ofnode node;
|
||||
#ifdef CONFIG_OF_LIVE
|
||||
const struct device_node *np;
|
||||
struct property *pp;
|
||||
#else
|
||||
int property_offset, pcfg_node;
|
||||
const void *blob = gd->fdt_blob;
|
||||
#endif
|
||||
data = dev_read_prop(config, "rockchip,pins", &count);
|
||||
if (count < 0) {
|
||||
debug("%s: bad array size %d\n", __func__, count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
count /= sizeof(u32);
|
||||
if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
|
||||
debug("%s: unsupported pins array count %d\n",
|
||||
__func__, count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
cells[i] = fdt32_to_cpu(data[i]);
|
||||
|
||||
for (i = 0; i < (count >> 2); i++) {
|
||||
bank = cells[4 * i + 0];
|
||||
pin = cells[4 * i + 1];
|
||||
mux = cells[4 * i + 2];
|
||||
conf = cells[4 * i + 3];
|
||||
|
||||
ret = rockchip_verify_config(dev, bank, pin);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
node = ofnode_get_by_phandle(conf);
|
||||
if (!ofnode_valid(node))
|
||||
return -ENODEV;
|
||||
#ifdef CONFIG_OF_LIVE
|
||||
np = ofnode_to_np(node);
|
||||
for (pp = np->properties; pp; pp = pp->next) {
|
||||
prop_name = pp->name;
|
||||
prop_len = pp->length;
|
||||
value = pp->value;
|
||||
#else
|
||||
pcfg_node = ofnode_to_offset(node);
|
||||
fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
|
||||
value = fdt_getprop_by_offset(blob, property_offset,
|
||||
&prop_name, &prop_len);
|
||||
if (!value)
|
||||
return -ENOENT;
|
||||
#endif
|
||||
param = rockchip_pinconf_prop_name_to_param(prop_name,
|
||||
&default_val);
|
||||
if (param < 0)
|
||||
break;
|
||||
|
||||
if (prop_len >= sizeof(fdt32_t))
|
||||
arg = fdt32_to_cpu(*(fdt32_t *)value);
|
||||
else
|
||||
arg = default_val;
|
||||
|
||||
ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
|
||||
param, arg);
|
||||
if (ret) {
|
||||
debug("%s: rockchip_pinconf_set fail: %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct pinctrl_ops rockchip_pinctrl_ops = {
|
||||
.set_state = rockchip_pinctrl_set_state,
|
||||
.get_gpio_mux = rockchip_pinctrl_get_gpio_mux,
|
||||
};
|
||||
|
||||
/* retrieve the soc specific data */
|
||||
static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct udevice *dev)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
struct rockchip_pin_ctrl *ctrl =
|
||||
(struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
|
||||
struct rockchip_pin_bank *bank;
|
||||
int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
|
||||
|
||||
grf_offs = ctrl->grf_mux_offset;
|
||||
pmu_offs = ctrl->pmu_mux_offset;
|
||||
drv_pmu_offs = ctrl->pmu_drv_offset;
|
||||
drv_grf_offs = ctrl->grf_drv_offset;
|
||||
bank = ctrl->pin_banks;
|
||||
|
||||
for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
|
||||
int bank_pins = 0;
|
||||
|
||||
bank->priv = priv;
|
||||
bank->pin_base = ctrl->nr_pins;
|
||||
ctrl->nr_pins += bank->nr_pins;
|
||||
|
||||
/* calculate iomux and drv offsets */
|
||||
for (j = 0; j < 4; j++) {
|
||||
struct rockchip_iomux *iom = &bank->iomux[j];
|
||||
struct rockchip_drv *drv = &bank->drv[j];
|
||||
int inc;
|
||||
|
||||
if (bank_pins >= bank->nr_pins)
|
||||
break;
|
||||
|
||||
/* preset iomux offset value, set new start value */
|
||||
if (iom->offset >= 0) {
|
||||
if (iom->type & IOMUX_SOURCE_PMU)
|
||||
pmu_offs = iom->offset;
|
||||
else
|
||||
grf_offs = iom->offset;
|
||||
} else { /* set current iomux offset */
|
||||
iom->offset = (iom->type & IOMUX_SOURCE_PMU) ?
|
||||
pmu_offs : grf_offs;
|
||||
}
|
||||
|
||||
/* preset drv offset value, set new start value */
|
||||
if (drv->offset >= 0) {
|
||||
if (iom->type & IOMUX_SOURCE_PMU)
|
||||
drv_pmu_offs = drv->offset;
|
||||
else
|
||||
drv_grf_offs = drv->offset;
|
||||
} else { /* set current drv offset */
|
||||
drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
|
||||
drv_pmu_offs : drv_grf_offs;
|
||||
}
|
||||
|
||||
debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
|
||||
i, j, iom->offset, drv->offset);
|
||||
|
||||
/*
|
||||
* Increase offset according to iomux width.
|
||||
* 4bit iomux'es are spread over two registers.
|
||||
*/
|
||||
inc = (iom->type & (IOMUX_WIDTH_4BIT |
|
||||
IOMUX_WIDTH_3BIT)) ? 8 : 4;
|
||||
if (iom->type & IOMUX_SOURCE_PMU)
|
||||
pmu_offs += inc;
|
||||
else
|
||||
grf_offs += inc;
|
||||
|
||||
/*
|
||||
* Increase offset according to drv width.
|
||||
* 3bit drive-strenth'es are spread over two registers.
|
||||
*/
|
||||
if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
|
||||
(drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
|
||||
inc = 8;
|
||||
else
|
||||
inc = 4;
|
||||
|
||||
if (iom->type & IOMUX_SOURCE_PMU)
|
||||
drv_pmu_offs += inc;
|
||||
else
|
||||
drv_grf_offs += inc;
|
||||
|
||||
bank_pins += 8;
|
||||
}
|
||||
|
||||
/* calculate the per-bank recalced_mask */
|
||||
for (j = 0; j < ctrl->niomux_recalced; j++) {
|
||||
int pin = 0;
|
||||
|
||||
if (ctrl->iomux_recalced[j].num == bank->bank_num) {
|
||||
pin = ctrl->iomux_recalced[j].pin;
|
||||
bank->recalced_mask |= BIT(pin);
|
||||
}
|
||||
}
|
||||
|
||||
/* calculate the per-bank route_mask */
|
||||
for (j = 0; j < ctrl->niomux_routes; j++) {
|
||||
int pin = 0;
|
||||
|
||||
if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
|
||||
pin = ctrl->iomux_routes[j].pin;
|
||||
bank->route_mask |= BIT(pin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
int rockchip_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
struct rockchip_pin_ctrl *ctrl;
|
||||
struct udevice *syscon;
|
||||
struct regmap *regmap;
|
||||
int ret = 0;
|
||||
|
||||
/* get rockchip grf syscon phandle */
|
||||
ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
|
||||
&syscon);
|
||||
if (ret) {
|
||||
debug("unable to find rockchip,grf syscon device (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* get grf-reg base address */
|
||||
regmap = syscon_get_regmap(syscon);
|
||||
if (!regmap) {
|
||||
debug("unable to find rockchip grf regmap\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
priv->regmap_base = regmap;
|
||||
|
||||
/* option: get pmu-reg base address */
|
||||
ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
|
||||
&syscon);
|
||||
if (!ret) {
|
||||
/* get pmugrf-reg base address */
|
||||
regmap = syscon_get_regmap(syscon);
|
||||
if (!regmap) {
|
||||
debug("unable to find rockchip pmu regmap\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
priv->regmap_pmu = regmap;
|
||||
}
|
||||
|
||||
ctrl = rockchip_pinctrl_get_soc_data(dev);
|
||||
if (!ctrl) {
|
||||
debug("driver data not available\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
priv->ctrl = ctrl;
|
||||
return 0;
|
||||
}
|
302
drivers/pinctrl/rockchip/pinctrl-rockchip.h
Normal file
302
drivers/pinctrl/rockchip/pinctrl-rockchip.h
Normal file
@ -0,0 +1,302 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#ifndef __DRIVERS_PINCTRL_ROCKCHIP_H
|
||||
#define __DRIVERS_PINCTRL_ROCKCHIP_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
enum rockchip_pinctrl_type {
|
||||
RV1108,
|
||||
RK3036,
|
||||
RK3128,
|
||||
RK3188,
|
||||
RK3288,
|
||||
RK3368,
|
||||
RK3399,
|
||||
};
|
||||
|
||||
/**
|
||||
* Encode variants of iomux registers into a type variable
|
||||
*/
|
||||
#define IOMUX_GPIO_ONLY BIT(0)
|
||||
#define IOMUX_WIDTH_4BIT BIT(1)
|
||||
#define IOMUX_SOURCE_PMU BIT(2)
|
||||
#define IOMUX_UNROUTED BIT(3)
|
||||
#define IOMUX_WIDTH_3BIT BIT(4)
|
||||
|
||||
/**
|
||||
* Defined some common pins constants
|
||||
*/
|
||||
#define ROCKCHIP_PULL_BITS_PER_PIN 2
|
||||
#define ROCKCHIP_PULL_PINS_PER_REG 8
|
||||
#define ROCKCHIP_PULL_BANK_STRIDE 16
|
||||
#define ROCKCHIP_DRV_BITS_PER_PIN 2
|
||||
#define ROCKCHIP_DRV_PINS_PER_REG 8
|
||||
#define ROCKCHIP_DRV_BANK_STRIDE 16
|
||||
#define ROCKCHIP_DRV_3BITS_PER_PIN 3
|
||||
|
||||
/**
|
||||
* @type: iomux variant using IOMUX_* constants
|
||||
* @offset: if initialized to -1 it will be autocalculated, by specifying
|
||||
* an initial offset value the relevant source offset can be reset
|
||||
* to a new value for autocalculating the following iomux registers.
|
||||
*/
|
||||
struct rockchip_iomux {
|
||||
int type;
|
||||
int offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum type index corresponding to rockchip_perpin_drv_list arrays index.
|
||||
*/
|
||||
enum rockchip_pin_drv_type {
|
||||
DRV_TYPE_IO_DEFAULT = 0,
|
||||
DRV_TYPE_IO_1V8_OR_3V0,
|
||||
DRV_TYPE_IO_1V8_ONLY,
|
||||
DRV_TYPE_IO_1V8_3V0_AUTO,
|
||||
DRV_TYPE_IO_3V3_ONLY,
|
||||
DRV_TYPE_MAX
|
||||
};
|
||||
|
||||
/**
|
||||
* enum type index corresponding to rockchip_pull_list arrays index.
|
||||
*/
|
||||
enum rockchip_pin_pull_type {
|
||||
PULL_TYPE_IO_DEFAULT = 0,
|
||||
PULL_TYPE_IO_1V8_ONLY,
|
||||
PULL_TYPE_MAX
|
||||
};
|
||||
|
||||
/**
|
||||
* @drv_type: drive strength variant using rockchip_perpin_drv_type
|
||||
* @offset: if initialized to -1 it will be autocalculated, by specifying
|
||||
* an initial offset value the relevant source offset can be reset
|
||||
* to a new value for autocalculating the following drive strength
|
||||
* registers. if used chips own cal_drv func instead to calculate
|
||||
* registers offset, the variant could be ignored.
|
||||
*/
|
||||
struct rockchip_drv {
|
||||
enum rockchip_pin_drv_type drv_type;
|
||||
int offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* @priv: common pinctrl private basedata
|
||||
* @pin_base: first pin number
|
||||
* @nr_pins: number of pins in this bank
|
||||
* @name: name of the bank
|
||||
* @bank_num: number of the bank, to account for holes
|
||||
* @iomux: array describing the 4 iomux sources of the bank
|
||||
* @drv: array describing the 4 drive strength sources of the bank
|
||||
* @pull_type: array describing the 4 pull type sources of the bank
|
||||
* @recalced_mask: bits describing the mux recalced pins of per bank
|
||||
* @route_mask: bits describing the routing pins of per bank
|
||||
*/
|
||||
struct rockchip_pin_bank {
|
||||
struct rockchip_pinctrl_priv *priv;
|
||||
u32 pin_base;
|
||||
u8 nr_pins;
|
||||
char *name;
|
||||
u8 bank_num;
|
||||
struct rockchip_iomux iomux[4];
|
||||
struct rockchip_drv drv[4];
|
||||
enum rockchip_pin_pull_type pull_type[4];
|
||||
u32 recalced_mask;
|
||||
u32 route_mask;
|
||||
};
|
||||
|
||||
#define PIN_BANK(id, pins, label) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = -1 }, \
|
||||
{ .type = iom1, .offset = -1 }, \
|
||||
{ .type = iom2, .offset = -1 }, \
|
||||
{ .type = iom3, .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
}, \
|
||||
.drv = { \
|
||||
{ .drv_type = type0, .offset = -1 }, \
|
||||
{ .drv_type = type1, .offset = -1 }, \
|
||||
{ .drv_type = type2, .offset = -1 }, \
|
||||
{ .drv_type = type3, .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \
|
||||
drv2, drv3, pull0, pull1, \
|
||||
pull2, pull3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
}, \
|
||||
.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_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \
|
||||
iom2, iom3, drv0, drv1, drv2, \
|
||||
drv3, offset0, offset1, \
|
||||
offset2, offset3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = -1 }, \
|
||||
{ .type = iom1, .offset = -1 }, \
|
||||
{ .type = iom2, .offset = -1 }, \
|
||||
{ .type = iom3, .offset = -1 }, \
|
||||
}, \
|
||||
.drv = { \
|
||||
{ .drv_type = drv0, .offset = offset0 }, \
|
||||
{ .drv_type = drv1, .offset = offset1 }, \
|
||||
{ .drv_type = drv2, .offset = offset2 }, \
|
||||
{ .drv_type = drv3, .offset = offset3 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \
|
||||
label, iom0, iom1, iom2, \
|
||||
iom3, drv0, drv1, drv2, \
|
||||
drv3, offset0, offset1, \
|
||||
offset2, offset3, pull0, \
|
||||
pull1, pull2, pull3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = -1 }, \
|
||||
{ .type = iom1, .offset = -1 }, \
|
||||
{ .type = iom2, .offset = -1 }, \
|
||||
{ .type = iom3, .offset = -1 }, \
|
||||
}, \
|
||||
.drv = { \
|
||||
{ .drv_type = drv0, .offset = offset0 }, \
|
||||
{ .drv_type = drv1, .offset = offset1 }, \
|
||||
{ .drv_type = drv2, .offset = offset2 }, \
|
||||
{ .drv_type = drv3, .offset = offset3 }, \
|
||||
}, \
|
||||
.pull_type[0] = pull0, \
|
||||
.pull_type[1] = pull1, \
|
||||
.pull_type[2] = pull2, \
|
||||
.pull_type[3] = pull3, \
|
||||
}
|
||||
|
||||
/**
|
||||
* struct rockchip_mux_recalced_data: recalculate a pin iomux data.
|
||||
* @num: bank number.
|
||||
* @pin: pin number.
|
||||
* @reg: register offset.
|
||||
* @bit: index at register.
|
||||
* @mask: mask bit
|
||||
*/
|
||||
struct rockchip_mux_recalced_data {
|
||||
u8 num;
|
||||
u8 pin;
|
||||
u32 reg;
|
||||
u8 bit;
|
||||
u8 mask;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct rockchip_mux_route_data: route a pin iomux data.
|
||||
* @bank_num: bank number.
|
||||
* @pin: index at register or used to calc index.
|
||||
* @func: the min pin.
|
||||
* @route_offset: the max pin.
|
||||
* @route_val: the register offset.
|
||||
*/
|
||||
struct rockchip_mux_route_data {
|
||||
u8 bank_num;
|
||||
u8 pin;
|
||||
u8 func;
|
||||
u32 route_offset;
|
||||
u32 route_val;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct rockchip_pin_ctrl {
|
||||
struct rockchip_pin_bank *pin_banks;
|
||||
u32 nr_banks;
|
||||
u32 nr_pins;
|
||||
char *label;
|
||||
enum rockchip_pinctrl_type type;
|
||||
int grf_mux_offset;
|
||||
int pmu_mux_offset;
|
||||
int grf_drv_offset;
|
||||
int pmu_drv_offset;
|
||||
struct rockchip_mux_recalced_data *iomux_recalced;
|
||||
u32 niomux_recalced;
|
||||
struct rockchip_mux_route_data *iomux_routes;
|
||||
u32 niomux_routes;
|
||||
|
||||
void (*pull_calc_reg)(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit);
|
||||
void (*drv_calc_reg)(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit);
|
||||
int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit);
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct rockchip_pinctrl_priv {
|
||||
struct rockchip_pin_ctrl *ctrl;
|
||||
struct regmap *regmap_base;
|
||||
struct regmap *regmap_pmu;
|
||||
};
|
||||
|
||||
extern const struct pinctrl_ops rockchip_pinctrl_ops;
|
||||
int rockchip_pinctrl_probe(struct udevice *dev);
|
||||
|
||||
#endif /* __DRIVERS_PINCTRL_ROCKCHIP_H */
|
203
drivers/pinctrl/rockchip/pinctrl-rv1108.c
Normal file
203
drivers/pinctrl/rockchip/pinctrl-rv1108.c
Normal file
@ -0,0 +1,203 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2019 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <regmap.h>
|
||||
#include <syscon.h>
|
||||
|
||||
#include "pinctrl-rockchip.h"
|
||||
|
||||
static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
|
||||
{
|
||||
.num = 1,
|
||||
.pin = 0,
|
||||
.reg = 0x418,
|
||||
.bit = 0,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 1,
|
||||
.reg = 0x418,
|
||||
.bit = 2,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 2,
|
||||
.reg = 0x418,
|
||||
.bit = 4,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 3,
|
||||
.reg = 0x418,
|
||||
.bit = 6,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 4,
|
||||
.reg = 0x418,
|
||||
.bit = 8,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 5,
|
||||
.reg = 0x418,
|
||||
.bit = 10,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 6,
|
||||
.reg = 0x418,
|
||||
.bit = 12,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 7,
|
||||
.reg = 0x418,
|
||||
.bit = 14,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 8,
|
||||
.reg = 0x41c,
|
||||
.bit = 0,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
.num = 1,
|
||||
.pin = 9,
|
||||
.reg = 0x41c,
|
||||
.bit = 2,
|
||||
.mask = 0x3
|
||||
},
|
||||
};
|
||||
|
||||
#define RV1108_PULL_PMU_OFFSET 0x10
|
||||
#define RV1108_PULL_OFFSET 0x110
|
||||
|
||||
static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 24 pins of the first bank are located in PMU */
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RV1108_PULL_PMU_OFFSET;
|
||||
} else {
|
||||
*reg = RV1108_PULL_OFFSET;
|
||||
*regmap = priv->regmap_base;
|
||||
/* correct the offset, as we're starting with the 2nd bank */
|
||||
*reg -= 0x10;
|
||||
*reg += bank->bank_num * ROCKCHIP_PULL_BANK_STRIDE;
|
||||
}
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_PULL_PINS_PER_REG) * 4);
|
||||
*bit = (pin_num % ROCKCHIP_PULL_PINS_PER_REG);
|
||||
*bit *= ROCKCHIP_PULL_BITS_PER_PIN;
|
||||
}
|
||||
|
||||
#define RV1108_DRV_PMU_OFFSET 0x20
|
||||
#define RV1108_DRV_GRF_OFFSET 0x210
|
||||
|
||||
static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
|
||||
/* The first 24 pins of the first bank are located in PMU */
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RV1108_DRV_PMU_OFFSET;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RV1108_DRV_GRF_OFFSET;
|
||||
|
||||
/* correct the offset, as we're starting with the 2nd bank */
|
||||
*reg -= 0x10;
|
||||
*reg += bank->bank_num * ROCKCHIP_DRV_BANK_STRIDE;
|
||||
}
|
||||
|
||||
*reg += ((pin_num / ROCKCHIP_DRV_PINS_PER_REG) * 4);
|
||||
*bit = pin_num % ROCKCHIP_DRV_PINS_PER_REG;
|
||||
*bit *= ROCKCHIP_DRV_BITS_PER_PIN;
|
||||
}
|
||||
|
||||
#define RV1108_SCHMITT_PMU_OFFSET 0x30
|
||||
#define RV1108_SCHMITT_GRF_OFFSET 0x388
|
||||
#define RV1108_SCHMITT_BANK_STRIDE 8
|
||||
#define RV1108_SCHMITT_PINS_PER_GRF_REG 16
|
||||
#define RV1108_SCHMITT_PINS_PER_PMU_REG 8
|
||||
|
||||
static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
|
||||
int pin_num,
|
||||
struct regmap **regmap,
|
||||
int *reg, u8 *bit)
|
||||
{
|
||||
struct rockchip_pinctrl_priv *priv = bank->priv;
|
||||
int pins_per_reg;
|
||||
|
||||
if (bank->bank_num == 0) {
|
||||
*regmap = priv->regmap_pmu;
|
||||
*reg = RV1108_SCHMITT_PMU_OFFSET;
|
||||
pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
|
||||
} else {
|
||||
*regmap = priv->regmap_base;
|
||||
*reg = RV1108_SCHMITT_GRF_OFFSET;
|
||||
pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
|
||||
*reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE;
|
||||
}
|
||||
*reg += ((pin_num / pins_per_reg) * 4);
|
||||
*bit = pin_num % pins_per_reg;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rv1108_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU),
|
||||
PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
|
||||
};
|
||||
|
||||
static struct rockchip_pin_ctrl rv1108_pin_ctrl = {
|
||||
.pin_banks = rv1108_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rv1108_pin_banks),
|
||||
.label = "RV1108-GPIO",
|
||||
.type = RV1108,
|
||||
.grf_mux_offset = 0x10,
|
||||
.pmu_mux_offset = 0x0,
|
||||
.iomux_recalced = rv1108_mux_recalced_data,
|
||||
.niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data),
|
||||
.pull_calc_reg = rv1108_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rv1108_calc_drv_reg_and_bit,
|
||||
.schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct udevice_id rv1108_pinctrl_ids[] = {
|
||||
{
|
||||
.compatible = "rockchip,rv1108-pinctrl",
|
||||
.data = (ulong)&rv1108_pin_ctrl
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rv1108) = {
|
||||
.name = "pinctrl_rv1108",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rv1108_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
|
||||
.ops = &rockchip_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rockchip_pinctrl_probe,
|
||||
};
|
@ -1,671 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Pinctrl driver for Rockchip 3036 SoCs
|
||||
* (C) Copyright 2015 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk3036.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
/* GRF_GPIO0A_IOMUX */
|
||||
enum {
|
||||
GPIO0A3_SHIFT = 6,
|
||||
GPIO0A3_MASK = 1 << GPIO0A3_SHIFT,
|
||||
GPIO0A3_GPIO = 0,
|
||||
GPIO0A3_I2C1_SDA,
|
||||
|
||||
GPIO0A2_SHIFT = 4,
|
||||
GPIO0A2_MASK = 1 << GPIO0A2_SHIFT,
|
||||
GPIO0A2_GPIO = 0,
|
||||
GPIO0A2_I2C1_SCL,
|
||||
|
||||
GPIO0A1_SHIFT = 2,
|
||||
GPIO0A1_MASK = 3 << GPIO0A1_SHIFT,
|
||||
GPIO0A1_GPIO = 0,
|
||||
GPIO0A1_I2C0_SDA,
|
||||
GPIO0A1_PWM2,
|
||||
|
||||
GPIO0A0_SHIFT = 0,
|
||||
GPIO0A0_MASK = 3 << GPIO0A0_SHIFT,
|
||||
GPIO0A0_GPIO = 0,
|
||||
GPIO0A0_I2C0_SCL,
|
||||
GPIO0A0_PWM1,
|
||||
};
|
||||
|
||||
/* GRF_GPIO0B_IOMUX */
|
||||
enum {
|
||||
GPIO0B6_SHIFT = 12,
|
||||
GPIO0B6_MASK = 3 << GPIO0B6_SHIFT,
|
||||
GPIO0B6_GPIO = 0,
|
||||
GPIO0B6_MMC1_D3,
|
||||
GPIO0B6_I2S1_SCLK,
|
||||
|
||||
GPIO0B5_SHIFT = 10,
|
||||
GPIO0B5_MASK = 3 << GPIO0B5_SHIFT,
|
||||
GPIO0B5_GPIO = 0,
|
||||
GPIO0B5_MMC1_D2,
|
||||
GPIO0B5_I2S1_SDI,
|
||||
|
||||
GPIO0B4_SHIFT = 8,
|
||||
GPIO0B4_MASK = 3 << GPIO0B4_SHIFT,
|
||||
GPIO0B4_GPIO = 0,
|
||||
GPIO0B4_MMC1_D1,
|
||||
GPIO0B4_I2S1_LRCKTX,
|
||||
|
||||
GPIO0B3_SHIFT = 6,
|
||||
GPIO0B3_MASK = 3 << GPIO0B3_SHIFT,
|
||||
GPIO0B3_GPIO = 0,
|
||||
GPIO0B3_MMC1_D0,
|
||||
GPIO0B3_I2S1_LRCKRX,
|
||||
|
||||
GPIO0B1_SHIFT = 2,
|
||||
GPIO0B1_MASK = 3 << GPIO0B1_SHIFT,
|
||||
GPIO0B1_GPIO = 0,
|
||||
GPIO0B1_MMC1_CLKOUT,
|
||||
GPIO0B1_I2S1_MCLK,
|
||||
|
||||
GPIO0B0_SHIFT = 0,
|
||||
GPIO0B0_MASK = 3,
|
||||
GPIO0B0_GPIO = 0,
|
||||
GPIO0B0_MMC1_CMD,
|
||||
GPIO0B0_I2S1_SDO,
|
||||
};
|
||||
|
||||
/* GRF_GPIO0C_IOMUX */
|
||||
enum {
|
||||
GPIO0C4_SHIFT = 8,
|
||||
GPIO0C4_MASK = 1 << GPIO0C4_SHIFT,
|
||||
GPIO0C4_GPIO = 0,
|
||||
GPIO0C4_DRIVE_VBUS,
|
||||
|
||||
GPIO0C3_SHIFT = 6,
|
||||
GPIO0C3_MASK = 1 << GPIO0C3_SHIFT,
|
||||
GPIO0C3_GPIO = 0,
|
||||
GPIO0C3_UART0_CTSN,
|
||||
|
||||
GPIO0C2_SHIFT = 4,
|
||||
GPIO0C2_MASK = 1 << GPIO0C2_SHIFT,
|
||||
GPIO0C2_GPIO = 0,
|
||||
GPIO0C2_UART0_RTSN,
|
||||
|
||||
GPIO0C1_SHIFT = 2,
|
||||
GPIO0C1_MASK = 1 << GPIO0C1_SHIFT,
|
||||
GPIO0C1_GPIO = 0,
|
||||
GPIO0C1_UART0_SIN,
|
||||
|
||||
|
||||
GPIO0C0_SHIFT = 0,
|
||||
GPIO0C0_MASK = 1 << GPIO0C0_SHIFT,
|
||||
GPIO0C0_GPIO = 0,
|
||||
GPIO0C0_UART0_SOUT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO0D_IOMUX */
|
||||
enum {
|
||||
GPIO0D4_SHIFT = 8,
|
||||
GPIO0D4_MASK = 1 << GPIO0D4_SHIFT,
|
||||
GPIO0D4_GPIO = 0,
|
||||
GPIO0D4_SPDIF,
|
||||
|
||||
GPIO0D3_SHIFT = 6,
|
||||
GPIO0D3_MASK = 1 << GPIO0D3_SHIFT,
|
||||
GPIO0D3_GPIO = 0,
|
||||
GPIO0D3_PWM3,
|
||||
|
||||
GPIO0D2_SHIFT = 4,
|
||||
GPIO0D2_MASK = 1 << GPIO0D2_SHIFT,
|
||||
GPIO0D2_GPIO = 0,
|
||||
GPIO0D2_PWM0,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1A_IOMUX */
|
||||
enum {
|
||||
GPIO1A5_SHIFT = 10,
|
||||
GPIO1A5_MASK = 1 << GPIO1A5_SHIFT,
|
||||
GPIO1A5_GPIO = 0,
|
||||
GPIO1A5_I2S_SDI,
|
||||
|
||||
GPIO1A4_SHIFT = 8,
|
||||
GPIO1A4_MASK = 1 << GPIO1A4_SHIFT,
|
||||
GPIO1A4_GPIO = 0,
|
||||
GPIO1A4_I2S_SD0,
|
||||
|
||||
GPIO1A3_SHIFT = 6,
|
||||
GPIO1A3_MASK = 1 << GPIO1A3_SHIFT,
|
||||
GPIO1A3_GPIO = 0,
|
||||
GPIO1A3_I2S_LRCKTX,
|
||||
|
||||
GPIO1A2_SHIFT = 4,
|
||||
GPIO1A2_MASK = 3 << GPIO1A2_SHIFT,
|
||||
GPIO1A2_GPIO = 0,
|
||||
GPIO1A2_I2S_LRCKRX,
|
||||
GPIO1A2_PWM1_0,
|
||||
|
||||
GPIO1A1_SHIFT = 2,
|
||||
GPIO1A1_MASK = 1 << GPIO1A1_SHIFT,
|
||||
GPIO1A1_GPIO = 0,
|
||||
GPIO1A1_I2S_SCLK,
|
||||
|
||||
GPIO1A0_SHIFT = 0,
|
||||
GPIO1A0_MASK = 1 << GPIO1A0_SHIFT,
|
||||
GPIO1A0_GPIO = 0,
|
||||
GPIO1A0_I2S_MCLK,
|
||||
|
||||
};
|
||||
|
||||
/* GRF_GPIO1B_IOMUX */
|
||||
enum {
|
||||
GPIO1B7_SHIFT = 14,
|
||||
GPIO1B7_MASK = 1 << GPIO1B7_SHIFT,
|
||||
GPIO1B7_GPIO = 0,
|
||||
GPIO1B7_MMC0_CMD,
|
||||
|
||||
GPIO1B3_SHIFT = 6,
|
||||
GPIO1B3_MASK = 1 << GPIO1B3_SHIFT,
|
||||
GPIO1B3_GPIO = 0,
|
||||
GPIO1B3_HDMI_HPD,
|
||||
|
||||
GPIO1B2_SHIFT = 4,
|
||||
GPIO1B2_MASK = 1 << GPIO1B2_SHIFT,
|
||||
GPIO1B2_GPIO = 0,
|
||||
GPIO1B2_HDMI_SCL,
|
||||
|
||||
GPIO1B1_SHIFT = 2,
|
||||
GPIO1B1_MASK = 1 << GPIO1B1_SHIFT,
|
||||
GPIO1B1_GPIO = 0,
|
||||
GPIO1B1_HDMI_SDA,
|
||||
|
||||
GPIO1B0_SHIFT = 0,
|
||||
GPIO1B0_MASK = 1 << GPIO1B0_SHIFT,
|
||||
GPIO1B0_GPIO = 0,
|
||||
GPIO1B0_HDMI_CEC,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1C_IOMUX */
|
||||
enum {
|
||||
GPIO1C5_SHIFT = 10,
|
||||
GPIO1C5_MASK = 3 << GPIO1C5_SHIFT,
|
||||
GPIO1C5_GPIO = 0,
|
||||
GPIO1C5_MMC0_D3,
|
||||
GPIO1C5_JTAG_TMS,
|
||||
|
||||
GPIO1C4_SHIFT = 8,
|
||||
GPIO1C4_MASK = 3 << GPIO1C4_SHIFT,
|
||||
GPIO1C4_GPIO = 0,
|
||||
GPIO1C4_MMC0_D2,
|
||||
GPIO1C4_JTAG_TCK,
|
||||
|
||||
GPIO1C3_SHIFT = 6,
|
||||
GPIO1C3_MASK = 3 << GPIO1C3_SHIFT,
|
||||
GPIO1C3_GPIO = 0,
|
||||
GPIO1C3_MMC0_D1,
|
||||
GPIO1C3_UART2_SOUT,
|
||||
|
||||
GPIO1C2_SHIFT = 4,
|
||||
GPIO1C2_MASK = 3 << GPIO1C2_SHIFT ,
|
||||
GPIO1C2_GPIO = 0,
|
||||
GPIO1C2_MMC0_D0,
|
||||
GPIO1C2_UART2_SIN,
|
||||
|
||||
GPIO1C1_SHIFT = 2,
|
||||
GPIO1C1_MASK = 1 << GPIO1C1_SHIFT,
|
||||
GPIO1C1_GPIO = 0,
|
||||
GPIO1C1_MMC0_DETN,
|
||||
|
||||
GPIO1C0_SHIFT = 0,
|
||||
GPIO1C0_MASK = 1 << GPIO1C0_SHIFT,
|
||||
GPIO1C0_GPIO = 0,
|
||||
GPIO1C0_MMC0_CLKOUT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1D_IOMUX */
|
||||
enum {
|
||||
GPIO1D7_SHIFT = 14,
|
||||
GPIO1D7_MASK = 3 << GPIO1D7_SHIFT,
|
||||
GPIO1D7_GPIO = 0,
|
||||
GPIO1D7_NAND_D7,
|
||||
GPIO1D7_EMMC_D7,
|
||||
GPIO1D7_SPI_CSN1,
|
||||
|
||||
GPIO1D6_SHIFT = 12,
|
||||
GPIO1D6_MASK = 3 << GPIO1D6_SHIFT,
|
||||
GPIO1D6_GPIO = 0,
|
||||
GPIO1D6_NAND_D6,
|
||||
GPIO1D6_EMMC_D6,
|
||||
GPIO1D6_SPI_CSN0,
|
||||
|
||||
GPIO1D5_SHIFT = 10,
|
||||
GPIO1D5_MASK = 3 << GPIO1D5_SHIFT,
|
||||
GPIO1D5_GPIO = 0,
|
||||
GPIO1D5_NAND_D5,
|
||||
GPIO1D5_EMMC_D5,
|
||||
GPIO1D5_SPI_TXD,
|
||||
|
||||
GPIO1D4_SHIFT = 8,
|
||||
GPIO1D4_MASK = 3 << GPIO1D4_SHIFT,
|
||||
GPIO1D4_GPIO = 0,
|
||||
GPIO1D4_NAND_D4,
|
||||
GPIO1D4_EMMC_D4,
|
||||
GPIO1D4_SPI_RXD,
|
||||
|
||||
GPIO1D3_SHIFT = 6,
|
||||
GPIO1D3_MASK = 3 << GPIO1D3_SHIFT,
|
||||
GPIO1D3_GPIO = 0,
|
||||
GPIO1D3_NAND_D3,
|
||||
GPIO1D3_EMMC_D3,
|
||||
GPIO1D3_SFC_SIO3,
|
||||
|
||||
GPIO1D2_SHIFT = 4,
|
||||
GPIO1D2_MASK = 3 << GPIO1D2_SHIFT,
|
||||
GPIO1D2_GPIO = 0,
|
||||
GPIO1D2_NAND_D2,
|
||||
GPIO1D2_EMMC_D2,
|
||||
GPIO1D2_SFC_SIO2,
|
||||
|
||||
GPIO1D1_SHIFT = 2,
|
||||
GPIO1D1_MASK = 3 << GPIO1D1_SHIFT,
|
||||
GPIO1D1_GPIO = 0,
|
||||
GPIO1D1_NAND_D1,
|
||||
GPIO1D1_EMMC_D1,
|
||||
GPIO1D1_SFC_SIO1,
|
||||
|
||||
GPIO1D0_SHIFT = 0,
|
||||
GPIO1D0_MASK = 3 << GPIO1D0_SHIFT,
|
||||
GPIO1D0_GPIO = 0,
|
||||
GPIO1D0_NAND_D0,
|
||||
GPIO1D0_EMMC_D0,
|
||||
GPIO1D0_SFC_SIO0,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2A_IOMUX */
|
||||
enum {
|
||||
GPIO2A7_SHIFT = 14,
|
||||
GPIO2A7_MASK = 1 << GPIO2A7_SHIFT,
|
||||
GPIO2A7_GPIO = 0,
|
||||
GPIO2A7_TESTCLK_OUT,
|
||||
|
||||
GPIO2A6_SHIFT = 12,
|
||||
GPIO2A6_MASK = 1 << GPIO2A6_SHIFT,
|
||||
GPIO2A6_GPIO = 0,
|
||||
GPIO2A6_NAND_CS0,
|
||||
|
||||
GPIO2A4_SHIFT = 8,
|
||||
GPIO2A4_MASK = 3 << GPIO2A4_SHIFT,
|
||||
GPIO2A4_GPIO = 0,
|
||||
GPIO2A4_NAND_RDY,
|
||||
GPIO2A4_EMMC_CMD,
|
||||
GPIO2A3_SFC_CLK,
|
||||
|
||||
GPIO2A3_SHIFT = 6,
|
||||
GPIO2A3_MASK = 3 << GPIO2A3_SHIFT,
|
||||
GPIO2A3_GPIO = 0,
|
||||
GPIO2A3_NAND_RDN,
|
||||
GPIO2A4_SFC_CSN1,
|
||||
|
||||
GPIO2A2_SHIFT = 4,
|
||||
GPIO2A2_MASK = 3 << GPIO2A2_SHIFT,
|
||||
GPIO2A2_GPIO = 0,
|
||||
GPIO2A2_NAND_WRN,
|
||||
GPIO2A4_SFC_CSN0,
|
||||
|
||||
GPIO2A1_SHIFT = 2,
|
||||
GPIO2A1_MASK = 3 << GPIO2A1_SHIFT,
|
||||
GPIO2A1_GPIO = 0,
|
||||
GPIO2A1_NAND_CLE,
|
||||
GPIO2A1_EMMC_CLKOUT,
|
||||
|
||||
GPIO2A0_SHIFT = 0,
|
||||
GPIO2A0_MASK = 3 << GPIO2A0_SHIFT,
|
||||
GPIO2A0_GPIO = 0,
|
||||
GPIO2A0_NAND_ALE,
|
||||
GPIO2A0_SPI_CLK,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2B_IOMUX */
|
||||
enum {
|
||||
GPIO2B7_SHIFT = 14,
|
||||
GPIO2B7_MASK = 1 << GPIO2B7_SHIFT,
|
||||
GPIO2B7_GPIO = 0,
|
||||
GPIO2B7_MAC_RXER,
|
||||
|
||||
GPIO2B6_SHIFT = 12,
|
||||
GPIO2B6_MASK = 3 << GPIO2B6_SHIFT,
|
||||
GPIO2B6_GPIO = 0,
|
||||
GPIO2B6_MAC_CLKOUT,
|
||||
GPIO2B6_MAC_CLKIN,
|
||||
|
||||
GPIO2B5_SHIFT = 10,
|
||||
GPIO2B5_MASK = 1 << GPIO2B5_SHIFT,
|
||||
GPIO2B5_GPIO = 0,
|
||||
GPIO2B5_MAC_TXEN,
|
||||
|
||||
GPIO2B4_SHIFT = 8,
|
||||
GPIO2B4_MASK = 1 << GPIO2B4_SHIFT,
|
||||
GPIO2B4_GPIO = 0,
|
||||
GPIO2B4_MAC_MDIO,
|
||||
|
||||
GPIO2B2_SHIFT = 4,
|
||||
GPIO2B2_MASK = 1 << GPIO2B2_SHIFT,
|
||||
GPIO2B2_GPIO = 0,
|
||||
GPIO2B2_MAC_CRS,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2C_IOMUX */
|
||||
enum {
|
||||
GPIO2C7_SHIFT = 14,
|
||||
GPIO2C7_MASK = 3 << GPIO2C7_SHIFT,
|
||||
GPIO2C7_GPIO = 0,
|
||||
GPIO2C7_UART1_SOUT,
|
||||
GPIO2C7_TESTCLK_OUT1,
|
||||
|
||||
GPIO2C6_SHIFT = 12,
|
||||
GPIO2C6_MASK = 1 << GPIO2C6_SHIFT,
|
||||
GPIO2C6_GPIO = 0,
|
||||
GPIO2C6_UART1_SIN,
|
||||
|
||||
GPIO2C5_SHIFT = 10,
|
||||
GPIO2C5_MASK = 1 << GPIO2C5_SHIFT,
|
||||
GPIO2C5_GPIO = 0,
|
||||
GPIO2C5_I2C2_SCL,
|
||||
|
||||
GPIO2C4_SHIFT = 8,
|
||||
GPIO2C4_MASK = 1 << GPIO2C4_SHIFT,
|
||||
GPIO2C4_GPIO = 0,
|
||||
GPIO2C4_I2C2_SDA,
|
||||
|
||||
GPIO2C3_SHIFT = 6,
|
||||
GPIO2C3_MASK = 1 << GPIO2C3_SHIFT,
|
||||
GPIO2C3_GPIO = 0,
|
||||
GPIO2C3_MAC_TXD0,
|
||||
|
||||
GPIO2C2_SHIFT = 4,
|
||||
GPIO2C2_MASK = 1 << GPIO2C2_SHIFT,
|
||||
GPIO2C2_GPIO = 0,
|
||||
GPIO2C2_MAC_TXD1,
|
||||
|
||||
GPIO2C1_SHIFT = 2,
|
||||
GPIO2C1_MASK = 1 << GPIO2C1_SHIFT,
|
||||
GPIO2C1_GPIO = 0,
|
||||
GPIO2C1_MAC_RXD0,
|
||||
|
||||
GPIO2C0_SHIFT = 0,
|
||||
GPIO2C0_MASK = 1 << GPIO2C0_SHIFT,
|
||||
GPIO2C0_GPIO = 0,
|
||||
GPIO2C0_MAC_RXD1,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2D_IOMUX */
|
||||
enum {
|
||||
GPIO2D6_SHIFT = 12,
|
||||
GPIO2D6_MASK = 1 << GPIO2D6_SHIFT,
|
||||
GPIO2D6_GPIO = 0,
|
||||
GPIO2D6_I2S_SDO1,
|
||||
|
||||
GPIO2D5_SHIFT = 10,
|
||||
GPIO2D5_MASK = 1 << GPIO2D5_SHIFT,
|
||||
GPIO2D5_GPIO = 0,
|
||||
GPIO2D5_I2S_SDO2,
|
||||
|
||||
GPIO2D4_SHIFT = 8,
|
||||
GPIO2D4_MASK = 1 << GPIO2D4_SHIFT,
|
||||
GPIO2D4_GPIO = 0,
|
||||
GPIO2D4_I2S_SDO3,
|
||||
|
||||
GPIO2D1_SHIFT = 2,
|
||||
GPIO2D1_MASK = 1 << GPIO2D1_SHIFT,
|
||||
GPIO2D1_GPIO = 0,
|
||||
GPIO2D1_MAC_MDC,
|
||||
};
|
||||
|
||||
struct rk3036_pinctrl_priv {
|
||||
struct rk3036_grf *grf;
|
||||
};
|
||||
|
||||
static void pinctrl_rk3036_pwm_config(struct rk3036_grf *grf, int pwm_id)
|
||||
{
|
||||
switch (pwm_id) {
|
||||
case PERIPH_ID_PWM0:
|
||||
rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D2_MASK,
|
||||
GPIO0D2_PWM0 << GPIO0D2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM1:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux, GPIO0A0_MASK,
|
||||
GPIO0A0_PWM1 << GPIO0A0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM2:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux, GPIO0A1_MASK,
|
||||
GPIO0A1_PWM2 << GPIO0A1_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM3:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux, GPIO0D3_MASK,
|
||||
GPIO0D3_PWM3 << GPIO0D3_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("pwm id = %d iomux error!\n", pwm_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3036_i2c_config(struct rk3036_grf *grf, int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A1_MASK | GPIO0A0_MASK,
|
||||
GPIO0A1_I2C0_SDA << GPIO0A1_SHIFT |
|
||||
GPIO0A0_I2C0_SCL << GPIO0A0_SHIFT);
|
||||
|
||||
break;
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A3_MASK | GPIO0A2_MASK,
|
||||
GPIO0A3_I2C1_SDA << GPIO0A3_SHIFT |
|
||||
GPIO0A2_I2C1_SCL << GPIO0A2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio2c_iomux,
|
||||
GPIO2C5_MASK | GPIO2C4_MASK,
|
||||
GPIO2C5_I2C2_SCL << GPIO2C5_SHIFT |
|
||||
GPIO2C4_I2C2_SDA << GPIO2C4_SHIFT);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3036_spi_config(struct rk3036_grf *grf, int cs)
|
||||
{
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D6_MASK,
|
||||
GPIO1D6_SPI_CSN0 << GPIO1D6_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux, GPIO1D7_MASK,
|
||||
GPIO1D7_SPI_CSN1 << GPIO1D7_SHIFT);
|
||||
break;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D5_MASK | GPIO1D4_MASK,
|
||||
GPIO1D5_SPI_TXD << GPIO1D5_SHIFT |
|
||||
GPIO1D4_SPI_RXD << GPIO1D4_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio2a_iomux, GPIO2A0_MASK,
|
||||
GPIO2A0_SPI_CLK << GPIO2A0_SHIFT);
|
||||
}
|
||||
|
||||
static void pinctrl_rk3036_uart_config(struct rk3036_grf *grf, int uart_id)
|
||||
{
|
||||
switch (uart_id) {
|
||||
case PERIPH_ID_UART0:
|
||||
rk_clrsetreg(&grf->gpio0c_iomux,
|
||||
GPIO0C3_MASK | GPIO0C2_MASK |
|
||||
GPIO0C1_MASK | GPIO0C0_MASK,
|
||||
GPIO0C3_UART0_CTSN << GPIO0C3_SHIFT |
|
||||
GPIO0C2_UART0_RTSN << GPIO0C2_SHIFT |
|
||||
GPIO0C1_UART0_SIN << GPIO0C1_SHIFT |
|
||||
GPIO0C0_UART0_SOUT << GPIO0C0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART1:
|
||||
rk_clrsetreg(&grf->gpio2c_iomux,
|
||||
GPIO2C7_MASK | GPIO2C6_MASK,
|
||||
GPIO2C7_UART1_SOUT << GPIO2C7_SHIFT |
|
||||
GPIO2C6_UART1_SIN << GPIO2C6_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART2:
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C3_MASK | GPIO1C2_MASK,
|
||||
GPIO1C3_UART2_SOUT << GPIO1C3_SHIFT |
|
||||
GPIO1C2_UART2_SIN << GPIO1C2_SHIFT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3036_sdmmc_config(struct rk3036_grf *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux, 0xffff,
|
||||
GPIO1D7_EMMC_D7 << GPIO1D7_SHIFT |
|
||||
GPIO1D6_EMMC_D6 << GPIO1D6_SHIFT |
|
||||
GPIO1D5_EMMC_D5 << GPIO1D5_SHIFT |
|
||||
GPIO1D4_EMMC_D4 << GPIO1D4_SHIFT |
|
||||
GPIO1D3_EMMC_D3 << GPIO1D3_SHIFT |
|
||||
GPIO1D2_EMMC_D2 << GPIO1D2_SHIFT |
|
||||
GPIO1D1_EMMC_D1 << GPIO1D1_SHIFT |
|
||||
GPIO1D0_EMMC_D0 << GPIO1D0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A4_MASK | GPIO2A1_MASK,
|
||||
GPIO2A4_EMMC_CMD << GPIO2A4_SHIFT |
|
||||
GPIO2A1_EMMC_CLKOUT << GPIO2A1_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
rk_clrsetreg(&grf->gpio1c_iomux, 0xffff,
|
||||
GPIO1C5_MMC0_D3 << GPIO1C5_SHIFT |
|
||||
GPIO1C4_MMC0_D2 << GPIO1C4_SHIFT |
|
||||
GPIO1C3_MMC0_D1 << GPIO1C3_SHIFT |
|
||||
GPIO1C2_MMC0_D0 << GPIO1C2_SHIFT |
|
||||
GPIO1C1_MMC0_DETN << GPIO1C1_SHIFT |
|
||||
GPIO1C0_MMC0_CLKOUT << GPIO1C0_SHIFT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int rk3036_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3036_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_PWM0:
|
||||
case PERIPH_ID_PWM1:
|
||||
case PERIPH_ID_PWM2:
|
||||
case PERIPH_ID_PWM3:
|
||||
pinctrl_rk3036_pwm_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
pinctrl_rk3036_i2c_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
pinctrl_rk3036_spi_config(priv->grf, flags);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
pinctrl_rk3036_uart_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk3036_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3036_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 14:
|
||||
return PERIPH_ID_SDCARD;
|
||||
case 16:
|
||||
return PERIPH_ID_EMMC;
|
||||
case 20:
|
||||
return PERIPH_ID_UART0;
|
||||
case 21:
|
||||
return PERIPH_ID_UART1;
|
||||
case 22:
|
||||
return PERIPH_ID_UART2;
|
||||
case 23:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 24:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 25:
|
||||
return PERIPH_ID_I2C1;
|
||||
case 26:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 30:
|
||||
return PERIPH_ID_PWM0;
|
||||
}
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3036_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3036_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
return rk3036_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops rk3036_pinctrl_ops = {
|
||||
.set_state_simple = rk3036_pinctrl_set_state_simple,
|
||||
.request = rk3036_pinctrl_request,
|
||||
.get_periph_id = rk3036_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
static int rk3036_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3036_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
debug("%s: grf=%p\n", __func__, priv->grf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3036_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3036-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3036) = {
|
||||
.name = "pinctrl_rk3036",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3036_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3036_pinctrl_priv),
|
||||
.ops = &rk3036_pinctrl_ops,
|
||||
.bind = dm_scan_fdt_dev,
|
||||
.probe = rk3036_pinctrl_probe,
|
||||
};
|
@ -1,186 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Pinctrl driver for Rockchip 3128 SoCs
|
||||
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk3128.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
struct rk3128_pinctrl_priv {
|
||||
struct rk3128_grf *grf;
|
||||
};
|
||||
|
||||
static void pinctrl_rk3128_i2c_config(struct rk3128_grf *grf, int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A1_MASK | GPIO0A0_MASK,
|
||||
GPIO0A1_I2C0_SDA << GPIO0A1_SHIFT |
|
||||
GPIO0A0_I2C0_SCL << GPIO0A0_SHIFT);
|
||||
|
||||
break;
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A3_MASK | GPIO0A2_MASK,
|
||||
GPIO0A3_I2C1_SDA << GPIO0A3_SHIFT |
|
||||
GPIO0A2_I2C1_SCL << GPIO0A2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio2c_iomux2,
|
||||
GPIO2C5_MASK | GPIO2C4_MASK,
|
||||
GPIO2C5_I2C2_SCL << GPIO2C5_SHIFT |
|
||||
GPIO2C4_I2C2_SDA << GPIO2C4_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C3:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A7_MASK | GPIO0A6_MASK,
|
||||
GPIO0A7_I2C3_SDA << GPIO0A7_SHIFT |
|
||||
GPIO0A6_I2C3_SCL << GPIO0A6_SHIFT);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3128_sdmmc_config(struct rk3128_grf *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux, 0xffff,
|
||||
GPIO1D7_EMMC_D7 << GPIO1D7_SHIFT |
|
||||
GPIO1D6_EMMC_D6 << GPIO1D6_SHIFT |
|
||||
GPIO1D5_EMMC_D5 << GPIO1D5_SHIFT |
|
||||
GPIO1D4_EMMC_D4 << GPIO1D4_SHIFT |
|
||||
GPIO1D3_EMMC_D3 << GPIO1D3_SHIFT |
|
||||
GPIO1D2_EMMC_D2 << GPIO1D2_SHIFT |
|
||||
GPIO1D1_EMMC_D1 << GPIO1D1_SHIFT |
|
||||
GPIO1D0_EMMC_D0 << GPIO1D0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A5_MASK | GPIO2A7_MASK,
|
||||
GPIO2A5_EMMC_PWREN << GPIO2A5_SHIFT |
|
||||
GPIO2A7_EMMC_CLKOUT << GPIO2A7_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
rk_clrsetreg(&grf->gpio1c_iomux, 0x0fff,
|
||||
GPIO1C5_MMC0_D3 << GPIO1C5_SHIFT |
|
||||
GPIO1C4_MMC0_D2 << GPIO1C4_SHIFT |
|
||||
GPIO1C3_MMC0_D1 << GPIO1C3_SHIFT |
|
||||
GPIO1C2_MMC0_D0 << GPIO1C2_SHIFT |
|
||||
GPIO1C1_MMC0_DETN << GPIO1C1_SHIFT |
|
||||
GPIO1C0_MMC0_CLKOUT << GPIO1C0_SHIFT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int rk3128_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3128_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
case PERIPH_ID_I2C3:
|
||||
pinctrl_rk3128_i2c_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk3128_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3128_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(periph),
|
||||
"interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 14:
|
||||
return PERIPH_ID_SDCARD;
|
||||
case 16:
|
||||
return PERIPH_ID_EMMC;
|
||||
case 20:
|
||||
return PERIPH_ID_UART0;
|
||||
case 21:
|
||||
return PERIPH_ID_UART1;
|
||||
case 22:
|
||||
return PERIPH_ID_UART2;
|
||||
case 23:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 24:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 25:
|
||||
return PERIPH_ID_I2C1;
|
||||
case 26:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 27:
|
||||
return PERIPH_ID_I2C3;
|
||||
case 30:
|
||||
return PERIPH_ID_PWM0;
|
||||
}
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3128_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3128_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
return rk3128_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops rk3128_pinctrl_ops = {
|
||||
.set_state_simple = rk3128_pinctrl_set_state_simple,
|
||||
.request = rk3128_pinctrl_request,
|
||||
.get_periph_id = rk3128_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
static int rk3128_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3128_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
debug("%s: grf=%p\n", __func__, priv->grf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3128_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3128-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3128) = {
|
||||
.name = "pinctrl_rk3128",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3128_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3128_pinctrl_priv),
|
||||
.ops = &rk3128_pinctrl_ops,
|
||||
.bind = dm_scan_fdt_dev,
|
||||
.probe = rk3128_pinctrl_probe,
|
||||
};
|
@ -1,989 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Pinctrl driver for Rockchip RK3188 SoCs
|
||||
* Copyright (c) 2016 Heiko Stuebner <heiko@sntech.de>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk3188.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/pmu_rk3188.h>
|
||||
#include <dm/pinctrl.h>
|
||||
#include <dm/root.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/* GRF_GPIO0D_IOMUX */
|
||||
enum {
|
||||
GPIO0D7_SHIFT = 14,
|
||||
GPIO0D7_MASK = 1,
|
||||
GPIO0D7_GPIO = 0,
|
||||
GPIO0D7_SPI1_CSN0,
|
||||
|
||||
GPIO0D6_SHIFT = 12,
|
||||
GPIO0D6_MASK = 1,
|
||||
GPIO0D6_GPIO = 0,
|
||||
GPIO0D6_SPI1_CLK,
|
||||
|
||||
GPIO0D5_SHIFT = 10,
|
||||
GPIO0D5_MASK = 1,
|
||||
GPIO0D5_GPIO = 0,
|
||||
GPIO0D5_SPI1_TXD,
|
||||
|
||||
GPIO0D4_SHIFT = 8,
|
||||
GPIO0D4_MASK = 1,
|
||||
GPIO0D4_GPIO = 0,
|
||||
GPIO0D4_SPI0_RXD,
|
||||
|
||||
GPIO0D3_SHIFT = 6,
|
||||
GPIO0D3_MASK = 3,
|
||||
GPIO0D3_GPIO = 0,
|
||||
GPIO0D3_FLASH_CSN3,
|
||||
GPIO0D3_EMMC_RSTN_OUT,
|
||||
|
||||
GPIO0D2_SHIFT = 4,
|
||||
GPIO0D2_MASK = 3,
|
||||
GPIO0D2_GPIO = 0,
|
||||
GPIO0D2_FLASH_CSN2,
|
||||
GPIO0D2_EMMC_CMD,
|
||||
|
||||
GPIO0D1_SHIFT = 2,
|
||||
GPIO0D1_MASK = 1,
|
||||
GPIO0D1_GPIO = 0,
|
||||
GPIO0D1_FLASH_CSN1,
|
||||
|
||||
GPIO0D0_SHIFT = 0,
|
||||
GPIO0D0_MASK = 3,
|
||||
GPIO0D0_GPIO = 0,
|
||||
GPIO0D0_FLASH_DQS,
|
||||
GPIO0D0_EMMC_CLKOUT
|
||||
};
|
||||
|
||||
/* GRF_GPIO1A_IOMUX */
|
||||
enum {
|
||||
GPIO1A7_SHIFT = 14,
|
||||
GPIO1A7_MASK = 3,
|
||||
GPIO1A7_GPIO = 0,
|
||||
GPIO1A7_UART1_RTS_N,
|
||||
GPIO1A7_SPI0_CSN0,
|
||||
|
||||
GPIO1A6_SHIFT = 12,
|
||||
GPIO1A6_MASK = 3,
|
||||
GPIO1A6_GPIO = 0,
|
||||
GPIO1A6_UART1_CTS_N,
|
||||
GPIO1A6_SPI0_CLK,
|
||||
|
||||
GPIO1A5_SHIFT = 10,
|
||||
GPIO1A5_MASK = 3,
|
||||
GPIO1A5_GPIO = 0,
|
||||
GPIO1A5_UART1_SOUT,
|
||||
GPIO1A5_SPI0_TXD,
|
||||
|
||||
GPIO1A4_SHIFT = 8,
|
||||
GPIO1A4_MASK = 3,
|
||||
GPIO1A4_GPIO = 0,
|
||||
GPIO1A4_UART1_SIN,
|
||||
GPIO1A4_SPI0_RXD,
|
||||
|
||||
GPIO1A3_SHIFT = 6,
|
||||
GPIO1A3_MASK = 1,
|
||||
GPIO1A3_GPIO = 0,
|
||||
GPIO1A3_UART0_RTS_N,
|
||||
|
||||
GPIO1A2_SHIFT = 4,
|
||||
GPIO1A2_MASK = 1,
|
||||
GPIO1A2_GPIO = 0,
|
||||
GPIO1A2_UART0_CTS_N,
|
||||
|
||||
GPIO1A1_SHIFT = 2,
|
||||
GPIO1A1_MASK = 1,
|
||||
GPIO1A1_GPIO = 0,
|
||||
GPIO1A1_UART0_SOUT,
|
||||
|
||||
GPIO1A0_SHIFT = 0,
|
||||
GPIO1A0_MASK = 1,
|
||||
GPIO1A0_GPIO = 0,
|
||||
GPIO1A0_UART0_SIN,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1B_IOMUX */
|
||||
enum {
|
||||
GPIO1B7_SHIFT = 14,
|
||||
GPIO1B7_MASK = 1,
|
||||
GPIO1B7_GPIO = 0,
|
||||
GPIO1B7_SPI0_CSN1,
|
||||
|
||||
GPIO1B6_SHIFT = 12,
|
||||
GPIO1B6_MASK = 3,
|
||||
GPIO1B6_GPIO = 0,
|
||||
GPIO1B6_SPDIF_TX,
|
||||
GPIO1B6_SPI1_CSN1,
|
||||
|
||||
GPIO1B5_SHIFT = 10,
|
||||
GPIO1B5_MASK = 3,
|
||||
GPIO1B5_GPIO = 0,
|
||||
GPIO1B5_UART3_RTS_N,
|
||||
GPIO1B5_RESERVED,
|
||||
|
||||
GPIO1B4_SHIFT = 8,
|
||||
GPIO1B4_MASK = 3,
|
||||
GPIO1B4_GPIO = 0,
|
||||
GPIO1B4_UART3_CTS_N,
|
||||
GPIO1B4_GPS_RFCLK,
|
||||
|
||||
GPIO1B3_SHIFT = 6,
|
||||
GPIO1B3_MASK = 3,
|
||||
GPIO1B3_GPIO = 0,
|
||||
GPIO1B3_UART3_SOUT,
|
||||
GPIO1B3_GPS_SIG,
|
||||
|
||||
GPIO1B2_SHIFT = 4,
|
||||
GPIO1B2_MASK = 3,
|
||||
GPIO1B2_GPIO = 0,
|
||||
GPIO1B2_UART3_SIN,
|
||||
GPIO1B2_GPS_MAG,
|
||||
|
||||
GPIO1B1_SHIFT = 2,
|
||||
GPIO1B1_MASK = 3,
|
||||
GPIO1B1_GPIO = 0,
|
||||
GPIO1B1_UART2_SOUT,
|
||||
GPIO1B1_JTAG_TDO,
|
||||
|
||||
GPIO1B0_SHIFT = 0,
|
||||
GPIO1B0_MASK = 3,
|
||||
GPIO1B0_GPIO = 0,
|
||||
GPIO1B0_UART2_SIN,
|
||||
GPIO1B0_JTAG_TDI,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1D_IOMUX */
|
||||
enum {
|
||||
GPIO1D7_SHIFT = 14,
|
||||
GPIO1D7_MASK = 1,
|
||||
GPIO1D7_GPIO = 0,
|
||||
GPIO1D7_I2C4_SCL,
|
||||
|
||||
GPIO1D6_SHIFT = 12,
|
||||
GPIO1D6_MASK = 1,
|
||||
GPIO1D6_GPIO = 0,
|
||||
GPIO1D6_I2C4_SDA,
|
||||
|
||||
GPIO1D5_SHIFT = 10,
|
||||
GPIO1D5_MASK = 1,
|
||||
GPIO1D5_GPIO = 0,
|
||||
GPIO1D5_I2C2_SCL,
|
||||
|
||||
GPIO1D4_SHIFT = 8,
|
||||
GPIO1D4_MASK = 1,
|
||||
GPIO1D4_GPIO = 0,
|
||||
GPIO1D4_I2C2_SDA,
|
||||
|
||||
GPIO1D3_SHIFT = 6,
|
||||
GPIO1D3_MASK = 1,
|
||||
GPIO1D3_GPIO = 0,
|
||||
GPIO1D3_I2C1_SCL,
|
||||
|
||||
GPIO1D2_SHIFT = 4,
|
||||
GPIO1D2_MASK = 1,
|
||||
GPIO1D2_GPIO = 0,
|
||||
GPIO1D2_I2C1_SDA,
|
||||
|
||||
GPIO1D1_SHIFT = 2,
|
||||
GPIO1D1_MASK = 1,
|
||||
GPIO1D1_GPIO = 0,
|
||||
GPIO1D1_I2C0_SCL,
|
||||
|
||||
GPIO1D0_SHIFT = 0,
|
||||
GPIO1D0_MASK = 1,
|
||||
GPIO1D0_GPIO = 0,
|
||||
GPIO1D0_I2C0_SDA,
|
||||
};
|
||||
|
||||
/* GRF_GPIO3A_IOMUX */
|
||||
enum {
|
||||
GPIO3A7_SHIFT = 14,
|
||||
GPIO3A7_MASK = 1,
|
||||
GPIO3A7_GPIO = 0,
|
||||
GPIO3A7_SDMMC0_DATA3,
|
||||
|
||||
GPIO3A6_SHIFT = 12,
|
||||
GPIO3A6_MASK = 1,
|
||||
GPIO3A6_GPIO = 0,
|
||||
GPIO3A6_SDMMC0_DATA2,
|
||||
|
||||
GPIO3A5_SHIFT = 10,
|
||||
GPIO3A5_MASK = 1,
|
||||
GPIO3A5_GPIO = 0,
|
||||
GPIO3A5_SDMMC0_DATA1,
|
||||
|
||||
GPIO3A4_SHIFT = 8,
|
||||
GPIO3A4_MASK = 1,
|
||||
GPIO3A4_GPIO = 0,
|
||||
GPIO3A4_SDMMC0_DATA0,
|
||||
|
||||
GPIO3A3_SHIFT = 6,
|
||||
GPIO3A3_MASK = 1,
|
||||
GPIO3A3_GPIO = 0,
|
||||
GPIO3A3_SDMMC0_CMD,
|
||||
|
||||
GPIO3A2_SHIFT = 4,
|
||||
GPIO3A2_MASK = 1,
|
||||
GPIO3A2_GPIO = 0,
|
||||
GPIO3A2_SDMMC0_CLKOUT,
|
||||
|
||||
GPIO3A1_SHIFT = 2,
|
||||
GPIO3A1_MASK = 1,
|
||||
GPIO3A1_GPIO = 0,
|
||||
GPIO3A1_SDMMC0_PWREN,
|
||||
|
||||
GPIO3A0_SHIFT = 0,
|
||||
GPIO3A0_MASK = 1,
|
||||
GPIO3A0_GPIO = 0,
|
||||
GPIO3A0_SDMMC0_RSTN,
|
||||
};
|
||||
|
||||
/* GRF_GPIO3B_IOMUX */
|
||||
enum {
|
||||
GPIO3B7_SHIFT = 14,
|
||||
GPIO3B7_MASK = 3,
|
||||
GPIO3B7_GPIO = 0,
|
||||
GPIO3B7_CIF_DATA11,
|
||||
GPIO3B7_I2C3_SCL,
|
||||
|
||||
GPIO3B6_SHIFT = 12,
|
||||
GPIO3B6_MASK = 3,
|
||||
GPIO3B6_GPIO = 0,
|
||||
GPIO3B6_CIF_DATA10,
|
||||
GPIO3B6_I2C3_SDA,
|
||||
|
||||
GPIO3B5_SHIFT = 10,
|
||||
GPIO3B5_MASK = 3,
|
||||
GPIO3B5_GPIO = 0,
|
||||
GPIO3B5_CIF_DATA1,
|
||||
GPIO3B5_HSADC_DATA9,
|
||||
|
||||
GPIO3B4_SHIFT = 8,
|
||||
GPIO3B4_MASK = 3,
|
||||
GPIO3B4_GPIO = 0,
|
||||
GPIO3B4_CIF_DATA0,
|
||||
GPIO3B4_HSADC_DATA8,
|
||||
|
||||
GPIO3B3_SHIFT = 6,
|
||||
GPIO3B3_MASK = 1,
|
||||
GPIO3B3_GPIO = 0,
|
||||
GPIO3B3_CIF_CLKOUT,
|
||||
|
||||
GPIO3B2_SHIFT = 4,
|
||||
GPIO3B2_MASK = 1,
|
||||
GPIO3B2_GPIO = 0,
|
||||
/* no muxes */
|
||||
|
||||
GPIO3B1_SHIFT = 2,
|
||||
GPIO3B1_MASK = 1,
|
||||
GPIO3B1_GPIO = 0,
|
||||
GPIO3B1_SDMMC0_WRITE_PRT,
|
||||
|
||||
GPIO3B0_SHIFT = 0,
|
||||
GPIO3B0_MASK = 1,
|
||||
GPIO3B0_GPIO = 0,
|
||||
GPIO3B0_SDMMC_DETECT_N,
|
||||
};
|
||||
|
||||
/* GRF_GPIO3C_IOMUX */
|
||||
enum {
|
||||
GPIO3C7_SHIFT = 14,
|
||||
GPIO3C7_MASK = 3,
|
||||
GPIO3C7_GPIO = 0,
|
||||
GPIO3C7_SDMMC1_WRITE_PRT,
|
||||
GPIO3C7_RMII_CRS_DVALID,
|
||||
GPIO3C7_RESERVED,
|
||||
|
||||
GPIO3C6_SHIFT = 12,
|
||||
GPIO3C6_MASK = 3,
|
||||
GPIO3C6_GPIO = 0,
|
||||
GPIO3C6_SDMMC1_DECTN,
|
||||
GPIO3C6_RMII_RX_ERR,
|
||||
GPIO3C6_RESERVED,
|
||||
|
||||
GPIO3C5_SHIFT = 10,
|
||||
GPIO3C5_MASK = 3,
|
||||
GPIO3C5_GPIO = 0,
|
||||
GPIO3C5_SDMMC1_CLKOUT,
|
||||
GPIO3C5_RMII_CLKOUT,
|
||||
GPIO3C5_RMII_CLKIN,
|
||||
|
||||
GPIO3C4_SHIFT = 8,
|
||||
GPIO3C4_MASK = 3,
|
||||
GPIO3C4_GPIO = 0,
|
||||
GPIO3C4_SDMMC1_DATA3,
|
||||
GPIO3C4_RMII_RXD1,
|
||||
GPIO3C4_RESERVED,
|
||||
|
||||
GPIO3C3_SHIFT = 6,
|
||||
GPIO3C3_MASK = 3,
|
||||
GPIO3C3_GPIO = 0,
|
||||
GPIO3C3_SDMMC1_DATA2,
|
||||
GPIO3C3_RMII_RXD0,
|
||||
GPIO3C3_RESERVED,
|
||||
|
||||
GPIO3C2_SHIFT = 4,
|
||||
GPIO3C2_MASK = 3,
|
||||
GPIO3C2_GPIO = 0,
|
||||
GPIO3C2_SDMMC1_DATA1,
|
||||
GPIO3C2_RMII_TXD0,
|
||||
GPIO3C2_RESERVED,
|
||||
|
||||
GPIO3C1_SHIFT = 2,
|
||||
GPIO3C1_MASK = 3,
|
||||
GPIO3C1_GPIO = 0,
|
||||
GPIO3C1_SDMMC1_DATA0,
|
||||
GPIO3C1_RMII_TXD1,
|
||||
GPIO3C1_RESERVED,
|
||||
|
||||
GPIO3C0_SHIFT = 0,
|
||||
GPIO3C0_MASK = 3,
|
||||
GPIO3C0_GPIO = 0,
|
||||
GPIO3C0_SDMMC1_CMD,
|
||||
GPIO3C0_RMII_TX_EN,
|
||||
GPIO3C0_RESERVED,
|
||||
};
|
||||
|
||||
/* GRF_GPIO3D_IOMUX */
|
||||
enum {
|
||||
GPIO3D6_SHIFT = 12,
|
||||
GPIO3D6_MASK = 3,
|
||||
GPIO3D6_GPIO = 0,
|
||||
GPIO3D6_PWM_3,
|
||||
GPIO3D6_JTAG_TMS,
|
||||
GPIO3D6_HOST_DRV_VBUS,
|
||||
|
||||
GPIO3D5_SHIFT = 10,
|
||||
GPIO3D5_MASK = 3,
|
||||
GPIO3D5_GPIO = 0,
|
||||
GPIO3D5_PWM_2,
|
||||
GPIO3D5_JTAG_TCK,
|
||||
GPIO3D5_OTG_DRV_VBUS,
|
||||
|
||||
GPIO3D4_SHIFT = 8,
|
||||
GPIO3D4_MASK = 3,
|
||||
GPIO3D4_GPIO = 0,
|
||||
GPIO3D4_PWM_1,
|
||||
GPIO3D4_JTAG_TRSTN,
|
||||
|
||||
GPIO3D3_SHIFT = 6,
|
||||
GPIO3D3_MASK = 3,
|
||||
GPIO3D3_GPIO = 0,
|
||||
GPIO3D3_PWM_0,
|
||||
|
||||
GPIO3D2_SHIFT = 4,
|
||||
GPIO3D2_MASK = 3,
|
||||
GPIO3D2_GPIO = 0,
|
||||
GPIO3D2_SDMMC1_INT_N,
|
||||
|
||||
GPIO3D1_SHIFT = 2,
|
||||
GPIO3D1_MASK = 3,
|
||||
GPIO3D1_GPIO = 0,
|
||||
GPIO3D1_SDMMC1_BACKEND_PWR,
|
||||
GPIO3D1_MII_MDCLK,
|
||||
|
||||
GPIO3D0_SHIFT = 0,
|
||||
GPIO3D0_MASK = 3,
|
||||
GPIO3D0_GPIO = 0,
|
||||
GPIO3D0_SDMMC1_PWR_EN,
|
||||
GPIO3D0_MII_MD,
|
||||
};
|
||||
|
||||
struct rk3188_pinctrl_priv {
|
||||
struct rk3188_grf *grf;
|
||||
struct rk3188_pmu *pmu;
|
||||
int num_banks;
|
||||
};
|
||||
|
||||
/**
|
||||
* Encode variants of iomux registers into a type variable
|
||||
*/
|
||||
#define IOMUX_GPIO_ONLY BIT(0)
|
||||
|
||||
/**
|
||||
* @type: iomux variant using IOMUX_* constants
|
||||
* @offset: if initialized to -1 it will be autocalculated, by specifying
|
||||
* an initial offset value the relevant source offset can be reset
|
||||
* to a new value for autocalculating the following iomux registers.
|
||||
*/
|
||||
struct rockchip_iomux {
|
||||
u8 type;
|
||||
s16 offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* @reg: register offset of the gpio bank
|
||||
* @nr_pins: number of pins in this bank
|
||||
* @bank_num: number of the bank, to account for holes
|
||||
* @name: name of the bank
|
||||
* @iomux: array describing the 4 iomux sources of the bank
|
||||
*/
|
||||
struct rockchip_pin_bank {
|
||||
u16 reg;
|
||||
u8 nr_pins;
|
||||
u8 bank_num;
|
||||
char *name;
|
||||
struct rockchip_iomux iomux[4];
|
||||
};
|
||||
|
||||
#define PIN_BANK(id, pins, label) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = -1 }, \
|
||||
{ .type = iom1, .offset = -1 }, \
|
||||
{ .type = iom2, .offset = -1 }, \
|
||||
{ .type = iom3, .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
static struct rockchip_pin_bank rk3188_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
|
||||
PIN_BANK(1, 32, "gpio1"),
|
||||
PIN_BANK(2, 32, "gpio2"),
|
||||
PIN_BANK(3, 32, "gpio3"),
|
||||
};
|
||||
#endif
|
||||
|
||||
static void pinctrl_rk3188_pwm_config(struct rk3188_grf *grf, int pwm_id)
|
||||
{
|
||||
switch (pwm_id) {
|
||||
case PERIPH_ID_PWM0:
|
||||
rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D3_MASK << GPIO3D3_SHIFT,
|
||||
GPIO3D3_PWM_0 << GPIO3D3_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM1:
|
||||
rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D4_MASK << GPIO3D4_SHIFT,
|
||||
GPIO3D4_PWM_1 << GPIO3D4_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM2:
|
||||
rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D5_MASK << GPIO3D5_SHIFT,
|
||||
GPIO3D5_PWM_2 << GPIO3D5_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM3:
|
||||
rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D6_MASK << GPIO3D6_SHIFT,
|
||||
GPIO3D6_PWM_3 << GPIO3D6_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("pwm id = %d iomux error!\n", pwm_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3188_i2c_config(struct rk3188_grf *grf,
|
||||
struct rk3188_pmu *pmu, int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D1_MASK << GPIO1D1_SHIFT |
|
||||
GPIO1D0_MASK << GPIO1D0_SHIFT,
|
||||
GPIO1D1_I2C0_SCL << GPIO1D1_SHIFT |
|
||||
GPIO1D0_I2C0_SDA << GPIO1D0_SHIFT);
|
||||
/* enable new i2c controller */
|
||||
rk_clrsetreg(&grf->soc_con1, 1 << RKI2C0_SEL_SHIFT,
|
||||
1 << RKI2C0_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D3_MASK << GPIO1D3_SHIFT |
|
||||
GPIO1D2_MASK << GPIO1D2_SHIFT,
|
||||
GPIO1D3_I2C1_SCL << GPIO1D2_SHIFT |
|
||||
GPIO1D2_I2C1_SDA << GPIO1D2_SHIFT);
|
||||
rk_clrsetreg(&grf->soc_con1, 1 << RKI2C1_SEL_SHIFT,
|
||||
1 << RKI2C1_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D5_MASK << GPIO1D5_SHIFT |
|
||||
GPIO1D4_MASK << GPIO1D4_SHIFT,
|
||||
GPIO1D5_I2C2_SCL << GPIO1D5_SHIFT |
|
||||
GPIO1D4_I2C2_SDA << GPIO1D4_SHIFT);
|
||||
rk_clrsetreg(&grf->soc_con1, 1 << RKI2C2_SEL_SHIFT,
|
||||
1 << RKI2C2_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C3:
|
||||
rk_clrsetreg(&grf->gpio3b_iomux,
|
||||
GPIO3B7_MASK << GPIO3B7_SHIFT |
|
||||
GPIO3B6_MASK << GPIO3B6_SHIFT,
|
||||
GPIO3B7_I2C3_SCL << GPIO3B7_SHIFT |
|
||||
GPIO3B6_I2C3_SDA << GPIO3B6_SHIFT);
|
||||
rk_clrsetreg(&grf->soc_con1, 1 << RKI2C3_SEL_SHIFT,
|
||||
1 << RKI2C3_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C4:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D7_MASK << GPIO1D7_SHIFT |
|
||||
GPIO1D6_MASK << GPIO1D6_SHIFT,
|
||||
GPIO1D7_I2C4_SCL << GPIO1D7_SHIFT |
|
||||
GPIO1D6_I2C4_SDA << GPIO1D6_SHIFT);
|
||||
rk_clrsetreg(&grf->soc_con1, 1 << RKI2C4_SEL_SHIFT,
|
||||
1 << RKI2C4_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("i2c id = %d iomux error!\n", i2c_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int pinctrl_rk3188_spi_config(struct rk3188_grf *grf,
|
||||
enum periph_id spi_id, int cs)
|
||||
{
|
||||
switch (spi_id) {
|
||||
case PERIPH_ID_SPI0:
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio1a_iomux,
|
||||
GPIO1A7_MASK << GPIO1A7_SHIFT,
|
||||
GPIO1A7_SPI0_CSN0 << GPIO1A7_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B7_MASK << GPIO1B7_SHIFT,
|
||||
GPIO1B7_SPI0_CSN1 << GPIO1B7_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio1a_iomux,
|
||||
GPIO1A4_MASK << GPIO1A4_SHIFT |
|
||||
GPIO1A5_MASK << GPIO1A5_SHIFT |
|
||||
GPIO1A6_MASK << GPIO1A6_SHIFT,
|
||||
GPIO1A4_SPI0_RXD << GPIO1A4_SHIFT |
|
||||
GPIO1A5_SPI0_TXD << GPIO1A5_SHIFT |
|
||||
GPIO1A6_SPI0_CLK << GPIO1A6_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SPI1:
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio0d_iomux,
|
||||
GPIO0D7_MASK << GPIO0D7_SHIFT,
|
||||
GPIO0D7_SPI1_CSN0 << GPIO0D7_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B6_MASK << GPIO1B6_SHIFT,
|
||||
GPIO1B6_SPI1_CSN1 << GPIO1B6_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio0d_iomux,
|
||||
GPIO0D4_MASK << GPIO0D4_SHIFT |
|
||||
GPIO0D5_MASK << GPIO0D5_SHIFT |
|
||||
GPIO0D6_MASK << GPIO0D6_SHIFT,
|
||||
GPIO0D4_SPI0_RXD << GPIO0D4_SHIFT |
|
||||
GPIO0D5_SPI1_TXD << GPIO0D5_SHIFT |
|
||||
GPIO0D6_SPI1_CLK << GPIO0D6_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void pinctrl_rk3188_uart_config(struct rk3188_grf *grf, int uart_id)
|
||||
{
|
||||
switch (uart_id) {
|
||||
case PERIPH_ID_UART0:
|
||||
rk_clrsetreg(&grf->gpio1a_iomux,
|
||||
GPIO1A3_MASK << GPIO1A3_SHIFT |
|
||||
GPIO1A2_MASK << GPIO1A2_SHIFT |
|
||||
GPIO1A1_MASK << GPIO1A1_SHIFT |
|
||||
GPIO1A0_MASK << GPIO1A0_SHIFT,
|
||||
GPIO1A3_UART0_RTS_N << GPIO1A3_SHIFT |
|
||||
GPIO1A2_UART0_CTS_N << GPIO1A2_SHIFT |
|
||||
GPIO1A1_UART0_SOUT << GPIO1A1_SHIFT |
|
||||
GPIO1A0_UART0_SIN << GPIO1A0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART1:
|
||||
rk_clrsetreg(&grf->gpio1a_iomux,
|
||||
GPIO1A7_MASK << GPIO1A7_SHIFT |
|
||||
GPIO1A6_MASK << GPIO1A6_SHIFT |
|
||||
GPIO1A5_MASK << GPIO1A5_SHIFT |
|
||||
GPIO1A4_MASK << GPIO1A4_SHIFT,
|
||||
GPIO1A7_UART1_RTS_N << GPIO1A7_SHIFT |
|
||||
GPIO1A6_UART1_CTS_N << GPIO1A6_SHIFT |
|
||||
GPIO1A5_UART1_SOUT << GPIO1A5_SHIFT |
|
||||
GPIO1A4_UART1_SIN << GPIO1A4_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART2:
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B1_MASK << GPIO1B1_SHIFT |
|
||||
GPIO1B0_MASK << GPIO1B0_SHIFT,
|
||||
GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT |
|
||||
GPIO1B0_UART2_SIN << GPIO1B0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART3:
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B5_MASK << GPIO1B5_SHIFT |
|
||||
GPIO1B4_MASK << GPIO1B4_SHIFT |
|
||||
GPIO1B3_MASK << GPIO1B3_SHIFT |
|
||||
GPIO1B2_MASK << GPIO1B2_SHIFT,
|
||||
GPIO1B5_UART3_RTS_N << GPIO1B5_SHIFT |
|
||||
GPIO1B4_UART3_CTS_N << GPIO1B4_SHIFT |
|
||||
GPIO1B3_UART3_SOUT << GPIO1B3_SHIFT |
|
||||
GPIO1B2_UART3_SIN << GPIO1B2_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("uart id = %d iomux error!\n", uart_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3188_sdmmc_config(struct rk3188_grf *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
rk_clrsetreg(&grf->soc_con0, 1 << EMMC_FLASH_SEL_SHIFT,
|
||||
1 << EMMC_FLASH_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio0d_iomux,
|
||||
GPIO0D2_MASK << GPIO0D2_SHIFT |
|
||||
GPIO0D0_MASK << GPIO0D0_SHIFT,
|
||||
GPIO0D2_EMMC_CMD << GPIO0D2_SHIFT |
|
||||
GPIO0D0_EMMC_CLKOUT << GPIO0D0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
rk_clrsetreg(&grf->gpio3b_iomux,
|
||||
GPIO3B0_MASK << GPIO3B0_SHIFT,
|
||||
GPIO3B0_SDMMC_DETECT_N << GPIO3B0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3a_iomux,
|
||||
GPIO3A7_MASK << GPIO3A7_SHIFT |
|
||||
GPIO3A6_MASK << GPIO3A6_SHIFT |
|
||||
GPIO3A5_MASK << GPIO3A5_SHIFT |
|
||||
GPIO3A4_MASK << GPIO3A4_SHIFT |
|
||||
GPIO3A3_MASK << GPIO3A3_SHIFT |
|
||||
GPIO3A3_MASK << GPIO3A2_SHIFT,
|
||||
GPIO3A7_SDMMC0_DATA3 << GPIO3A7_SHIFT |
|
||||
GPIO3A6_SDMMC0_DATA2 << GPIO3A6_SHIFT |
|
||||
GPIO3A5_SDMMC0_DATA1 << GPIO3A5_SHIFT |
|
||||
GPIO3A4_SDMMC0_DATA0 << GPIO3A4_SHIFT |
|
||||
GPIO3A3_SDMMC0_CMD << GPIO3A3_SHIFT |
|
||||
GPIO3A2_SDMMC0_CLKOUT << GPIO3A2_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("mmc id = %d iomux error!\n", mmc_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int rk3188_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_PWM0:
|
||||
case PERIPH_ID_PWM1:
|
||||
case PERIPH_ID_PWM2:
|
||||
case PERIPH_ID_PWM3:
|
||||
case PERIPH_ID_PWM4:
|
||||
pinctrl_rk3188_pwm_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
case PERIPH_ID_I2C3:
|
||||
case PERIPH_ID_I2C4:
|
||||
case PERIPH_ID_I2C5:
|
||||
pinctrl_rk3188_i2c_config(priv->grf, priv->pmu, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
case PERIPH_ID_SPI1:
|
||||
case PERIPH_ID_SPI2:
|
||||
pinctrl_rk3188_spi_config(priv->grf, func, flags);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
pinctrl_rk3188_uart_config(priv->grf, func);
|
||||
break;
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk3188_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3188_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 44:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 45:
|
||||
return PERIPH_ID_SPI1;
|
||||
case 46:
|
||||
return PERIPH_ID_SPI2;
|
||||
case 60:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 62: /* Note strange order */
|
||||
return PERIPH_ID_I2C1;
|
||||
case 61:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 63:
|
||||
return PERIPH_ID_I2C3;
|
||||
case 64:
|
||||
return PERIPH_ID_I2C4;
|
||||
case 65:
|
||||
return PERIPH_ID_I2C5;
|
||||
}
|
||||
#endif
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3188_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3188_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
return rk3188_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
int rk3188_pinctrl_get_pin_info(struct rk3188_pinctrl_priv *priv,
|
||||
int banknum, int ind, u32 **addrp, uint *shiftp,
|
||||
uint *maskp)
|
||||
{
|
||||
struct rockchip_pin_bank *bank = &rk3188_pin_banks[banknum];
|
||||
uint muxnum;
|
||||
u32 *addr;
|
||||
|
||||
for (muxnum = 0; muxnum < 4; muxnum++) {
|
||||
struct rockchip_iomux *mux = &bank->iomux[muxnum];
|
||||
|
||||
if (ind >= 8) {
|
||||
ind -= 8;
|
||||
continue;
|
||||
}
|
||||
|
||||
addr = &priv->grf->gpio0c_iomux - 2;
|
||||
addr += mux->offset;
|
||||
*shiftp = ind & 7;
|
||||
*maskp = 3;
|
||||
*shiftp *= 2;
|
||||
|
||||
debug("%s: addr=%p, mask=%x, shift=%x\n", __func__, addr,
|
||||
*maskp, *shiftp);
|
||||
*addrp = addr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int rk3188_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
|
||||
int index)
|
||||
{
|
||||
struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
uint shift;
|
||||
uint mask;
|
||||
u32 *addr;
|
||||
int ret;
|
||||
|
||||
ret = rk3188_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
|
||||
&mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
return (readl(addr) & mask) >> shift;
|
||||
}
|
||||
|
||||
static int rk3188_pinctrl_set_pins(struct udevice *dev, int banknum, int index,
|
||||
int muxval, int flags)
|
||||
{
|
||||
struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
uint shift, ind = index;
|
||||
uint mask;
|
||||
u32 *addr;
|
||||
int ret;
|
||||
|
||||
debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags);
|
||||
ret = rk3188_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
|
||||
&mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
rk_clrsetreg(addr, mask << shift, muxval << shift);
|
||||
|
||||
/* Handle pullup/pulldown */
|
||||
if (flags) {
|
||||
uint val = 0;
|
||||
|
||||
if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP))
|
||||
val = 1;
|
||||
else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN))
|
||||
val = 2;
|
||||
|
||||
ind = index >> 3;
|
||||
|
||||
if (banknum == 0 && index < 12) {
|
||||
addr = &priv->pmu->gpio0_p[ind];
|
||||
shift = (index & 7) * 2;
|
||||
} else if (banknum == 0 && index >= 12) {
|
||||
addr = &priv->grf->gpio0_p[ind - 1];
|
||||
/*
|
||||
* The bits in the grf-registers have an inverse
|
||||
* ordering with the lowest pin being in bits 15:14
|
||||
* and the highest pin in bits 1:0 .
|
||||
*/
|
||||
shift = (7 - (index & 7)) * 2;
|
||||
} else {
|
||||
addr = &priv->grf->gpio1_p[banknum - 1][ind];
|
||||
shift = (7 - (index & 7)) * 2;
|
||||
}
|
||||
debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val,
|
||||
shift);
|
||||
rk_clrsetreg(addr, 3 << shift, val << shift);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3188_pinctrl_set_state(struct udevice *dev, struct udevice *config)
|
||||
{
|
||||
const void *blob = gd->fdt_blob;
|
||||
int pcfg_node, ret, flags, count, i;
|
||||
u32 cell[60], *ptr;
|
||||
|
||||
debug("%s: %s %s\n", __func__, dev->name, config->name);
|
||||
ret = fdtdec_get_int_array_count(blob, dev_of_offset(config),
|
||||
"rockchip,pins", cell,
|
||||
ARRAY_SIZE(cell));
|
||||
if (ret < 0) {
|
||||
debug("%s: bad array %d\n", __func__, ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
count = ret;
|
||||
for (i = 0, ptr = cell; i < count; i += 4, ptr += 4) {
|
||||
pcfg_node = fdt_node_offset_by_phandle(blob, ptr[3]);
|
||||
if (pcfg_node < 0)
|
||||
return -EINVAL;
|
||||
flags = pinctrl_decode_pin_config(blob, pcfg_node);
|
||||
if (flags < 0)
|
||||
return flags;
|
||||
|
||||
ret = rk3188_pinctrl_set_pins(dev, ptr[0], ptr[1], ptr[2],
|
||||
flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct pinctrl_ops rk3188_pinctrl_ops = {
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
.set_state = rk3188_pinctrl_set_state,
|
||||
.get_gpio_mux = rk3188_pinctrl_get_gpio_mux,
|
||||
#endif
|
||||
.set_state_simple = rk3188_pinctrl_set_state_simple,
|
||||
.request = rk3188_pinctrl_request,
|
||||
.get_periph_id = rk3188_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
static int rk3188_pinctrl_parse_tables(struct rk3188_pinctrl_priv *priv,
|
||||
struct rockchip_pin_bank *banks,
|
||||
int count)
|
||||
{
|
||||
struct rockchip_pin_bank *bank;
|
||||
uint reg, muxnum, banknum;
|
||||
|
||||
reg = 0;
|
||||
for (banknum = 0; banknum < count; banknum++) {
|
||||
bank = &banks[banknum];
|
||||
bank->reg = reg;
|
||||
debug("%s: bank %d, reg %x\n", __func__, banknum, reg * 4);
|
||||
for (muxnum = 0; muxnum < 4; muxnum++) {
|
||||
struct rockchip_iomux *mux = &bank->iomux[muxnum];
|
||||
|
||||
mux->offset = reg;
|
||||
reg += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rk3188_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
int ret = 0;
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
priv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
|
||||
debug("%s: grf=%p, pmu=%p\n", __func__, priv->grf, priv->pmu);
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
ret = rk3188_pinctrl_parse_tables(priv, rk3188_pin_banks,
|
||||
ARRAY_SIZE(rk3188_pin_banks));
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3188_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3188-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3188) = {
|
||||
.name = "rockchip_rk3188_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3188_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3188_pinctrl_priv),
|
||||
.ops = &rk3188_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rk3188_pinctrl_probe,
|
||||
};
|
@ -1,894 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2017 Rockchip Electronics Co., Ltd.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk322x.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/* GRF_GPIO0A_IOMUX */
|
||||
enum {
|
||||
GPIO0A7_SHIFT = 14,
|
||||
GPIO0A7_MASK = 3 << GPIO0A7_SHIFT,
|
||||
GPIO0A7_GPIO = 0,
|
||||
GPIO0A7_I2C3_SDA,
|
||||
GPIO0A7_HDMI_DDCSDA,
|
||||
|
||||
GPIO0A6_SHIFT = 12,
|
||||
GPIO0A6_MASK = 3 << GPIO0A6_SHIFT,
|
||||
GPIO0A6_GPIO = 0,
|
||||
GPIO0A6_I2C3_SCL,
|
||||
GPIO0A6_HDMI_DDCSCL,
|
||||
|
||||
GPIO0A3_SHIFT = 6,
|
||||
GPIO0A3_MASK = 3 << GPIO0A3_SHIFT,
|
||||
GPIO0A3_GPIO = 0,
|
||||
GPIO0A3_I2C1_SDA,
|
||||
GPIO0A3_SDIO_CMD,
|
||||
|
||||
GPIO0A2_SHIFT = 4,
|
||||
GPIO0A2_MASK = 3 << GPIO0A2_SHIFT,
|
||||
GPIO0A2_GPIO = 0,
|
||||
GPIO0A2_I2C1_SCL,
|
||||
|
||||
GPIO0A1_SHIFT = 2,
|
||||
GPIO0A1_MASK = 3 << GPIO0A1_SHIFT,
|
||||
GPIO0A1_GPIO = 0,
|
||||
GPIO0A1_I2C0_SDA,
|
||||
|
||||
GPIO0A0_SHIFT = 0,
|
||||
GPIO0A0_MASK = 3 << GPIO0A0_SHIFT,
|
||||
GPIO0A0_GPIO = 0,
|
||||
GPIO0A0_I2C0_SCL,
|
||||
};
|
||||
|
||||
/* GRF_GPIO0B_IOMUX */
|
||||
enum {
|
||||
GPIO0B7_SHIFT = 14,
|
||||
GPIO0B7_MASK = 3 << GPIO0B7_SHIFT,
|
||||
GPIO0B7_GPIO = 0,
|
||||
GPIO0B7_HDMI_HDP,
|
||||
|
||||
GPIO0B6_SHIFT = 12,
|
||||
GPIO0B6_MASK = 3 << GPIO0B6_SHIFT,
|
||||
GPIO0B6_GPIO = 0,
|
||||
GPIO0B6_I2S_SDI,
|
||||
GPIO0B6_SPI_CSN0,
|
||||
|
||||
GPIO0B5_SHIFT = 10,
|
||||
GPIO0B5_MASK = 3 << GPIO0B5_SHIFT,
|
||||
GPIO0B5_GPIO = 0,
|
||||
GPIO0B5_I2S_SDO,
|
||||
GPIO0B5_SPI_RXD,
|
||||
|
||||
GPIO0B3_SHIFT = 6,
|
||||
GPIO0B3_MASK = 3 << GPIO0B3_SHIFT,
|
||||
GPIO0B3_GPIO = 0,
|
||||
GPIO0B3_I2S1_LRCKRX,
|
||||
GPIO0B3_SPI_TXD,
|
||||
|
||||
GPIO0B1_SHIFT = 2,
|
||||
GPIO0B1_MASK = 3 << GPIO0B1_SHIFT,
|
||||
GPIO0B1_GPIO = 0,
|
||||
GPIO0B1_I2S_SCLK,
|
||||
GPIO0B1_SPI_CLK,
|
||||
|
||||
GPIO0B0_SHIFT = 0,
|
||||
GPIO0B0_MASK = 3,
|
||||
GPIO0B0_GPIO = 0,
|
||||
GPIO0B0_I2S_MCLK,
|
||||
};
|
||||
|
||||
/* GRF_GPIO0C_IOMUX */
|
||||
enum {
|
||||
GPIO0C4_SHIFT = 8,
|
||||
GPIO0C4_MASK = 3 << GPIO0C4_SHIFT,
|
||||
GPIO0C4_GPIO = 0,
|
||||
GPIO0C4_HDMI_CECSDA,
|
||||
|
||||
GPIO0C1_SHIFT = 2,
|
||||
GPIO0C1_MASK = 3 << GPIO0C1_SHIFT,
|
||||
GPIO0C1_GPIO = 0,
|
||||
GPIO0C1_UART0_RSTN,
|
||||
GPIO0C1_CLK_OUT1,
|
||||
};
|
||||
|
||||
/* GRF_GPIO0D_IOMUX */
|
||||
enum {
|
||||
GPIO0D6_SHIFT = 12,
|
||||
GPIO0D6_MASK = 3 << GPIO0D6_SHIFT,
|
||||
GPIO0D6_GPIO = 0,
|
||||
GPIO0D6_SDIO_PWREN,
|
||||
GPIO0D6_PWM11,
|
||||
|
||||
GPIO0D4_SHIFT = 8,
|
||||
GPIO0D4_MASK = 3 << GPIO0D4_SHIFT,
|
||||
GPIO0D4_GPIO = 0,
|
||||
GPIO0D4_PWM2,
|
||||
|
||||
GPIO0D3_SHIFT = 6,
|
||||
GPIO0D3_MASK = 3 << GPIO0D3_SHIFT,
|
||||
GPIO0D3_GPIO = 0,
|
||||
GPIO0D3_PWM1,
|
||||
|
||||
GPIO0D2_SHIFT = 4,
|
||||
GPIO0D2_MASK = 3 << GPIO0D2_SHIFT,
|
||||
GPIO0D2_GPIO = 0,
|
||||
GPIO0D2_PWM0,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1A_IOMUX */
|
||||
enum {
|
||||
GPIO1A7_SHIFT = 14,
|
||||
GPIO1A7_MASK = 1,
|
||||
GPIO1A7_GPIO = 0,
|
||||
GPIO1A7_SDMMC_WRPRT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1B_IOMUX */
|
||||
enum {
|
||||
GPIO1B7_SHIFT = 14,
|
||||
GPIO1B7_MASK = 3 << GPIO1B7_SHIFT,
|
||||
GPIO1B7_GPIO = 0,
|
||||
GPIO1B7_SDMMC_CMD,
|
||||
|
||||
GPIO1B6_SHIFT = 12,
|
||||
GPIO1B6_MASK = 3 << GPIO1B6_SHIFT,
|
||||
GPIO1B6_GPIO = 0,
|
||||
GPIO1B6_SDMMC_PWREN,
|
||||
|
||||
GPIO1B4_SHIFT = 8,
|
||||
GPIO1B4_MASK = 3 << GPIO1B4_SHIFT,
|
||||
GPIO1B4_GPIO = 0,
|
||||
GPIO1B4_SPI_CSN1,
|
||||
GPIO1B4_PWM12,
|
||||
|
||||
GPIO1B3_SHIFT = 6,
|
||||
GPIO1B3_MASK = 3 << GPIO1B3_SHIFT,
|
||||
GPIO1B3_GPIO = 0,
|
||||
GPIO1B3_UART1_RSTN,
|
||||
GPIO1B3_PWM13,
|
||||
|
||||
GPIO1B2_SHIFT = 4,
|
||||
GPIO1B2_MASK = 3 << GPIO1B2_SHIFT,
|
||||
GPIO1B2_GPIO = 0,
|
||||
GPIO1B2_UART1_SIN,
|
||||
GPIO1B2_UART21_SIN,
|
||||
|
||||
GPIO1B1_SHIFT = 2,
|
||||
GPIO1B1_MASK = 3 << GPIO1B1_SHIFT,
|
||||
GPIO1B1_GPIO = 0,
|
||||
GPIO1B1_UART1_SOUT,
|
||||
GPIO1B1_UART21_SOUT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1C_IOMUX */
|
||||
enum {
|
||||
GPIO1C7_SHIFT = 14,
|
||||
GPIO1C7_MASK = 3 << GPIO1C7_SHIFT,
|
||||
GPIO1C7_GPIO = 0,
|
||||
GPIO1C7_NAND_CS3,
|
||||
GPIO1C7_EMMC_RSTNOUT,
|
||||
|
||||
GPIO1C6_SHIFT = 12,
|
||||
GPIO1C6_MASK = 3 << GPIO1C6_SHIFT,
|
||||
GPIO1C6_GPIO = 0,
|
||||
GPIO1C6_NAND_CS2,
|
||||
GPIO1C6_EMMC_CMD,
|
||||
|
||||
GPIO1C5_SHIFT = 10,
|
||||
GPIO1C5_MASK = 3 << GPIO1C5_SHIFT,
|
||||
GPIO1C5_GPIO = 0,
|
||||
GPIO1C5_SDMMC_D3,
|
||||
GPIO1C5_JTAG_TMS,
|
||||
|
||||
GPIO1C4_SHIFT = 8,
|
||||
GPIO1C4_MASK = 3 << GPIO1C4_SHIFT,
|
||||
GPIO1C4_GPIO = 0,
|
||||
GPIO1C4_SDMMC_D2,
|
||||
GPIO1C4_JTAG_TCK,
|
||||
|
||||
GPIO1C3_SHIFT = 6,
|
||||
GPIO1C3_MASK = 3 << GPIO1C3_SHIFT,
|
||||
GPIO1C3_GPIO = 0,
|
||||
GPIO1C3_SDMMC_D1,
|
||||
GPIO1C3_UART2_SIN,
|
||||
|
||||
GPIO1C2_SHIFT = 4,
|
||||
GPIO1C2_MASK = 3 << GPIO1C2_SHIFT,
|
||||
GPIO1C2_GPIO = 0,
|
||||
GPIO1C2_SDMMC_D0,
|
||||
GPIO1C2_UART2_SOUT,
|
||||
|
||||
GPIO1C1_SHIFT = 2,
|
||||
GPIO1C1_MASK = 3 << GPIO1C1_SHIFT,
|
||||
GPIO1C1_GPIO = 0,
|
||||
GPIO1C1_SDMMC_DETN,
|
||||
|
||||
GPIO1C0_SHIFT = 0,
|
||||
GPIO1C0_MASK = 3 << GPIO1C0_SHIFT,
|
||||
GPIO1C0_GPIO = 0,
|
||||
GPIO1C0_SDMMC_CLKOUT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO1D_IOMUX */
|
||||
enum {
|
||||
GPIO1D7_SHIFT = 14,
|
||||
GPIO1D7_MASK = 3 << GPIO1D7_SHIFT,
|
||||
GPIO1D7_GPIO = 0,
|
||||
GPIO1D7_NAND_D7,
|
||||
GPIO1D7_EMMC_D7,
|
||||
|
||||
GPIO1D6_SHIFT = 12,
|
||||
GPIO1D6_MASK = 3 << GPIO1D6_SHIFT,
|
||||
GPIO1D6_GPIO = 0,
|
||||
GPIO1D6_NAND_D6,
|
||||
GPIO1D6_EMMC_D6,
|
||||
|
||||
GPIO1D5_SHIFT = 10,
|
||||
GPIO1D5_MASK = 3 << GPIO1D5_SHIFT,
|
||||
GPIO1D5_GPIO = 0,
|
||||
GPIO1D5_NAND_D5,
|
||||
GPIO1D5_EMMC_D5,
|
||||
|
||||
GPIO1D4_SHIFT = 8,
|
||||
GPIO1D4_MASK = 3 << GPIO1D4_SHIFT,
|
||||
GPIO1D4_GPIO = 0,
|
||||
GPIO1D4_NAND_D4,
|
||||
GPIO1D4_EMMC_D4,
|
||||
|
||||
GPIO1D3_SHIFT = 6,
|
||||
GPIO1D3_MASK = 3 << GPIO1D3_SHIFT,
|
||||
GPIO1D3_GPIO = 0,
|
||||
GPIO1D3_NAND_D3,
|
||||
GPIO1D3_EMMC_D3,
|
||||
|
||||
GPIO1D2_SHIFT = 4,
|
||||
GPIO1D2_MASK = 3 << GPIO1D2_SHIFT,
|
||||
GPIO1D2_GPIO = 0,
|
||||
GPIO1D2_NAND_D2,
|
||||
GPIO1D2_EMMC_D2,
|
||||
|
||||
GPIO1D1_SHIFT = 2,
|
||||
GPIO1D1_MASK = 3 << GPIO1D1_SHIFT,
|
||||
GPIO1D1_GPIO = 0,
|
||||
GPIO1D1_NAND_D1,
|
||||
GPIO1D1_EMMC_D1,
|
||||
|
||||
GPIO1D0_SHIFT = 0,
|
||||
GPIO1D0_MASK = 3 << GPIO1D0_SHIFT,
|
||||
GPIO1D0_GPIO = 0,
|
||||
GPIO1D0_NAND_D0,
|
||||
GPIO1D0_EMMC_D0,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2A_IOMUX */
|
||||
enum {
|
||||
GPIO2A7_SHIFT = 14,
|
||||
GPIO2A7_MASK = 3 << GPIO2A7_SHIFT,
|
||||
GPIO2A7_GPIO = 0,
|
||||
GPIO2A7_NAND_DQS,
|
||||
GPIO2A7_EMMC_CLKOUT,
|
||||
|
||||
GPIO2A5_SHIFT = 10,
|
||||
GPIO2A5_MASK = 3 << GPIO2A5_SHIFT,
|
||||
GPIO2A5_GPIO = 0,
|
||||
GPIO2A5_NAND_WP,
|
||||
GPIO2A5_EMMC_PWREN,
|
||||
|
||||
GPIO2A4_SHIFT = 8,
|
||||
GPIO2A4_MASK = 3 << GPIO2A4_SHIFT,
|
||||
GPIO2A4_GPIO = 0,
|
||||
GPIO2A4_NAND_RDY,
|
||||
GPIO2A4_EMMC_CMD,
|
||||
|
||||
GPIO2A3_SHIFT = 6,
|
||||
GPIO2A3_MASK = 3 << GPIO2A3_SHIFT,
|
||||
GPIO2A3_GPIO = 0,
|
||||
GPIO2A3_NAND_RDN,
|
||||
GPIO2A4_SPI1_CSN1,
|
||||
|
||||
GPIO2A2_SHIFT = 4,
|
||||
GPIO2A2_MASK = 3 << GPIO2A2_SHIFT,
|
||||
GPIO2A2_GPIO = 0,
|
||||
GPIO2A2_NAND_WRN,
|
||||
GPIO2A4_SPI1_CSN0,
|
||||
|
||||
GPIO2A1_SHIFT = 2,
|
||||
GPIO2A1_MASK = 3 << GPIO2A1_SHIFT,
|
||||
GPIO2A1_GPIO = 0,
|
||||
GPIO2A1_NAND_CLE,
|
||||
GPIO2A1_SPI1_TXD,
|
||||
|
||||
GPIO2A0_SHIFT = 0,
|
||||
GPIO2A0_MASK = 3 << GPIO2A0_SHIFT,
|
||||
GPIO2A0_GPIO = 0,
|
||||
GPIO2A0_NAND_ALE,
|
||||
GPIO2A0_SPI1_RXD,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2B_IOMUX */
|
||||
enum {
|
||||
GPIO2B7_SHIFT = 14,
|
||||
GPIO2B7_MASK = 3 << GPIO2B7_SHIFT,
|
||||
GPIO2B7_GPIO = 0,
|
||||
GPIO2B7_GMAC_RXER,
|
||||
|
||||
GPIO2B6_SHIFT = 12,
|
||||
GPIO2B6_MASK = 3 << GPIO2B6_SHIFT,
|
||||
GPIO2B6_GPIO = 0,
|
||||
GPIO2B6_GMAC_CLK,
|
||||
GPIO2B6_MAC_LINK,
|
||||
|
||||
GPIO2B5_SHIFT = 10,
|
||||
GPIO2B5_MASK = 3 << GPIO2B5_SHIFT,
|
||||
GPIO2B5_GPIO = 0,
|
||||
GPIO2B5_GMAC_TXEN,
|
||||
|
||||
GPIO2B4_SHIFT = 8,
|
||||
GPIO2B4_MASK = 3 << GPIO2B4_SHIFT,
|
||||
GPIO2B4_GPIO = 0,
|
||||
GPIO2B4_GMAC_MDIO,
|
||||
|
||||
GPIO2B3_SHIFT = 6,
|
||||
GPIO2B3_MASK = 3 << GPIO2B3_SHIFT,
|
||||
GPIO2B3_GPIO = 0,
|
||||
GPIO2B3_GMAC_RXCLK,
|
||||
|
||||
GPIO2B2_SHIFT = 4,
|
||||
GPIO2B2_MASK = 3 << GPIO2B2_SHIFT,
|
||||
GPIO2B2_GPIO = 0,
|
||||
GPIO2B2_GMAC_CRS,
|
||||
|
||||
GPIO2B1_SHIFT = 2,
|
||||
GPIO2B1_MASK = 3 << GPIO2B1_SHIFT,
|
||||
GPIO2B1_GPIO = 0,
|
||||
GPIO2B1_GMAC_TXCLK,
|
||||
|
||||
GPIO2B0_SHIFT = 0,
|
||||
GPIO2B0_MASK = 3 << GPIO2B0_SHIFT,
|
||||
GPIO2B0_GPIO = 0,
|
||||
GPIO2B0_GMAC_RXDV,
|
||||
GPIO2B0_MAC_SPEED_IOUT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2C_IOMUX */
|
||||
enum {
|
||||
GPIO2C7_SHIFT = 14,
|
||||
GPIO2C7_MASK = 3 << GPIO2C7_SHIFT,
|
||||
GPIO2C7_GPIO = 0,
|
||||
GPIO2C7_GMAC_TXD3,
|
||||
|
||||
GPIO2C6_SHIFT = 12,
|
||||
GPIO2C6_MASK = 3 << GPIO2C6_SHIFT,
|
||||
GPIO2C6_GPIO = 0,
|
||||
GPIO2C6_GMAC_TXD2,
|
||||
|
||||
GPIO2C5_SHIFT = 10,
|
||||
GPIO2C5_MASK = 3 << GPIO2C5_SHIFT,
|
||||
GPIO2C5_GPIO = 0,
|
||||
GPIO2C5_I2C2_SCL,
|
||||
GPIO2C5_GMAC_RXD2,
|
||||
|
||||
GPIO2C4_SHIFT = 8,
|
||||
GPIO2C4_MASK = 3 << GPIO2C4_SHIFT,
|
||||
GPIO2C4_GPIO = 0,
|
||||
GPIO2C4_I2C2_SDA,
|
||||
GPIO2C4_GMAC_RXD3,
|
||||
|
||||
GPIO2C3_SHIFT = 6,
|
||||
GPIO2C3_MASK = 3 << GPIO2C3_SHIFT,
|
||||
GPIO2C3_GPIO = 0,
|
||||
GPIO2C3_GMAC_TXD0,
|
||||
|
||||
GPIO2C2_SHIFT = 4,
|
||||
GPIO2C2_MASK = 3 << GPIO2C2_SHIFT,
|
||||
GPIO2C2_GPIO = 0,
|
||||
GPIO2C2_GMAC_TXD1,
|
||||
|
||||
GPIO2C1_SHIFT = 2,
|
||||
GPIO2C1_MASK = 3 << GPIO2C1_SHIFT,
|
||||
GPIO2C1_GPIO = 0,
|
||||
GPIO2C1_GMAC_RXD0,
|
||||
|
||||
GPIO2C0_SHIFT = 0,
|
||||
GPIO2C0_MASK = 3 << GPIO2C0_SHIFT,
|
||||
GPIO2C0_GPIO = 0,
|
||||
GPIO2C0_GMAC_RXD1,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2D_IOMUX */
|
||||
enum {
|
||||
GPIO2D1_SHIFT = 2,
|
||||
GPIO2D1_MASK = 3 << GPIO2D1_SHIFT,
|
||||
GPIO2D1_GPIO = 0,
|
||||
GPIO2D1_GMAC_MDC,
|
||||
|
||||
GPIO2D0_SHIFT = 0,
|
||||
GPIO2D0_MASK = 3,
|
||||
GPIO2D0_GPIO = 0,
|
||||
GPIO2D0_GMAC_COL,
|
||||
};
|
||||
|
||||
/* GRF_GPIO3C_IOMUX */
|
||||
enum {
|
||||
GPIO3C6_SHIFT = 12,
|
||||
GPIO3C6_MASK = 3 << GPIO3C6_SHIFT,
|
||||
GPIO3C6_GPIO = 0,
|
||||
GPIO3C6_DRV_VBUS1,
|
||||
|
||||
GPIO3C5_SHIFT = 10,
|
||||
GPIO3C5_MASK = 3 << GPIO3C5_SHIFT,
|
||||
GPIO3C5_GPIO = 0,
|
||||
GPIO3C5_PWM10,
|
||||
|
||||
GPIO3C1_SHIFT = 2,
|
||||
GPIO3C1_MASK = 3 << GPIO3C1_SHIFT,
|
||||
GPIO3C1_GPIO = 0,
|
||||
GPIO3C1_DRV_VBUS,
|
||||
};
|
||||
|
||||
/* GRF_GPIO3D_IOMUX */
|
||||
enum {
|
||||
GPIO3D2_SHIFT = 4,
|
||||
GPIO3D2_MASK = 3 << GPIO3D2_SHIFT,
|
||||
GPIO3D2_GPIO = 0,
|
||||
GPIO3D2_PWM3,
|
||||
};
|
||||
|
||||
/* GRF_CON_IOMUX */
|
||||
enum {
|
||||
CON_IOMUX_GMACSEL_SHIFT = 15,
|
||||
CON_IOMUX_GMACSEL_MASK = 1 << CON_IOMUX_GMACSEL_SHIFT,
|
||||
CON_IOMUX_GMACSEL_1 = 1,
|
||||
CON_IOMUX_UART1SEL_SHIFT = 11,
|
||||
CON_IOMUX_UART1SEL_MASK = 1 << CON_IOMUX_UART1SEL_SHIFT,
|
||||
CON_IOMUX_UART2SEL_SHIFT = 8,
|
||||
CON_IOMUX_UART2SEL_MASK = 1 << CON_IOMUX_UART2SEL_SHIFT,
|
||||
CON_IOMUX_UART2SEL_2 = 0,
|
||||
CON_IOMUX_UART2SEL_21,
|
||||
CON_IOMUX_EMMCSEL_SHIFT = 7,
|
||||
CON_IOMUX_EMMCSEL_MASK = 1 << CON_IOMUX_EMMCSEL_SHIFT,
|
||||
CON_IOMUX_PWM3SEL_SHIFT = 3,
|
||||
CON_IOMUX_PWM3SEL_MASK = 1 << CON_IOMUX_PWM3SEL_SHIFT,
|
||||
CON_IOMUX_PWM2SEL_SHIFT = 2,
|
||||
CON_IOMUX_PWM2SEL_MASK = 1 << CON_IOMUX_PWM2SEL_SHIFT,
|
||||
CON_IOMUX_PWM1SEL_SHIFT = 1,
|
||||
CON_IOMUX_PWM1SEL_MASK = 1 << CON_IOMUX_PWM1SEL_SHIFT,
|
||||
CON_IOMUX_PWM0SEL_SHIFT = 0,
|
||||
CON_IOMUX_PWM0SEL_MASK = 1 << CON_IOMUX_PWM0SEL_SHIFT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2B_E */
|
||||
enum {
|
||||
GRF_GPIO2B0_E_SHIFT = 0,
|
||||
GRF_GPIO2B0_E_MASK = 3 << GRF_GPIO2B0_E_SHIFT,
|
||||
GRF_GPIO2B1_E_SHIFT = 2,
|
||||
GRF_GPIO2B1_E_MASK = 3 << GRF_GPIO2B1_E_SHIFT,
|
||||
GRF_GPIO2B3_E_SHIFT = 6,
|
||||
GRF_GPIO2B3_E_MASK = 3 << GRF_GPIO2B3_E_SHIFT,
|
||||
GRF_GPIO2B4_E_SHIFT = 8,
|
||||
GRF_GPIO2B4_E_MASK = 3 << GRF_GPIO2B4_E_SHIFT,
|
||||
GRF_GPIO2B5_E_SHIFT = 10,
|
||||
GRF_GPIO2B5_E_MASK = 3 << GRF_GPIO2B5_E_SHIFT,
|
||||
GRF_GPIO2B6_E_SHIFT = 12,
|
||||
GRF_GPIO2B6_E_MASK = 3 << GRF_GPIO2B6_E_SHIFT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2C_E */
|
||||
enum {
|
||||
GRF_GPIO2C0_E_SHIFT = 0,
|
||||
GRF_GPIO2C0_E_MASK = 3 << GRF_GPIO2C0_E_SHIFT,
|
||||
GRF_GPIO2C1_E_SHIFT = 2,
|
||||
GRF_GPIO2C1_E_MASK = 3 << GRF_GPIO2C1_E_SHIFT,
|
||||
GRF_GPIO2C2_E_SHIFT = 4,
|
||||
GRF_GPIO2C2_E_MASK = 3 << GRF_GPIO2C2_E_SHIFT,
|
||||
GRF_GPIO2C3_E_SHIFT = 6,
|
||||
GRF_GPIO2C3_E_MASK = 3 << GRF_GPIO2C3_E_SHIFT,
|
||||
GRF_GPIO2C4_E_SHIFT = 8,
|
||||
GRF_GPIO2C4_E_MASK = 3 << GRF_GPIO2C4_E_SHIFT,
|
||||
GRF_GPIO2C5_E_SHIFT = 10,
|
||||
GRF_GPIO2C5_E_MASK = 3 << GRF_GPIO2C5_E_SHIFT,
|
||||
GRF_GPIO2C6_E_SHIFT = 12,
|
||||
GRF_GPIO2C6_E_MASK = 3 << GRF_GPIO2C6_E_SHIFT,
|
||||
GRF_GPIO2C7_E_SHIFT = 14,
|
||||
GRF_GPIO2C7_E_MASK = 3 << GRF_GPIO2C7_E_SHIFT,
|
||||
};
|
||||
|
||||
/* GRF_GPIO2D_E */
|
||||
enum {
|
||||
GRF_GPIO2D1_E_SHIFT = 2,
|
||||
GRF_GPIO2D1_E_MASK = 3 << GRF_GPIO2D1_E_SHIFT,
|
||||
};
|
||||
|
||||
/* GPIO Bias drive strength settings */
|
||||
enum GPIO_BIAS {
|
||||
GPIO_BIAS_2MA = 0,
|
||||
GPIO_BIAS_4MA,
|
||||
GPIO_BIAS_8MA,
|
||||
GPIO_BIAS_12MA,
|
||||
};
|
||||
|
||||
struct rk322x_pinctrl_priv {
|
||||
struct rk322x_grf *grf;
|
||||
};
|
||||
|
||||
static void pinctrl_rk322x_pwm_config(struct rk322x_grf *grf, int pwm_id)
|
||||
{
|
||||
u32 mux_con = readl(&grf->con_iomux);
|
||||
|
||||
switch (pwm_id) {
|
||||
case PERIPH_ID_PWM0:
|
||||
if (mux_con & CON_IOMUX_PWM0SEL_MASK)
|
||||
rk_clrsetreg(&grf->gpio3c_iomux, GPIO3C5_MASK,
|
||||
GPIO3C5_PWM10 << GPIO3C5_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D2_MASK,
|
||||
GPIO0D2_PWM0 << GPIO0D2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM1:
|
||||
if (mux_con & CON_IOMUX_PWM1SEL_MASK)
|
||||
rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D6_MASK,
|
||||
GPIO0D6_PWM11 << GPIO0D6_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D3_MASK,
|
||||
GPIO0D3_PWM1 << GPIO0D3_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM2:
|
||||
if (mux_con & CON_IOMUX_PWM2SEL_MASK)
|
||||
rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B4_MASK,
|
||||
GPIO1B4_PWM12 << GPIO1B4_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&grf->gpio0d_iomux, GPIO0D4_MASK,
|
||||
GPIO0D4_PWM2 << GPIO0D4_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM3:
|
||||
if (mux_con & CON_IOMUX_PWM3SEL_MASK)
|
||||
rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B3_MASK,
|
||||
GPIO1B3_PWM13 << GPIO1B3_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D2_MASK,
|
||||
GPIO3D2_PWM3 << GPIO3D2_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("pwm id = %d iomux error!\n", pwm_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk322x_i2c_config(struct rk322x_grf *grf, int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A1_MASK | GPIO0A0_MASK,
|
||||
GPIO0A1_I2C0_SDA << GPIO0A1_SHIFT |
|
||||
GPIO0A0_I2C0_SCL << GPIO0A0_SHIFT);
|
||||
|
||||
break;
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A3_MASK | GPIO0A2_MASK,
|
||||
GPIO0A3_I2C1_SDA << GPIO0A3_SHIFT |
|
||||
GPIO0A2_I2C1_SCL << GPIO0A2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio2c_iomux,
|
||||
GPIO2C5_MASK | GPIO2C4_MASK,
|
||||
GPIO2C5_I2C2_SCL << GPIO2C5_SHIFT |
|
||||
GPIO2C4_I2C2_SDA << GPIO2C4_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C3:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A7_MASK | GPIO0A6_MASK,
|
||||
GPIO0A7_I2C3_SDA << GPIO0A7_SHIFT |
|
||||
GPIO0A6_I2C3_SCL << GPIO0A6_SHIFT);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk322x_spi_config(struct rk322x_grf *grf, int cs)
|
||||
{
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio0b_iomux, GPIO0B6_MASK,
|
||||
GPIO0B6_SPI_CSN0 << GPIO0B6_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B4_MASK,
|
||||
GPIO1B4_SPI_CSN1 << GPIO1B4_SHIFT);
|
||||
break;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio0b_iomux,
|
||||
GPIO0B1_MASK | GPIO0B3_MASK | GPIO0B5_MASK,
|
||||
GPIO0B5_SPI_RXD << GPIO0B5_SHIFT |
|
||||
GPIO0B3_SPI_TXD << GPIO0B3_SHIFT |
|
||||
GPIO0B1_SPI_CLK << GPIO0B1_SHIFT);
|
||||
}
|
||||
|
||||
static void pinctrl_rk322x_uart_config(struct rk322x_grf *grf, int uart_id)
|
||||
{
|
||||
u32 mux_con = readl(&grf->con_iomux);
|
||||
|
||||
switch (uart_id) {
|
||||
case PERIPH_ID_UART1:
|
||||
if (!(mux_con & CON_IOMUX_UART1SEL_MASK))
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B1_MASK | GPIO1B2_MASK,
|
||||
GPIO1B1_UART1_SOUT << GPIO1B1_SHIFT |
|
||||
GPIO1B2_UART1_SIN << GPIO1B2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART2:
|
||||
if (mux_con & CON_IOMUX_UART2SEL_MASK)
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B1_MASK | GPIO1B2_MASK,
|
||||
GPIO1B1_UART21_SOUT << GPIO1B1_SHIFT |
|
||||
GPIO1B2_UART21_SIN << GPIO1B2_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C3_MASK | GPIO1C2_MASK,
|
||||
GPIO1C3_UART2_SIN << GPIO1C3_SHIFT |
|
||||
GPIO1C2_UART2_SOUT << GPIO1C2_SHIFT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk322x_sdmmc_config(struct rk322x_grf *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux, 0xffff,
|
||||
GPIO1D7_EMMC_D7 << GPIO1D7_SHIFT |
|
||||
GPIO1D6_EMMC_D6 << GPIO1D6_SHIFT |
|
||||
GPIO1D5_EMMC_D5 << GPIO1D5_SHIFT |
|
||||
GPIO1D4_EMMC_D4 << GPIO1D4_SHIFT |
|
||||
GPIO1D3_EMMC_D3 << GPIO1D3_SHIFT |
|
||||
GPIO1D2_EMMC_D2 << GPIO1D2_SHIFT |
|
||||
GPIO1D1_EMMC_D1 << GPIO1D1_SHIFT |
|
||||
GPIO1D0_EMMC_D0 << GPIO1D0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A5_MASK | GPIO2A7_MASK,
|
||||
GPIO2A5_EMMC_PWREN << GPIO2A5_SHIFT |
|
||||
GPIO2A7_EMMC_CLKOUT << GPIO2A7_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C6_MASK | GPIO1C7_MASK,
|
||||
GPIO1C6_EMMC_CMD << GPIO1C6_SHIFT |
|
||||
GPIO1C7_EMMC_RSTNOUT << GPIO1C6_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B6_MASK | GPIO1B7_MASK,
|
||||
GPIO1B6_SDMMC_PWREN << GPIO1B6_SHIFT |
|
||||
GPIO1B7_SDMMC_CMD << GPIO1B7_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio1c_iomux, 0xfff,
|
||||
GPIO1C5_SDMMC_D3 << GPIO1C5_SHIFT |
|
||||
GPIO1C4_SDMMC_D2 << GPIO1C4_SHIFT |
|
||||
GPIO1C3_SDMMC_D1 << GPIO1C3_SHIFT |
|
||||
GPIO1C2_SDMMC_D0 << GPIO1C2_SHIFT |
|
||||
GPIO1C1_SDMMC_DETN << GPIO1C1_SHIFT |
|
||||
GPIO1C0_SDMMC_CLKOUT << GPIO1C0_SHIFT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
static void pinctrl_rk322x_gmac_config(struct rk322x_grf *grf, int gmac_id)
|
||||
{
|
||||
switch (gmac_id) {
|
||||
case PERIPH_ID_GMAC:
|
||||
/* set rgmii pins mux */
|
||||
rk_clrsetreg(&grf->gpio2b_iomux,
|
||||
GPIO2B0_MASK |
|
||||
GPIO2B1_MASK |
|
||||
GPIO2B3_MASK |
|
||||
GPIO2B4_MASK |
|
||||
GPIO2B5_MASK |
|
||||
GPIO2B6_MASK,
|
||||
GPIO2B0_GMAC_RXDV << GPIO2B0_SHIFT |
|
||||
GPIO2B1_GMAC_TXCLK << GPIO2B1_SHIFT |
|
||||
GPIO2B3_GMAC_RXCLK << GPIO2B3_SHIFT |
|
||||
GPIO2B4_GMAC_MDIO << GPIO2B4_SHIFT |
|
||||
GPIO2B5_GMAC_TXEN << GPIO2B5_SHIFT |
|
||||
GPIO2B6_GMAC_CLK << GPIO2B6_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio2c_iomux,
|
||||
GPIO2C0_MASK |
|
||||
GPIO2C1_MASK |
|
||||
GPIO2C2_MASK |
|
||||
GPIO2C3_MASK |
|
||||
GPIO2C4_MASK |
|
||||
GPIO2C5_MASK |
|
||||
GPIO2C6_MASK |
|
||||
GPIO2C7_MASK,
|
||||
GPIO2C0_GMAC_RXD1 << GPIO2C0_SHIFT |
|
||||
GPIO2C1_GMAC_RXD0 << GPIO2C1_SHIFT |
|
||||
GPIO2C2_GMAC_TXD1 << GPIO2C2_SHIFT |
|
||||
GPIO2C3_GMAC_TXD0 << GPIO2C3_SHIFT |
|
||||
GPIO2C4_GMAC_RXD3 << GPIO2C4_SHIFT |
|
||||
GPIO2C5_GMAC_RXD2 << GPIO2C5_SHIFT |
|
||||
GPIO2C6_GMAC_TXD2 << GPIO2C6_SHIFT |
|
||||
GPIO2C7_GMAC_TXD3 << GPIO2C7_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio2d_iomux,
|
||||
GPIO2D1_MASK,
|
||||
GPIO2D1_GMAC_MDC << GPIO2D1_SHIFT);
|
||||
|
||||
/*
|
||||
* set rgmii tx pins to 12ma drive-strength,
|
||||
* clean others with 2ma.
|
||||
*/
|
||||
rk_clrsetreg(&grf->gpio2_e[1],
|
||||
GRF_GPIO2B0_E_MASK |
|
||||
GRF_GPIO2B1_E_MASK |
|
||||
GRF_GPIO2B3_E_MASK |
|
||||
GRF_GPIO2B4_E_MASK |
|
||||
GRF_GPIO2B5_E_MASK |
|
||||
GRF_GPIO2B6_E_MASK,
|
||||
GPIO_BIAS_2MA << GRF_GPIO2B0_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO2B1_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO2B3_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO2B4_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO2B5_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO2B6_E_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio2_e[2],
|
||||
GRF_GPIO2C0_E_MASK |
|
||||
GRF_GPIO2C1_E_MASK |
|
||||
GRF_GPIO2C2_E_MASK |
|
||||
GRF_GPIO2C3_E_MASK |
|
||||
GRF_GPIO2C4_E_MASK |
|
||||
GRF_GPIO2C5_E_MASK |
|
||||
GRF_GPIO2C6_E_MASK |
|
||||
GRF_GPIO2C7_E_MASK,
|
||||
GPIO_BIAS_2MA << GRF_GPIO2C0_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO2C1_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO2C2_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO2C3_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO2C4_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO2C5_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO2C6_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO2C7_E_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio2_e[3],
|
||||
GRF_GPIO2D1_E_MASK,
|
||||
GPIO_BIAS_2MA << GRF_GPIO2D1_E_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("gmac id = %d iomux error!\n", gmac_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rk322x_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk322x_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_PWM0:
|
||||
case PERIPH_ID_PWM1:
|
||||
case PERIPH_ID_PWM2:
|
||||
case PERIPH_ID_PWM3:
|
||||
pinctrl_rk322x_pwm_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
pinctrl_rk322x_i2c_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
pinctrl_rk322x_spi_config(priv->grf, flags);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
pinctrl_rk322x_uart_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk322x_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case PERIPH_ID_GMAC:
|
||||
pinctrl_rk322x_gmac_config(priv->grf, func);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk322x_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(periph),
|
||||
"interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 12:
|
||||
return PERIPH_ID_SDCARD;
|
||||
case 14:
|
||||
return PERIPH_ID_EMMC;
|
||||
case 36:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 37:
|
||||
return PERIPH_ID_I2C1;
|
||||
case 38:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 49:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 50:
|
||||
return PERIPH_ID_PWM0;
|
||||
case 55:
|
||||
return PERIPH_ID_UART0;
|
||||
case 56:
|
||||
return PERIPH_ID_UART1;
|
||||
case 57:
|
||||
return PERIPH_ID_UART2;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case 24:
|
||||
return PERIPH_ID_GMAC;
|
||||
#endif
|
||||
}
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk322x_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk322x_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
return rk322x_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops rk322x_pinctrl_ops = {
|
||||
.set_state_simple = rk322x_pinctrl_set_state_simple,
|
||||
.request = rk322x_pinctrl_request,
|
||||
.get_periph_id = rk322x_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
static int rk322x_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk322x_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
debug("%s: grf=%p\n", __func__, priv->grf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk322x_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3228-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3228) = {
|
||||
.name = "pinctrl_rk3228",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk322x_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk322x_pinctrl_priv),
|
||||
.ops = &rk322x_pinctrl_ops,
|
||||
.bind = dm_scan_fdt_dev,
|
||||
.probe = rk322x_pinctrl_probe,
|
||||
};
|
@ -1,869 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Pinctrl driver for Rockchip SoCs
|
||||
* Copyright (c) 2015 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/grf_rk3288.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/pmu_rk3288.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
struct rk3288_pinctrl_priv {
|
||||
struct rk3288_grf *grf;
|
||||
struct rk3288_pmu *pmu;
|
||||
int num_banks;
|
||||
};
|
||||
|
||||
/**
|
||||
* Encode variants of iomux registers into a type variable
|
||||
*/
|
||||
#define IOMUX_GPIO_ONLY BIT(0)
|
||||
#define IOMUX_WIDTH_4BIT BIT(1)
|
||||
#define IOMUX_SOURCE_PMU BIT(2)
|
||||
#define IOMUX_UNROUTED BIT(3)
|
||||
|
||||
/**
|
||||
* @type: iomux variant using IOMUX_* constants
|
||||
* @offset: if initialized to -1 it will be autocalculated, by specifying
|
||||
* an initial offset value the relevant source offset can be reset
|
||||
* to a new value for autocalculating the following iomux registers.
|
||||
*/
|
||||
struct rockchip_iomux {
|
||||
u8 type;
|
||||
s16 offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* @reg: register offset of the gpio bank
|
||||
* @nr_pins: number of pins in this bank
|
||||
* @bank_num: number of the bank, to account for holes
|
||||
* @name: name of the bank
|
||||
* @iomux: array describing the 4 iomux sources of the bank
|
||||
*/
|
||||
struct rockchip_pin_bank {
|
||||
u16 reg;
|
||||
u8 nr_pins;
|
||||
u8 bank_num;
|
||||
char *name;
|
||||
struct rockchip_iomux iomux[4];
|
||||
};
|
||||
|
||||
#define PIN_BANK(id, pins, label) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
{ .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \
|
||||
{ \
|
||||
.bank_num = id, \
|
||||
.nr_pins = pins, \
|
||||
.name = label, \
|
||||
.iomux = { \
|
||||
{ .type = iom0, .offset = -1 }, \
|
||||
{ .type = iom1, .offset = -1 }, \
|
||||
{ .type = iom2, .offset = -1 }, \
|
||||
{ .type = iom3, .offset = -1 }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
static struct rockchip_pin_bank rk3288_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_SOURCE_PMU,
|
||||
IOMUX_UNROUTED
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
|
||||
IOMUX_UNROUTED,
|
||||
IOMUX_UNROUTED,
|
||||
0
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
|
||||
PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
|
||||
PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
0,
|
||||
0
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
|
||||
0,
|
||||
0,
|
||||
IOMUX_UNROUTED
|
||||
),
|
||||
PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
|
||||
PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
|
||||
0,
|
||||
IOMUX_WIDTH_4BIT,
|
||||
IOMUX_UNROUTED
|
||||
),
|
||||
PIN_BANK(8, 16, "gpio8"),
|
||||
};
|
||||
#endif
|
||||
|
||||
static void pinctrl_rk3288_pwm_config(struct rk3288_grf *grf, int pwm_id)
|
||||
{
|
||||
switch (pwm_id) {
|
||||
case PERIPH_ID_PWM0:
|
||||
rk_clrsetreg(&grf->gpio7a_iomux, GPIO7A0_MASK << GPIO7A0_SHIFT,
|
||||
GPIO7A0_PWM_0 << GPIO7A0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM1:
|
||||
rk_clrsetreg(&grf->gpio7a_iomux, GPIO7A1_MASK << GPIO7A1_SHIFT,
|
||||
GPIO7A1_PWM_1 << GPIO7A1_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM2:
|
||||
rk_clrsetreg(&grf->gpio7a_iomux, GPIO7C6_MASK << GPIO7C6_SHIFT,
|
||||
GPIO7C6_PWM_2 << GPIO7C6_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM3:
|
||||
rk_clrsetreg(&grf->gpio7a_iomux, GPIO7C7_MASK << GPIO7C6_SHIFT,
|
||||
GPIO7C7_PWM_3 << GPIO7C7_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("pwm id = %d iomux error!\n", pwm_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3288_i2c_config(struct rk3288_grf *grf,
|
||||
struct rk3288_pmu *pmu, int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
clrsetbits_le32(&pmu->gpio0_iomux[PMU_GPIO0_B],
|
||||
GPIO0_B7_MASK << GPIO0_B7_SHIFT,
|
||||
GPIO0_B7_I2C0PMU_SDA << GPIO0_B7_SHIFT);
|
||||
clrsetbits_le32(&pmu->gpio0_iomux[PMU_GPIO0_C],
|
||||
GPIO0_C0_MASK << GPIO0_C0_SHIFT,
|
||||
GPIO0_C0_I2C0PMU_SCL << GPIO0_C0_SHIFT);
|
||||
break;
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio8a_iomux,
|
||||
GPIO8A4_MASK << GPIO8A4_SHIFT |
|
||||
GPIO8A5_MASK << GPIO8A5_SHIFT,
|
||||
GPIO8A4_I2C2SENSOR_SDA << GPIO8A4_SHIFT |
|
||||
GPIO8A5_I2C2SENSOR_SCL << GPIO8A5_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio6b_iomux,
|
||||
GPIO6B1_MASK << GPIO6B1_SHIFT |
|
||||
GPIO6B2_MASK << GPIO6B2_SHIFT,
|
||||
GPIO6B1_I2C1AUDIO_SDA << GPIO6B1_SHIFT |
|
||||
GPIO6B2_I2C1AUDIO_SCL << GPIO6B2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C3:
|
||||
rk_clrsetreg(&grf->gpio2c_iomux,
|
||||
GPIO2C1_MASK << GPIO2C1_SHIFT |
|
||||
GPIO2C0_MASK << GPIO2C0_SHIFT,
|
||||
GPIO2C1_I2C3CAM_SDA << GPIO2C1_SHIFT |
|
||||
GPIO2C0_I2C3CAM_SCL << GPIO2C0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C4:
|
||||
rk_clrsetreg(&grf->gpio7cl_iomux,
|
||||
GPIO7C1_MASK << GPIO7C1_SHIFT |
|
||||
GPIO7C2_MASK << GPIO7C2_SHIFT,
|
||||
GPIO7C1_I2C4TP_SDA << GPIO7C1_SHIFT |
|
||||
GPIO7C2_I2C4TP_SCL << GPIO7C2_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C5:
|
||||
rk_clrsetreg(&grf->gpio7cl_iomux,
|
||||
GPIO7C3_MASK << GPIO7C3_SHIFT,
|
||||
GPIO7C3_I2C5HDMI_SDA << GPIO7C3_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio7ch_iomux,
|
||||
GPIO7C4_MASK << GPIO7C4_SHIFT,
|
||||
GPIO7C4_I2C5HDMI_SCL << GPIO7C4_SHIFT);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
debug("i2c id = %d iomux error!\n", i2c_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
static void pinctrl_rk3288_lcdc_config(struct rk3288_grf *grf, int lcd_id)
|
||||
{
|
||||
switch (lcd_id) {
|
||||
case PERIPH_ID_LCDC0:
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D3_MASK << GPIO1D0_SHIFT |
|
||||
GPIO1D2_MASK << GPIO1D2_SHIFT |
|
||||
GPIO1D1_MASK << GPIO1D1_SHIFT |
|
||||
GPIO1D0_MASK << GPIO1D0_SHIFT,
|
||||
GPIO1D3_LCDC0_DCLK << GPIO1D3_SHIFT |
|
||||
GPIO1D2_LCDC0_DEN << GPIO1D2_SHIFT |
|
||||
GPIO1D1_LCDC0_VSYNC << GPIO1D1_SHIFT |
|
||||
GPIO1D0_LCDC0_HSYNC << GPIO1D0_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("lcdc id = %d iomux error!\n", lcd_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int pinctrl_rk3288_spi_config(struct rk3288_grf *grf,
|
||||
enum periph_id spi_id, int cs)
|
||||
{
|
||||
switch (spi_id) {
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
case PERIPH_ID_SPI0:
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio5b_iomux,
|
||||
GPIO5B5_MASK << GPIO5B5_SHIFT,
|
||||
GPIO5B5_SPI0_CSN0 << GPIO5B5_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio5c_iomux,
|
||||
GPIO5C0_MASK << GPIO5C0_SHIFT,
|
||||
GPIO5C0_SPI0_CSN1 << GPIO5C0_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio5b_iomux,
|
||||
GPIO5B7_MASK << GPIO5B7_SHIFT |
|
||||
GPIO5B6_MASK << GPIO5B6_SHIFT |
|
||||
GPIO5B4_MASK << GPIO5B4_SHIFT,
|
||||
GPIO5B7_SPI0_RXD << GPIO5B7_SHIFT |
|
||||
GPIO5B6_SPI0_TXD << GPIO5B6_SHIFT |
|
||||
GPIO5B4_SPI0_CLK << GPIO5B4_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SPI1:
|
||||
if (cs != 0)
|
||||
goto err;
|
||||
rk_clrsetreg(&grf->gpio7b_iomux,
|
||||
GPIO7B6_MASK << GPIO7B6_SHIFT |
|
||||
GPIO7B7_MASK << GPIO7B7_SHIFT |
|
||||
GPIO7B5_MASK << GPIO7B5_SHIFT |
|
||||
GPIO7B4_MASK << GPIO7B4_SHIFT,
|
||||
GPIO7B6_SPI1_RXD << GPIO7B6_SHIFT |
|
||||
GPIO7B7_SPI1_TXD << GPIO7B7_SHIFT |
|
||||
GPIO7B5_SPI1_CSN0 << GPIO7B5_SHIFT |
|
||||
GPIO7B4_SPI1_CLK << GPIO7B4_SHIFT);
|
||||
break;
|
||||
#endif
|
||||
case PERIPH_ID_SPI2:
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio8a_iomux,
|
||||
GPIO8A7_MASK << GPIO8A7_SHIFT,
|
||||
GPIO8A7_SPI2_CSN0 << GPIO8A7_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio8a_iomux,
|
||||
GPIO8A3_MASK << GPIO8A3_SHIFT,
|
||||
GPIO8A3_SPI2_CSN1 << GPIO8A3_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio8b_iomux,
|
||||
GPIO8B1_MASK << GPIO8B1_SHIFT |
|
||||
GPIO8B0_MASK << GPIO8B0_SHIFT,
|
||||
GPIO8B1_SPI2_TXD << GPIO8B1_SHIFT |
|
||||
GPIO8B0_SPI2_RXD << GPIO8B0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio8a_iomux,
|
||||
GPIO8A6_MASK << GPIO8A6_SHIFT,
|
||||
GPIO8A6_SPI2_CLK << GPIO8A6_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void pinctrl_rk3288_uart_config(struct rk3288_grf *grf, int uart_id)
|
||||
{
|
||||
switch (uart_id) {
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
case PERIPH_ID_UART_BT:
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GPIO4C3_MASK << GPIO4C3_SHIFT |
|
||||
GPIO4C2_MASK << GPIO4C2_SHIFT |
|
||||
GPIO4C1_MASK << GPIO4C1_SHIFT |
|
||||
GPIO4C0_MASK << GPIO4C0_SHIFT,
|
||||
GPIO4C3_UART0BT_RTSN << GPIO4C3_SHIFT |
|
||||
GPIO4C2_UART0BT_CTSN << GPIO4C2_SHIFT |
|
||||
GPIO4C1_UART0BT_SOUT << GPIO4C1_SHIFT |
|
||||
GPIO4C0_UART0BT_SIN << GPIO4C0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART_BB:
|
||||
rk_clrsetreg(&grf->gpio5b_iomux,
|
||||
GPIO5B3_MASK << GPIO5B3_SHIFT |
|
||||
GPIO5B2_MASK << GPIO5B2_SHIFT |
|
||||
GPIO5B1_MASK << GPIO5B1_SHIFT |
|
||||
GPIO5B0_MASK << GPIO5B0_SHIFT,
|
||||
GPIO5B3_UART1BB_RTSN << GPIO5B3_SHIFT |
|
||||
GPIO5B2_UART1BB_CTSN << GPIO5B2_SHIFT |
|
||||
GPIO5B1_UART1BB_SOUT << GPIO5B1_SHIFT |
|
||||
GPIO5B0_UART1BB_SIN << GPIO5B0_SHIFT);
|
||||
break;
|
||||
#endif
|
||||
case PERIPH_ID_UART_DBG:
|
||||
rk_clrsetreg(&grf->gpio7ch_iomux,
|
||||
GPIO7C7_MASK << GPIO7C7_SHIFT |
|
||||
GPIO7C6_MASK << GPIO7C6_SHIFT,
|
||||
GPIO7C7_UART2DBG_SOUT << GPIO7C7_SHIFT |
|
||||
GPIO7C6_UART2DBG_SIN << GPIO7C6_SHIFT);
|
||||
break;
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
case PERIPH_ID_UART_GPS:
|
||||
rk_clrsetreg(&grf->gpio7b_iomux,
|
||||
GPIO7B2_MASK << GPIO7B2_SHIFT |
|
||||
GPIO7B1_MASK << GPIO7B1_SHIFT |
|
||||
GPIO7B0_MASK << GPIO7B0_SHIFT,
|
||||
GPIO7B2_UART3GPS_RTSN << GPIO7B2_SHIFT |
|
||||
GPIO7B1_UART3GPS_CTSN << GPIO7B1_SHIFT |
|
||||
GPIO7B0_UART3GPS_SOUT << GPIO7B0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio7a_iomux,
|
||||
GPIO7A7_MASK << GPIO7A7_SHIFT,
|
||||
GPIO7A7_UART3GPS_SIN << GPIO7A7_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART_EXP:
|
||||
rk_clrsetreg(&grf->gpio5b_iomux,
|
||||
GPIO5B5_MASK << GPIO5B5_SHIFT |
|
||||
GPIO5B4_MASK << GPIO5B4_SHIFT |
|
||||
GPIO5B6_MASK << GPIO5B6_SHIFT |
|
||||
GPIO5B7_MASK << GPIO5B7_SHIFT,
|
||||
GPIO5B5_UART4EXP_RTSN << GPIO5B5_SHIFT |
|
||||
GPIO5B4_UART4EXP_CTSN << GPIO5B4_SHIFT |
|
||||
GPIO5B6_UART4EXP_SOUT << GPIO5B6_SHIFT |
|
||||
GPIO5B7_UART4EXP_SIN << GPIO5B7_SHIFT);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
debug("uart id = %d iomux error!\n", uart_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3288_sdmmc_config(struct rk3288_grf *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
rk_clrsetreg(&grf->gpio3a_iomux, 0xffff,
|
||||
GPIO3A7_EMMC_DATA7 << GPIO3A7_SHIFT |
|
||||
GPIO3A6_EMMC_DATA6 << GPIO3A6_SHIFT |
|
||||
GPIO3A5_EMMC_DATA5 << GPIO3A5_SHIFT |
|
||||
GPIO3A4_EMMC_DATA4 << GPIO3A4_SHIFT |
|
||||
GPIO3A3_EMMC_DATA3 << GPIO3A3_SHIFT |
|
||||
GPIO3A2_EMMC_DATA2 << GPIO3A2_SHIFT |
|
||||
GPIO3A1_EMMC_DATA1 << GPIO3A1_SHIFT |
|
||||
GPIO3A0_EMMC_DATA0 << GPIO3A0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3b_iomux, GPIO3B1_MASK << GPIO3B1_SHIFT,
|
||||
GPIO3B1_EMMC_PWREN << GPIO3B1_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3c_iomux,
|
||||
GPIO3C0_MASK << GPIO3C0_SHIFT,
|
||||
GPIO3C0_EMMC_CMD << GPIO3C0_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
rk_clrsetreg(&grf->gpio6c_iomux, 0xffff,
|
||||
GPIO6C6_SDMMC0_DECTN << GPIO6C6_SHIFT |
|
||||
GPIO6C5_SDMMC0_CMD << GPIO6C5_SHIFT |
|
||||
GPIO6C4_SDMMC0_CLKOUT << GPIO6C4_SHIFT |
|
||||
GPIO6C3_SDMMC0_DATA3 << GPIO6C3_SHIFT |
|
||||
GPIO6C2_SDMMC0_DATA2 << GPIO6C2_SHIFT |
|
||||
GPIO6C1_SDMMC0_DATA1 << GPIO6C1_SHIFT |
|
||||
GPIO6C0_SDMMC0_DATA0 << GPIO6C0_SHIFT);
|
||||
|
||||
/* use sdmmc0 io, disable JTAG function */
|
||||
rk_clrsetreg(&grf->soc_con0, 1 << GRF_FORCE_JTAG_SHIFT, 0);
|
||||
break;
|
||||
default:
|
||||
debug("mmc id = %d iomux error!\n", mmc_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3288_gmac_config(struct rk3288_grf *grf, int gmac_id)
|
||||
{
|
||||
switch (gmac_id) {
|
||||
case PERIPH_ID_GMAC:
|
||||
rk_clrsetreg(&grf->gpio3dl_iomux,
|
||||
GPIO3D3_MASK << GPIO3D3_SHIFT |
|
||||
GPIO3D2_MASK << GPIO3D2_SHIFT |
|
||||
GPIO3D2_MASK << GPIO3D1_SHIFT |
|
||||
GPIO3D0_MASK << GPIO3D0_SHIFT,
|
||||
GPIO3D3_MAC_RXD3 << GPIO3D3_SHIFT |
|
||||
GPIO3D2_MAC_RXD2 << GPIO3D2_SHIFT |
|
||||
GPIO3D1_MAC_TXD3 << GPIO3D1_SHIFT |
|
||||
GPIO3D0_MAC_TXD2 << GPIO3D0_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio3dh_iomux,
|
||||
GPIO3D7_MASK << GPIO3D7_SHIFT |
|
||||
GPIO3D6_MASK << GPIO3D6_SHIFT |
|
||||
GPIO3D5_MASK << GPIO3D5_SHIFT |
|
||||
GPIO3D4_MASK << GPIO3D4_SHIFT,
|
||||
GPIO3D7_MAC_RXD1 << GPIO3D7_SHIFT |
|
||||
GPIO3D6_MAC_RXD0 << GPIO3D6_SHIFT |
|
||||
GPIO3D5_MAC_TXD1 << GPIO3D5_SHIFT |
|
||||
GPIO3D4_MAC_TXD0 << GPIO3D4_SHIFT);
|
||||
|
||||
/* switch the Tx pins to 12ma drive-strength */
|
||||
rk_clrsetreg(&grf->gpio1_e[2][3],
|
||||
GPIO_BIAS_MASK |
|
||||
(GPIO_BIAS_MASK << GPIO_BIAS_SHIFT(1)) |
|
||||
(GPIO_BIAS_MASK << GPIO_BIAS_SHIFT(4)) |
|
||||
(GPIO_BIAS_MASK << GPIO_BIAS_SHIFT(5)),
|
||||
(GPIO_BIAS_12MA << GPIO_BIAS_SHIFT(0)) |
|
||||
(GPIO_BIAS_12MA << GPIO_BIAS_SHIFT(1)) |
|
||||
(GPIO_BIAS_12MA << GPIO_BIAS_SHIFT(4)) |
|
||||
(GPIO_BIAS_12MA << GPIO_BIAS_SHIFT(5)));
|
||||
|
||||
/* Set normal pull for all GPIO3D pins */
|
||||
rk_clrsetreg(&grf->gpio1_p[2][3],
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(0)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(1)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(2)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(3)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(4)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(5)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(5)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(7)),
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(0)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(1)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(2)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(3)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(4)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(5)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(6)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(7)));
|
||||
|
||||
rk_clrsetreg(&grf->gpio4al_iomux,
|
||||
GPIO4A3_MASK << GPIO4A3_SHIFT |
|
||||
GPIO4A1_MASK << GPIO4A1_SHIFT |
|
||||
GPIO4A0_MASK << GPIO4A0_SHIFT,
|
||||
GPIO4A3_MAC_CLK << GPIO4A3_SHIFT |
|
||||
GPIO4A1_MAC_TXDV << GPIO4A1_SHIFT |
|
||||
GPIO4A0_MAC_MDC << GPIO4A0_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio4ah_iomux,
|
||||
GPIO4A6_MASK << GPIO4A6_SHIFT |
|
||||
GPIO4A5_MASK << GPIO4A5_SHIFT |
|
||||
GPIO4A4_MASK << GPIO4A4_SHIFT,
|
||||
GPIO4A6_MAC_RXCLK << GPIO4A6_SHIFT |
|
||||
GPIO4A5_MAC_MDIO << GPIO4A5_SHIFT |
|
||||
GPIO4A4_MAC_TXEN << GPIO4A4_SHIFT);
|
||||
|
||||
/* switch GPIO4A4 to 12ma drive-strength */
|
||||
rk_clrsetreg(&grf->gpio1_e[3][0],
|
||||
GPIO_BIAS_MASK << GPIO_BIAS_SHIFT(4),
|
||||
GPIO_BIAS_12MA << GPIO_BIAS_SHIFT(4));
|
||||
|
||||
/* Set normal pull for all GPIO4A pins */
|
||||
rk_clrsetreg(&grf->gpio1_p[3][0],
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(0)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(1)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(2)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(3)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(4)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(5)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(5)) |
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(7)),
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(0)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(1)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(2)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(3)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(4)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(5)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(6)) |
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(7)));
|
||||
|
||||
rk_clrsetreg(&grf->gpio4bl_iomux,
|
||||
GPIO4B1_MASK << GPIO4B1_SHIFT,
|
||||
GPIO4B1_MAC_TXCLK << GPIO4B1_SHIFT);
|
||||
|
||||
/* switch GPIO4B1 to 12ma drive-strength */
|
||||
rk_clrsetreg(&grf->gpio1_e[3][1],
|
||||
GPIO_BIAS_MASK << GPIO_BIAS_SHIFT(1),
|
||||
GPIO_BIAS_12MA << GPIO_BIAS_SHIFT(1));
|
||||
|
||||
/* Set pull normal for GPIO4B1 */
|
||||
rk_clrsetreg(&grf->gpio1_p[3][1],
|
||||
(GPIO_PULL_MASK << GPIO_PULL_SHIFT(1)),
|
||||
(GPIO_PULL_NORMAL << GPIO_PULL_SHIFT(1)));
|
||||
|
||||
break;
|
||||
default:
|
||||
printf("gmac id = %d iomux error!\n", gmac_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
static void pinctrl_rk3288_hdmi_config(struct rk3288_grf *grf, int hdmi_id)
|
||||
{
|
||||
switch (hdmi_id) {
|
||||
case PERIPH_ID_HDMI:
|
||||
rk_clrsetreg(&grf->gpio7cl_iomux, GPIO7C3_MASK << GPIO7C3_SHIFT,
|
||||
GPIO7C3_EDPHDMII2C_SDA << GPIO7C3_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio7ch_iomux, GPIO7C4_MASK << GPIO7C4_SHIFT,
|
||||
GPIO7C4_EDPHDMII2C_SCL << GPIO7C4_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("hdmi id = %d iomux error!\n", hdmi_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rk3288_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_PWM0:
|
||||
case PERIPH_ID_PWM1:
|
||||
case PERIPH_ID_PWM2:
|
||||
case PERIPH_ID_PWM3:
|
||||
case PERIPH_ID_PWM4:
|
||||
pinctrl_rk3288_pwm_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
case PERIPH_ID_I2C3:
|
||||
case PERIPH_ID_I2C4:
|
||||
case PERIPH_ID_I2C5:
|
||||
pinctrl_rk3288_i2c_config(priv->grf, priv->pmu, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
case PERIPH_ID_SPI1:
|
||||
case PERIPH_ID_SPI2:
|
||||
pinctrl_rk3288_spi_config(priv->grf, func, flags);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
pinctrl_rk3288_uart_config(priv->grf, func);
|
||||
break;
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
case PERIPH_ID_LCDC0:
|
||||
case PERIPH_ID_LCDC1:
|
||||
pinctrl_rk3288_lcdc_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_HDMI:
|
||||
pinctrl_rk3288_hdmi_config(priv->grf, func);
|
||||
break;
|
||||
#endif
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk3288_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_GMAC:
|
||||
pinctrl_rk3288_gmac_config(priv->grf, func);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3288_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 27:
|
||||
return PERIPH_ID_GMAC;
|
||||
case 44:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 45:
|
||||
return PERIPH_ID_SPI1;
|
||||
case 46:
|
||||
return PERIPH_ID_SPI2;
|
||||
case 60:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 62: /* Note strange order */
|
||||
return PERIPH_ID_I2C1;
|
||||
case 61:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 63:
|
||||
return PERIPH_ID_I2C3;
|
||||
case 64:
|
||||
return PERIPH_ID_I2C4;
|
||||
case 65:
|
||||
return PERIPH_ID_I2C5;
|
||||
case 103:
|
||||
return PERIPH_ID_HDMI;
|
||||
}
|
||||
#endif
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3288_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3288_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
return rk3288_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
int rk3288_pinctrl_get_pin_info(struct rk3288_pinctrl_priv *priv,
|
||||
int banknum, int ind, u32 **addrp, uint *shiftp,
|
||||
uint *maskp)
|
||||
{
|
||||
struct rockchip_pin_bank *bank = &rk3288_pin_banks[banknum];
|
||||
uint muxnum;
|
||||
u32 *addr;
|
||||
|
||||
for (muxnum = 0; muxnum < 4; muxnum++) {
|
||||
struct rockchip_iomux *mux = &bank->iomux[muxnum];
|
||||
|
||||
if (ind >= 8) {
|
||||
ind -= 8;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mux->type & IOMUX_SOURCE_PMU)
|
||||
addr = priv->pmu->gpio0_iomux;
|
||||
else
|
||||
addr = (u32 *)priv->grf - 4;
|
||||
addr += mux->offset;
|
||||
*shiftp = ind & 7;
|
||||
if (mux->type & IOMUX_WIDTH_4BIT) {
|
||||
*maskp = 0xf;
|
||||
*shiftp *= 4;
|
||||
if (*shiftp >= 16) {
|
||||
*shiftp -= 16;
|
||||
addr++;
|
||||
}
|
||||
} else {
|
||||
*maskp = 3;
|
||||
*shiftp *= 2;
|
||||
}
|
||||
|
||||
debug("%s: addr=%p, mask=%x, shift=%x\n", __func__, addr,
|
||||
*maskp, *shiftp);
|
||||
*addrp = addr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int rk3288_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
|
||||
int index)
|
||||
{
|
||||
struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
uint shift;
|
||||
uint mask;
|
||||
u32 *addr;
|
||||
int ret;
|
||||
|
||||
ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
|
||||
&mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
return (readl(addr) & mask) >> shift;
|
||||
}
|
||||
|
||||
static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index,
|
||||
int muxval, int flags)
|
||||
{
|
||||
struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
uint shift, ind = index;
|
||||
uint mask;
|
||||
uint value;
|
||||
u32 *addr;
|
||||
int ret;
|
||||
|
||||
debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags);
|
||||
ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
|
||||
&mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* PMU_GPIO0 registers cannot be selectively written so we cannot use
|
||||
* rk_clrsetreg() here. However, the upper 16 bits are reserved and
|
||||
* are ignored when written, so we can use the same code as for the
|
||||
* other GPIO banks providing that we preserve the value of the other
|
||||
* bits.
|
||||
*/
|
||||
value = readl(addr);
|
||||
value &= ~(mask << shift);
|
||||
value |= (mask << (shift + 16)) | (muxval << shift);
|
||||
writel(value, addr);
|
||||
|
||||
/* Handle pullup/pulldown/drive-strength */
|
||||
if (flags) {
|
||||
uint val = 0;
|
||||
|
||||
if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP))
|
||||
val = 1;
|
||||
else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN))
|
||||
val = 2;
|
||||
else if (flags & (1 << PIN_CONFIG_DRIVE_STRENGTH))
|
||||
val = 3;
|
||||
|
||||
shift = (index & 7) * 2;
|
||||
ind = index >> 3;
|
||||
if (banknum == 0)
|
||||
addr = &priv->pmu->gpio0pull[ind];
|
||||
else if (flags & (1 << PIN_CONFIG_DRIVE_STRENGTH))
|
||||
addr = &priv->grf->gpio1_e[banknum - 1][ind];
|
||||
else
|
||||
addr = &priv->grf->gpio1_p[banknum - 1][ind];
|
||||
debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val,
|
||||
shift);
|
||||
|
||||
/* As above, rk_clrsetreg() cannot be used here. */
|
||||
value = readl(addr);
|
||||
value &= ~(mask << shift);
|
||||
value |= (3 << (shift + 16)) | (val << shift);
|
||||
writel(value, addr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3288_pinctrl_set_state(struct udevice *dev, struct udevice *config)
|
||||
{
|
||||
const void *blob = gd->fdt_blob;
|
||||
int pcfg_node, ret, flags, count, i;
|
||||
u32 cell[60], *ptr;
|
||||
|
||||
debug("%s: %s %s\n", __func__, dev->name, config->name);
|
||||
ret = fdtdec_get_int_array_count(blob, dev_of_offset(config),
|
||||
"rockchip,pins", cell,
|
||||
ARRAY_SIZE(cell));
|
||||
if (ret < 0) {
|
||||
debug("%s: bad array %d\n", __func__, ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
count = ret;
|
||||
for (i = 0, ptr = cell; i < count; i += 4, ptr += 4) {
|
||||
pcfg_node = fdt_node_offset_by_phandle(blob, ptr[3]);
|
||||
if (pcfg_node < 0)
|
||||
return -EINVAL;
|
||||
flags = pinctrl_decode_pin_config(blob, pcfg_node);
|
||||
if (flags < 0)
|
||||
return flags;
|
||||
|
||||
if (fdtdec_get_int(blob, pcfg_node, "drive-strength", 0) == 12)
|
||||
flags |= 1 << PIN_CONFIG_DRIVE_STRENGTH;
|
||||
|
||||
ret = rk3288_pinctrl_set_pins(dev, ptr[0], ptr[1], ptr[2],
|
||||
flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct pinctrl_ops rk3288_pinctrl_ops = {
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
.set_state = rk3288_pinctrl_set_state,
|
||||
.get_gpio_mux = rk3288_pinctrl_get_gpio_mux,
|
||||
#endif
|
||||
.set_state_simple = rk3288_pinctrl_set_state_simple,
|
||||
.request = rk3288_pinctrl_request,
|
||||
.get_periph_id = rk3288_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
static int rk3288_pinctrl_parse_tables(struct rk3288_pinctrl_priv *priv,
|
||||
struct rockchip_pin_bank *banks,
|
||||
int count)
|
||||
{
|
||||
struct rockchip_pin_bank *bank;
|
||||
uint reg, muxnum, banknum;
|
||||
|
||||
reg = 0;
|
||||
for (banknum = 0; banknum < count; banknum++) {
|
||||
bank = &banks[banknum];
|
||||
bank->reg = reg;
|
||||
debug("%s: bank %d, reg %x\n", __func__, banknum, reg * 4);
|
||||
for (muxnum = 0; muxnum < 4; muxnum++) {
|
||||
struct rockchip_iomux *mux = &bank->iomux[muxnum];
|
||||
|
||||
if (!(mux->type & IOMUX_UNROUTED))
|
||||
mux->offset = reg;
|
||||
if (mux->type & IOMUX_WIDTH_4BIT)
|
||||
reg += 2;
|
||||
else
|
||||
reg += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rk3288_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3288_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
int ret = 0;
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
priv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
|
||||
debug("%s: grf=%p, pmu=%p\n", __func__, priv->grf, priv->pmu);
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
ret = rk3288_pinctrl_parse_tables(priv, rk3288_pin_banks,
|
||||
ARRAY_SIZE(rk3288_pin_banks));
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3288_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3288-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3288) = {
|
||||
.name = "rockchip_rk3288_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3288_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3288_pinctrl_priv),
|
||||
.ops = &rk3288_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rk3288_pinctrl_probe,
|
||||
};
|
@ -1,705 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2016 Rockchip Electronics Co., Ltd
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/grf_rk3328.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/io.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
enum {
|
||||
/* GPIO0A_IOMUX */
|
||||
GPIO0A5_SEL_SHIFT = 10,
|
||||
GPIO0A5_SEL_MASK = 3 << GPIO0A5_SEL_SHIFT,
|
||||
GPIO0A5_I2C3_SCL = 2,
|
||||
|
||||
GPIO0A6_SEL_SHIFT = 12,
|
||||
GPIO0A6_SEL_MASK = 3 << GPIO0A6_SEL_SHIFT,
|
||||
GPIO0A6_I2C3_SDA = 2,
|
||||
|
||||
GPIO0A7_SEL_SHIFT = 14,
|
||||
GPIO0A7_SEL_MASK = 3 << GPIO0A7_SEL_SHIFT,
|
||||
GPIO0A7_EMMC_DATA0 = 2,
|
||||
|
||||
/* GPIO0B_IOMUX*/
|
||||
GPIO0B0_SEL_SHIFT = 0,
|
||||
GPIO0B0_SEL_MASK = 3 << GPIO0B0_SEL_SHIFT,
|
||||
GPIO0B0_GAMC_CLKTXM0 = 1,
|
||||
|
||||
GPIO0B4_SEL_SHIFT = 8,
|
||||
GPIO0B4_SEL_MASK = 3 << GPIO0B4_SEL_SHIFT,
|
||||
GPIO0B4_GAMC_TXENM0 = 1,
|
||||
|
||||
/* GPIO0C_IOMUX*/
|
||||
GPIO0C0_SEL_SHIFT = 0,
|
||||
GPIO0C0_SEL_MASK = 3 << GPIO0C0_SEL_SHIFT,
|
||||
GPIO0C0_GAMC_TXD1M0 = 1,
|
||||
|
||||
GPIO0C1_SEL_SHIFT = 2,
|
||||
GPIO0C1_SEL_MASK = 3 << GPIO0C1_SEL_SHIFT,
|
||||
GPIO0C1_GAMC_TXD0M0 = 1,
|
||||
|
||||
GPIO0C6_SEL_SHIFT = 12,
|
||||
GPIO0C6_SEL_MASK = 3 << GPIO0C6_SEL_SHIFT,
|
||||
GPIO0C6_GAMC_TXD2M0 = 1,
|
||||
|
||||
GPIO0C7_SEL_SHIFT = 14,
|
||||
GPIO0C7_SEL_MASK = 3 << GPIO0C7_SEL_SHIFT,
|
||||
GPIO0C7_GAMC_TXD3M0 = 1,
|
||||
|
||||
/* GPIO0D_IOMUX*/
|
||||
GPIO0D0_SEL_SHIFT = 0,
|
||||
GPIO0D0_SEL_MASK = 3 << GPIO0D0_SEL_SHIFT,
|
||||
GPIO0D0_GMAC_CLKM0 = 1,
|
||||
|
||||
GPIO0D6_SEL_SHIFT = 12,
|
||||
GPIO0D6_SEL_MASK = 3 << GPIO0D6_SEL_SHIFT,
|
||||
GPIO0D6_GPIO = 0,
|
||||
GPIO0D6_SDMMC0_PWRENM1 = 3,
|
||||
|
||||
/* GPIO1A_IOMUX */
|
||||
GPIO1A0_SEL_SHIFT = 0,
|
||||
GPIO1A0_SEL_MASK = 0x3fff << GPIO1A0_SEL_SHIFT,
|
||||
GPIO1A0_CARD_DATA_CLK_CMD_DETN = 0x1555,
|
||||
|
||||
/* GPIO1B_IOMUX */
|
||||
GPIO1B0_SEL_SHIFT = 0,
|
||||
GPIO1B0_SEL_MASK = 3 << GPIO1B0_SEL_SHIFT,
|
||||
GPIO1B0_GMAC_TXD1M1 = 2,
|
||||
|
||||
GPIO1B1_SEL_SHIFT = 2,
|
||||
GPIO1B1_SEL_MASK = 3 << GPIO1B1_SEL_SHIFT,
|
||||
GPIO1B1_GMAC_TXD0M1 = 2,
|
||||
|
||||
GPIO1B2_SEL_SHIFT = 4,
|
||||
GPIO1B2_SEL_MASK = 3 << GPIO1B2_SEL_SHIFT,
|
||||
GPIO1B2_GMAC_RXD1M1 = 2,
|
||||
|
||||
GPIO1B3_SEL_SHIFT = 6,
|
||||
GPIO1B3_SEL_MASK = 3 << GPIO1B3_SEL_SHIFT,
|
||||
GPIO1B3_GMAC_RXD0M1 = 2,
|
||||
|
||||
GPIO1B4_SEL_SHIFT = 8,
|
||||
GPIO1B4_SEL_MASK = 3 << GPIO1B4_SEL_SHIFT,
|
||||
GPIO1B4_GMAC_TXCLKM1 = 2,
|
||||
|
||||
GPIO1B5_SEL_SHIFT = 10,
|
||||
GPIO1B5_SEL_MASK = 3 << GPIO1B5_SEL_SHIFT,
|
||||
GPIO1B5_GMAC_RXCLKM1 = 2,
|
||||
|
||||
GPIO1B6_SEL_SHIFT = 12,
|
||||
GPIO1B6_SEL_MASK = 3 << GPIO1B6_SEL_SHIFT,
|
||||
GPIO1B6_GMAC_RXD3M1 = 2,
|
||||
|
||||
GPIO1B7_SEL_SHIFT = 14,
|
||||
GPIO1B7_SEL_MASK = 3 << GPIO1B7_SEL_SHIFT,
|
||||
GPIO1B7_GMAC_RXD2M1 = 2,
|
||||
|
||||
/* GPIO1C_IOMUX */
|
||||
GPIO1C0_SEL_SHIFT = 0,
|
||||
GPIO1C0_SEL_MASK = 3 << GPIO1C0_SEL_SHIFT,
|
||||
GPIO1C0_GMAC_TXD3M1 = 2,
|
||||
|
||||
GPIO1C1_SEL_SHIFT = 2,
|
||||
GPIO1C1_SEL_MASK = 3 << GPIO1C1_SEL_SHIFT,
|
||||
GPIO1C1_GMAC_TXD2M1 = 2,
|
||||
|
||||
GPIO1C3_SEL_SHIFT = 6,
|
||||
GPIO1C3_SEL_MASK = 3 << GPIO1C3_SEL_SHIFT,
|
||||
GPIO1C3_GMAC_MDIOM1 = 2,
|
||||
|
||||
GPIO1C5_SEL_SHIFT = 10,
|
||||
GPIO1C5_SEL_MASK = 3 << GPIO1C5_SEL_SHIFT,
|
||||
GPIO1C5_GMAC_CLKM1 = 2,
|
||||
|
||||
GPIO1C6_SEL_SHIFT = 12,
|
||||
GPIO1C6_SEL_MASK = 3 << GPIO1C6_SEL_SHIFT,
|
||||
GPIO1C6_GMAC_RXDVM1 = 2,
|
||||
|
||||
GPIO1C7_SEL_SHIFT = 14,
|
||||
GPIO1C7_SEL_MASK = 3 << GPIO1C7_SEL_SHIFT,
|
||||
GPIO1C7_GMAC_MDCM1 = 2,
|
||||
|
||||
/* GPIO1D_IOMUX */
|
||||
GPIO1D1_SEL_SHIFT = 2,
|
||||
GPIO1D1_SEL_MASK = 3 << GPIO1D1_SEL_SHIFT,
|
||||
GPIO1D1_GMAC_TXENM1 = 2,
|
||||
|
||||
/* GPIO2A_IOMUX */
|
||||
GPIO2A0_SEL_SHIFT = 0,
|
||||
GPIO2A0_SEL_MASK = 3 << GPIO2A0_SEL_SHIFT,
|
||||
GPIO2A0_UART2_TX_M1 = 1,
|
||||
|
||||
GPIO2A1_SEL_SHIFT = 2,
|
||||
GPIO2A1_SEL_MASK = 3 << GPIO2A1_SEL_SHIFT,
|
||||
GPIO2A1_UART2_RX_M1 = 1,
|
||||
|
||||
GPIO2A2_SEL_SHIFT = 4,
|
||||
GPIO2A2_SEL_MASK = 3 << GPIO2A2_SEL_SHIFT,
|
||||
GPIO2A2_PWM_IR = 1,
|
||||
|
||||
GPIO2A4_SEL_SHIFT = 8,
|
||||
GPIO2A4_SEL_MASK = 3 << GPIO2A4_SEL_SHIFT,
|
||||
GPIO2A4_PWM_0 = 1,
|
||||
GPIO2A4_I2C1_SDA,
|
||||
|
||||
GPIO2A5_SEL_SHIFT = 10,
|
||||
GPIO2A5_SEL_MASK = 3 << GPIO2A5_SEL_SHIFT,
|
||||
GPIO2A5_PWM_1 = 1,
|
||||
GPIO2A5_I2C1_SCL,
|
||||
|
||||
GPIO2A6_SEL_SHIFT = 12,
|
||||
GPIO2A6_SEL_MASK = 3 << GPIO2A6_SEL_SHIFT,
|
||||
GPIO2A6_PWM_2 = 1,
|
||||
|
||||
GPIO2A7_SEL_SHIFT = 14,
|
||||
GPIO2A7_SEL_MASK = 3 << GPIO2A7_SEL_SHIFT,
|
||||
GPIO2A7_GPIO = 0,
|
||||
GPIO2A7_SDMMC0_PWRENM0,
|
||||
|
||||
/* GPIO2BL_IOMUX */
|
||||
GPIO2BL0_SEL_SHIFT = 0,
|
||||
GPIO2BL0_SEL_MASK = 0x3f << GPIO2BL0_SEL_SHIFT,
|
||||
GPIO2BL0_SPI_CLK_TX_RX_M0 = 0x15,
|
||||
|
||||
GPIO2BL3_SEL_SHIFT = 6,
|
||||
GPIO2BL3_SEL_MASK = 3 << GPIO2BL3_SEL_SHIFT,
|
||||
GPIO2BL3_SPI_CSN0_M0 = 1,
|
||||
|
||||
GPIO2BL4_SEL_SHIFT = 8,
|
||||
GPIO2BL4_SEL_MASK = 3 << GPIO2BL4_SEL_SHIFT,
|
||||
GPIO2BL4_SPI_CSN1_M0 = 1,
|
||||
|
||||
GPIO2BL5_SEL_SHIFT = 10,
|
||||
GPIO2BL5_SEL_MASK = 3 << GPIO2BL5_SEL_SHIFT,
|
||||
GPIO2BL5_I2C2_SDA = 1,
|
||||
|
||||
GPIO2BL6_SEL_SHIFT = 12,
|
||||
GPIO2BL6_SEL_MASK = 3 << GPIO2BL6_SEL_SHIFT,
|
||||
GPIO2BL6_I2C2_SCL = 1,
|
||||
|
||||
/* GPIO2D_IOMUX */
|
||||
GPIO2D0_SEL_SHIFT = 0,
|
||||
GPIO2D0_SEL_MASK = 3 << GPIO2D0_SEL_SHIFT,
|
||||
GPIO2D0_I2C0_SCL = 1,
|
||||
|
||||
GPIO2D1_SEL_SHIFT = 2,
|
||||
GPIO2D1_SEL_MASK = 3 << GPIO2D1_SEL_SHIFT,
|
||||
GPIO2D1_I2C0_SDA = 1,
|
||||
|
||||
GPIO2D4_SEL_SHIFT = 8,
|
||||
GPIO2D4_SEL_MASK = 0xff << GPIO2D4_SEL_SHIFT,
|
||||
GPIO2D4_EMMC_DATA1234 = 0xaa,
|
||||
|
||||
/* GPIO3C_IOMUX */
|
||||
GPIO3C0_SEL_SHIFT = 0,
|
||||
GPIO3C0_SEL_MASK = 0x3fff << GPIO3C0_SEL_SHIFT,
|
||||
GPIO3C0_EMMC_DATA567_PWR_CLK_RSTN_CMD = 0x2aaa,
|
||||
|
||||
/* COM_IOMUX */
|
||||
IOMUX_SEL_UART2_SHIFT = 0,
|
||||
IOMUX_SEL_UART2_MASK = 3 << IOMUX_SEL_UART2_SHIFT,
|
||||
IOMUX_SEL_UART2_M0 = 0,
|
||||
IOMUX_SEL_UART2_M1,
|
||||
|
||||
IOMUX_SEL_GMAC_SHIFT = 2,
|
||||
IOMUX_SEL_GMAC_MASK = 1 << IOMUX_SEL_GMAC_SHIFT,
|
||||
IOMUX_SEL_GMAC_M0 = 0,
|
||||
IOMUX_SEL_GMAC_M1,
|
||||
|
||||
IOMUX_SEL_SPI_SHIFT = 4,
|
||||
IOMUX_SEL_SPI_MASK = 3 << IOMUX_SEL_SPI_SHIFT,
|
||||
IOMUX_SEL_SPI_M0 = 0,
|
||||
IOMUX_SEL_SPI_M1,
|
||||
IOMUX_SEL_SPI_M2,
|
||||
|
||||
IOMUX_SEL_SDMMC_SHIFT = 7,
|
||||
IOMUX_SEL_SDMMC_MASK = 1 << IOMUX_SEL_SDMMC_SHIFT,
|
||||
IOMUX_SEL_SDMMC_M0 = 0,
|
||||
IOMUX_SEL_SDMMC_M1,
|
||||
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_SHIFT = 10,
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_MASK = 1 << IOMUX_SEL_GMACM1_OPTIMIZATION_SHIFT,
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_BEFORE = 0,
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_AFTER,
|
||||
|
||||
/* GRF_GPIO1B_E */
|
||||
GRF_GPIO1B0_E_SHIFT = 0,
|
||||
GRF_GPIO1B0_E_MASK = 3 << GRF_GPIO1B0_E_SHIFT,
|
||||
GRF_GPIO1B1_E_SHIFT = 2,
|
||||
GRF_GPIO1B1_E_MASK = 3 << GRF_GPIO1B1_E_SHIFT,
|
||||
GRF_GPIO1B2_E_SHIFT = 4,
|
||||
GRF_GPIO1B2_E_MASK = 3 << GRF_GPIO1B2_E_SHIFT,
|
||||
GRF_GPIO1B3_E_SHIFT = 6,
|
||||
GRF_GPIO1B3_E_MASK = 3 << GRF_GPIO1B3_E_SHIFT,
|
||||
GRF_GPIO1B4_E_SHIFT = 8,
|
||||
GRF_GPIO1B4_E_MASK = 3 << GRF_GPIO1B4_E_SHIFT,
|
||||
GRF_GPIO1B5_E_SHIFT = 10,
|
||||
GRF_GPIO1B5_E_MASK = 3 << GRF_GPIO1B5_E_SHIFT,
|
||||
GRF_GPIO1B6_E_SHIFT = 12,
|
||||
GRF_GPIO1B6_E_MASK = 3 << GRF_GPIO1B6_E_SHIFT,
|
||||
GRF_GPIO1B7_E_SHIFT = 14,
|
||||
GRF_GPIO1B7_E_MASK = 3 << GRF_GPIO1B7_E_SHIFT,
|
||||
|
||||
/* GRF_GPIO1C_E */
|
||||
GRF_GPIO1C0_E_SHIFT = 0,
|
||||
GRF_GPIO1C0_E_MASK = 3 << GRF_GPIO1C0_E_SHIFT,
|
||||
GRF_GPIO1C1_E_SHIFT = 2,
|
||||
GRF_GPIO1C1_E_MASK = 3 << GRF_GPIO1C1_E_SHIFT,
|
||||
GRF_GPIO1C3_E_SHIFT = 6,
|
||||
GRF_GPIO1C3_E_MASK = 3 << GRF_GPIO1C3_E_SHIFT,
|
||||
GRF_GPIO1C5_E_SHIFT = 10,
|
||||
GRF_GPIO1C5_E_MASK = 3 << GRF_GPIO1C5_E_SHIFT,
|
||||
GRF_GPIO1C6_E_SHIFT = 12,
|
||||
GRF_GPIO1C6_E_MASK = 3 << GRF_GPIO1C6_E_SHIFT,
|
||||
GRF_GPIO1C7_E_SHIFT = 14,
|
||||
GRF_GPIO1C7_E_MASK = 3 << GRF_GPIO1C7_E_SHIFT,
|
||||
|
||||
/* GRF_GPIO1D_E */
|
||||
GRF_GPIO1D1_E_SHIFT = 2,
|
||||
GRF_GPIO1D1_E_MASK = 3 << GRF_GPIO1D1_E_SHIFT,
|
||||
};
|
||||
|
||||
/* GPIO Bias drive strength settings */
|
||||
enum GPIO_BIAS {
|
||||
GPIO_BIAS_2MA = 0,
|
||||
GPIO_BIAS_4MA,
|
||||
GPIO_BIAS_8MA,
|
||||
GPIO_BIAS_12MA,
|
||||
};
|
||||
|
||||
struct rk3328_pinctrl_priv {
|
||||
struct rk3328_grf_regs *grf;
|
||||
};
|
||||
|
||||
static void pinctrl_rk3328_pwm_config(struct rk3328_grf_regs *grf, int pwm_id)
|
||||
{
|
||||
switch (pwm_id) {
|
||||
case PERIPH_ID_PWM0:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A4_SEL_MASK,
|
||||
GPIO2A4_PWM_0 << GPIO2A4_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM1:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A5_SEL_MASK,
|
||||
GPIO2A5_PWM_1 << GPIO2A5_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM2:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A6_SEL_MASK,
|
||||
GPIO2A6_PWM_2 << GPIO2A6_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM3:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A2_SEL_MASK,
|
||||
GPIO2A2_PWM_IR << GPIO2A2_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("pwm id = %d iomux error!\n", pwm_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3328_i2c_config(struct rk3328_grf_regs *grf, int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
rk_clrsetreg(&grf->gpio2d_iomux,
|
||||
GPIO2D0_SEL_MASK | GPIO2D1_SEL_MASK,
|
||||
GPIO2D0_I2C0_SCL << GPIO2D0_SEL_SHIFT |
|
||||
GPIO2D1_I2C0_SDA << GPIO2D1_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A4_SEL_MASK | GPIO2A5_SEL_MASK,
|
||||
GPIO2A5_I2C1_SCL << GPIO2A5_SEL_SHIFT |
|
||||
GPIO2A4_I2C1_SDA << GPIO2A4_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio2bl_iomux,
|
||||
GPIO2BL5_SEL_MASK | GPIO2BL6_SEL_MASK,
|
||||
GPIO2BL6_I2C2_SCL << GPIO2BL6_SEL_SHIFT |
|
||||
GPIO2BL5_I2C2_SDA << GPIO2BL5_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C3:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A5_SEL_MASK | GPIO0A6_SEL_MASK,
|
||||
GPIO0A5_I2C3_SCL << GPIO0A5_SEL_SHIFT |
|
||||
GPIO0A6_I2C3_SDA << GPIO0A6_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("i2c id = %d iomux error!\n", i2c_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3328_lcdc_config(struct rk3328_grf_regs *grf, int lcd_id)
|
||||
{
|
||||
switch (lcd_id) {
|
||||
case PERIPH_ID_LCDC0:
|
||||
break;
|
||||
default:
|
||||
debug("lcdc id = %d iomux error!\n", lcd_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int pinctrl_rk3328_spi_config(struct rk3328_grf_regs *grf,
|
||||
enum periph_id spi_id, int cs)
|
||||
{
|
||||
u32 com_iomux = readl(&grf->com_iomux);
|
||||
|
||||
if ((com_iomux & IOMUX_SEL_SPI_MASK) !=
|
||||
IOMUX_SEL_SPI_M0 << IOMUX_SEL_SPI_SHIFT) {
|
||||
debug("driver do not support iomux other than m0\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (spi_id) {
|
||||
case PERIPH_ID_SPI0:
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio2bl_iomux,
|
||||
GPIO2BL3_SEL_MASK,
|
||||
GPIO2BL3_SPI_CSN0_M0
|
||||
<< GPIO2BL3_SEL_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio2bl_iomux,
|
||||
GPIO2BL4_SEL_MASK,
|
||||
GPIO2BL4_SPI_CSN1_M0
|
||||
<< GPIO2BL4_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio2bl_iomux,
|
||||
GPIO2BL0_SEL_MASK,
|
||||
GPIO2BL0_SPI_CLK_TX_RX_M0 << GPIO2BL0_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void pinctrl_rk3328_uart_config(struct rk3328_grf_regs *grf, int uart_id)
|
||||
{
|
||||
u32 com_iomux = readl(&grf->com_iomux);
|
||||
|
||||
switch (uart_id) {
|
||||
case PERIPH_ID_UART2:
|
||||
break;
|
||||
if (com_iomux & IOMUX_SEL_UART2_MASK)
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A0_SEL_MASK | GPIO2A1_SEL_MASK,
|
||||
GPIO2A0_UART2_TX_M1 << GPIO2A0_SEL_SHIFT |
|
||||
GPIO2A1_UART2_RX_M1 << GPIO2A1_SEL_SHIFT);
|
||||
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
default:
|
||||
debug("uart id = %d iomux error!\n", uart_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3328_sdmmc_config(struct rk3328_grf_regs *grf,
|
||||
int mmc_id)
|
||||
{
|
||||
u32 com_iomux = readl(&grf->com_iomux);
|
||||
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
rk_clrsetreg(&grf->gpio0a_iomux,
|
||||
GPIO0A7_SEL_MASK,
|
||||
GPIO0A7_EMMC_DATA0 << GPIO0A7_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2d_iomux,
|
||||
GPIO2D4_SEL_MASK,
|
||||
GPIO2D4_EMMC_DATA1234 << GPIO2D4_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3c_iomux,
|
||||
GPIO3C0_SEL_MASK,
|
||||
GPIO3C0_EMMC_DATA567_PWR_CLK_RSTN_CMD
|
||||
<< GPIO3C0_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
/* SDMMC_PWREN use GPIO and init as regulator-fiexed */
|
||||
if (com_iomux & IOMUX_SEL_SDMMC_MASK)
|
||||
rk_clrsetreg(&grf->gpio0d_iomux,
|
||||
GPIO0D6_SEL_MASK,
|
||||
GPIO0D6_GPIO << GPIO0D6_SEL_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A7_SEL_MASK,
|
||||
GPIO2A7_GPIO << GPIO2A7_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio1a_iomux,
|
||||
GPIO1A0_SEL_MASK,
|
||||
GPIO1A0_CARD_DATA_CLK_CMD_DETN
|
||||
<< GPIO1A0_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("mmc id = %d iomux error!\n", mmc_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
static void pinctrl_rk3328_gmac_config(struct rk3328_grf_regs *grf, int gmac_id)
|
||||
{
|
||||
switch (gmac_id) {
|
||||
case PERIPH_ID_GMAC:
|
||||
/* set rgmii m1 pins mux */
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B0_SEL_MASK |
|
||||
GPIO1B1_SEL_MASK |
|
||||
GPIO1B2_SEL_MASK |
|
||||
GPIO1B3_SEL_MASK |
|
||||
GPIO1B4_SEL_MASK |
|
||||
GPIO1B5_SEL_MASK |
|
||||
GPIO1B6_SEL_MASK |
|
||||
GPIO1B7_SEL_MASK,
|
||||
GPIO1B0_GMAC_TXD1M1 << GPIO1B0_SEL_SHIFT |
|
||||
GPIO1B1_GMAC_TXD0M1 << GPIO1B1_SEL_SHIFT |
|
||||
GPIO1B2_GMAC_RXD1M1 << GPIO1B2_SEL_SHIFT |
|
||||
GPIO1B3_GMAC_RXD0M1 << GPIO1B3_SEL_SHIFT |
|
||||
GPIO1B4_GMAC_TXCLKM1 << GPIO1B4_SEL_SHIFT |
|
||||
GPIO1B5_GMAC_RXCLKM1 << GPIO1B5_SEL_SHIFT |
|
||||
GPIO1B6_GMAC_RXD3M1 << GPIO1B6_SEL_SHIFT |
|
||||
GPIO1B7_GMAC_RXD2M1 << GPIO1B7_SEL_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C0_SEL_MASK |
|
||||
GPIO1C1_SEL_MASK |
|
||||
GPIO1C3_SEL_MASK |
|
||||
GPIO1C5_SEL_MASK |
|
||||
GPIO1C6_SEL_MASK |
|
||||
GPIO1C7_SEL_MASK,
|
||||
GPIO1C0_GMAC_TXD3M1 << GPIO1C0_SEL_SHIFT |
|
||||
GPIO1C1_GMAC_TXD2M1 << GPIO1C1_SEL_SHIFT |
|
||||
GPIO1C3_GMAC_MDIOM1 << GPIO1C3_SEL_SHIFT |
|
||||
GPIO1C5_GMAC_CLKM1 << GPIO1C5_SEL_SHIFT |
|
||||
GPIO1C6_GMAC_RXDVM1 << GPIO1C6_SEL_SHIFT |
|
||||
GPIO1C7_GMAC_MDCM1 << GPIO1C7_SEL_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D1_SEL_MASK,
|
||||
GPIO1D1_GMAC_TXENM1 << GPIO1D1_SEL_SHIFT);
|
||||
|
||||
/* set rgmii m0 tx pins mux */
|
||||
rk_clrsetreg(&grf->gpio0b_iomux,
|
||||
GPIO0B0_SEL_MASK |
|
||||
GPIO0B4_SEL_MASK,
|
||||
GPIO0B0_GAMC_CLKTXM0 << GPIO0B0_SEL_SHIFT |
|
||||
GPIO0B4_GAMC_TXENM0 << GPIO0B4_SEL_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio0c_iomux,
|
||||
GPIO0C0_SEL_MASK |
|
||||
GPIO0C1_SEL_MASK |
|
||||
GPIO0C6_SEL_MASK |
|
||||
GPIO0C7_SEL_MASK,
|
||||
GPIO0C0_GAMC_TXD1M0 << GPIO0C0_SEL_SHIFT |
|
||||
GPIO0C1_GAMC_TXD0M0 << GPIO0C1_SEL_SHIFT |
|
||||
GPIO0C6_GAMC_TXD2M0 << GPIO0C6_SEL_SHIFT |
|
||||
GPIO0C7_GAMC_TXD3M0 << GPIO0C7_SEL_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio0d_iomux,
|
||||
GPIO0D0_SEL_MASK,
|
||||
GPIO0D0_GMAC_CLKM0 << GPIO0D0_SEL_SHIFT);
|
||||
|
||||
/* set com mux */
|
||||
rk_clrsetreg(&grf->com_iomux,
|
||||
IOMUX_SEL_GMAC_MASK |
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_MASK,
|
||||
IOMUX_SEL_GMAC_M1 << IOMUX_SEL_GMAC_SHIFT |
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_AFTER <<
|
||||
IOMUX_SEL_GMACM1_OPTIMIZATION_SHIFT);
|
||||
|
||||
/*
|
||||
* set rgmii m1 tx pins to 12ma drive-strength,
|
||||
* and clean others to 2ma.
|
||||
*/
|
||||
rk_clrsetreg(&grf->gpio1b_e,
|
||||
GRF_GPIO1B0_E_MASK |
|
||||
GRF_GPIO1B1_E_MASK |
|
||||
GRF_GPIO1B2_E_MASK |
|
||||
GRF_GPIO1B3_E_MASK |
|
||||
GRF_GPIO1B4_E_MASK |
|
||||
GRF_GPIO1B5_E_MASK |
|
||||
GRF_GPIO1B6_E_MASK |
|
||||
GRF_GPIO1B7_E_MASK,
|
||||
GPIO_BIAS_12MA << GRF_GPIO1B0_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO1B1_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1B2_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1B3_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO1B4_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1B5_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1B6_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1B7_E_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio1c_e,
|
||||
GRF_GPIO1C0_E_MASK |
|
||||
GRF_GPIO1C1_E_MASK |
|
||||
GRF_GPIO1C3_E_MASK |
|
||||
GRF_GPIO1C5_E_MASK |
|
||||
GRF_GPIO1C6_E_MASK |
|
||||
GRF_GPIO1C7_E_MASK,
|
||||
GPIO_BIAS_12MA << GRF_GPIO1C0_E_SHIFT |
|
||||
GPIO_BIAS_12MA << GRF_GPIO1C1_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1C3_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1C5_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1C6_E_SHIFT |
|
||||
GPIO_BIAS_2MA << GRF_GPIO1C7_E_SHIFT);
|
||||
|
||||
rk_clrsetreg(&grf->gpio1d_e,
|
||||
GRF_GPIO1D1_E_MASK,
|
||||
GPIO_BIAS_12MA << GRF_GPIO1D1_E_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("gmac id = %d iomux error!\n", gmac_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rk3328_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3328_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_PWM0:
|
||||
case PERIPH_ID_PWM1:
|
||||
case PERIPH_ID_PWM2:
|
||||
case PERIPH_ID_PWM3:
|
||||
pinctrl_rk3328_pwm_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
case PERIPH_ID_I2C3:
|
||||
pinctrl_rk3328_i2c_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
pinctrl_rk3328_spi_config(priv->grf, func, flags);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
pinctrl_rk3328_uart_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_LCDC0:
|
||||
case PERIPH_ID_LCDC1:
|
||||
pinctrl_rk3328_lcdc_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk3328_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case PERIPH_ID_GMAC:
|
||||
pinctrl_rk3328_gmac_config(priv->grf, func);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3328_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 49:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 50:
|
||||
return PERIPH_ID_PWM0;
|
||||
case 36:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 37: /* Note strange order */
|
||||
return PERIPH_ID_I2C1;
|
||||
case 38:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 39:
|
||||
return PERIPH_ID_I2C3;
|
||||
case 12:
|
||||
return PERIPH_ID_SDCARD;
|
||||
case 14:
|
||||
return PERIPH_ID_EMMC;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case 24:
|
||||
return PERIPH_ID_GMAC;
|
||||
#endif
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3328_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3328_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
|
||||
return rk3328_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops rk3328_pinctrl_ops = {
|
||||
.set_state_simple = rk3328_pinctrl_set_state_simple,
|
||||
.request = rk3328_pinctrl_request,
|
||||
.get_periph_id = rk3328_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
static int rk3328_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3328_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
int ret = 0;
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
debug("%s: grf=%p\n", __func__, priv->grf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3328_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3328-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3328) = {
|
||||
.name = "rockchip_rk3328_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3328_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3328_pinctrl_priv),
|
||||
.ops = &rk3328_pinctrl_ops,
|
||||
.bind = dm_scan_fdt_dev,
|
||||
.probe = rk3328_pinctrl_probe,
|
||||
};
|
@ -1,739 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
|
||||
* Author: Andy Yan <andy.yan@rock-chips.com>
|
||||
* (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/grf_rk3368.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
/* PMUGRF_GPIO0B_IOMUX */
|
||||
enum {
|
||||
GPIO0B5_SHIFT = 10,
|
||||
GPIO0B5_MASK = GENMASK(GPIO0B5_SHIFT + 1, GPIO0B5_SHIFT),
|
||||
GPIO0B5_GPIO = 0,
|
||||
GPIO0B5_SPI2_CSN0 = (2 << GPIO0B5_SHIFT),
|
||||
|
||||
GPIO0B4_SHIFT = 8,
|
||||
GPIO0B4_MASK = GENMASK(GPIO0B4_SHIFT + 1, GPIO0B4_SHIFT),
|
||||
GPIO0B4_GPIO = 0,
|
||||
GPIO0B4_SPI2_CLK = (2 << GPIO0B4_SHIFT),
|
||||
|
||||
GPIO0B3_SHIFT = 6,
|
||||
GPIO0B3_MASK = GENMASK(GPIO0B3_SHIFT + 1, GPIO0B3_SHIFT),
|
||||
GPIO0B3_GPIO = 0,
|
||||
GPIO0B3_SPI2_TXD = (2 << GPIO0B3_SHIFT),
|
||||
|
||||
GPIO0B2_SHIFT = 4,
|
||||
GPIO0B2_MASK = GENMASK(GPIO0B2_SHIFT + 1, GPIO0B2_SHIFT),
|
||||
GPIO0B2_GPIO = 0,
|
||||
GPIO0B2_SPI2_RXD = (2 << GPIO0B2_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO0C_IOMUX*/
|
||||
enum {
|
||||
GPIO0C7_SHIFT = 14,
|
||||
GPIO0C7_MASK = GENMASK(GPIO0C7_SHIFT + 1, GPIO0C7_SHIFT),
|
||||
GPIO0C7_GPIO = 0,
|
||||
GPIO0C7_LCDC_D19 = (1 << GPIO0C7_SHIFT),
|
||||
GPIO0C7_TRACE_D9 = (2 << GPIO0C7_SHIFT),
|
||||
GPIO0C7_UART1_RTSN = (3 << GPIO0C7_SHIFT),
|
||||
|
||||
GPIO0C6_SHIFT = 12,
|
||||
GPIO0C6_MASK = GENMASK(GPIO0C6_SHIFT + 1, GPIO0C6_SHIFT),
|
||||
GPIO0C6_GPIO = 0,
|
||||
GPIO0C6_LCDC_D18 = (1 << GPIO0C6_SHIFT),
|
||||
GPIO0C6_TRACE_D8 = (2 << GPIO0C6_SHIFT),
|
||||
GPIO0C6_UART1_CTSN = (3 << GPIO0C6_SHIFT),
|
||||
|
||||
GPIO0C5_SHIFT = 10,
|
||||
GPIO0C5_MASK = GENMASK(GPIO0C5_SHIFT + 1, GPIO0C5_SHIFT),
|
||||
GPIO0C5_GPIO = 0,
|
||||
GPIO0C5_LCDC_D17 = (1 << GPIO0C5_SHIFT),
|
||||
GPIO0C5_TRACE_D7 = (2 << GPIO0C5_SHIFT),
|
||||
GPIO0C5_UART1_SOUT = (3 << GPIO0C5_SHIFT),
|
||||
|
||||
GPIO0C4_SHIFT = 8,
|
||||
GPIO0C4_MASK = GENMASK(GPIO0C4_SHIFT + 1, GPIO0C4_SHIFT),
|
||||
GPIO0C4_GPIO = 0,
|
||||
GPIO0C4_LCDC_D16 = (1 << GPIO0C4_SHIFT),
|
||||
GPIO0C4_TRACE_D6 = (2 << GPIO0C4_SHIFT),
|
||||
GPIO0C4_UART1_SIN = (3 << GPIO0C4_SHIFT),
|
||||
|
||||
GPIO0C3_SHIFT = 6,
|
||||
GPIO0C3_MASK = GENMASK(GPIO0C3_SHIFT + 1, GPIO0C3_SHIFT),
|
||||
GPIO0C3_GPIO = 0,
|
||||
GPIO0C3_LCDC_D15 = (1 << GPIO0C3_SHIFT),
|
||||
GPIO0C3_TRACE_D5 = (2 << GPIO0C3_SHIFT),
|
||||
GPIO0C3_MCU_JTAG_TDO = (3 << GPIO0C3_SHIFT),
|
||||
|
||||
GPIO0C2_SHIFT = 4,
|
||||
GPIO0C2_MASK = GENMASK(GPIO0C2_SHIFT + 1, GPIO0C2_SHIFT),
|
||||
GPIO0C2_GPIO = 0,
|
||||
GPIO0C2_LCDC_D14 = (1 << GPIO0C2_SHIFT),
|
||||
GPIO0C2_TRACE_D4 = (2 << GPIO0C2_SHIFT),
|
||||
GPIO0C2_MCU_JTAG_TDI = (3 << GPIO0C2_SHIFT),
|
||||
|
||||
GPIO0C1_SHIFT = 2,
|
||||
GPIO0C1_MASK = GENMASK(GPIO0C1_SHIFT + 1, GPIO0C1_SHIFT),
|
||||
GPIO0C1_GPIO = 0,
|
||||
GPIO0C1_LCDC_D13 = (1 << GPIO0C1_SHIFT),
|
||||
GPIO0C1_TRACE_D3 = (2 << GPIO0C1_SHIFT),
|
||||
GPIO0C1_MCU_JTAG_TRTSN = (3 << GPIO0C1_SHIFT),
|
||||
|
||||
GPIO0C0_SHIFT = 0,
|
||||
GPIO0C0_MASK = GENMASK(GPIO0C0_SHIFT + 1, GPIO0C0_SHIFT),
|
||||
GPIO0C0_GPIO = 0,
|
||||
GPIO0C0_LCDC_D12 = (1 << GPIO0C0_SHIFT),
|
||||
GPIO0C0_TRACE_D2 = (2 << GPIO0C0_SHIFT),
|
||||
GPIO0C0_MCU_JTAG_TDO = (3 << GPIO0C0_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO0D_IOMUX*/
|
||||
enum {
|
||||
GPIO0D7_SHIFT = 14,
|
||||
GPIO0D7_MASK = GENMASK(GPIO0D7_SHIFT + 1, GPIO0D7_SHIFT),
|
||||
GPIO0D7_GPIO = 0,
|
||||
GPIO0D7_LCDC_DCLK = (1 << GPIO0D7_SHIFT),
|
||||
GPIO0D7_TRACE_CTL = (2 << GPIO0D7_SHIFT),
|
||||
GPIO0D7_PMU_DEBUG5 = (3 << GPIO0D7_SHIFT),
|
||||
|
||||
GPIO0D6_SHIFT = 12,
|
||||
GPIO0D6_MASK = GENMASK(GPIO0D6_SHIFT + 1, GPIO0D6_SHIFT),
|
||||
GPIO0D6_GPIO = 0,
|
||||
GPIO0D6_LCDC_DEN = (1 << GPIO0D6_SHIFT),
|
||||
GPIO0D6_TRACE_CLK = (2 << GPIO0D6_SHIFT),
|
||||
GPIO0D6_PMU_DEBUG4 = (3 << GPIO0D6_SHIFT),
|
||||
|
||||
GPIO0D5_SHIFT = 10,
|
||||
GPIO0D5_MASK = GENMASK(GPIO0D5_SHIFT + 1, GPIO0D5_SHIFT),
|
||||
GPIO0D5_GPIO = 0,
|
||||
GPIO0D5_LCDC_VSYNC = (1 << GPIO0D5_SHIFT),
|
||||
GPIO0D5_TRACE_D15 = (2 << GPIO0D5_SHIFT),
|
||||
GPIO0D5_PMU_DEBUG3 = (3 << GPIO0D5_SHIFT),
|
||||
|
||||
GPIO0D4_SHIFT = 8,
|
||||
GPIO0D4_MASK = GENMASK(GPIO0D4_SHIFT + 1, GPIO0D4_SHIFT),
|
||||
GPIO0D4_GPIO = 0,
|
||||
GPIO0D4_LCDC_HSYNC = (1 << GPIO0D4_SHIFT),
|
||||
GPIO0D4_TRACE_D14 = (2 << GPIO0D4_SHIFT),
|
||||
GPIO0D4_PMU_DEBUG2 = (3 << GPIO0D4_SHIFT),
|
||||
|
||||
GPIO0D3_SHIFT = 6,
|
||||
GPIO0D3_MASK = GENMASK(GPIO0D3_SHIFT + 1, GPIO0D3_SHIFT),
|
||||
GPIO0D3_GPIO = 0,
|
||||
GPIO0D3_LCDC_D23 = (1 << GPIO0D3_SHIFT),
|
||||
GPIO0D3_TRACE_D13 = (2 << GPIO0D3_SHIFT),
|
||||
GPIO0D3_UART4_SIN = (3 << GPIO0D3_SHIFT),
|
||||
|
||||
GPIO0D2_SHIFT = 4,
|
||||
GPIO0D2_MASK = GENMASK(GPIO0D2_SHIFT + 1, GPIO0D2_SHIFT),
|
||||
GPIO0D2_GPIO = 0,
|
||||
GPIO0D2_LCDC_D22 = (1 << GPIO0D2_SHIFT),
|
||||
GPIO0D2_TRACE_D12 = (2 << GPIO0D2_SHIFT),
|
||||
GPIO0D2_UART4_SOUT = (3 << GPIO0D2_SHIFT),
|
||||
|
||||
GPIO0D1_SHIFT = 2,
|
||||
GPIO0D1_MASK = GENMASK(GPIO0D1_SHIFT + 1, GPIO0D1_SHIFT),
|
||||
GPIO0D1_GPIO = 0,
|
||||
GPIO0D1_LCDC_D21 = (1 << GPIO0D1_SHIFT),
|
||||
GPIO0D1_TRACE_D11 = (2 << GPIO0D1_SHIFT),
|
||||
GPIO0D1_UART4_RTSN = (3 << GPIO0D1_SHIFT),
|
||||
|
||||
GPIO0D0_SHIFT = 0,
|
||||
GPIO0D0_MASK = GENMASK(GPIO0D0_SHIFT + 1, GPIO0D0_SHIFT),
|
||||
GPIO0D0_GPIO = 0,
|
||||
GPIO0D0_LCDC_D20 = (1 << GPIO0D0_SHIFT),
|
||||
GPIO0D0_TRACE_D10 = (2 << GPIO0D0_SHIFT),
|
||||
GPIO0D0_UART4_CTSN = (3 << GPIO0D0_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO2A_IOMUX*/
|
||||
enum {
|
||||
GPIO2A7_SHIFT = 14,
|
||||
GPIO2A7_MASK = GENMASK(GPIO2A7_SHIFT + 1, GPIO2A7_SHIFT),
|
||||
GPIO2A7_GPIO = 0,
|
||||
GPIO2A7_SDMMC0_D2 = (1 << GPIO2A7_SHIFT),
|
||||
GPIO2A7_JTAG_TCK = (2 << GPIO2A7_SHIFT),
|
||||
|
||||
GPIO2A6_SHIFT = 12,
|
||||
GPIO2A6_MASK = GENMASK(GPIO2A6_SHIFT + 1, GPIO2A6_SHIFT),
|
||||
GPIO2A6_GPIO = 0,
|
||||
GPIO2A6_SDMMC0_D1 = (1 << GPIO2A6_SHIFT),
|
||||
GPIO2A6_UART2_SIN = (2 << GPIO2A6_SHIFT),
|
||||
|
||||
GPIO2A5_SHIFT = 10,
|
||||
GPIO2A5_MASK = GENMASK(GPIO2A5_SHIFT + 1, GPIO2A5_SHIFT),
|
||||
GPIO2A5_GPIO = 0,
|
||||
GPIO2A5_SDMMC0_D0 = (1 << GPIO2A5_SHIFT),
|
||||
GPIO2A5_UART2_SOUT = (2 << GPIO2A5_SHIFT),
|
||||
|
||||
GPIO2A4_SHIFT = 8,
|
||||
GPIO2A4_MASK = GENMASK(GPIO2A4_SHIFT + 1, GPIO2A4_SHIFT),
|
||||
GPIO2A4_GPIO = 0,
|
||||
GPIO2A4_FLASH_DQS = (1 << GPIO2A4_SHIFT),
|
||||
GPIO2A4_EMMC_CLKOUT = (2 << GPIO2A4_SHIFT),
|
||||
|
||||
GPIO2A3_SHIFT = 6,
|
||||
GPIO2A3_MASK = GENMASK(GPIO2A3_SHIFT + 1, GPIO2A3_SHIFT),
|
||||
GPIO2A3_GPIO = 0,
|
||||
GPIO2A3_FLASH_CSN3 = (1 << GPIO2A3_SHIFT),
|
||||
GPIO2A3_EMMC_RSTNOUT = (2 << GPIO2A3_SHIFT),
|
||||
|
||||
GPIO2A2_SHIFT = 4,
|
||||
GPIO2A2_MASK = GENMASK(GPIO2A2_SHIFT + 1, GPIO2A2_SHIFT),
|
||||
GPIO2A2_GPIO = 0,
|
||||
GPIO2A2_FLASH_CSN2 = (1 << GPIO2A2_SHIFT),
|
||||
|
||||
GPIO2A1_SHIFT = 2,
|
||||
GPIO2A1_MASK = GENMASK(GPIO2A1_SHIFT + 1, GPIO2A1_SHIFT),
|
||||
GPIO2A1_GPIO = 0,
|
||||
GPIO2A1_FLASH_CSN1 = (1 << GPIO2A1_SHIFT),
|
||||
|
||||
GPIO2A0_SHIFT = 0,
|
||||
GPIO2A0_MASK = GENMASK(GPIO2A0_SHIFT + 1, GPIO2A0_SHIFT),
|
||||
GPIO2A0_GPIO = 0,
|
||||
GPIO2A0_FLASH_CSN0 = (1 << GPIO2A0_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO2B_IOMUX*/
|
||||
enum {
|
||||
GPIO2B3_SHIFT = 6,
|
||||
GPIO2B3_MASK = GENMASK(GPIO2B3_SHIFT + 1, GPIO2B3_SHIFT),
|
||||
GPIO2B3_GPIO = 0,
|
||||
GPIO2B3_SDMMC0_DTECTN = (1 << GPIO2B3_SHIFT),
|
||||
|
||||
GPIO2B2_SHIFT = 4,
|
||||
GPIO2B2_MASK = GENMASK(GPIO2B2_SHIFT + 1, GPIO2B2_SHIFT),
|
||||
GPIO2B2_GPIO = 0,
|
||||
GPIO2B2_SDMMC0_CMD = (1 << GPIO2B2_SHIFT),
|
||||
|
||||
GPIO2B1_SHIFT = 2,
|
||||
GPIO2B1_MASK = GENMASK(GPIO2B1_SHIFT + 1, GPIO2B1_SHIFT),
|
||||
GPIO2B1_GPIO = 0,
|
||||
GPIO2B1_SDMMC0_CLKOUT = (1 << GPIO2B1_SHIFT),
|
||||
|
||||
GPIO2B0_SHIFT = 0,
|
||||
GPIO2B0_MASK = GENMASK(GPIO2B0_SHIFT + 1, GPIO2B0_SHIFT),
|
||||
GPIO2B0_GPIO = 0,
|
||||
GPIO2B0_SDMMC0_D3 = (1 << GPIO2B0_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO2D_IOMUX*/
|
||||
enum {
|
||||
GPIO2D7_SHIFT = 14,
|
||||
GPIO2D7_MASK = GENMASK(GPIO2D7_SHIFT + 1, GPIO2D7_SHIFT),
|
||||
GPIO2D7_GPIO = 0,
|
||||
GPIO2D7_SDIO0_D3 = (1 << GPIO2D7_SHIFT),
|
||||
|
||||
GPIO2D6_SHIFT = 12,
|
||||
GPIO2D6_MASK = GENMASK(GPIO2D6_SHIFT + 1, GPIO2D6_SHIFT),
|
||||
GPIO2D6_GPIO = 0,
|
||||
GPIO2D6_SDIO0_D2 = (1 << GPIO2D6_SHIFT),
|
||||
|
||||
GPIO2D5_SHIFT = 10,
|
||||
GPIO2D5_MASK = GENMASK(GPIO2D5_SHIFT + 1, GPIO2D5_SHIFT),
|
||||
GPIO2D5_GPIO = 0,
|
||||
GPIO2D5_SDIO0_D1 = (1 << GPIO2D5_SHIFT),
|
||||
|
||||
GPIO2D4_SHIFT = 8,
|
||||
GPIO2D4_MASK = GENMASK(GPIO2D4_SHIFT + 1, GPIO2D4_SHIFT),
|
||||
GPIO2D4_GPIO = 0,
|
||||
GPIO2D4_SDIO0_D0 = (1 << GPIO2D4_SHIFT),
|
||||
|
||||
GPIO2D3_SHIFT = 6,
|
||||
GPIO2D3_MASK = GENMASK(GPIO2D3_SHIFT + 1, GPIO2D3_SHIFT),
|
||||
GPIO2D3_GPIO = 0,
|
||||
GPIO2D3_UART0_RTS0 = (1 << GPIO2D3_SHIFT),
|
||||
|
||||
GPIO2D2_SHIFT = 4,
|
||||
GPIO2D2_MASK = GENMASK(GPIO2D2_SHIFT + 1, GPIO2D2_SHIFT),
|
||||
GPIO2D2_GPIO = 0,
|
||||
GPIO2D2_UART0_CTS0 = (1 << GPIO2D2_SHIFT),
|
||||
|
||||
GPIO2D1_SHIFT = 2,
|
||||
GPIO2D1_MASK = GENMASK(GPIO2D1_SHIFT + 1, GPIO2D1_SHIFT),
|
||||
GPIO2D1_GPIO = 0,
|
||||
GPIO2D1_UART0_SOUT = (1 << GPIO2D1_SHIFT),
|
||||
|
||||
GPIO2D0_SHIFT = 0,
|
||||
GPIO2D0_MASK = GENMASK(GPIO2D0_SHIFT + 1, GPIO2D0_SHIFT),
|
||||
GPIO2D0_GPIO = 0,
|
||||
GPIO2D0_UART0_SIN = (1 << GPIO2D0_SHIFT),
|
||||
};
|
||||
|
||||
/* GRF_GPIO1B_IOMUX */
|
||||
enum {
|
||||
GPIO1B7_SHIFT = 14,
|
||||
GPIO1B7_MASK = GENMASK(GPIO1B7_SHIFT + 1, GPIO1B7_SHIFT),
|
||||
GPIO1B7_GPIO = 0,
|
||||
GPIO1B7_SPI1_CSN0 = (2 << GPIO1B7_SHIFT),
|
||||
|
||||
GPIO1B6_SHIFT = 12,
|
||||
GPIO1B6_MASK = GENMASK(GPIO1B6_SHIFT + 1, GPIO1B6_SHIFT),
|
||||
GPIO1B6_GPIO = 0,
|
||||
GPIO1B6_SPI1_CLK = (2 << GPIO1B6_SHIFT),
|
||||
};
|
||||
|
||||
/* GRF_GPIO1C_IOMUX */
|
||||
enum {
|
||||
GPIO1C7_SHIFT = 14,
|
||||
GPIO1C7_MASK = GENMASK(GPIO1C7_SHIFT + 1, GPIO1C7_SHIFT),
|
||||
GPIO1C7_GPIO = 0,
|
||||
GPIO1C7_EMMC_DATA5 = (2 << GPIO1C7_SHIFT),
|
||||
GPIO1C7_SPI0_TXD = (3 << GPIO1C7_SHIFT),
|
||||
|
||||
GPIO1C6_SHIFT = 12,
|
||||
GPIO1C6_MASK = GENMASK(GPIO1C6_SHIFT + 1, GPIO1C6_SHIFT),
|
||||
GPIO1C6_GPIO = 0,
|
||||
GPIO1C6_EMMC_DATA4 = (2 << GPIO1C6_SHIFT),
|
||||
GPIO1C6_SPI0_RXD = (3 << GPIO1C6_SHIFT),
|
||||
|
||||
GPIO1C5_SHIFT = 10,
|
||||
GPIO1C5_MASK = GENMASK(GPIO1C5_SHIFT + 1, GPIO1C5_SHIFT),
|
||||
GPIO1C5_GPIO = 0,
|
||||
GPIO1C5_EMMC_DATA3 = (2 << GPIO1C5_SHIFT),
|
||||
|
||||
GPIO1C4_SHIFT = 8,
|
||||
GPIO1C4_MASK = GENMASK(GPIO1C4_SHIFT + 1, GPIO1C4_SHIFT),
|
||||
GPIO1C4_GPIO = 0,
|
||||
GPIO1C4_EMMC_DATA2 = (2 << GPIO1C4_SHIFT),
|
||||
|
||||
GPIO1C3_SHIFT = 6,
|
||||
GPIO1C3_MASK = GENMASK(GPIO1C3_SHIFT + 1, GPIO1C3_SHIFT),
|
||||
GPIO1C3_GPIO = 0,
|
||||
GPIO1C3_EMMC_DATA1 = (2 << GPIO1C3_SHIFT),
|
||||
|
||||
GPIO1C2_SHIFT = 4,
|
||||
GPIO1C2_MASK = GENMASK(GPIO1C2_SHIFT + 1, GPIO1C2_SHIFT),
|
||||
GPIO1C2_GPIO = 0,
|
||||
GPIO1C2_EMMC_DATA0 = (2 << GPIO1C2_SHIFT),
|
||||
|
||||
GPIO1C1_SHIFT = 2,
|
||||
GPIO1C1_MASK = GENMASK(GPIO1C1_SHIFT + 1, GPIO1C1_SHIFT),
|
||||
GPIO1C1_GPIO = 0,
|
||||
GPIO1C1_SPI1_RXD = (2 << GPIO1C1_SHIFT),
|
||||
|
||||
GPIO1C0_SHIFT = 0,
|
||||
GPIO1C0_MASK = GENMASK(GPIO1C0_SHIFT + 1, GPIO1C0_SHIFT),
|
||||
GPIO1C0_GPIO = 0,
|
||||
GPIO1C0_SPI1_TXD = (2 << GPIO1C0_SHIFT),
|
||||
};
|
||||
|
||||
/* GRF_GPIO1D_IOMUX*/
|
||||
enum {
|
||||
GPIO1D5_SHIFT = 10,
|
||||
GPIO1D5_MASK = GENMASK(GPIO1D5_SHIFT + 1, GPIO1D5_SHIFT),
|
||||
GPIO1D5_GPIO = 0,
|
||||
GPIO1D5_SPI0_CLK = (2 << GPIO1D5_SHIFT),
|
||||
|
||||
GPIO1D3_SHIFT = 6,
|
||||
GPIO1D3_MASK = GENMASK(GPIO1D3_SHIFT + 1, GPIO1D3_SHIFT),
|
||||
GPIO1D3_GPIO = 0,
|
||||
GPIO1D3_EMMC_PWREN = (2 << GPIO1D3_SHIFT),
|
||||
|
||||
GPIO1D2_SHIFT = 4,
|
||||
GPIO1D2_MASK = GENMASK(GPIO1D2_SHIFT + 1, GPIO1D2_SHIFT),
|
||||
GPIO1D2_GPIO = 0,
|
||||
GPIO1D2_EMMC_CMD = (2 << GPIO1D2_SHIFT),
|
||||
|
||||
GPIO1D1_SHIFT = 2,
|
||||
GPIO1D1_MASK = GENMASK(GPIO1D1_SHIFT + 1, GPIO1D1_SHIFT),
|
||||
GPIO1D1_GPIO = 0,
|
||||
GPIO1D1_EMMC_DATA7 = (2 << GPIO1D1_SHIFT),
|
||||
GPIO1D1_SPI0_CSN1 = (3 << GPIO1D1_SHIFT),
|
||||
|
||||
GPIO1D0_SHIFT = 0,
|
||||
GPIO1D0_MASK = GENMASK(GPIO1D0_SHIFT + 1, GPIO1D0_SHIFT),
|
||||
GPIO1D0_GPIO = 0,
|
||||
GPIO1D0_EMMC_DATA6 = (2 << GPIO1D0_SHIFT),
|
||||
GPIO1D0_SPI0_CSN0 = (3 << GPIO1D0_SHIFT),
|
||||
};
|
||||
|
||||
|
||||
/*GRF_GPIO3B_IOMUX*/
|
||||
enum {
|
||||
GPIO3B7_SHIFT = 14,
|
||||
GPIO3B7_MASK = GENMASK(GPIO3B7_SHIFT + 1, GPIO3B7_SHIFT),
|
||||
GPIO3B7_GPIO = 0,
|
||||
GPIO3B7_MAC_RXD0 = (1 << GPIO3B7_SHIFT),
|
||||
|
||||
GPIO3B6_SHIFT = 12,
|
||||
GPIO3B6_MASK = GENMASK(GPIO3B6_SHIFT + 1, GPIO3B6_SHIFT),
|
||||
GPIO3B6_GPIO = 0,
|
||||
GPIO3B6_MAC_TXD3 = (1 << GPIO3B6_SHIFT),
|
||||
|
||||
GPIO3B5_SHIFT = 10,
|
||||
GPIO3B5_MASK = GENMASK(GPIO3B5_SHIFT + 1, GPIO3B5_SHIFT),
|
||||
GPIO3B5_GPIO = 0,
|
||||
GPIO3B5_MAC_TXEN = (1 << GPIO3B5_SHIFT),
|
||||
|
||||
GPIO3B4_SHIFT = 8,
|
||||
GPIO3B4_MASK = GENMASK(GPIO3B4_SHIFT + 1, GPIO3B4_SHIFT),
|
||||
GPIO3B4_GPIO = 0,
|
||||
GPIO3B4_MAC_COL = (1 << GPIO3B4_SHIFT),
|
||||
|
||||
GPIO3B3_SHIFT = 6,
|
||||
GPIO3B3_MASK = GENMASK(GPIO3B3_SHIFT + 1, GPIO3B3_SHIFT),
|
||||
GPIO3B3_GPIO = 0,
|
||||
GPIO3B3_MAC_CRS = (1 << GPIO3B3_SHIFT),
|
||||
|
||||
GPIO3B2_SHIFT = 4,
|
||||
GPIO3B2_MASK = GENMASK(GPIO3B2_SHIFT + 1, GPIO3B2_SHIFT),
|
||||
GPIO3B2_GPIO = 0,
|
||||
GPIO3B2_MAC_TXD2 = (1 << GPIO3B2_SHIFT),
|
||||
|
||||
GPIO3B1_SHIFT = 2,
|
||||
GPIO3B1_MASK = GENMASK(GPIO3B1_SHIFT + 1, GPIO3B1_SHIFT),
|
||||
GPIO3B1_GPIO = 0,
|
||||
GPIO3B1_MAC_TXD1 = (1 << GPIO3B1_SHIFT),
|
||||
|
||||
GPIO3B0_SHIFT = 0,
|
||||
GPIO3B0_MASK = GENMASK(GPIO3B0_SHIFT + 1, GPIO3B0_SHIFT),
|
||||
GPIO3B0_GPIO = 0,
|
||||
GPIO3B0_MAC_TXD0 = (1 << GPIO3B0_SHIFT),
|
||||
GPIO3B0_PWM0 = (2 << GPIO3B0_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO3C_IOMUX*/
|
||||
enum {
|
||||
GPIO3C6_SHIFT = 12,
|
||||
GPIO3C6_MASK = GENMASK(GPIO3C6_SHIFT + 1, GPIO3C6_SHIFT),
|
||||
GPIO3C6_GPIO = 0,
|
||||
GPIO3C6_MAC_CLK = (1 << GPIO3C6_SHIFT),
|
||||
|
||||
GPIO3C5_SHIFT = 10,
|
||||
GPIO3C5_MASK = GENMASK(GPIO3C5_SHIFT + 1, GPIO3C5_SHIFT),
|
||||
GPIO3C5_GPIO = 0,
|
||||
GPIO3C5_MAC_RXEN = (1 << GPIO3C5_SHIFT),
|
||||
|
||||
GPIO3C4_SHIFT = 8,
|
||||
GPIO3C4_MASK = GENMASK(GPIO3C4_SHIFT + 1, GPIO3C4_SHIFT),
|
||||
GPIO3C4_GPIO = 0,
|
||||
GPIO3C4_MAC_RXDV = (1 << GPIO3C4_SHIFT),
|
||||
|
||||
GPIO3C3_SHIFT = 6,
|
||||
GPIO3C3_MASK = GENMASK(GPIO3C3_SHIFT + 1, GPIO3C3_SHIFT),
|
||||
GPIO3C3_GPIO = 0,
|
||||
GPIO3C3_MAC_MDC = (1 << GPIO3C3_SHIFT),
|
||||
|
||||
GPIO3C2_SHIFT = 4,
|
||||
GPIO3C2_MASK = GENMASK(GPIO3C2_SHIFT + 1, GPIO3C2_SHIFT),
|
||||
GPIO3C2_GPIO = 0,
|
||||
GPIO3C2_MAC_RXD3 = (1 << GPIO3C2_SHIFT),
|
||||
|
||||
GPIO3C1_SHIFT = 2,
|
||||
GPIO3C1_MASK = GENMASK(GPIO3C1_SHIFT + 1, GPIO3C1_SHIFT),
|
||||
GPIO3C1_GPIO = 0,
|
||||
GPIO3C1_MAC_RXD2 = (1 << GPIO3C1_SHIFT),
|
||||
|
||||
GPIO3C0_SHIFT = 0,
|
||||
GPIO3C0_MASK = GENMASK(GPIO3C0_SHIFT + 1, GPIO3C0_SHIFT),
|
||||
GPIO3C0_GPIO = 0,
|
||||
GPIO3C0_MAC_RXD1 = (1 << GPIO3C0_SHIFT),
|
||||
};
|
||||
|
||||
/*GRF_GPIO3D_IOMUX*/
|
||||
enum {
|
||||
GPIO3D4_SHIFT = 8,
|
||||
GPIO3D4_MASK = GENMASK(GPIO3D4_SHIFT + 1, GPIO3D4_SHIFT),
|
||||
GPIO3D4_GPIO = 0,
|
||||
GPIO3D4_MAC_TXCLK = (1 << GPIO3D4_SHIFT),
|
||||
GPIO3D4_SPI1_CNS1 = (2 << GPIO3D4_SHIFT),
|
||||
|
||||
GPIO3D1_SHIFT = 2,
|
||||
GPIO3D1_MASK = GENMASK(GPIO3D1_SHIFT + 1, GPIO3D1_SHIFT),
|
||||
GPIO3D1_GPIO = 0,
|
||||
GPIO3D1_MAC_RXCLK = (1 << GPIO3D1_SHIFT),
|
||||
|
||||
GPIO3D0_SHIFT = 0,
|
||||
GPIO3D0_MASK = GENMASK(GPIO3D0_SHIFT + 1, GPIO3D0_SHIFT),
|
||||
GPIO3D0_GPIO = 0,
|
||||
GPIO3D0_MAC_MDIO = (1 << GPIO3D0_SHIFT),
|
||||
};
|
||||
|
||||
struct rk3368_pinctrl_priv {
|
||||
struct rk3368_grf *grf;
|
||||
struct rk3368_pmu_grf *pmugrf;
|
||||
};
|
||||
|
||||
static void pinctrl_rk3368_uart_config(struct rk3368_pinctrl_priv *priv,
|
||||
int uart_id)
|
||||
{
|
||||
struct rk3368_grf *grf = priv->grf;
|
||||
struct rk3368_pmu_grf *pmugrf = priv->pmugrf;
|
||||
|
||||
switch (uart_id) {
|
||||
case PERIPH_ID_UART2:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A6_MASK | GPIO2A5_MASK,
|
||||
GPIO2A6_UART2_SIN | GPIO2A5_UART2_SOUT);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
break;
|
||||
case PERIPH_ID_UART1:
|
||||
break;
|
||||
case PERIPH_ID_UART3:
|
||||
break;
|
||||
case PERIPH_ID_UART4:
|
||||
rk_clrsetreg(&pmugrf->gpio0d_iomux,
|
||||
GPIO0D0_MASK | GPIO0D1_MASK |
|
||||
GPIO0D2_MASK | GPIO0D3_MASK,
|
||||
GPIO0D0_GPIO | GPIO0D1_GPIO |
|
||||
GPIO0D2_UART4_SOUT | GPIO0D3_UART4_SIN);
|
||||
break;
|
||||
default:
|
||||
debug("uart id = %d iomux error!\n", uart_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3368_spi_config(struct rk3368_pinctrl_priv *priv,
|
||||
int spi_id)
|
||||
{
|
||||
struct rk3368_grf *grf = priv->grf;
|
||||
struct rk3368_pmu_grf *pmugrf = priv->pmugrf;
|
||||
|
||||
switch (spi_id) {
|
||||
case PERIPH_ID_SPI0:
|
||||
/*
|
||||
* eMMC can only be connected with 4 bits, when SPI0 is used.
|
||||
* This is all-or-nothing, so we assume that if someone asks us
|
||||
* to configure SPI0, that their eMMC interface is unused or
|
||||
* configured appropriately.
|
||||
*/
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D0_MASK | GPIO1D1_MASK |
|
||||
GPIO1D5_MASK,
|
||||
GPIO1D0_SPI0_CSN0 | GPIO1D1_SPI0_CSN1 |
|
||||
GPIO1D5_SPI0_CLK);
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C6_MASK | GPIO1C7_MASK,
|
||||
GPIO1C6_SPI0_RXD | GPIO1C7_SPI0_TXD);
|
||||
break;
|
||||
case PERIPH_ID_SPI1:
|
||||
/*
|
||||
* We don't implement support for configuring SPI1_CSN#1, as it
|
||||
* conflicts with the GMAC (MAC TX clk-out).
|
||||
*/
|
||||
rk_clrsetreg(&grf->gpio1b_iomux,
|
||||
GPIO1B6_MASK | GPIO1B7_MASK,
|
||||
GPIO1B6_SPI1_CLK | GPIO1B7_SPI1_CSN0);
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C0_MASK | GPIO1C1_MASK,
|
||||
GPIO1C0_SPI1_TXD | GPIO1C1_SPI1_RXD);
|
||||
break;
|
||||
case PERIPH_ID_SPI2:
|
||||
rk_clrsetreg(&pmugrf->gpio0b_iomux,
|
||||
GPIO0B2_MASK | GPIO0B3_MASK |
|
||||
GPIO0B4_MASK | GPIO0B5_MASK,
|
||||
GPIO0B2_SPI2_RXD | GPIO0B3_SPI2_TXD |
|
||||
GPIO0B4_SPI2_CLK | GPIO0B5_SPI2_CSN0);
|
||||
break;
|
||||
default:
|
||||
debug("%s: spi id = %d iomux error!\n", __func__, spi_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
static void pinctrl_rk3368_gmac_config(struct rk3368_grf *grf, int gmac_id)
|
||||
{
|
||||
rk_clrsetreg(&grf->gpio3b_iomux,
|
||||
GPIO3B0_MASK | GPIO3B1_MASK |
|
||||
GPIO3B2_MASK | GPIO3B5_MASK |
|
||||
GPIO3B6_MASK | GPIO3B7_MASK,
|
||||
GPIO3B0_MAC_TXD0 | GPIO3B1_MAC_TXD1 |
|
||||
GPIO3B2_MAC_TXD2 | GPIO3B5_MAC_TXEN |
|
||||
GPIO3B6_MAC_TXD3 | GPIO3B7_MAC_RXD0);
|
||||
rk_clrsetreg(&grf->gpio3c_iomux,
|
||||
GPIO3C0_MASK | GPIO3C1_MASK |
|
||||
GPIO3C2_MASK | GPIO3C3_MASK |
|
||||
GPIO3C4_MASK | GPIO3C5_MASK |
|
||||
GPIO3C6_MASK,
|
||||
GPIO3C0_MAC_RXD1 | GPIO3C1_MAC_RXD2 |
|
||||
GPIO3C2_MAC_RXD3 | GPIO3C3_MAC_MDC |
|
||||
GPIO3C4_MAC_RXDV | GPIO3C5_MAC_RXEN |
|
||||
GPIO3C6_MAC_CLK);
|
||||
rk_clrsetreg(&grf->gpio3d_iomux,
|
||||
GPIO3D0_MASK | GPIO3D1_MASK |
|
||||
GPIO3D4_MASK,
|
||||
GPIO3D0_MAC_MDIO | GPIO3D1_MAC_RXCLK |
|
||||
GPIO3D4_MAC_TXCLK);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void pinctrl_rk3368_sdmmc_config(struct rk3368_grf *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
debug("mmc id = %d setting registers!\n", mmc_id);
|
||||
rk_clrsetreg(&grf->gpio1c_iomux,
|
||||
GPIO1C2_MASK | GPIO1C3_MASK |
|
||||
GPIO1C4_MASK | GPIO1C5_MASK |
|
||||
GPIO1C6_MASK | GPIO1C7_MASK,
|
||||
GPIO1C2_EMMC_DATA0 |
|
||||
GPIO1C3_EMMC_DATA1 |
|
||||
GPIO1C4_EMMC_DATA2 |
|
||||
GPIO1C5_EMMC_DATA3 |
|
||||
GPIO1C6_EMMC_DATA4 |
|
||||
GPIO1C7_EMMC_DATA5);
|
||||
rk_clrsetreg(&grf->gpio1d_iomux,
|
||||
GPIO1D0_MASK | GPIO1D1_MASK |
|
||||
GPIO1D2_MASK | GPIO1D3_MASK,
|
||||
GPIO1D0_EMMC_DATA6 |
|
||||
GPIO1D1_EMMC_DATA7 |
|
||||
GPIO1D2_EMMC_CMD |
|
||||
GPIO1D3_EMMC_PWREN);
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A3_MASK | GPIO2A4_MASK,
|
||||
GPIO2A3_EMMC_RSTNOUT |
|
||||
GPIO2A4_EMMC_CLKOUT);
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
debug("mmc id = %d setting registers!\n", mmc_id);
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GPIO2A5_MASK | GPIO2A7_MASK |
|
||||
GPIO2A7_MASK,
|
||||
GPIO2A5_SDMMC0_D0 | GPIO2A6_SDMMC0_D1 |
|
||||
GPIO2A7_SDMMC0_D2);
|
||||
rk_clrsetreg(&grf->gpio2b_iomux,
|
||||
GPIO2B0_MASK | GPIO2B1_MASK |
|
||||
GPIO2B2_MASK | GPIO2B3_MASK,
|
||||
GPIO2B0_SDMMC0_D3 | GPIO2B1_SDMMC0_CLKOUT |
|
||||
GPIO2B2_SDMMC0_CMD | GPIO2B3_SDMMC0_DTECTN);
|
||||
break;
|
||||
default:
|
||||
debug("mmc id = %d iomux error!\n", mmc_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int rk3368_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3368_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%d, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
pinctrl_rk3368_uart_config(priv, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
case PERIPH_ID_SPI1:
|
||||
case PERIPH_ID_SPI2:
|
||||
pinctrl_rk3368_spi_config(priv, func);
|
||||
break;
|
||||
case PERIPH_ID_EMMC:
|
||||
case PERIPH_ID_SDCARD:
|
||||
pinctrl_rk3368_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case PERIPH_ID_GMAC:
|
||||
pinctrl_rk3368_gmac_config(priv->grf, func);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3368_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 59:
|
||||
return PERIPH_ID_UART4;
|
||||
case 58:
|
||||
return PERIPH_ID_UART3;
|
||||
case 57:
|
||||
return PERIPH_ID_UART2;
|
||||
case 56:
|
||||
return PERIPH_ID_UART1;
|
||||
case 55:
|
||||
return PERIPH_ID_UART0;
|
||||
case 44:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 45:
|
||||
return PERIPH_ID_SPI1;
|
||||
case 41:
|
||||
return PERIPH_ID_SPI2;
|
||||
case 35:
|
||||
return PERIPH_ID_EMMC;
|
||||
case 32:
|
||||
return PERIPH_ID_SDCARD;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case 27:
|
||||
return PERIPH_ID_GMAC;
|
||||
#endif
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3368_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3368_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
|
||||
return rk3368_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops rk3368_pinctrl_ops = {
|
||||
.set_state_simple = rk3368_pinctrl_set_state_simple,
|
||||
.request = rk3368_pinctrl_request,
|
||||
.get_periph_id = rk3368_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
static int rk3368_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3368_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
int ret = 0;
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
|
||||
|
||||
debug("%s: grf=%p pmugrf:%p\n", __func__, priv->grf, priv->pmugrf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3368_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3368-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3368) = {
|
||||
.name = "rockchip_rk3368_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3368_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3368_pinctrl_priv),
|
||||
.ops = &rk3368_pinctrl_ops,
|
||||
.bind = dm_scan_fdt_dev,
|
||||
.probe = rk3368_pinctrl_probe,
|
||||
};
|
@ -1,740 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2016 Rockchip Electronics Co., Ltd
|
||||
* (C) 2018 Theobroma Systems Design und Consulting GmbH
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <errno.h>
|
||||
#include <syscon.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/grf_rk3399.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <dm/pinctrl.h>
|
||||
|
||||
#if CONFIG_IS_ENABLED(PINCTRL_ROCKCHIP_RK3399_FULL)
|
||||
static const u32 RK_GRF_P_PULLUP = 1;
|
||||
static const u32 RK_GRF_P_PULLDOWN = 2;
|
||||
#endif /* PINCTRL_ROCKCHIP_RK3399_FULL */
|
||||
|
||||
struct rk3399_pinctrl_priv {
|
||||
struct rk3399_grf_regs *grf;
|
||||
struct rk3399_pmugrf_regs *pmugrf;
|
||||
struct rockchip_pin_bank *banks;
|
||||
};
|
||||
|
||||
#if CONFIG_IS_ENABLED(PINCTRL_ROCKCHIP_RK3399_FULL)
|
||||
/* Location of pinctrl/pinconf registers. */
|
||||
enum rk_grf_location {
|
||||
RK_GRF,
|
||||
RK_PMUGRF,
|
||||
};
|
||||
|
||||
/**
|
||||
* @nr_pins: number of pins in this bank
|
||||
* @grf_location: location of pinctrl/pinconf registers
|
||||
* @bank_num: number of the bank, to account for holes
|
||||
* @iomux: array describing the 4 iomux sources of the bank
|
||||
*/
|
||||
struct rockchip_pin_bank {
|
||||
u8 nr_pins;
|
||||
enum rk_grf_location grf_location;
|
||||
size_t iomux_offset;
|
||||
size_t pupd_offset;
|
||||
};
|
||||
|
||||
#define PIN_BANK(pins, grf, iomux, pupd) \
|
||||
{ \
|
||||
.nr_pins = pins, \
|
||||
.grf_location = grf, \
|
||||
.iomux_offset = iomux, \
|
||||
.pupd_offset = pupd, \
|
||||
}
|
||||
|
||||
static struct rockchip_pin_bank rk3399_pin_banks[] = {
|
||||
PIN_BANK(16, RK_PMUGRF,
|
||||
offsetof(struct rk3399_pmugrf_regs, gpio0a_iomux),
|
||||
offsetof(struct rk3399_pmugrf_regs, gpio0_p)),
|
||||
PIN_BANK(32, RK_PMUGRF,
|
||||
offsetof(struct rk3399_pmugrf_regs, gpio1a_iomux),
|
||||
offsetof(struct rk3399_pmugrf_regs, gpio1_p)),
|
||||
PIN_BANK(32, RK_GRF,
|
||||
offsetof(struct rk3399_grf_regs, gpio2a_iomux),
|
||||
offsetof(struct rk3399_grf_regs, gpio2_p)),
|
||||
PIN_BANK(32, RK_GRF,
|
||||
offsetof(struct rk3399_grf_regs, gpio3a_iomux),
|
||||
offsetof(struct rk3399_grf_regs, gpio3_p)),
|
||||
PIN_BANK(32, RK_GRF,
|
||||
offsetof(struct rk3399_grf_regs, gpio4a_iomux),
|
||||
offsetof(struct rk3399_grf_regs, gpio4_p)),
|
||||
};
|
||||
|
||||
static void rk_pinctrl_get_info(uintptr_t base, u32 index, uintptr_t *addr,
|
||||
u32 *shift, u32 *mask)
|
||||
{
|
||||
/*
|
||||
* In general we four subsequent 32-bit configuration registers
|
||||
* per bank (e.g. GPIO2A_P, GPIO2B_P, GPIO2C_P, GPIO2D_P).
|
||||
* The configuration for each pin has two bits.
|
||||
*
|
||||
* @base...contains the address to the first register.
|
||||
* @index...defines the pin within the bank (0..31).
|
||||
* @addr...will be the address of the actual register to use
|
||||
* @shift...will be the bit position in the configuration register
|
||||
* @mask...will be the (unshifted) mask
|
||||
*/
|
||||
|
||||
const u32 pins_per_register = 8;
|
||||
const u32 config_bits_per_pin = 2;
|
||||
|
||||
/* Get the address of the configuration register. */
|
||||
*addr = base + (index / pins_per_register) * sizeof(u32);
|
||||
|
||||
/* Get the bit offset within the configuration register. */
|
||||
*shift = (index & (pins_per_register - 1)) * config_bits_per_pin;
|
||||
|
||||
/* Get the (unshifted) mask for the configuration pins. */
|
||||
*mask = ((1 << config_bits_per_pin) - 1);
|
||||
|
||||
pr_debug("%s: addr=0x%lx, mask=0x%x, shift=0x%x\n",
|
||||
__func__, *addr, *mask, *shift);
|
||||
}
|
||||
|
||||
static void rk3399_pinctrl_set_pin_iomux(uintptr_t grf_addr,
|
||||
struct rockchip_pin_bank *bank,
|
||||
u32 index, u32 muxval)
|
||||
{
|
||||
uintptr_t iomux_base, addr;
|
||||
u32 shift, mask;
|
||||
|
||||
iomux_base = grf_addr + bank->iomux_offset;
|
||||
rk_pinctrl_get_info(iomux_base, index, &addr, &shift, &mask);
|
||||
|
||||
/* Set pinmux register */
|
||||
rk_clrsetreg(addr, mask << shift, muxval << shift);
|
||||
}
|
||||
|
||||
static void rk3399_pinctrl_set_pin_pupd(uintptr_t grf_addr,
|
||||
struct rockchip_pin_bank *bank,
|
||||
u32 index, int pinconfig)
|
||||
{
|
||||
uintptr_t pupd_base, addr;
|
||||
u32 shift, mask, pupdval;
|
||||
|
||||
/* Fast path in case there's nothing to do. */
|
||||
if (!pinconfig)
|
||||
return;
|
||||
|
||||
if (pinconfig & (1 << PIN_CONFIG_BIAS_PULL_UP))
|
||||
pupdval = RK_GRF_P_PULLUP;
|
||||
else if (pinconfig & (1 << PIN_CONFIG_BIAS_PULL_DOWN)) {
|
||||
pupdval = RK_GRF_P_PULLDOWN;
|
||||
} else {
|
||||
/* Flag not supported. */
|
||||
pr_warn("%s: Unsupported pinconfig flag: 0x%x\n", __func__,
|
||||
pinconfig);
|
||||
return;
|
||||
}
|
||||
|
||||
pupd_base = grf_addr + (uintptr_t)bank->pupd_offset;
|
||||
rk_pinctrl_get_info(pupd_base, index, &addr, &shift, &mask);
|
||||
|
||||
/* Set pull-up/pull-down regisrer */
|
||||
rk_clrsetreg(addr, mask << shift, pupdval << shift);
|
||||
}
|
||||
|
||||
static int rk3399_pinctrl_set_pin(struct udevice *dev, u32 banknum, u32 index,
|
||||
u32 muxval, int pinconfig)
|
||||
{
|
||||
struct rk3399_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
struct rockchip_pin_bank *bank = &priv->banks[banknum];
|
||||
uintptr_t grf_addr;
|
||||
|
||||
pr_debug("%s: 0x%x 0x%x 0x%x 0x%x\n", __func__, banknum, index, muxval,
|
||||
pinconfig);
|
||||
|
||||
if (bank->grf_location == RK_GRF)
|
||||
grf_addr = (uintptr_t)priv->grf;
|
||||
else if (bank->grf_location == RK_PMUGRF)
|
||||
grf_addr = (uintptr_t)priv->pmugrf;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
rk3399_pinctrl_set_pin_iomux(grf_addr, bank, index, muxval);
|
||||
|
||||
rk3399_pinctrl_set_pin_pupd(grf_addr, bank, index, pinconfig);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3399_pinctrl_set_state(struct udevice *dev, struct udevice *config)
|
||||
{
|
||||
/*
|
||||
* The order of the fields in this struct must match the order of
|
||||
* the fields in the "rockchip,pins" property.
|
||||
*/
|
||||
struct rk_pin {
|
||||
u32 banknum;
|
||||
u32 index;
|
||||
u32 muxval;
|
||||
u32 phandle;
|
||||
} __packed;
|
||||
|
||||
u32 *fields = NULL;
|
||||
const int fields_per_pin = 4;
|
||||
int num_fields, num_pins;
|
||||
int ret;
|
||||
int size;
|
||||
int i;
|
||||
struct rk_pin *pin;
|
||||
|
||||
pr_debug("%s: %s\n", __func__, config->name);
|
||||
|
||||
size = dev_read_size(config, "rockchip,pins");
|
||||
if (size < 0)
|
||||
return -EINVAL;
|
||||
|
||||
num_fields = size / sizeof(u32);
|
||||
num_pins = num_fields / fields_per_pin;
|
||||
|
||||
if (num_fields * sizeof(u32) != size ||
|
||||
num_pins * fields_per_pin != num_fields) {
|
||||
pr_warn("Invalid number of rockchip,pins fields.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fields = calloc(num_fields, sizeof(u32));
|
||||
if (!fields)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = dev_read_u32_array(config, "rockchip,pins", fields, num_fields);
|
||||
if (ret) {
|
||||
pr_warn("%s: Failed to read rockchip,pins fields.\n",
|
||||
config->name);
|
||||
goto end;
|
||||
}
|
||||
|
||||
pin = (struct rk_pin *)fields;
|
||||
for (i = 0; i < num_pins; i++, pin++) {
|
||||
struct udevice *dev_pinconfig;
|
||||
int pinconfig;
|
||||
|
||||
ret = uclass_get_device_by_phandle_id(UCLASS_PINCONFIG,
|
||||
pin->phandle,
|
||||
&dev_pinconfig);
|
||||
if (ret) {
|
||||
pr_debug("Could not get pinconfig device\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
pinconfig = pinctrl_decode_pin_config_dm(dev_pinconfig);
|
||||
if (pinconfig < 0) {
|
||||
pr_warn("Could not parse pinconfig\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = rk3399_pinctrl_set_pin(dev, pin->banknum, pin->index,
|
||||
pin->muxval, pinconfig);
|
||||
if (ret) {
|
||||
pr_warn("Could not set pinctrl settings\n");
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
free(fields);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* PINCTRL_ROCKCHIP_RK3399_FULL */
|
||||
|
||||
static void pinctrl_rk3399_pwm_config(struct rk3399_grf_regs *grf,
|
||||
struct rk3399_pmugrf_regs *pmugrf, int pwm_id)
|
||||
{
|
||||
switch (pwm_id) {
|
||||
case PERIPH_ID_PWM0:
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C2_SEL_MASK,
|
||||
GRF_PWM_0 << GRF_GPIO4C2_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM1:
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C6_SEL_MASK,
|
||||
GRF_PWM_1 << GRF_GPIO4C6_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM2:
|
||||
rk_clrsetreg(&pmugrf->gpio1c_iomux,
|
||||
PMUGRF_GPIO1C3_SEL_MASK,
|
||||
PMUGRF_PWM_2 << PMUGRF_GPIO1C3_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_PWM3:
|
||||
if (readl(&pmugrf->soc_con0) & (1 << 5))
|
||||
rk_clrsetreg(&pmugrf->gpio1b_iomux,
|
||||
PMUGRF_GPIO1B6_SEL_MASK,
|
||||
PMUGRF_PWM_3B << PMUGRF_GPIO1B6_SEL_SHIFT);
|
||||
else
|
||||
rk_clrsetreg(&pmugrf->gpio0a_iomux,
|
||||
PMUGRF_GPIO0A6_SEL_MASK,
|
||||
PMUGRF_PWM_3A << PMUGRF_GPIO0A6_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("pwm id = %d iomux error!\n", pwm_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3399_i2c_config(struct rk3399_grf_regs *grf,
|
||||
struct rk3399_pmugrf_regs *pmugrf,
|
||||
int i2c_id)
|
||||
{
|
||||
switch (i2c_id) {
|
||||
case PERIPH_ID_I2C0:
|
||||
rk_clrsetreg(&pmugrf->gpio1b_iomux,
|
||||
PMUGRF_GPIO1B7_SEL_MASK,
|
||||
PMUGRF_I2C0PMU_SDA << PMUGRF_GPIO1B7_SEL_SHIFT);
|
||||
rk_clrsetreg(&pmugrf->gpio1c_iomux,
|
||||
PMUGRF_GPIO1C0_SEL_MASK,
|
||||
PMUGRF_I2C0PMU_SCL << PMUGRF_GPIO1C0_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C1:
|
||||
rk_clrsetreg(&grf->gpio4a_iomux,
|
||||
GRF_GPIO4A1_SEL_MASK,
|
||||
GRF_I2C1_SDA << GRF_GPIO4A1_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio4a_iomux,
|
||||
GRF_GPIO4A2_SEL_MASK,
|
||||
GRF_I2C1_SCL << GRF_GPIO4A2_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C2:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GRF_GPIO2A0_SEL_MASK,
|
||||
GRF_I2C2_SDA << GRF_GPIO2A0_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GRF_GPIO2A1_SEL_MASK,
|
||||
GRF_I2C2_SCL << GRF_GPIO2A1_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_I2C3:
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C0_SEL_MASK,
|
||||
GRF_HDMII2C_SCL << GRF_GPIO4C0_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C1_SEL_MASK,
|
||||
GRF_HDMII2C_SDA << GRF_GPIO4C1_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C4:
|
||||
rk_clrsetreg(&pmugrf->gpio1b_iomux,
|
||||
PMUGRF_GPIO1B3_SEL_MASK,
|
||||
PMUGRF_I2C4_SDA << PMUGRF_GPIO1B3_SEL_SHIFT);
|
||||
rk_clrsetreg(&pmugrf->gpio1b_iomux,
|
||||
PMUGRF_GPIO1B4_SEL_MASK,
|
||||
PMUGRF_I2C4_SCL << PMUGRF_GPIO1B4_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C7:
|
||||
rk_clrsetreg(&grf->gpio2a_iomux,
|
||||
GRF_GPIO2A7_SEL_MASK,
|
||||
GRF_I2C7_SDA << GRF_GPIO2A7_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2b_iomux,
|
||||
GRF_GPIO2B0_SEL_MASK,
|
||||
GRF_I2C7_SCL << GRF_GPIO2B0_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C6:
|
||||
rk_clrsetreg(&grf->gpio2b_iomux,
|
||||
GRF_GPIO2B1_SEL_MASK,
|
||||
GRF_I2C6_SDA << GRF_GPIO2B1_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio2b_iomux,
|
||||
GRF_GPIO2B2_SEL_MASK,
|
||||
GRF_I2C6_SDA << GRF_GPIO2B2_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C8:
|
||||
rk_clrsetreg(&pmugrf->gpio1c_iomux,
|
||||
PMUGRF_GPIO1C4_SEL_MASK,
|
||||
PMUGRF_I2C8PMU_SDA << PMUGRF_GPIO1C4_SEL_SHIFT);
|
||||
rk_clrsetreg(&pmugrf->gpio1c_iomux,
|
||||
PMUGRF_GPIO1C5_SEL_MASK,
|
||||
PMUGRF_I2C8PMU_SCL << PMUGRF_GPIO1C5_SEL_SHIFT);
|
||||
break;
|
||||
|
||||
case PERIPH_ID_I2C5:
|
||||
default:
|
||||
debug("i2c id = %d iomux error!\n", i2c_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3399_lcdc_config(struct rk3399_grf_regs *grf, int lcd_id)
|
||||
{
|
||||
switch (lcd_id) {
|
||||
case PERIPH_ID_LCDC0:
|
||||
break;
|
||||
default:
|
||||
debug("lcdc id = %d iomux error!\n", lcd_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int pinctrl_rk3399_spi_config(struct rk3399_grf_regs *grf,
|
||||
struct rk3399_pmugrf_regs *pmugrf,
|
||||
enum periph_id spi_id, int cs)
|
||||
{
|
||||
switch (spi_id) {
|
||||
case PERIPH_ID_SPI0:
|
||||
switch (cs) {
|
||||
case 0:
|
||||
rk_clrsetreg(&grf->gpio3a_iomux,
|
||||
GRF_GPIO3A7_SEL_MASK,
|
||||
GRF_SPI0NORCODEC_CSN0
|
||||
<< GRF_GPIO3A7_SEL_SHIFT);
|
||||
break;
|
||||
case 1:
|
||||
rk_clrsetreg(&grf->gpio3b_iomux,
|
||||
GRF_GPIO3B0_SEL_MASK,
|
||||
GRF_SPI0NORCODEC_CSN1
|
||||
<< GRF_GPIO3B0_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
rk_clrsetreg(&grf->gpio3a_iomux,
|
||||
GRF_GPIO3A4_SEL_MASK | GRF_GPIO3A5_SEL_SHIFT
|
||||
| GRF_GPIO3A6_SEL_SHIFT,
|
||||
GRF_SPI0NORCODEC_RXD << GRF_GPIO3A4_SEL_SHIFT
|
||||
| GRF_SPI0NORCODEC_RXD << GRF_GPIO3A5_SEL_SHIFT
|
||||
| GRF_SPI0NORCODEC_RXD << GRF_GPIO3A6_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SPI1:
|
||||
if (cs != 0)
|
||||
goto err;
|
||||
rk_clrsetreg(&pmugrf->gpio1a_iomux,
|
||||
PMUGRF_GPIO1A7_SEL_MASK,
|
||||
PMUGRF_SPI1EC_RXD << PMUGRF_GPIO1A7_SEL_SHIFT);
|
||||
rk_clrsetreg(&pmugrf->gpio1b_iomux,
|
||||
PMUGRF_GPIO1B0_SEL_MASK | PMUGRF_GPIO1B1_SEL_MASK
|
||||
| PMUGRF_GPIO1B2_SEL_MASK,
|
||||
PMUGRF_SPI1EC_TXD << PMUGRF_GPIO1B0_SEL_SHIFT
|
||||
| PMUGRF_SPI1EC_CLK << PMUGRF_GPIO1B1_SEL_SHIFT
|
||||
| PMUGRF_SPI1EC_CSN0 << PMUGRF_GPIO1B2_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SPI2:
|
||||
if (cs != 0)
|
||||
goto err;
|
||||
rk_clrsetreg(&grf->gpio2b_iomux,
|
||||
GRF_GPIO2B1_SEL_MASK | GRF_GPIO2B2_SEL_MASK
|
||||
| GRF_GPIO2B3_SEL_MASK | GRF_GPIO2B4_SEL_MASK,
|
||||
GRF_SPI2TPM_RXD << GRF_GPIO2B1_SEL_SHIFT
|
||||
| GRF_SPI2TPM_TXD << GRF_GPIO2B2_SEL_SHIFT
|
||||
| GRF_SPI2TPM_CLK << GRF_GPIO2B3_SEL_SHIFT
|
||||
| GRF_SPI2TPM_CSN0 << GRF_GPIO2B4_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_SPI5:
|
||||
if (cs != 0)
|
||||
goto err;
|
||||
rk_clrsetreg(&grf->gpio2c_iomux,
|
||||
GRF_GPIO2C4_SEL_MASK | GRF_GPIO2C5_SEL_MASK
|
||||
| GRF_GPIO2C6_SEL_MASK | GRF_GPIO2C7_SEL_MASK,
|
||||
GRF_SPI5EXPPLUS_RXD << GRF_GPIO2C4_SEL_SHIFT
|
||||
| GRF_SPI5EXPPLUS_TXD << GRF_GPIO2C5_SEL_SHIFT
|
||||
| GRF_SPI5EXPPLUS_CLK << GRF_GPIO2C6_SEL_SHIFT
|
||||
| GRF_SPI5EXPPLUS_CSN0 << GRF_GPIO2C7_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
printf("%s: spi_id %d is not supported.\n", __func__, spi_id);
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void pinctrl_rk3399_uart_config(struct rk3399_grf_regs *grf,
|
||||
struct rk3399_pmugrf_regs *pmugrf,
|
||||
int uart_id)
|
||||
{
|
||||
switch (uart_id) {
|
||||
case PERIPH_ID_UART2:
|
||||
/* Using channel-C by default */
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C3_SEL_MASK,
|
||||
GRF_UART2DGBC_SIN << GRF_GPIO4C3_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C4_SEL_MASK,
|
||||
GRF_UART2DBGC_SOUT << GRF_GPIO4C4_SEL_SHIFT);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
default:
|
||||
debug("uart id = %d iomux error!\n", uart_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void pinctrl_rk3399_sdmmc_config(struct rk3399_grf_regs *grf, int mmc_id)
|
||||
{
|
||||
switch (mmc_id) {
|
||||
case PERIPH_ID_EMMC:
|
||||
break;
|
||||
case PERIPH_ID_SDCARD:
|
||||
rk_clrsetreg(&grf->gpio4b_iomux,
|
||||
GRF_GPIO4B0_SEL_MASK | GRF_GPIO4B1_SEL_MASK
|
||||
| GRF_GPIO4B2_SEL_MASK | GRF_GPIO4B3_SEL_MASK
|
||||
| GRF_GPIO4B4_SEL_MASK | GRF_GPIO4B5_SEL_MASK,
|
||||
GRF_SDMMC_DATA0 << GRF_GPIO4B0_SEL_SHIFT
|
||||
| GRF_SDMMC_DATA1 << GRF_GPIO4B1_SEL_SHIFT
|
||||
| GRF_SDMMC_DATA2 << GRF_GPIO4B2_SEL_SHIFT
|
||||
| GRF_SDMMC_DATA3 << GRF_GPIO4B3_SEL_SHIFT
|
||||
| GRF_SDMMC_CLKOUT << GRF_GPIO4B4_SEL_SHIFT
|
||||
| GRF_SDMMC_CMD << GRF_GPIO4B5_SEL_SHIFT);
|
||||
break;
|
||||
default:
|
||||
debug("mmc id = %d iomux error!\n", mmc_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
static void pinctrl_rk3399_gmac_config(struct rk3399_grf_regs *grf, int mmc_id)
|
||||
{
|
||||
rk_clrsetreg(&grf->gpio3a_iomux,
|
||||
GRF_GPIO3A0_SEL_MASK | GRF_GPIO3A1_SEL_MASK |
|
||||
GRF_GPIO3A2_SEL_MASK | GRF_GPIO3A3_SEL_MASK |
|
||||
GRF_GPIO3A4_SEL_MASK | GRF_GPIO3A5_SEL_MASK |
|
||||
GRF_GPIO3A6_SEL_MASK | GRF_GPIO3A7_SEL_MASK,
|
||||
GRF_MAC_TXD2 << GRF_GPIO3A0_SEL_SHIFT |
|
||||
GRF_MAC_TXD3 << GRF_GPIO3A1_SEL_SHIFT |
|
||||
GRF_MAC_RXD2 << GRF_GPIO3A2_SEL_SHIFT |
|
||||
GRF_MAC_RXD3 << GRF_GPIO3A3_SEL_SHIFT |
|
||||
GRF_MAC_TXD0 << GRF_GPIO3A4_SEL_SHIFT |
|
||||
GRF_MAC_TXD1 << GRF_GPIO3A5_SEL_SHIFT |
|
||||
GRF_MAC_RXD0 << GRF_GPIO3A6_SEL_SHIFT |
|
||||
GRF_MAC_RXD1 << GRF_GPIO3A7_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3b_iomux,
|
||||
GRF_GPIO3B0_SEL_MASK | GRF_GPIO3B1_SEL_MASK |
|
||||
GRF_GPIO3B3_SEL_MASK |
|
||||
GRF_GPIO3B4_SEL_MASK | GRF_GPIO3B5_SEL_MASK |
|
||||
GRF_GPIO3B6_SEL_MASK,
|
||||
GRF_MAC_MDC << GRF_GPIO3B0_SEL_SHIFT |
|
||||
GRF_MAC_RXDV << GRF_GPIO3B1_SEL_SHIFT |
|
||||
GRF_MAC_CLK << GRF_GPIO3B3_SEL_SHIFT |
|
||||
GRF_MAC_TXEN << GRF_GPIO3B4_SEL_SHIFT |
|
||||
GRF_MAC_MDIO << GRF_GPIO3B5_SEL_SHIFT |
|
||||
GRF_MAC_RXCLK << GRF_GPIO3B6_SEL_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3c_iomux,
|
||||
GRF_GPIO3C1_SEL_MASK,
|
||||
GRF_MAC_TXCLK << GRF_GPIO3C1_SEL_SHIFT);
|
||||
|
||||
/* Set drive strength for GMAC tx io, value 3 means 13mA */
|
||||
rk_clrsetreg(&grf->gpio3_e[0],
|
||||
GRF_GPIO3A0_E_MASK | GRF_GPIO3A1_E_MASK |
|
||||
GRF_GPIO3A4_E_MASK | GRF_GPIO3A5_E0_MASK,
|
||||
3 << GRF_GPIO3A0_E_SHIFT |
|
||||
3 << GRF_GPIO3A1_E_SHIFT |
|
||||
3 << GRF_GPIO3A4_E_SHIFT |
|
||||
1 << GRF_GPIO3A5_E0_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3_e[1],
|
||||
GRF_GPIO3A5_E12_MASK,
|
||||
1 << GRF_GPIO3A5_E12_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3_e[2],
|
||||
GRF_GPIO3B4_E_MASK,
|
||||
3 << GRF_GPIO3B4_E_SHIFT);
|
||||
rk_clrsetreg(&grf->gpio3_e[4],
|
||||
GRF_GPIO3C1_E_MASK,
|
||||
3 << GRF_GPIO3C1_E_SHIFT);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_SPL_BUILD)
|
||||
static void pinctrl_rk3399_hdmi_config(struct rk3399_grf_regs *grf, int hdmi_id)
|
||||
{
|
||||
switch (hdmi_id) {
|
||||
case PERIPH_ID_HDMI:
|
||||
rk_clrsetreg(&grf->gpio4c_iomux,
|
||||
GRF_GPIO4C0_SEL_MASK | GRF_GPIO4C1_SEL_MASK,
|
||||
(GRF_HDMII2C_SCL << GRF_GPIO4C0_SEL_SHIFT) |
|
||||
(GRF_HDMII2C_SDA << GRF_GPIO4C1_SEL_SHIFT));
|
||||
break;
|
||||
default:
|
||||
debug("%s: hdmi_id = %d unsupported\n", __func__, hdmi_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rk3399_pinctrl_request(struct udevice *dev, int func, int flags)
|
||||
{
|
||||
struct rk3399_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
|
||||
debug("%s: func=%x, flags=%x\n", __func__, func, flags);
|
||||
switch (func) {
|
||||
case PERIPH_ID_PWM0:
|
||||
case PERIPH_ID_PWM1:
|
||||
case PERIPH_ID_PWM2:
|
||||
case PERIPH_ID_PWM3:
|
||||
case PERIPH_ID_PWM4:
|
||||
pinctrl_rk3399_pwm_config(priv->grf, priv->pmugrf, func);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
case PERIPH_ID_I2C3:
|
||||
case PERIPH_ID_I2C4:
|
||||
case PERIPH_ID_I2C5:
|
||||
case PERIPH_ID_I2C6:
|
||||
case PERIPH_ID_I2C7:
|
||||
case PERIPH_ID_I2C8:
|
||||
pinctrl_rk3399_i2c_config(priv->grf, priv->pmugrf, func);
|
||||
break;
|
||||
case PERIPH_ID_SPI0:
|
||||
case PERIPH_ID_SPI1:
|
||||
case PERIPH_ID_SPI2:
|
||||
case PERIPH_ID_SPI3:
|
||||
case PERIPH_ID_SPI4:
|
||||
case PERIPH_ID_SPI5:
|
||||
pinctrl_rk3399_spi_config(priv->grf, priv->pmugrf, func, flags);
|
||||
break;
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
case PERIPH_ID_UART3:
|
||||
case PERIPH_ID_UART4:
|
||||
pinctrl_rk3399_uart_config(priv->grf, priv->pmugrf, func);
|
||||
break;
|
||||
case PERIPH_ID_LCDC0:
|
||||
case PERIPH_ID_LCDC1:
|
||||
pinctrl_rk3399_lcdc_config(priv->grf, func);
|
||||
break;
|
||||
case PERIPH_ID_SDMMC0:
|
||||
case PERIPH_ID_SDMMC1:
|
||||
pinctrl_rk3399_sdmmc_config(priv->grf, func);
|
||||
break;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case PERIPH_ID_GMAC:
|
||||
pinctrl_rk3399_gmac_config(priv->grf, func);
|
||||
break;
|
||||
#endif
|
||||
#if !defined(CONFIG_SPL_BUILD)
|
||||
case PERIPH_ID_HDMI:
|
||||
pinctrl_rk3399_hdmi_config(priv->grf, func);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk3399_pinctrl_get_periph_id(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
u32 cell[3];
|
||||
int ret;
|
||||
|
||||
ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cell[1]) {
|
||||
case 68:
|
||||
return PERIPH_ID_SPI0;
|
||||
case 53:
|
||||
return PERIPH_ID_SPI1;
|
||||
case 52:
|
||||
return PERIPH_ID_SPI2;
|
||||
case 132:
|
||||
return PERIPH_ID_SPI5;
|
||||
case 57:
|
||||
return PERIPH_ID_I2C0;
|
||||
case 59: /* Note strange order */
|
||||
return PERIPH_ID_I2C1;
|
||||
case 35:
|
||||
return PERIPH_ID_I2C2;
|
||||
case 34:
|
||||
return PERIPH_ID_I2C3;
|
||||
case 56:
|
||||
return PERIPH_ID_I2C4;
|
||||
case 38:
|
||||
return PERIPH_ID_I2C5;
|
||||
case 37:
|
||||
return PERIPH_ID_I2C6;
|
||||
case 36:
|
||||
return PERIPH_ID_I2C7;
|
||||
case 58:
|
||||
return PERIPH_ID_I2C8;
|
||||
case 65:
|
||||
return PERIPH_ID_SDMMC1;
|
||||
#if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
|
||||
case 12:
|
||||
return PERIPH_ID_GMAC;
|
||||
#endif
|
||||
#if !defined(CONFIG_SPL_BUILD)
|
||||
case 23:
|
||||
return PERIPH_ID_HDMI;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int rk3399_pinctrl_set_state_simple(struct udevice *dev,
|
||||
struct udevice *periph)
|
||||
{
|
||||
int func;
|
||||
|
||||
func = rk3399_pinctrl_get_periph_id(dev, periph);
|
||||
if (func < 0)
|
||||
return func;
|
||||
|
||||
return rk3399_pinctrl_request(dev, func, 0);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops rk3399_pinctrl_ops = {
|
||||
#if CONFIG_IS_ENABLED(PINCTRL_ROCKCHIP_RK3399_FULL)
|
||||
.set_state = rk3399_pinctrl_set_state,
|
||||
#endif
|
||||
.set_state_simple = rk3399_pinctrl_set_state_simple,
|
||||
.request = rk3399_pinctrl_request,
|
||||
.get_periph_id = rk3399_pinctrl_get_periph_id,
|
||||
};
|
||||
|
||||
static int rk3399_pinctrl_probe(struct udevice *dev)
|
||||
{
|
||||
struct rk3399_pinctrl_priv *priv = dev_get_priv(dev);
|
||||
int ret = 0;
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
|
||||
debug("%s: grf=%p, pmugrf=%p\n", __func__, priv->grf, priv->pmugrf);
|
||||
#if CONFIG_IS_ENABLED(PINCTRL_ROCKCHIP_RK3399_FULL)
|
||||
priv->banks = rk3399_pin_banks;
|
||||
#endif /* PINCTRL_ROCKCHIP_RK3399_FULL */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct udevice_id rk3399_pinctrl_ids[] = {
|
||||
{ .compatible = "rockchip,rk3399-pinctrl" },
|
||||
{ }
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(pinctrl_rk3399) = {
|
||||
.name = "rockchip_rk3399_pinctrl",
|
||||
.id = UCLASS_PINCTRL,
|
||||
.of_match = rk3399_pinctrl_ids,
|
||||
.priv_auto_alloc_size = sizeof(struct rk3399_pinctrl_priv),
|
||||
.ops = &rk3399_pinctrl_ops,
|
||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
.bind = dm_scan_fdt_dev,
|
||||
#endif
|
||||
.probe = rk3399_pinctrl_probe,
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user