From a78b174c2fb699be11006e43557137b8e602cfdc Mon Sep 17 00:00:00 2001 From: William Wu Date: Mon, 14 Jul 2025 09:56:54 +0800 Subject: [PATCH 01/10] phy: rockchip: inno-usb2: Fix DEBUG_LOCKS_WARN_ON in chg work The following trace can be seen if usb is connecting to Host while do rockchip_chg_detect_work. DEBUG_LOCKS_WARN_ON(rt_mutex_owner(lock) != current) WARNING: CPU: 6 PID: 512 at kernel/locking/rtmutex-debug.c:47 debug_rt_mutex_unlock+0x58/0x64 Modules linked in: CPU: 6 PID: 512 Comm: kworker/6:3 Not tainted 5.10.226-rt89 #186 Hardware name: Rockchip RK3588 EVB1 LP4 V10 Board (DT) Workqueue: events rockchip_chg_detect_work pstate: 60c00089 (nZCv daIf +PAN +UAO -TCO BTYPE=--) pc : debug_rt_mutex_unlock+0x58/0x64 lr : debug_rt_mutex_unlock+0x58/0x64 ...... Call trace: debug_rt_mutex_unlock+0x58/0x64 __rt_mutex_unlock+0x48/0xf8 _mutex_unlock+0xc/0x14 rockchip_chg_detect_work+0x44c/0x6f0 process_one_work+0x1bc/0x27c worker_thread+0x268/0x488 kthread+0x170/0x210 ret_from_fork+0x10/0x18 This issue can cause the preempt-rt Linux kernel to crash. The reason is that all mutexes in preempt-rt have been replaced with rt_mutexes. An rt_mutex has a PI (Priority Inversion) feature, which means that when a high-priority task waits for a lock held by a low-priority task, the priority of the low-priority task is elevated. A linked list is established on p->pi_waiters. This requires that lock/unlock operations be handled by the same task. If unlock is performed and pi_waiters is released by another task, the task that holds the lock will encounter an exception when accessing pi_waiters. When executing rockchip_chg_detect_work, a schedule_delayed_work operation is performed while holding the mutex lock, causing the mutex lock to be released by a different worker task, which triggers a kernel panic. This patch use kthread_work instead of delayed_work to avoid long-running chg work affecting other tasks in the system workqueue. And also avoid chg work to be scheduled while hold a mutex lock. Signed-off-by: William Wu Change-Id: I1e49a22f002b0dfcf0e04d243d99624d34c9a701 --- drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 158 +++++++++++------- 1 file changed, 100 insertions(+), 58 deletions(-) diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c index 50861763b182..66748c397525 100644 --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c @@ -267,10 +267,11 @@ struct rockchip_usb2phy_cfg { * @otg_mux_irq: IRQ number which multiplex otg-id/otg-bvalid/linestate * irqs to one irq in otg-port. * @mutex: for register updating in sm_work. - * @chg_work: charge detect work. * @bypass_uart_work: usb bypass uart work. * @otg_sm_work: OTG state machine work. * @sm_work: HOST state machine work. + * @chg_work: charge detect kthread work. + * @chg_worker: charge detect kthread worker. * @vbus: vbus regulator supply on few rockchip boards. * @sw: orientation switch, communicate with TCPM (Type-C Port Manager). * @port_cfg: port register configuration, assigned by driver data. @@ -304,9 +305,10 @@ struct rockchip_usb2phy_port { int otg_mux_irq; struct mutex mutex; struct delayed_work bypass_uart_work; - struct delayed_work chg_work; struct delayed_work otg_sm_work; struct delayed_work sm_work; + struct kthread_work chg_work; + struct kthread_worker *chg_worker; struct regulator *vbus; struct typec_switch_dev *sw; const struct rockchip_usb2phy_port_cfg *port_cfg; @@ -1306,7 +1308,7 @@ static void rockchip_usb2phy_otg_sm_work(struct work_struct *work) switch (rphy->chg_state) { case USB_CHG_STATE_UNDEFINED: mutex_unlock(&rport->mutex); - schedule_delayed_work(&rport->chg_work, 0); + kthread_queue_work(rport->chg_worker, &rport->chg_work); return; case USB_CHG_STATE_DETECTED: switch (rphy->chg_type) { @@ -1472,46 +1474,17 @@ static void rockchip_chg_enable_secondary_det(struct rockchip_usb2phy *rphy, #define CHG_DCD_MAX_RETRIES 6 #define CHG_PRIMARY_DET_TIME (40 * HZ / 1000) #define CHG_SECONDARY_DET_TIME (40 * HZ / 1000) -static void rockchip_chg_detect_work(struct work_struct *work) +static void rockchip_run_chg_detect_machine(struct rockchip_usb2phy_port *rport) { - struct rockchip_usb2phy_port *rport = - container_of(work, struct rockchip_usb2phy_port, chg_work.work); struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent); - struct regmap *base = get_reg_base(rphy); - const struct usb2phy_reg *phy_sus_reg; bool is_dcd, tmout, vout; unsigned long delay; - unsigned int mask; - int ret; dev_dbg(&rport->phy->dev, "chg detection work state = %d\n", rphy->chg_state); - /* - * The conditions for charger detection: - * 1. Set the PHY in normal mode to keep the UTMI_CLK on. - * 2. Set the utmi_opmode in non-driving mode. - * 3. Set the utmi_xcvrselect to FS speed. - * 4. Set the utmi_termselect to FS speed. - * 5. Enable the DP/DM pulldown resistor. - */ switch (rphy->chg_state) { case USB_CHG_STATE_UNDEFINED: - mutex_lock(&rport->mutex); - /* Store the PHY current suspend configuration */ - phy_sus_reg = &rport->port_cfg->phy_sus; - ret = regmap_read(base, phy_sus_reg->offset, - &rphy->phy_sus_cfg); - if (ret) { - dev_err(&rport->phy->dev, - "Fail to read phy_sus reg offset 0x%x, ret %d\n", - phy_sus_reg->offset, ret); - mutex_unlock(&rport->mutex); - return; - } - - /* Set the PHY in charger detection mode */ - property_enable(base, &rphy->phy_cfg->chg_det.chg_mode, true); /* Start DCD processing stage 1 */ rockchip_chg_enable_dcd(rphy, true); rphy->chg_state = USB_CHG_STATE_WAIT_FOR_DCD; @@ -1585,37 +1558,75 @@ static void rockchip_chg_detect_work(struct work_struct *work) fallthrough; case USB_CHG_STATE_SECONDARY_DONE: rphy->chg_state = USB_CHG_STATE_DETECTED; - fallthrough; - case USB_CHG_STATE_DETECTED: - if (rphy->phy_cfg->chg_det.chg_mode.offset != - rport->port_cfg->phy_sus.offset) - property_enable(base, &rphy->phy_cfg->chg_det.chg_mode, false); - - /* Restore the PHY suspend configuration */ - phy_sus_reg = &rport->port_cfg->phy_sus; - mask = GENMASK(phy_sus_reg->bitend, phy_sus_reg->bitstart); - ret = regmap_write(base, phy_sus_reg->offset, - (rphy->phy_sus_cfg | (mask << BIT_WRITEABLE_SHIFT))); - if (ret) - dev_err(&rport->phy->dev, - "Fail to set phy_sus reg offset 0x%x, ret %d\n", - phy_sus_reg->offset, ret); - mutex_unlock(&rport->mutex); - rockchip_usb2phy_otg_sm_work(&rport->otg_sm_work.work); - dev_dbg(&rport->phy->dev, "charger = %s\n", - chg_to_string(rphy->chg_type)); return; default: + rphy->chg_state = USB_CHG_STATE_DETECTED; + rphy->chg_type = POWER_SUPPLY_TYPE_UNKNOWN; + return; + } + + if (delay) + msleep(jiffies_to_msecs(delay)); +} + +static void rockchip_chg_detect_work(struct kthread_work *work) +{ + struct rockchip_usb2phy_port *rport = + container_of(work, struct rockchip_usb2phy_port, chg_work); + struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent); + struct regmap *base = get_reg_base(rphy); + const struct usb2phy_reg *phy_sus_reg; + unsigned int mask; + int ret; + + mutex_lock(&rport->mutex); + + /* Store the PHY current suspend configuration */ + phy_sus_reg = &rport->port_cfg->phy_sus; + ret = regmap_read(base, phy_sus_reg->offset, &rphy->phy_sus_cfg); + if (ret) { + dev_err(&rport->phy->dev, + "Fail to read phy_sus reg offset 0x%x, ret %d\n", + phy_sus_reg->offset, ret); mutex_unlock(&rport->mutex); return; } - /* - * Hold the mutex lock during the whole charger - * detection stage, and release it after detect - * the charger type. + /* Set the PHY in charger detection mode. + * The conditions for charger detection: + * 1. Set the PHY in normal mode to keep the UTMI_CLK on. + * 2. Set the utmi_opmode in non-driving mode. + * 3. Set the utmi_xcvrselect to FS speed. + * 4. Set the utmi_termselect to FS speed. + * 5. Enable the DP/DM pulldown resistor. */ - schedule_delayed_work(&rport->chg_work, delay); + property_enable(base, &rphy->phy_cfg->chg_det.chg_mode, true); + + do { + rockchip_run_chg_detect_machine(rport); + } while (rphy->chg_state != USB_CHG_STATE_UNDEFINED && + rphy->chg_state != USB_CHG_STATE_DETECTED); + + dev_info(&rport->phy->dev, "charger = %s\n", chg_to_string(rphy->chg_type)); + + /* Disable charger detection mode */ + if (rphy->phy_cfg->chg_det.chg_mode.offset != rport->port_cfg->phy_sus.offset) + property_enable(base, &rphy->phy_cfg->chg_det.chg_mode, false); + + /* Restore the PHY suspend configuration */ + phy_sus_reg = &rport->port_cfg->phy_sus; + mask = GENMASK(phy_sus_reg->bitend, phy_sus_reg->bitstart); + ret = regmap_write(base, phy_sus_reg->offset, + (rphy->phy_sus_cfg | (mask << BIT_WRITEABLE_SHIFT))); + if (ret) + dev_err(&rport->phy->dev, + "Fail to set phy_sus reg offset 0x%x, ret %d\n", + phy_sus_reg->offset, ret); + + mutex_unlock(&rport->mutex); + + if (rphy->chg_state == USB_CHG_STATE_DETECTED) + rockchip_usb2phy_otg_sm_work(&rport->otg_sm_work.work); } /* @@ -2382,7 +2393,6 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy, INIT_DELAYED_WORK(&rport->bypass_uart_work, rockchip_usb_bypass_uart_work); - INIT_DELAYED_WORK(&rport->chg_work, rockchip_chg_detect_work); INIT_DELAYED_WORK(&rport->otg_sm_work, rockchip_usb2phy_otg_sm_work); if (!IS_ERR(rphy->edev)) { @@ -2396,6 +2406,12 @@ static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy, } } + rport->chg_worker = kthread_create_worker(0, "usbchg-worker-%d", + rport->phy->id); + if (IS_ERR(rport->chg_worker)) + return PTR_ERR(rport->chg_worker); + kthread_init_work(&rport->chg_work, rockchip_chg_detect_work); + out: /* * Let us put phy-port into suspend mode here for saving power @@ -2626,6 +2642,31 @@ disable_clks: return ret; } +static int rockchip_usb2phy_remove(struct platform_device *pdev) +{ + struct rockchip_usb2phy *rphy = platform_get_drvdata(pdev); + struct rockchip_usb2phy_port *rport; + unsigned int index; + + for (index = 0; index < rphy->phy_cfg->num_ports; index++) { + rport = &rphy->ports[index]; + if (!rport->phy) + continue; + + if (rport->port_id == USB2PHY_PORT_HOST) { + cancel_delayed_work_sync(&rport->sm_work); + } else if (rport->port_id == USB2PHY_PORT_OTG) { + if (rport->chg_worker) + kthread_destroy_worker(rport->chg_worker); + + if (rport->otg_sm_work.work.func) + cancel_delayed_work_sync(&rport->otg_sm_work); + } + } + + return 0; +} + static int __maybe_unused rockchip_usb2phy_low_power_enable(struct rockchip_usb2phy *rphy, struct rockchip_usb2phy_port *rport, @@ -4802,6 +4843,7 @@ MODULE_DEVICE_TABLE(of, rockchip_usb2phy_dt_match); static struct platform_driver rockchip_usb2phy_driver = { .probe = rockchip_usb2phy_probe, + .remove = rockchip_usb2phy_remove, .driver = { .name = "rockchip-usb2phy", .pm = ROCKCHIP_USB2PHY_DEV_PM, From e5a4867edf18987eaff0f739e9aa5d456e1f2ec4 Mon Sep 17 00:00:00 2001 From: Guochun Huang Date: Mon, 14 Jul 2025 10:05:56 +0800 Subject: [PATCH 02/10] misc: rk628: Fix compilation errors on 32-bit soc platforms. Change-Id: I961b2f33ef3707795eddd701ec8765dbe0a0c4f7 Signed-off-by: Guochun Huang --- drivers/misc/rk628/rk628.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/misc/rk628/rk628.c b/drivers/misc/rk628/rk628.c index 102e8b12ff83..fec76332c297 100644 --- a/drivers/misc/rk628/rk628.c +++ b/drivers/misc/rk628/rk628.c @@ -994,7 +994,7 @@ static void rk628_show_resolution(struct seq_file *s) src_vtotal = src_mode->vtotal; /* get fps */ - fps = src_dclk * 1000 / (src_htotal * src_vtotal); + fps = DIV_ROUND_CLOSEST_ULL(src_dclk * 1000, src_htotal * src_vtotal); clk_rx_read = rk628_cru_clk_get_rate(rk628, CGU_CLK_RX_READ) / 1000; @@ -1058,7 +1058,7 @@ static void rk628f_show_rgbrx_resolution(struct seq_file *s) src_vtotal = val & 0xffff; /* get fps */ - fps = src_dclk * 1000 / (src_htotal * src_vtotal); + fps = DIV_ROUND_CLOSEST_ULL(src_dclk * 1000, src_htotal * src_vtotal); clk_rx_read = rk628_cru_clk_get_rate(rk628, CGU_CLK_RX_READ) / 1000; @@ -1117,7 +1117,7 @@ static void rk628_show_output_resolution(struct seq_file *s) dsp_vact_end = val & 0xfff; /* get fps */ - fps = sclk_vop * 1000 / (dsp_vtotal * dsp_htotal); + fps = DIV_ROUND_CLOSEST_ULL(sclk_vop * 1000, (dsp_vtotal * dsp_htotal)); bus_format_s = rk628_get_output_bus_format_name(rk628); From 3664a5d88fbc7d033f356aece485e785d9d87f81 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 22 Jul 2025 10:52:37 +0800 Subject: [PATCH 03/10] ARM: dts: rockchip: rk3506{g-demo-display-control,b-test2-v10}: Add "pmic-reset" for rk801 Reset pmic and output NPOR signal 5ms when system reboot. Signed-off-by: Joseph Chen Change-Id: I8c59ed22342617cf555e54c3fb43821203aae70c --- arch/arm/boot/dts/rk3506-rk801.dtsi | 3 ++- arch/arm/boot/dts/rk3506b-test2-v10.dts | 4 ++++ arch/arm/boot/dts/rk3506g-demo-display-control.dts | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/rk3506-rk801.dtsi b/arch/arm/boot/dts/rk3506-rk801.dtsi index e63a79957a7f..e2f4a7b91c30 100644 --- a/arch/arm/boot/dts/rk3506-rk801.dtsi +++ b/arch/arm/boot/dts/rk3506-rk801.dtsi @@ -20,8 +20,9 @@ interrupts = ; pwrctrl-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; - pinctrl-names = "default"; + pinctrl-names = "default", "pmic-reset"; pinctrl-0 = <&pmic_int>; + pinctrl-1 = <&soc_pwrctrl_reset>; rockchip,system-power-controller; wakeup-source; diff --git a/arch/arm/boot/dts/rk3506b-test2-v10.dts b/arch/arm/boot/dts/rk3506b-test2-v10.dts index 822d39efcb82..82e8e1a0aee4 100644 --- a/arch/arm/boot/dts/rk3506b-test2-v10.dts +++ b/arch/arm/boot/dts/rk3506b-test2-v10.dts @@ -632,6 +632,10 @@ pmic_int: pmic-int { rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>; }; + + soc_pwrctrl_reset: soc-pwrctrl-reset { + rockchip,pins = <0 RK_PC1 RK_FUNC_GPIO &pcfg_output_high>; + }; }; sdcard { diff --git a/arch/arm/boot/dts/rk3506g-demo-display-control.dts b/arch/arm/boot/dts/rk3506g-demo-display-control.dts index 9a91f2db5658..026169b87697 100644 --- a/arch/arm/boot/dts/rk3506g-demo-display-control.dts +++ b/arch/arm/boot/dts/rk3506g-demo-display-control.dts @@ -526,6 +526,10 @@ pmic_int: pmic-int { rockchip,pins = <0 RK_PC2 RK_FUNC_GPIO &pcfg_pull_up>; }; + + soc_pwrctrl_reset: soc-pwrctrl-reset { + rockchip,pins = <0 RK_PC1 RK_FUNC_GPIO &pcfg_output_high>; + }; }; psensor { From f8dee2cf65e4a098de63d0efac7033287c7dd403 Mon Sep 17 00:00:00 2001 From: lin longjian Date: Tue, 22 Jul 2025 11:04:27 +0800 Subject: [PATCH 04/10] arm64: dts: rockchip: add bt_port for wireless_bluetooth Signed-off-by: lin longjian Change-Id: I893a0dae669a410e646df46926ed54fa693894f9 --- arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3518-evb1-ddr4-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3528-demo6-ddr3-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3566pro-evb2-lp4x-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3567-evb2-lp4x-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3568-toybrick.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3576-ebook-v10.dts | 1 + arch/arm64/boot/dts/rockchip/rk3576-ebook-x3-v10.dts | 1 + arch/arm64/boot/dts/rockchip/rk3576-evb.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3576-tablet.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3576-vehicle.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3576s-evb.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3576s-tablet-v10.dts | 1 + arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-evb3-lp5.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-evb7-v11.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v20.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v21.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v23.dts | 1 + arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588s-evb1-lp4x.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588s-evb8-lp4x.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi | 1 + arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi | 1 + 40 files changed, 40 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi index 8ef7171c11b5..581191b6ef9c 100644 --- a/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi @@ -164,6 +164,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&rk809 1>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio1 RK_PC3 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3518-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3518-evb1-ddr4-v10.dtsi index f6c8ce23f043..0aa2b2d32402 100644 --- a/arch/arm64/boot/dts/rockchip/rk3518-evb1-ddr4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3518-evb1-ddr4-v10.dtsi @@ -24,6 +24,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS2"; //wifi-bt-power-toggle; uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; diff --git a/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi index c1f34d084068..3a09e5bd7d0d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi @@ -22,6 +22,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS2"; //wifi-bt-power-toggle; uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; diff --git a/arch/arm64/boot/dts/rockchip/rk3528-demo6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-demo6-ddr3-v10.dtsi index bf9b4ca8d9a5..1af0e94671c9 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-demo6-ddr3-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-demo6-ddr3-v10.dtsi @@ -52,6 +52,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS2"; //wifi-bt-power-toggle; uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; diff --git a/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi index c3c340968ddd..0d571f63590f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi @@ -24,6 +24,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS2"; //wifi-bt-power-toggle; uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; diff --git a/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi index 2cd94a632058..8a3d98fe2aa1 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi @@ -53,6 +53,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS2"; //wifi-bt-power-toggle; uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; diff --git a/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi index a427da4e2376..ac301b0239bf 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi @@ -55,6 +55,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS2"; uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart2m0_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi index 9a288ee6b9b1..d1f1d9442f3a 100644 --- a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi @@ -438,6 +438,7 @@ }; &wireless_bluetooth { + bt_port = "/dev/ttyS1"; uart_rts_gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart1m1_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi index af4e4d32b9c4..8b3002f2124c 100644 --- a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi @@ -620,6 +620,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi index bf781f1cb92b..227dc501cb07 100644 --- a/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi @@ -506,6 +506,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi index 2870d4d3dabd..2013e94d0538 100644 --- a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi @@ -282,6 +282,7 @@ &wireless_bluetooth { uart_rts_gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_LOW>; + bt_port = "/dev/ttyS1"; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart1m1_rtsn>; pinctrl-1 = <&uart1_gpios>; diff --git a/arch/arm64/boot/dts/rockchip/rk3566pro-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566pro-evb2-lp4x-v10.dtsi index a826ede074fc..7dbb7db97163 100644 --- a/arch/arm64/boot/dts/rockchip/rk3566pro-evb2-lp4x-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3566pro-evb2-lp4x-v10.dtsi @@ -609,6 +609,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3567-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3567-evb2-lp4x-v10.dtsi index eb8d1f297ca8..c1c6958690cc 100644 --- a/arch/arm64/boot/dts/rockchip/rk3567-evb2-lp4x-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3567-evb2-lp4x-v10.dtsi @@ -634,6 +634,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi index e3d818840247..eb7636b197b9 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi @@ -348,6 +348,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi index 630c5cd30309..7bfe59fb2620 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi @@ -497,6 +497,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi index 7be9312f1650..baca4271b327 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi @@ -587,6 +587,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&pmucru CLK_RTC_32K>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi index ce1f22676747..e5f38aa6ad30 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi @@ -556,6 +556,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi index 630a49c1b0f4..5c23afe8f131 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi @@ -444,6 +444,7 @@ &wireless_bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS1"; clocks = <&pmucru CLK_RTC_32K>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3568-toybrick.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-toybrick.dtsi index a8db076c5ca0..2c3b90b31d8d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3568-toybrick.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3568-toybrick.dtsi @@ -367,6 +367,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&rk809 1>; clock-names = "ext_clock"; //wifi-bt-power-toggle; diff --git a/arch/arm64/boot/dts/rockchip/rk3576-ebook-v10.dts b/arch/arm64/boot/dts/rockchip/rk3576-ebook-v10.dts index 8202c3218308..8fbb3353094d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576-ebook-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3576-ebook-v10.dts @@ -194,6 +194,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3576-ebook-x3-v10.dts b/arch/arm64/boot/dts/rockchip/rk3576-ebook-x3-v10.dts index 4ac22b204e6d..18e45f3c7103 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576-ebook-x3-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3576-ebook-x3-v10.dts @@ -208,6 +208,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3576-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3576-evb.dtsi index bc0b80781ec4..20d738a90161 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3576-evb.dtsi @@ -207,6 +207,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart4m1_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3576-tablet.dtsi b/arch/arm64/boot/dts/rockchip/rk3576-tablet.dtsi index 0f857c602ef5..e9690dd56225 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576-tablet.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3576-tablet.dtsi @@ -254,6 +254,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart4m1_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3576-vehicle.dtsi b/arch/arm64/boot/dts/rockchip/rk3576-vehicle.dtsi index 599812136840..1c118682dda8 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576-vehicle.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3576-vehicle.dtsi @@ -173,6 +173,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart4m1_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3576s-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3576s-evb.dtsi index efe8634ac19e..4118a705c0ca 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576s-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3576s-evb.dtsi @@ -207,6 +207,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart4m1_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3576s-tablet-v10.dts b/arch/arm64/boot/dts/rockchip/rk3576s-tablet-v10.dts index 27b75c67801a..c07ccf16e0ec 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576s-tablet-v10.dts +++ b/arch/arm64/boot/dts/rockchip/rk3576s-tablet-v10.dts @@ -261,6 +261,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS4"; uart_rts_gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "rts_gpio"; pinctrl-0 = <&uart4m1_rtsn>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi index f38fb8c68d77..87c4fd646cfc 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi @@ -214,6 +214,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi index ac62b180d2b0..779cb702f57c 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi @@ -171,6 +171,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS9"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb3-lp5.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb3-lp5.dtsi index 5b4d853c17a1..7ad9d427b297 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb3-lp5.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb3-lp5.dtsi @@ -175,6 +175,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi index bfec0c0b8d73..e56b8eb49000 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi @@ -238,6 +238,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS7"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb7-v11.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb7-v11.dtsi index ed86fb00503d..ba96b1c7eb59 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb7-v11.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb7-v11.dtsi @@ -250,6 +250,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS9"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v20.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v20.dtsi index 77ac53749d9b..8dbc6df88225 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v20.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v20.dtsi @@ -96,6 +96,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS9"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v21.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v21.dtsi index 37e8cf8cf514..09a62d4ab15f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v21.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v21.dtsi @@ -108,6 +108,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS9"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v23.dts b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v23.dts index c3104909fd60..fd91b7a16ffa 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v23.dts +++ b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb-v23.dts @@ -494,6 +494,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS7"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb.dtsi index 59e6f5d3b556..5e3400a70de3 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-evb.dtsi @@ -178,6 +178,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS9"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-lp4x.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-lp4x.dtsi index 8c1d0f37b8a3..a90dbd0e1fd1 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb1-lp4x.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb1-lp4x.dtsi @@ -216,6 +216,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb8-lp4x.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-evb8-lp4x.dtsi index 982461d2f4d8..a18fa824e2ce 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb8-lp4x.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb8-lp4x.dtsi @@ -199,6 +199,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi index a4de74df789a..2a299227d605 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi @@ -180,6 +180,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS8"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi index 822bb7b885af..033c32a5664d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi @@ -296,6 +296,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS7"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi index 622b2dc6ef8b..41bae84dd5d4 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi @@ -293,6 +293,7 @@ wireless_bluetooth: wireless-bluetooth { compatible = "bluetooth-platdata"; + bt_port = "/dev/ttyS7"; clocks = <&hym8563>; clock-names = "ext_clock"; uart_rts_gpios = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; From 7338ae10527fc9a8ff7813974c30d36caa1e20d4 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 23 Jul 2025 10:25:04 +0800 Subject: [PATCH 05/10] ethernet: stmmac: stmmac_uio: Fixes compilation errors Change-Id: Ic460bcc5f11b6fb0e6961c5e58c63dfc1b318b3c Signed-off-by: David Wu --- .../net/ethernet/stmicro/stmmac/stmmac_uio.c | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c index 0db6d50cc542..4d01e0c3dd73 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c @@ -115,15 +115,15 @@ static void uio_free_dma_rx_desc_resources(struct stmmac_priv *priv) /* Free RX queue resources */ for (queue = 0; queue < rx_count; queue++) { - struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; + struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; /* Free DMA regions of consistent memory previously allocated */ if (!priv->extend_desc) - dma_free_coherent(priv->device, priv->dma_rx_size * + dma_free_coherent(priv->device, priv->dma_conf.dma_rx_size * sizeof(struct dma_desc), rx_q->dma_rx, rx_q->dma_rx_phy); else - dma_free_coherent(priv->device, priv->dma_rx_size * + dma_free_coherent(priv->device, priv->dma_conf.dma_rx_size * sizeof(struct dma_extended_desc), rx_q->dma_erx, rx_q->dma_rx_phy); } @@ -140,7 +140,7 @@ static void uio_free_dma_tx_desc_resources(struct stmmac_priv *priv) /* Free TX queue resources */ for (queue = 0; queue < tx_count; queue++) { - struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; + struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; size_t size; void *addr; @@ -155,7 +155,7 @@ static void uio_free_dma_tx_desc_resources(struct stmmac_priv *priv) addr = tx_q->dma_tx; } - size *= priv->dma_tx_size; + size *= priv->dma_conf.dma_tx_size; dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy); } @@ -177,11 +177,11 @@ static int uio_alloc_dma_rx_desc_resources(struct stmmac_priv *priv) /* RX queues buffers and DMA */ for (queue = 0; queue < rx_count; queue++) { - struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; + struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue]; if (priv->extend_desc) { rx_q->dma_erx = dma_alloc_coherent(priv->device, - priv->dma_rx_size * + priv->dma_conf.dma_rx_size * sizeof(struct dma_extended_desc), &rx_q->dma_rx_phy, GFP_KERNEL); @@ -189,7 +189,7 @@ static int uio_alloc_dma_rx_desc_resources(struct stmmac_priv *priv) goto err_dma; } else { rx_q->dma_rx = dma_alloc_coherent(priv->device, - priv->dma_rx_size * + priv->dma_conf.dma_rx_size * sizeof(struct dma_desc), &rx_q->dma_rx_phy, GFP_KERNEL); @@ -222,7 +222,7 @@ static int uio_alloc_dma_tx_desc_resources(struct stmmac_priv *priv) /* TX queues buffers and DMA */ for (queue = 0; queue < tx_count; queue++) { - struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue]; + struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue]; size_t size; void *addr; @@ -236,7 +236,7 @@ static int uio_alloc_dma_tx_desc_resources(struct stmmac_priv *priv) else size = sizeof(struct dma_desc); - size *= priv->dma_tx_size; + size *= priv->dma_conf.dma_tx_size; addr = dma_alloc_coherent(priv->device, size, &tx_q->dma_tx_phy, GFP_KERNEL); @@ -382,13 +382,13 @@ static int rockchip_gmac_uio_init_dma_engine(struct stmmac_priv *priv) /* DMA RX Channel Configuration */ for (chan = 0; chan < rx_channels_count; chan++) { - rx_q = &priv->rx_queue[chan]; + rx_q = &priv->dma_conf.rx_queue[chan]; stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, rx_q->dma_rx_phy, chan); rx_q->rx_tail_addr = rx_q->dma_rx_phy + - (priv->dma_rx_size * + (priv->dma_conf.dma_rx_size * sizeof(struct dma_desc)); stmmac_set_rx_tail_ptr(priv, priv->ioaddr, rx_q->rx_tail_addr, chan); @@ -396,7 +396,7 @@ static int rockchip_gmac_uio_init_dma_engine(struct stmmac_priv *priv) /* DMA TX Channel Configuration */ for (chan = 0; chan < tx_channels_count; chan++) { - tx_q = &priv->tx_queue[chan]; + tx_q = &priv->dma_conf.tx_queue[chan]; stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, tx_q->dma_tx_phy, chan); @@ -418,12 +418,12 @@ static void uio_set_rings_length(struct stmmac_priv *priv) /* set TX ring length */ for (chan = 0; chan < tx_channels_count; chan++) stmmac_set_tx_ring_len(priv, priv->ioaddr, - (priv->dma_tx_size - 1), chan); + (priv->dma_conf.dma_tx_size - 1), chan); /* set RX ring length */ for (chan = 0; chan < rx_channels_count; chan++) stmmac_set_rx_ring_len(priv, priv->ioaddr, - (priv->dma_rx_size - 1), chan); + (priv->dma_conf.dma_rx_size - 1), chan); } /** @@ -634,7 +634,8 @@ static void uio_safety_feat_configuration(struct stmmac_priv *priv) { if (priv->dma_cap.asp) { netdev_info(priv->dev, "Enabling Safety Features\n"); - stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp); + stmmac_safety_feat_config(priv, priv->ioaddr, priv->dma_cap.asp, + priv->plat->safety_feat_cfg); } else { netdev_info(priv->dev, "No Safety Features support found\n"); } @@ -690,7 +691,7 @@ static void uio_dma_operation_mode(struct stmmac_priv *priv) stmmac_dma_rx_mode(priv, priv->ioaddr, rxmode, chan, rxfifosz, qmode); - stmmac_set_dma_bfsize(priv, priv->ioaddr, priv->dma_buf_sz, + stmmac_set_dma_bfsize(priv, priv->ioaddr, priv->dma_conf.dma_buf_sz, chan); } @@ -828,17 +829,17 @@ static int uio_open(struct net_device *dev) bfsize = 0; if (bfsize < BUF_SIZE_16KiB) - bfsize = uio_set_bfsize(dev->mtu, priv->dma_buf_sz); + bfsize = uio_set_bfsize(dev->mtu, priv->dma_conf.dma_buf_sz); - priv->dma_buf_sz = bfsize; + priv->dma_conf.dma_buf_sz = bfsize; buf_sz = bfsize; priv->rx_copybreak = STMMAC_RX_COPYBREAK; - if (!priv->dma_tx_size) - priv->dma_tx_size = DMA_DEFAULT_TX_SIZE; - if (!priv->dma_rx_size) - priv->dma_rx_size = DMA_DEFAULT_RX_SIZE; + if (!priv->dma_conf.dma_tx_size) + priv->dma_conf.dma_tx_size = DMA_DEFAULT_TX_SIZE; + if (!priv->dma_conf.dma_rx_size) + priv->dma_conf.dma_rx_size = DMA_DEFAULT_RX_SIZE; ret = uio_alloc_dma_desc_resources(priv); if (ret < 0) { @@ -963,13 +964,13 @@ static int rockchip_gmac_uio_probe(struct platform_device *pdev) uio->mem[0].memtype = UIO_MEM_PHYS; uio->mem[1].name = "eth_rx_bd"; - uio->mem[1].addr = priv->rx_queue[0].dma_rx_phy; - uio->mem[1].size = priv->dma_rx_size * sizeof(struct dma_desc); + uio->mem[1].addr = priv->dma_conf.rx_queue[0].dma_rx_phy; + uio->mem[1].size = priv->dma_conf.dma_rx_size * sizeof(struct dma_desc); uio->mem[1].memtype = UIO_MEM_PHYS; uio->mem[2].name = "eth_tx_bd"; - uio->mem[2].addr = priv->tx_queue[0].dma_tx_phy; - uio->mem[2].size = priv->dma_tx_size * sizeof(struct dma_desc); + uio->mem[2].addr = priv->dma_conf.tx_queue[0].dma_tx_phy; + uio->mem[2].size = priv->dma_conf.dma_tx_size * sizeof(struct dma_desc); uio->mem[2].memtype = UIO_MEM_PHYS; uio->open = rockchip_gmac_uio_open; From 253e11f01f05f6d8172a09b3054caead787b58b2 Mon Sep 17 00:00:00 2001 From: Leo Sun Date: Wed, 23 Jul 2025 09:29:45 +0800 Subject: [PATCH 06/10] ARM: dts: rockchip: add rv1126b-evb2-v12-aov-dual-cam.dts Signed-off-by: Leo Sun Change-Id: I4a734cb199c7a1781b3a44b389e092790d7d69af --- arch/arm/boot/dts/Makefile | 1 + arch/arm/boot/dts/rv1126b-evb2-v12-aov-dual-cam.dts | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 arch/arm/boot/dts/rv1126b-evb2-v12-aov-dual-cam.dts diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 1d7385950ecc..06f90f08ae47 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -1196,6 +1196,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \ rv1126b-evb2-v10-sii9022-bt1120-to-hdmi.dtb \ rv1126b-evb2-v10-tb-400w-emmc.dtb \ rv1126b-evb2-v10-tb-400w-spi-nor.dtb \ + rv1126b-evb2-v12-aov-dual-cam.dtb \ rv1126b-evb3-v10.dtb \ rv1126b-evb4-v10.dtb \ rv1126b-iotest-v10.dtb \ diff --git a/arch/arm/boot/dts/rv1126b-evb2-v12-aov-dual-cam.dts b/arch/arm/boot/dts/rv1126b-evb2-v12-aov-dual-cam.dts new file mode 100644 index 000000000000..6a6a878c4752 --- /dev/null +++ b/arch/arm/boot/dts/rv1126b-evb2-v12-aov-dual-cam.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#include "arm64/rockchip/rv1126b-evb2-v10-aov-dual-cam.dts" From d86fac4c442a24d5bffff02c6b16868a9705d85c Mon Sep 17 00:00:00 2001 From: William Wu Date: Tue, 22 Jul 2025 20:05:33 +0800 Subject: [PATCH 07/10] phy: rockchip: inno-usb2: Destroy chg_worker on probe failure Fixes: a78b174c2fb6 ("phy: rockchip: inno-usb2: Fix DEBUG_LOCKS_WARN_ON in chg work") Signed-off-by: William Wu Change-Id: I1f200c7597418d9c174bc68d9a5fea0703cd9cc5 --- drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c index 66748c397525..20af74197466 100644 --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c @@ -2634,6 +2634,16 @@ next_child: return 0; put_child: + for (index = 0; index < rphy->phy_cfg->num_ports; index++) { + struct rockchip_usb2phy_port *rport = &rphy->ports[index]; + + if (!rport->phy) + continue; + + if (rport->port_id == USB2PHY_PORT_OTG && !IS_ERR_OR_NULL(rport->chg_worker)) + kthread_destroy_worker(rport->chg_worker); + } + of_node_put(child_np); disable_clks: pm_runtime_put_sync(dev); From 6a03ec9cb5bbb2fa7a8b4e29a03d3bd1da697e0c Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Thu, 29 May 2025 10:33:33 +0800 Subject: [PATCH 08/10] video: rockchip: rga3: modify the reset method to replace auto_rst on RK3576 1. Resetting only core_clk will cause abnormal src1 status in blend scenarios, so both aclk and core_clk must be reset. 2. Avoid the issue by shielding the wrong interrupt. Fixes: a2a7ce0bf0bf ("video: rockchip: rga3: add fix for hardware issuewith RK3576") Signed-off-by: Yu Qiaowei Change-Id: I3cb0034f6c3090faca19cea2c2f5b375388271f8 --- drivers/video/rockchip/rga3/rga2_reg_info.c | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index 8e3d18f4dad1..1ec1f4183b62 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -2723,9 +2723,13 @@ static void rga2_soft_reset(struct rga_scheduler_t *scheduler) if (i == RGA_RESET_TIMEOUT) rga_err("%s[%#x] soft reset timeout.\n", rga_get_core_name(scheduler->core), scheduler->core); - else - rga_log("%s[%#x] soft reset complete.\n", - rga_get_core_name(scheduler->core), scheduler->core); +} + +static void rga2_soft_reset_print(struct rga_scheduler_t *scheduler) +{ + rga2_soft_reset(scheduler); + rga_log("%s[%#x] soft reset complete.\n", + rga_get_core_name(scheduler->core), scheduler->core); } static int rga2_check_param(struct rga_job *job, @@ -3132,12 +3136,11 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) sys_ctrl |= m_RGA2_SYS_CTRL_DST_WR_OPT_DIS | m_RGA2_SRC0_YUV420SP_RD_OPT_DIS; if (rga_hw_has_issue(scheduler, RGA_HW_ISSUE_DIS_AUTO_RST)) { - /* - * when RGA is running continuously, disabling auto_rst - * requires resetting core_clk. - */ - rga_write(m_RGA2_SYS_CTRL_AUTO_CKG | m_RGA2_SYS_CTRL_CCLK_SRESET_P, - RGA2_SYS_CTRL, scheduler); + /* disable all_finish & cur_finish intr_en */ + rga_write(0, RGA2_INT, scheduler); + rga_write(0, RGA2_CMD_REG_BASE + RGA2_MODE_CTRL_OFFSET, scheduler); + /* replace auto_rst */ + rga2_soft_reset(scheduler); } else { sys_ctrl |= m_RGA2_SYS_CTRL_AUTO_RST; } @@ -3346,7 +3349,7 @@ const struct rga_backend_ops rga2_ops = { .get_version = rga2_get_version, .set_reg = rga2_set_reg, .init_reg = rga2_init_reg, - .soft_reset = rga2_soft_reset, + .soft_reset = rga2_soft_reset_print, .read_back_reg = rga2_read_back_reg, .read_status = rga2_read_status, .irq = rga2_irq, From 8bfa454c23731eb6cbd32b21b44a4a996211d6e3 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 10 Jun 2025 15:34:07 +0800 Subject: [PATCH 09/10] video: rockchip: rga3: restore iommu status on soft-reset Avoid auto_gating/int_mask register state loss after reset Change-Id: Ie341f0f58f398476daacffdd90565d39c68faa54 Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/rga2_reg_info.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index 1ec1f4183b62..98688ae20e05 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -2695,10 +2695,13 @@ static void rga2_soft_reset(struct rga_scheduler_t *scheduler) { u32 i; u32 reg; - u32 iommu_dte_addr = 0; + u32 iommu_dte_addr = 0, iommu_int_mask = 0, iommu_auto_gate = 0; - if (scheduler->data->mmu == RGA_IOMMU) + if (scheduler->data->mmu == RGA_IOMMU) { iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler); + iommu_int_mask = rga_read(RGA_IOMMU_INT_MASK, scheduler); + iommu_auto_gate = rga_read(RGA_IOMMU_AUTO_GATING, scheduler); + } rga_write(m_RGA2_SYS_CTRL_ACLK_SRESET_P | m_RGA2_SYS_CTRL_CCLK_SRESET_P | m_RGA2_SYS_CTRL_RST_PROTECT_P, @@ -2716,6 +2719,11 @@ static void rga2_soft_reset(struct rga_scheduler_t *scheduler) if (scheduler->data->mmu == RGA_IOMMU) { rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler); + rga_write(RGA_IOMMU_CMD_ZAP_CACHE, RGA_IOMMU_COMMAND, scheduler); + + rga_write(iommu_int_mask, RGA_IOMMU_INT_MASK, scheduler); + rga_write(iommu_auto_gate, RGA_IOMMU_AUTO_GATING, scheduler); + /* enable iommu */ rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler); } From 0e7abd67ecee19952915ddbf39d4d85ada1966b5 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Thu, 29 May 2025 10:47:49 +0800 Subject: [PATCH 10/10] video: rockchip: rga3: "reg" debug log add iommu readback register printing Update driver version to 1.3.10 Signed-off-by: Yu Qiaowei Change-Id: I79b641e8b41d43c451988f278596f229e9e0fd2c --- .../rockchip/rga3/include/rga2_reg_info.h | 1 + .../rockchip/rga3/include/rga3_reg_info.h | 1 + drivers/video/rockchip/rga3/include/rga_drv.h | 2 +- drivers/video/rockchip/rga3/rga2_reg_info.c | 23 ++++++++++++++++++ drivers/video/rockchip/rga3/rga3_reg_info.c | 24 +++++++++++++++++++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/video/rockchip/rga3/include/rga2_reg_info.h b/drivers/video/rockchip/rga3/include/rga2_reg_info.h index 2aadfa65c9a6..187460833cf5 100644 --- a/drivers/video/rockchip/rga3/include/rga2_reg_info.h +++ b/drivers/video/rockchip/rga3/include/rga2_reg_info.h @@ -8,6 +8,7 @@ #define RGA2_CSC_REG_BASE 0x060 #define RGA2_OTHER_REG_BASE 0x090 #define RGA2_CMD_REG_BASE 0x100 +#define RGA2_IOMMU_REG_BASE 0xf00 /* sys reg */ #define RGA2_SYS_CTRL 0x000 diff --git a/drivers/video/rockchip/rga3/include/rga3_reg_info.h b/drivers/video/rockchip/rga3/include/rga3_reg_info.h index 1f9d66a5050e..50629a3fd994 100644 --- a/drivers/video/rockchip/rga3/include/rga3_reg_info.h +++ b/drivers/video/rockchip/rga3/include/rga3_reg_info.h @@ -6,6 +6,7 @@ #define RGA3_SYS_REG_BASE 0x000 #define RGA3_CMD_REG_BASE 0x100 +#define RGA3_IOMMU_REG_BASE 0xf00 /* sys reg */ #define RGA3_SYS_CTRL 0x000 diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index 0d41d4be2e8a..45b13b221292 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -88,7 +88,7 @@ #define DRIVER_MAJOR_VERISON 1 #define DRIVER_MINOR_VERSION 3 -#define DRIVER_REVISION_VERSION 9 +#define DRIVER_REVISION_VERSION 10 #define DRIVER_PATCH_VERSION #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \ diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index 98688ae20e05..35b4d4e11e2b 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -3035,6 +3035,27 @@ static void rga2_dump_read_back_cmd_reg(struct rga_job *job, struct rga_schedule cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); } +static void rga2_dump_read_back_iommu_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) +{ + int i; + unsigned long flags; + uint32_t cmd_reg[12] = {0}; + + spin_lock_irqsave(&scheduler->irq_lock, flags); + + for (i = 0; i < 12; i++) + cmd_reg[i] = rga_read(RGA2_IOMMU_REG_BASE + i * 4, scheduler); + + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + + rga_job_log(job, "IOMMU_READ_BACK_REG\n"); + for (i = 0; i < 3; i++) + rga_job_log(job, "0x%04x : %.8x %.8x %.8x %.8x\n", + RGA2_IOMMU_REG_BASE + i * 0x10, + cmd_reg[0 + i * 4], cmd_reg[1 + i * 4], + cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); +} + static void rga2_dump_read_back_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) { rga2_dump_read_back_sys_reg(job, scheduler); @@ -3042,6 +3063,7 @@ static void rga2_dump_read_back_reg(struct rga_job *job, struct rga_scheduler_t if (scheduler->data->version > 0) rga2_dump_read_back_other_reg(job, scheduler); rga2_dump_read_back_cmd_reg(job, scheduler); + rga2_dump_read_back_iommu_reg(job, scheduler); } static void rga2_set_pre_intr_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) @@ -3132,6 +3154,7 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) RGA2_CMD_REG_BASE + i * 0x10, cmd[0 + i * 4], cmd[1 + i * 4], cmd[2 + i * 4], cmd[3 + i * 4]); + rga2_dump_read_back_iommu_reg(scheduler->running_job, scheduler); } spin_lock_irqsave(&scheduler->irq_lock, flags); diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index d23ad4a8b971..535b61982c51 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -2089,6 +2089,27 @@ static void rga3_dump_read_back_reg(struct rga_job *job, struct rga_scheduler_t cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); } +static void rga3_dump_read_back_iommu_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) +{ + int i; + unsigned long flags; + uint32_t cmd_reg[12] = {0}; + + spin_lock_irqsave(&scheduler->irq_lock, flags); + + for (i = 0; i < 12; i++) + cmd_reg[i] = rga_read(RGA3_IOMMU_REG_BASE + i * 4, scheduler); + + spin_unlock_irqrestore(&scheduler->irq_lock, flags); + + rga_job_log(job, "IOMMU_READ_BACK_REG\n"); + for (i = 0; i < 3; i++) + rga_job_log(job, "0x%04x : %.8x %.8x %.8x %.8x\n", + RGA3_IOMMU_REG_BASE + i * 0x10, + cmd_reg[0 + i * 4], cmd_reg[1 + i * 4], + cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); +} + static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) { int i; @@ -2117,6 +2138,8 @@ static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) RGA3_CMD_REG_BASE + i * 0x10, cmd[0 + i * 4], cmd[1 + i * 4], cmd[2 + i * 4], cmd[3 + i * 4]); + + rga3_dump_read_back_iommu_reg(job, scheduler); } /* All CMD finish int */ @@ -2151,6 +2174,7 @@ static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) if (DEBUGGER_EN(REG)) { rga3_dump_read_back_sys_reg(job, scheduler); rga3_dump_read_back_reg(job, scheduler); + rga3_dump_read_back_iommu_reg(job, scheduler); } return 0;