From 21226ba1254f439a4c64a9239646463c5b7cc8fc Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Mon, 18 Nov 2024 17:22:06 +0800 Subject: [PATCH 1/9] mtd: spinand: HIKSEMI: Fix MFR id to 0x3C Change-Id: If7ce0da4e1678615a8252740259f5bee46ef0f76 Signed-off-by: Jon Lin --- drivers/mtd/nand/spi/hiksemi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/mtd/nand/spi/hiksemi.c b/drivers/mtd/nand/spi/hiksemi.c index a1d8236a7888..dfc645e861ba 100644 --- a/drivers/mtd/nand/spi/hiksemi.c +++ b/drivers/mtd/nand/spi/hiksemi.c @@ -10,7 +10,7 @@ #include #include -#define SPINAND_MFR_HIKSEMI 0x52 +#define SPINAND_MFR_HIKSEMI 0x3C static SPINAND_OP_VARIANTS(read_cache_variants, SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), From 1c7a3dd86f0f97e0802f8bcf0ee5499b084d99be Mon Sep 17 00:00:00 2001 From: William Wu Date: Fri, 15 Nov 2024 15:09:26 +0800 Subject: [PATCH 2/9] usb: dwc3: core: Add shutdown support The RK3576 platform doesn't use the dwc3 glue layer which supports to call dwc3_of_simple_shutdown and dwc3_remove on system shutdown. Therefore, the RK3576 dwc3 controller still keeps working on system shutdown, and it may cause pending usb irq if usb transmission happens when do reboot test. This patch adds shutdown support for RK3576 platform. Signed-off-by: William Wu Change-Id: I2cc0764402909fc8c168c0bad75909a8719fce80 --- drivers/usb/dwc3/core.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 22a153a5985c..300fc0f40ff3 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2143,6 +2143,14 @@ static int dwc3_remove(struct platform_device *pdev) return 0; } +static void dwc3_shutdown(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + if (of_device_is_compatible(dev->of_node, "rockchip,rk3576-dwc3")) + dwc3_remove(pdev); +} + #ifdef CONFIG_PM static int dwc3_core_init_for_resume(struct dwc3 *dwc) { @@ -2455,6 +2463,7 @@ MODULE_DEVICE_TABLE(acpi, dwc3_acpi_match); static struct platform_driver dwc3_driver = { .probe = dwc3_probe, .remove = dwc3_remove, + .shutdown = dwc3_shutdown, .driver = { .name = "dwc3", .of_match_table = of_match_ptr(of_dwc3_match), From 2c35da87a464ff4089ea8ee879d8bcca726d1f8b Mon Sep 17 00:00:00 2001 From: Huang-Huang Bao Date: Thu, 6 Jun 2024 20:57:55 +0800 Subject: [PATCH 3/9] UPSTREAM: pinctrl: rockchip: fix pinmux reset in rockchip_pmx_set rockchip_pmx_set reset all pinmuxs in group to 0 in the case of error, add missing bank data retrieval in that code to avoid setting mux on unexpected pins. Change-Id: I5a1943732317002f77e4c0f80ded68952795418e Fixes: 14797189b35e ("pinctrl: rockchip: add return value to rockchip_set_mux") Reviewed-by: Heiko Stuebner Signed-off-by: Huang-Huang Bao Link: https://lore.kernel.org/r/20240606125755.53778-5-i@eh5.me Signed-off-by: Linus Walleij Signed-off-by: Ye Zhang (cherry picked from commit 4ea4d4808e342ddf89ba24b93ffa2057005aaced) --- drivers/pinctrl/pinctrl-rockchip.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index ddd091c2a9ab..e5c77c2027c0 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -4220,8 +4220,10 @@ static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, if (ret && cnt) { /* revert the already done pin settings */ - for (cnt--; cnt >= 0 && !data[cnt].func; cnt--) + for (cnt--; cnt >= 0; cnt--) { + bank = pin_to_bank(info, pins[cnt]); rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0); + } return ret; } From b711dfd7efe97b0c9e6461573dc6e6bf5640f964 Mon Sep 17 00:00:00 2001 From: Shengfei Xu Date: Tue, 12 Nov 2024 16:43:49 +0800 Subject: [PATCH 4/9] mfd: rk806: Support power-supply grouping to enter sleep mode In order to support the suspend/resume power supply sequence, the power supplies are grouped and controlled in stages to enter sleep mode. Change-Id: I16cb53b01b86a8b221de91a62c5ffddfa34e0f33 Signed-off-by: Shengfei Xu --- drivers/mfd/rk806-core.c | 18 ++++++++++++++- drivers/regulator/rk806-regulator.c | 36 ++++++++++++++++++++++++++--- include/linux/mfd/rk806.h | 2 ++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/rk806-core.c b/drivers/mfd/rk806-core.c index 7da7185763f4..eed82776374b 100644 --- a/drivers/mfd/rk806-core.c +++ b/drivers/mfd/rk806-core.c @@ -214,7 +214,7 @@ static const struct reg_field rk806_reg_fields[] = { [NLDO3_VSEL_CTR_SEL] = REG_FIELD(0x6a, 0, 1), /* SLEEP_VSEL_CTR_SEL4 */ [PLDO4_VSEL_CTR_SEL] = REG_FIELD(0x6d, 4, 5), - [PLDO3_VSEL_CTR_SEL] = REG_FIELD(0x6d, 0, 0), + [PLDO3_VSEL_CTR_SEL] = REG_FIELD(0x6d, 0, 1), [PLDO2_VSEL_CTR_SEL] = REG_FIELD(0x6c, 4, 5), [PLDO1_VSEL_CTR_SEL] = REG_FIELD(0x6c, 0, 1), /* SLEEP_VSEL_CTR_SEL5 */ @@ -820,6 +820,22 @@ static int rk806_parse_dt(struct rk806 *rk806) dev_info(dev, "vb-shutdown-sequence missing!\n"); } + pdata->dvs_control_suspend = devm_kzalloc(dev, + RK806_ID_END * sizeof(int), + GFP_KERNEL); + if (!pdata->dvs_control_suspend) + return -EINVAL; + + pdata->support_dvs_control_suspend = 1; + ret = device_property_read_u32_array(dev, + "dvs-suspend-control-by", + pdata->dvs_control_suspend, + RK806_ID_END); + if (ret) { + pdata->support_dvs_control_suspend = 0; + dev_info(dev, "dvs-suspend-control-by missing!\n"); + } + return 0; } diff --git a/drivers/regulator/rk806-regulator.c b/drivers/regulator/rk806-regulator.c index bbef6dee2d62..b8b18fd63e51 100644 --- a/drivers/regulator/rk806-regulator.c +++ b/drivers/regulator/rk806-regulator.c @@ -1178,6 +1178,8 @@ static int rk806_regulator_probe(struct platform_device *pdev) static int __maybe_unused rk806_suspend(struct device *dev) { struct rk806 *rk806 = dev_get_drvdata(dev->parent); + struct rk806_platform_data *pdata = rk806->pdata; + int value; int i; rk806_field_write(rk806, RST_FUN, 0x00); @@ -1186,10 +1188,35 @@ static int __maybe_unused rk806_suspend(struct device *dev) for (i = RK806_ID_DCDC1; i < RK806_ID_END; i++) rk806_field_write(rk806, BUCK1_VSEL_CTR_SEL + i, CTR_BY_NO_EFFECT); - rk806_field_write(rk806, PWRCTRL1_FUN, PWRCTRL_DVS_FUN); + if (!pdata->dvs_control_suspend || !pdata->support_dvs_control_suspend) { + rk806_field_write(rk806, PWRCTRL1_FUN, PWRCTRL_DVS_FUN); - for (i = RK806_ID_DCDC1; i < RK806_ID_END; i++) - rk806_field_write(rk806, BUCK1_VSEL_CTR_SEL + i, CTR_BY_PWRCTRL1); + for (i = RK806_ID_DCDC1; i < RK806_ID_END; i++) + rk806_field_write(rk806, BUCK1_VSEL_CTR_SEL + i, CTR_BY_PWRCTRL1); + } else { + for (i = 0; i <= RK806_ID_PLDO6 - RK806_ID_PLDO1; i++) { + value = rk806_field_read(rk806, PLDO1_ON_VSEL + i); + rk806_field_write(rk806, PLDO1_SLP_VSEL + i, value); + } + + for (i = RK806_ID_DCDC1; i <= RK806_ID_NLDO5; i++) + rk806_field_write(rk806, BUCK1_VSEL_CTR_SEL + i, + pdata->dvs_control_suspend[i]); + rk806_field_write(rk806, PLDO1_VSEL_CTR_SEL, pdata->dvs_control_suspend[RK806_ID_PLDO6]); + rk806_field_write(rk806, PLDO2_VSEL_CTR_SEL, pdata->dvs_control_suspend[RK806_ID_PLDO1]); + rk806_field_write(rk806, PLDO3_VSEL_CTR_SEL, pdata->dvs_control_suspend[RK806_ID_PLDO2]); + rk806_field_write(rk806, PLDO4_VSEL_CTR_SEL, pdata->dvs_control_suspend[RK806_ID_PLDO3]); + rk806_field_write(rk806, PLDO5_VSEL_CTR_SEL, pdata->dvs_control_suspend[RK806_ID_PLDO4]); + rk806_field_write(rk806, PLDO6_VSEL_CTR_SEL, pdata->dvs_control_suspend[RK806_ID_PLDO5]); + + for (i = RK806_ID_DCDC1; i < RK806_ID_END; i++) { + if (pdata->dvs_control_suspend[i] == CTR_BY_PWRCTRL2) + rk806_field_write(rk806, PWRCTRL2_FUN, PWRCTRL_DVS_FUN); + if (pdata->dvs_control_suspend[i] == CTR_BY_PWRCTRL3) + rk806_field_write(rk806, PWRCTRL3_FUN, PWRCTRL_DVS_FUN); + } + rk806_field_write(rk806, PWRCTRL1_FUN, PWRCTRL_SLP_FUN); + } return 0; } @@ -1203,6 +1230,9 @@ static int __maybe_unused rk806_resume(struct device *dev) rk806_field_write(rk806, BUCK1_VSEL_CTR_SEL + i, CTR_BY_NO_EFFECT); rk806_field_write(rk806, PWRCTRL1_FUN, PWRCTRL_NULL_FUN); + rk806_field_write(rk806, PWRCTRL2_FUN, PWRCTRL_NULL_FUN); + rk806_field_write(rk806, PWRCTRL3_FUN, PWRCTRL_NULL_FUN); + rk806_field_write(rk806, RST_FUN, 0x01); return 0; diff --git a/include/linux/mfd/rk806.h b/include/linux/mfd/rk806.h index f97602d73e39..e0d608480ce5 100644 --- a/include/linux/mfd/rk806.h +++ b/include/linux/mfd/rk806.h @@ -505,9 +505,11 @@ struct rk806_platform_data { int *shutdown_sequence; int *vb_shutdown_sequence; + int *dvs_control_suspend; int support_shutdown_sequence; int support_vb_sequence; + int support_dvs_control_suspend; }; struct rk806_pin_info { From 2ba5e1d68173143ee9d55b59c7ac364887267e74 Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Wed, 25 Sep 2024 09:34:14 +0800 Subject: [PATCH 5/9] drm/rockchip: gem: Set size of the allocated object when create gem We may want to know how many size of a gem object is allocated, but this size in rockchip_gem_object for no-IOMMU devices will not be set. There are two ways to use rockchip GEMs, one is to create GEMs via DRM, and the other is to import buffer created by other devices via DMA-BUF and map it. For no-IOMMU devices, neither of them will set the buffer size. Let's set the size in rockchip_gem_object when we create a new rockchip gem. Fixes: c1c9524d3f8a ("drm/rockchip: debugfs: optimize dump buffer file name and size") Change-Id: I396bf60a0d49d6f703044f9d354aa37312c9cc82 Signed-off-by: Chaoyi Chen --- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 7b52a92bdd6a..862c50d94c97 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -67,8 +67,6 @@ static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj) iommu_flush_iotlb_all(private->domain); - rk_obj->size = ret; - return 0; err_remove_node: @@ -731,6 +729,7 @@ rockchip_gem_create_with_handle(struct drm_file *file_priv, return ERR_CAST(rk_obj); obj = &rk_obj->base; + rk_obj->size = size; /* * allocate a id of idr table where the obj is registered @@ -863,6 +862,7 @@ rockchip_gem_prime_import_sg_table(struct drm_device *drm, goto err_free_rk_obj; } + rk_obj->size = attach->dmabuf->size; rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT; rk_obj->pages = drm_calloc_large(rk_obj->num_pages, sizeof(*rk_obj->pages)); if (!rk_obj->pages) { From fd4dfa23f4fdd8c0e3e1292df0768b8f8e082370 Mon Sep 17 00:00:00 2001 From: Zain Wang Date: Wed, 20 Nov 2024 14:40:51 +0800 Subject: [PATCH 6/9] ARM: configs: rk3506: Add gzip support for initrd Signed-off-by: Zain Wang Change-Id: Iedf4c04259b7accefb1d0fb7416108e088e8e67a --- arch/arm/configs/rk3506_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm/configs/rk3506_defconfig b/arch/arm/configs/rk3506_defconfig index d6cfcd7e6f7a..67b54de6ff44 100644 --- a/arch/arm/configs/rk3506_defconfig +++ b/arch/arm/configs/rk3506_defconfig @@ -8,7 +8,6 @@ CONFIG_HIGH_RES_TIMERS=y CONFIG_PREEMPT=y CONFIG_LOG_BUF_SHIFT=14 CONFIG_BLK_DEV_INITRD=y -# CONFIG_RD_GZIP is not set # CONFIG_RD_BZIP2 is not set # CONFIG_RD_LZMA is not set # CONFIG_RD_XZ is not set From a3d08fbcc0fbcc8cc4873bac6097c1d2907f5c00 Mon Sep 17 00:00:00 2001 From: Jianlong Wang Date: Wed, 13 Nov 2024 15:15:36 +0800 Subject: [PATCH 7/9] arm64: dts: rockchip: add rk3358m automotive board support Change-Id: I48e6d2748f5d7ab2681a8c13c54a92252d56eb59 Signed-off-by: Jianlong Wang --- arch/arm64/boot/dts/rockchip/Makefile | 1 + .../rk3358m-automotive-ddr3-v11-linux.dts | 60 ++ .../rockchip/rk3358m-automotive-ddr3-v11.dtsi | 730 ++++++++++++++++++ 3 files changed, 791 insertions(+) create mode 100644 arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11-linux.dts create mode 100644 arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11.dtsi diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile index daeb9e9946a5..3f7f2b1cfc81 100644 --- a/arch/arm64/boot/dts/rockchip/Makefile +++ b/arch/arm64/boot/dts/rockchip/Makefile @@ -47,6 +47,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-pc.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3358-evb-ddr3-v10-linux.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3358m-automotive-ddr3-v11-linux.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3358m-vehicle-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-geekbox.dtb diff --git a/arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11-linux.dts b/arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11-linux.dts new file mode 100644 index 000000000000..8252455991e3 --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11-linux.dts @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2024 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include "rk3358m-automotive-ddr3-v11.dtsi" +#include "rk3358-linux.dtsi" + +/ { + model = "Rockchip RK3358M AUTOMOTIVE DDR3 V11 board"; + compatible = "rockchip,rk3358m-automotive-ddr3-v11-linux", "rockchip,px30", "rockchip,rk3358"; + + chosen { + bootargs = "earlycon=uart8250,mmio32,0xff160000 console=ttyFIQ0 skip_initramfs root=/dev/rd0 rootfstype=squashfs init=/sbin/init"; + }; + + /* + * This memory mapping range represents a 512MB memory space + * starting from the physical address 0x00000000 + * where: + * 0x00000000 - base address + * 0x0 - address cells + * 0x0 - size cells + * 0x20000000 - memory size (512MB) + * Note: The actual available memory size depends on the hardware design + * and may differ from the 512MB defined here. + * Adjustment is needed based on the specific hardware memory configuration. + */ + memory: memory { + device_type = "memory"; + reg = <0x00000000 0x0 0x0 0x20000000>; + }; + + ramdisk: ramdisk { + compatible = "rockchip,ramdisk"; + memory-region = <&ramdisk_r>; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + atf: atf@0 { + reg = <0x0 0x00000 0x0 0x200000>; + no-map; + }; + + mmc_dma_buf@200000 { + reg = <0x0 0x200000 0x0 0x200000>; + }; + + ramdisk_r: ramdisk_r@4000000 { + /* Do not exceed 132MB which used by TEE */ + reg = <0x0 0x4000000 0x0 0x2000000>; + }; + }; +}; diff --git a/arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11.dtsi b/arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11.dtsi new file mode 100644 index 000000000000..716691fc7305 --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rk3358m-automotive-ddr3-v11.dtsi @@ -0,0 +1,730 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2024 Rockchip Electronics Co., Ltd + * + */ + +#include +#include +#include +#include +#include "rk3358.dtsi" + +/ { + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 2>; + io-channel-names = "buttons"; + poll-interval = <100>; + keyup-threshold-microvolt = <1800000>; + + vol-down-key { + linux,code = ; + label = "volume down"; + press-threshold-microvolt = <300000>; + }; + + vol-up-key { + linux,code = ; + label = "volume up"; + press-threshold-microvolt = <17000>; + }; + }; + + backlight: backlight { + compatible = "pwm-backlight"; + pwms = <&pwm3 0 10000000 0>; + pinctrl-names = "default"; + pinctrl-0 = <&lcd0_pwren &lcd0_rst>; + enable-gpios = <&gpio1 RK_PD6 GPIO_ACTIVE_HIGH>; + 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 101 102 103 + 104 105 106 107 108 109 110 111 + 112 113 114 115 116 117 118 119 + 120 121 122 123 124 125 126 127 + 128 129 130 131 132 133 134 135 + 136 137 138 139 140 141 142 143 + 144 145 146 147 148 149 150 151 + 152 153 154 155 156 157 158 159 + 160 161 162 163 164 165 166 167 + 168 169 170 171 172 173 174 175 + 176 177 178 179 180 181 182 183 + 184 185 186 187 188 189 190 191 + 192 193 194 195 196 197 198 199 + 200 201 202 203 204 205 206 207 + 208 209 210 211 212 213 214 215 + 216 217 218 219 220 221 222 223 + 224 225 226 227 228 229 230 231 + 232 233 234 235 236 237 238 239 + 240 241 242 243 244 245 246 247 + 248 249 250 251 252 253 254 255>; + default-brightness-level = <60>; + }; + + /* The THine 827-Q (rgb to dual lvds) don't need driver */ + panel_rgb: panel-rgb { + compatible = "simple-panel"; + #address-cells = <1>; + #size-cells = <0>; + + pinctrl-names = "default"; + pinctrl-0 = <&pwdn_rgb>; /* This the pwdn of THine-827-Q */ + power-supply = <&vcc3v3_lcd>; + backlight = <&backlight>; + enable-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio1 RK_PD7 GPIO_ACTIVE_LOW>; + prepare-delay-ms = <0>; + reset-delay-ms = <0>; + init-delay-ms = <0>; + enable-delay-ms = <5>; + disable-delay-ms = <10>; + unprepare-delay-ms = <0>; + + width-mm = <292>; + height-mm = <109>; + + bus-format = ; + + display-timings { + native-mode = <&timing1>; + + timing1: timing1 { + clock-frequency = <88200000>; + hactive = <1920>; + vactive = <720>; + hfront-porch = <40>; + hsync-len = <20>; + hback-porch = <24>; + vfront-porch = <5>; + vsync-len = <4>; + vback-porch = <4>; + hsync-active = <0>; + vsync-active = <0>; + de-active = <0>; + pixelclk-active = <1>; + }; + }; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + panel_in_rgb: endpoint@0 { + reg = <0>; + remote-endpoint = <&rgb_out_panel>; + }; + }; + }; + }; + + rk809_sound: rk809-sound { + status = "okay"; + compatible = "rockchip,multicodecs-card"; + rockchip,card-name = "rockchip-rk809"; + poll-interval = <100>; + rockchip,format = "i2s"; + rockchip,mclk-fs = <256>; + rockchip,cpu = <&i2s1_2ch>; + rockchip,codec = <&rk809_codec>; + }; + + vcc5v0_sys: vcc5v0-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + + vcc_phy: vcc-phy { + compatible = "regulator-fixed"; + regulator-name = "vcc_phy"; + regulator-always-on; + regulator-boot-on; + }; + + /* It's just for compatibility with SDK script checks. */ + wireless-bluetooth { + status = "disabled"; + }; +}; + +&cpu0 { + cpu-supply = <&vdd_arm>; +}; + +&dfi { + status = "okay"; +}; + +&display_subsystem { + status = "okay"; +}; + +&dmc { + center-supply = <&vdd_logic>; + status = "okay"; +}; + +&emmc { + bus-width = <8>; + cap-mmc-highspeed; + mmc-hs200-1_8v; + supports-emmc; + disable-wp; + non-removable; + num-slots = <1>; + status = "okay"; +}; + +&gmac { + phy-supply = <&vcc_phy>; + clock_in_out = "output"; + snps,reset-gpio = <&gpio2 12 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + snps,reset-delays-us = <0 50000 50000>; + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_logic>; + status = "okay"; +}; + +&hevc { + status = "okay"; +}; + +&hevc_mmu { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + clock-frequency = <400000>; + + rk809: pmic@20 { + compatible = "rockchip,rk809"; + reg = <0x20>; + interrupt-parent = <&gpio0>; + interrupts = <7 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default", "pmic-sleep", + "pmic-power-off", "pmic-reset"; + pinctrl-0 = <&pmic_int>; + pinctrl-1 = <&soc_slppin_slp>, <&rk817_slppin_slp>; + pinctrl-2 = <&soc_slppin_gpio>, <&rk817_slppin_pwrdn>; + pinctrl-3 = <&soc_slppin_rst>, <&rk817_slppin_rst>; + rockchip,system-power-controller; + wakeup-source; + #clock-cells = <1>; + clock-output-names = "rk808-clkout1", "rk808-clkout2"; + //fb-inner-reg-idxs = <2>; + /* 1: rst regs (default in codes), 0: rst the pmic */ + pmic-reset-func = <1>; + + vcc1-supply = <&vcc5v0_sys>; + vcc2-supply = <&vcc5v0_sys>; + vcc3-supply = <&vcc5v0_sys>; + vcc4-supply = <&vcc5v0_sys>; + vcc5-supply = <&vcc3v3_sys>; + vcc6-supply = <&vcc3v3_sys>; + vcc7-supply = <&vcc3v3_sys>; + vcc8-supply = <&vcc3v3_sys>; + vcc9-supply = <&vcc5v0_sys>; + + pwrkey { + status = "okay"; + }; + + pinctrl_rk8xx: pinctrl_rk8xx { + gpio-controller; + #gpio-cells = <2>; + + rk817_slppin_null: rk817_slppin_null { + pins = "gpio_slp"; + function = "pin_fun0"; + }; + + rk817_slppin_slp: rk817_slppin_slp { + pins = "gpio_slp"; + function = "pin_fun1"; + }; + + rk817_slppin_pwrdn: rk817_slppin_pwrdn { + pins = "gpio_slp"; + function = "pin_fun2"; + }; + + rk817_slppin_rst: rk817_slppin_rst { + pins = "gpio_slp"; + function = "pin_fun3"; + }; + }; + + regulators { + vdd_logic: DCDC_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <950000>; + regulator-max-microvolt = <1350000>; + regulator-ramp-delay = <6001>; + regulator-initial-mode = <0x2>; + regulator-name = "vdd_logic"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <950000>; + }; + }; + + vdd_arm: DCDC_REG2 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <950000>; + regulator-max-microvolt = <1350000>; + regulator-ramp-delay = <6001>; + regulator-initial-mode = <0x2>; + regulator-name = "vdd_arm"; + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <950000>; + }; + }; + + vcc_ddr: DCDC_REG3 { + regulator-always-on; + regulator-boot-on; + regulator-name = "vcc_ddr"; + regulator-initial-mode = <0x2>; + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vcc_3v3: DCDC_REG4 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-initial-mode = <0x2>; + regulator-name = "vcc_3v3"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; + }; + }; + + vcc_1v0: LDO_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-name = "vcc_1v0"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1000000>; + }; + }; + + vcc_1v8: LDO_REG2 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-name = "vcc_1v8"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vdd_1v0: LDO_REG3 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + + regulator-name = "vdd_1v0"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1000000>; + }; + }; + + vcc3v3_pmu: LDO_REG4 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + + regulator-name = "vcc3v3_pmu"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3000000>; + + }; + }; + + vcc3v3_ser: LDO_REG5 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + + regulator-name = "vcc3v3_ser"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; + }; + }; + + vcc3v3_deser: LDO_REG6 { + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-boot-off; + + regulator-name = "vcc3v3_deser"; + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <3300000>; + + }; + }; + + vcc1v8_thc: LDO_REG7 { + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-name = "vcc1v8_thc"; + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vcc1v8_ser: LDO_REG8 { + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-name = "vcc1v8_ser"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vdd1v2_ser: LDO_REG9 { + regulator-boot-on; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + + regulator-name = "vdd1v2_ser"; + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <1200000>; + }; + }; + + vcc3v3_sys: DCDC_REG5 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc3v3_sys"; + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; + }; + }; + + vcc5v0_host: SWITCH_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-name = "vcc5v0_host"; + }; + + vcc3v3_lcd: SWITCH_REG2 { + regulator-boot-on; + regulator-name = "vcc3v3_lcd"; + }; + }; + + rk809_codec: codec { + #sound-dai-cells = <0>; + compatible = "rockchip,rk809-codec", "rockchip,rk817-codec"; + clocks = <&cru SCLK_I2S1_OUT>; + clock-names = "mclk"; + pinctrl-names = "default"; + pinctrl-0 = <&i2s1_2ch_mclk>; + hp-volume = <20>; + spk-volume = <3>; + status = "okay"; + }; + }; +}; + +&i2c1 { + status = "okay"; + clock-frequency = <400000>; + + /* These are relatively safe rise/fall times; TODO: measure */ + i2c-scl-falling-time-ns = <50>; + i2c-scl-rising-time-ns = <300>; +}; + +&i2c2 { + status = "okay"; + clock-frequency = <400000>; +}; + +&i2s1_2ch { + status = "okay"; + #sound-dai-cells = <0>; +}; + +&io_domains { + status = "okay"; + + vccio1-supply = <&vcc_3v3>; + vccio2-supply = <&vcc_3v3>; + vccio3-supply = <&vcc_3v3>; + vccio4-supply = <&vcc3v3_pmu>; + vccio5-supply = <&vcc3v3_pmu>; +}; + +&isp_mmu { + status = "okay"; +}; + +&mipi_dphy_rx0 { + status = "okay"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + mipi_in_ucam: endpoint@1 { + reg = <1>; + // remote-endpoint = <&ucam_out>; + data-lanes = <1 2>; + }; + }; + + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + + dphy_rx0_out: endpoint@0 { + reg = <0>; + remote-endpoint = <&isp0_mipi_in>; + }; + }; + }; +}; + +&mpp_srv { + status = "okay"; +}; + +&pinctrl { + lcd { + lcd0_pwren: lcd0-pwren { + rockchip,pins = <1 RK_PD6 RK_FUNC_GPIO &pcfg_output_high>; + }; + lcd0_rst: lcd0-rst { + rockchip,pins = <1 RK_PD7 RK_FUNC_GPIO &pcfg_output_high>; + }; + pwdn_rgb: pwdn-rgb { + rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_output_high>; + }; + }; + + pmic { + pmic_int: pmic_int { + rockchip,pins = + <0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>; + }; + + soc_slppin_gpio: soc_slppin_gpio { + rockchip,pins = + <0 RK_PA4 RK_FUNC_GPIO &pcfg_output_low>; + }; + + soc_slppin_slp: soc_slppin_slp { + rockchip,pins = + <0 RK_PA4 1 &pcfg_pull_none>; + }; + + soc_slppin_rst: soc_slppin_rst { + rockchip,pins = + <0 RK_PA4 2 &pcfg_pull_none>; + }; + }; +}; + +&pmu_io_domains { + status = "okay"; + + pmuio1-supply = <&vcc3v3_pmu>; + pmuio2-supply = <&vcc3v3_pmu>; +}; + +&pwm1 { + status = "okay"; +}; + +&pwm3 { + status = "okay"; +}; + +&rgb { + status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + + /delete-property/ phys; + /delete-property/ phy-names; + + pinctrl-0 = <&lcdc_m0_rgb_pins>; + pinctrl-1 = <&lcdc_m0_sleep_pins>; + + ports { + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + + rgb_out_panel: endpoint@0 { + reg = <0>; + remote-endpoint = <&panel_in_rgb>; + }; + }; + }; +}; + +&rgb_in_vopb { + status = "okay"; +}; + +&rgb_in_vopl { + status = "disabled"; +}; + +&rk_rga { + status = "okay"; +}; + +&rkisp1 { + status = "okay"; + + port { + #address-cells = <1>; + #size-cells = <0>; + + isp0_mipi_in: endpoint@0 { + reg = <0>; + remote-endpoint = <&dphy_rx0_out>; + }; + }; +}; + +&route_rgb { + connect = <&vopb_out_rgb>; + status = "okay"; +}; + +&saradc { + status = "okay"; + vref-supply = <&vcc_1v8>; +}; + +&spi0 { + status = "okay"; +}; + +&tsadc { + pinctrl-names = "gpio", "otpout"; + pinctrl-0 = <&tsadc_otp_gpio>; + pinctrl-1 = <&tsadc_otp_out>; + status = "okay"; +}; + +&u2phy { + status = "okay"; + + u2phy_host: host-port { + status = "okay"; + phy-supply = <&vcc5v0_host>; + }; + + u2phy_otg: otg-port { + status = "okay"; + }; +}; + +&usb20_otg { + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&vdpu { + status = "okay"; +}; + +&vepu { + status = "okay"; +}; + +&vopb { + status = "okay"; +}; + +&vopb_mmu { + status = "okay"; +}; + +&vopl { + status = "okay"; +}; + +&vopl_mmu { + status = "okay"; +}; + +&vpu_mmu { + status = "okay"; +}; From eb966dcdee4e2760319a1124843ab7953024d417 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 19 Nov 2024 10:10:29 +0800 Subject: [PATCH 8/9] video: rockchip: rga3: fix hardware state has been cleared after timeout Change-Id: I15607f0af364bbb5947aba19024f0d582148016f Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/rga2_reg_info.c | 28 +++++++++++++++------ drivers/video/rockchip/rga3/rga_job.c | 18 +++++++------ 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index c2af876a98db..49523d5d7e95 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -3120,23 +3120,35 @@ static int rga2_read_status(struct rga_job *job, struct rga_scheduler_t *schedul return 0; } -static int rga2_irq(struct rga_scheduler_t *scheduler) +static void rga2_clear_intr(struct rga_scheduler_t *scheduler) { - struct rga_job *job = scheduler->running_job; - - /*clear INTR */ rga_write(rga_read(RGA2_INT, scheduler) | (m_RGA2_INT_ERROR_CLEAR_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR | m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR), RGA2_INT, scheduler); +} + +static int rga2_irq(struct rga_scheduler_t *scheduler) +{ + struct rga_job *job = scheduler->running_job; /* The hardware interrupt top-half don't need to lock the scheduler. */ - if (job == NULL) - return IRQ_HANDLED; + if (job == NULL) { + rga2_clear_intr(scheduler); + rga_err("core[%d], invalid job, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x], WORK_CYCLE[0x%x(%d)]\n", + scheduler->core, rga_read(RGA2_INT, scheduler), + rga_read(RGA2_STATUS2, scheduler), rga_read(RGA2_STATUS1, scheduler), + rga_read(RGA2_WORK_CNT, scheduler), rga_read(RGA2_WORK_CNT, scheduler)); + + return IRQ_HANDLED; + } + + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { + rga2_clear_intr(scheduler); - if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) return IRQ_WAKE_THREAD; + } scheduler->ops->read_status(job, scheduler); @@ -3158,6 +3170,8 @@ static int rga2_irq(struct rga_scheduler_t *scheduler) scheduler->ops->soft_reset(scheduler); } + rga2_clear_intr(scheduler); + return IRQ_WAKE_THREAD; } diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index dd184821b373..7625ab33df1b 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -263,27 +263,29 @@ static int rga_job_timeout_query_state(struct rga_job *job, int orig_ret) { struct rga_scheduler_t *scheduler = job->scheduler; - if (scheduler->ops->read_status) { - scheduler->ops->read_status(job, scheduler); - rga_job_err(job, "core[%d]: INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x], WORK_CYCLE[0x%x(%d)]\n", - scheduler->core, - job->intr_status, job->hw_status, job->cmd_status, - job->work_cycle, job->work_cycle); - } - if (test_bit(RGA_JOB_STATE_DONE, &job->state) && test_bit(RGA_JOB_STATE_FINISH, &job->state)) { return orig_ret; } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && test_bit(RGA_JOB_STATE_FINISH, &job->state)) { rga_job_err(job, "job hardware has finished, but the software has timeout!\n"); + return -EBUSY; } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && !test_bit(RGA_JOB_STATE_FINISH, &job->state)) { rga_job_err(job, "job hardware has timeout.\n"); + + if (scheduler->ops->read_status) + scheduler->ops->read_status(job, scheduler); + return -EBUSY; } + rga_job_err(job, "timeout core[%d]: INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x], WORK_CYCLE[0x%x(%d)]\n", + scheduler->core, + job->intr_status, job->hw_status, job->cmd_status, + job->work_cycle, job->work_cycle); + return orig_ret; } From 83ecc44c3702093c5857e4756e391c3310c461e9 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 19 Nov 2024 17:43:01 +0800 Subject: [PATCH 9/9] video: rockchip: rga3: fix power off in isr-thread when job is running When the ISR is blocked, it's possible that the original job has already been released while the scheduler is now running a new job. Therefore, it is necessary to check whether the current job has already triggered a hardware interrupt. Change-Id: If8999b07c76c5217f47419908f20945b6f619e67 Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/rga_job.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index 7625ab33df1b..0fb81a1c0280 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -233,6 +233,15 @@ struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler) spin_unlock_irqrestore(&scheduler->irq_lock, flags); return NULL; } + + if (!test_bit(RGA_JOB_STATE_FINISH, &job->state)) { + rga_err("%s(%#x) running job has not yet been completed.", + rga_get_core_name(scheduler->core), scheduler->core); + + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + return NULL; + } + scheduler->running_job = NULL; scheduler->timer.busy_time +=