From 03d235b31885b7f6e17b56ce144daec7c01837ca Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Mon, 6 Nov 2023 17:22:40 +0800 Subject: [PATCH 01/13] media: rockchip: isp: support for param run double Change-Id: I4b7d32b98762b66a322a831a2c20b23958714a07 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/isp_params.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 753d618847e7..03fd7fce0d7e 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -130,6 +130,11 @@ static int rkisp_params_vb2_queue_setup(struct vb2_queue *vq, INIT_LIST_HEAD(¶ms_vdev->params); + if (params_vdev->first_cfg_params) { + params_vdev->first_cfg_params = false; + return 0; + } + params_vdev->first_params = true; return 0; @@ -228,6 +233,10 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq) } spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); + if (dev->is_pre_on) { + params_vdev->first_cfg_params = true; + return; + } rkisp_params_disable_isp(params_vdev); /* clean module params */ params_vdev->ops->clear_first_param(params_vdev); @@ -456,6 +465,7 @@ void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev) params_vdev->ops->stream_stop(params_vdev); if (params_vdev->ops->fop_release) params_vdev->ops->fop_release(params_vdev); + params_vdev->first_cfg_params = false; } bool rkisp_params_check_bigmode(struct rkisp_isp_params_vdev *params_vdev) From d0d7380104b3ce9a92bc40257662fe65287a85b1 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Tue, 24 Oct 2023 11:51:40 +0800 Subject: [PATCH 02/13] media: rockchip: isp: add isp dgain for tb mem head Change-Id: I35e717445e798b0d7bee9e173cb39e67299676cb Signed-off-by: Cai YiWei --- include/uapi/linux/rk-isp2-config.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/uapi/linux/rk-isp2-config.h b/include/uapi/linux/rk-isp2-config.h index fb8254771d92..28f0803bf1ad 100644 --- a/include/uapi/linux/rk-isp2-config.h +++ b/include/uapi/linux/rk-isp2-config.h @@ -1993,6 +1993,7 @@ struct rkisp_thunderboot_resmem_head { __u32 exp_gain[3]; __u32 exp_time_reg[3]; __u32 exp_gain_reg[3]; + __u32 exp_isp_dgain[3]; } __attribute__ ((packed)); /** From 006f6868f6fb06449233630d05b1326a9e7efa3f Mon Sep 17 00:00:00 2001 From: Lan Honglin Date: Sun, 8 Oct 2023 19:40:07 +0800 Subject: [PATCH 03/13] media: i2c: sc230ai support master&slaver mode Change-Id: If019de218771c7f5a87d8dcc4439d7b464480b6d Signed-off-by: Lan Honglin --- drivers/media/i2c/sc230ai.c | 90 +++++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/sc230ai.c b/drivers/media/i2c/sc230ai.c index 084f5bf603fd..03949146f6d5 100644 --- a/drivers/media/i2c/sc230ai.c +++ b/drivers/media/i2c/sc230ai.c @@ -173,6 +173,7 @@ struct sc230ai { const char *module_facing; const char *module_name; const char *len_name; + enum rkmodule_sync_mode sync_mode; u32 cur_vts; bool has_init_exp; bool is_thunderboot; @@ -534,6 +535,28 @@ static const struct regval sc230ai_linear_10_1920x1080_regs[] = { {REG_NULL, 0x00}, }; +static __maybe_unused const struct regval sc230ai_interal_sync_master_start_regs[] = { + {0x300a, 0x24}, //sync as output PAD + {0x3032, 0xa0}, + {0x3222, 0x00}, //master mode + {REG_NULL, 0x00}, +}; + +static __maybe_unused const struct regval sc230ai_interal_sync_master_stop_regs[] = { + {REG_NULL, 0x00}, +}; + +static __maybe_unused const struct regval sc230ai_interal_sync_slaver_start_regs[] = { + {0x300a, 0x20}, //sync as input PAD + {0x3222, 0x01}, //slave mode + {0x3224, 0x92}, //fsync trigger + {0x3614, 0x01}, + {REG_NULL, 0x00}, +}; + +static __maybe_unused const struct regval sc230ai_interal_sync_slaver_stop_regs[] = { + {REG_NULL, 0x00}, +}; static const struct sc230ai_mode supported_modes[] = { { @@ -930,6 +953,7 @@ static long sc230ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) u32 i, h, w; long ret = 0; u32 stream = 0; + u32 *sync_mode = NULL; switch (cmd) { case RKMODULE_GET_MODULE_INFO: @@ -980,6 +1004,14 @@ static long sc230ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) ret = sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, SC230AI_REG_VALUE_08BIT, SC230AI_MODE_SW_STANDBY); break; + case RKMODULE_GET_SYNC_MODE: + sync_mode = (u32 *)arg; + *sync_mode = sc230ai->sync_mode; + break; + case RKMODULE_SET_SYNC_MODE: + sync_mode = (u32 *)arg; + sc230ai->sync_mode = *sync_mode; + break; default: ret = -ENOIOCTLCMD; break; @@ -998,6 +1030,7 @@ static long sc230ai_compat_ioctl32(struct v4l2_subdev *sd, struct preisp_hdrae_exp_s *hdrae; long ret; u32 stream = 0; + u32 sync_mode; switch (cmd) { case RKMODULE_GET_MODULE_INFO: @@ -1066,6 +1099,21 @@ static long sc230ai_compat_ioctl32(struct v4l2_subdev *sd, ret = sc230ai_ioctl(sd, cmd, &stream); break; + case RKMODULE_GET_SYNC_MODE: + ret = sc230ai_ioctl(sd, cmd, &sync_mode); + if (!ret) { + ret = copy_to_user(up, &sync_mode, sizeof(u32)); + if (ret) + ret = -EFAULT; + } + break; + case RKMODULE_SET_SYNC_MODE: + ret = copy_from_user(&sync_mode, up, sizeof(u32)); + if (!ret) + ret = sc230ai_ioctl(sd, cmd, &sync_mode); + else + ret = -EFAULT; + break; default: ret = -ENOIOCTLCMD; break; @@ -1077,7 +1125,7 @@ static long sc230ai_compat_ioctl32(struct v4l2_subdev *sd, static int __sc230ai_start_stream(struct sc230ai *sc230ai) { - int ret; + int ret = 0; if (!sc230ai->is_thunderboot) { ret = sc230ai_write_array(sc230ai->client, sc230ai->cur_mode->reg_list); @@ -1096,20 +1144,36 @@ static int __sc230ai_start_stream(struct sc230ai *sc230ai) return ret; } } + if (sc230ai->sync_mode == INTERNAL_MASTER_MODE) + ret |= sc230ai_write_array(sc230ai->client, + sc230ai_interal_sync_master_start_regs); + else if (sc230ai->sync_mode == SLAVE_MODE) + ret |= sc230ai_write_array(sc230ai->client, + sc230ai_interal_sync_slaver_start_regs); } - return sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, + ret |= sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, SC230AI_REG_VALUE_08BIT, SC230AI_MODE_STREAMING); + return ret; } static int __sc230ai_stop_stream(struct sc230ai *sc230ai) { + int ret = 0; sc230ai->has_init_exp = false; if (sc230ai->is_thunderboot) { sc230ai->is_first_streamoff = true; pm_runtime_put(&sc230ai->client->dev); + } else { + if (sc230ai->sync_mode == INTERNAL_MASTER_MODE) + ret |= sc230ai_write_array(sc230ai->client, + sc230ai_interal_sync_master_stop_regs); + else if (sc230ai->sync_mode == SLAVE_MODE) + ret |= sc230ai_write_array(sc230ai->client, + sc230ai_interal_sync_slaver_stop_regs); } - return sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, + ret |= sc230ai_write_reg(sc230ai->client, SC230AI_REG_CTRL_MODE, SC230AI_REG_VALUE_08BIT, SC230AI_MODE_SW_STANDBY); + return ret; } static int __sc230ai_power_on(struct sc230ai *sc230ai); @@ -1625,6 +1689,7 @@ static int sc230ai_probe(struct i2c_client *client, char facing[2]; int ret; u32 i, hdr_mode = 0; + const char *sync_mode_name = NULL; dev_info(dev, "driver version: %02x.%02x.%02x", DRIVER_VERSION >> 16, @@ -1648,6 +1713,25 @@ static int sc230ai_probe(struct i2c_client *client, dev_err(dev, "could not get module information!\n"); return -EINVAL; } + + ret = of_property_read_string(node, RKMODULE_CAMERA_SYNC_MODE, + &sync_mode_name); + if (ret) { + sc230ai->sync_mode = NO_SYNC_MODE; + dev_err(dev, "could not get sync mode!\n"); + } else { + if (strcmp(sync_mode_name, RKMODULE_EXTERNAL_MASTER_MODE) == 0) { + sc230ai->sync_mode = EXTERNAL_MASTER_MODE; + dev_info(dev, "external master mode\n"); + } else if (strcmp(sync_mode_name, RKMODULE_INTERNAL_MASTER_MODE) == 0) { + sc230ai->sync_mode = INTERNAL_MASTER_MODE; + dev_info(dev, "internal master mode\n"); + } else if (strcmp(sync_mode_name, RKMODULE_SLAVE_MODE) == 0) { + sc230ai->sync_mode = SLAVE_MODE; + dev_info(dev, "slave mode\n"); + } + } + sc230ai->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP); sc230ai->client = client; for (i = 0; i < ARRAY_SIZE(supported_modes); i++) { From 04a82bed12cef8a27c2d76f229e0292bd0357f0c Mon Sep 17 00:00:00 2001 From: Cai Wenzhong Date: Tue, 7 Nov 2023 14:22:13 +0800 Subject: [PATCH 04/13] media: i2c: maxim4c: driver version v2.05.00 1. local device power on add some delay for i2c normal access. 2. enable hot plug detect for partial links are locked. 3. remote device hot plug init disable lock irq. Signed-off-by: Cai Wenzhong Change-Id: I3424421395601266c0c2a787bedbd5028a786aab --- drivers/media/i2c/maxim4c/maxim4c_api.h | 2 + drivers/media/i2c/maxim4c/maxim4c_drv.c | 63 +++++++++++++++++++-- drivers/media/i2c/maxim4c/maxim4c_link.c | 12 +++- drivers/media/i2c/maxim4c/maxim4c_v4l2.c | 5 ++ drivers/media/i2c/maxim4c/remote_max96715.c | 15 +---- 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/drivers/media/i2c/maxim4c/maxim4c_api.h b/drivers/media/i2c/maxim4c/maxim4c_api.h index 25f261c84a44..a2968a30646f 100644 --- a/drivers/media/i2c/maxim4c/maxim4c_api.h +++ b/drivers/media/i2c/maxim4c/maxim4c_api.h @@ -90,7 +90,9 @@ int maxim4c_remote_device_register(maxim4c_t *maxim4c, int maxim4c_v4l2_subdev_init(maxim4c_t *maxim4c); void maxim4c_v4l2_subdev_deinit(maxim4c_t *maxim4c); +/* maxim4c driver api */ int maxim4c_module_hw_init(maxim4c_t *maxim4c); +int maxim4c_hot_plug_detect_work_start(maxim4c_t *maxim4c); /* maxim4c pattern api */ int maxim4c_pattern_hw_init(maxim4c_t *maxim4c); diff --git a/drivers/media/i2c/maxim4c/maxim4c_drv.c b/drivers/media/i2c/maxim4c/maxim4c_drv.c index 65650eeb5387..c543c6297ab2 100644 --- a/drivers/media/i2c/maxim4c/maxim4c_drv.c +++ b/drivers/media/i2c/maxim4c/maxim4c_drv.c @@ -37,6 +37,11 @@ * 5. Fix unbalanced disabling for PoC regulator * 6. MIPI VC count does not affected by data lane count * + * V2.05.00 + * 1. local device power on add some delay for i2c normal access. + * 2. enable hot plug detect for partial links are locked. + * 3. remote device hot plug init disable lock irq. + * */ #include #include @@ -66,7 +71,7 @@ #include "maxim4c_api.h" -#define DRIVER_VERSION KERNEL_VERSION(2, 0x04, 0x04) +#define DRIVER_VERSION KERNEL_VERSION(2, 0x05, 0x00) #define MAXIM4C_XVCLK_FREQ 25000000 @@ -103,8 +108,8 @@ static int maxim4c_check_local_chipid(maxim4c_t *maxim4c) return 0; } } else { + // if chipid is unexpected, retry dev_err(dev, "Unexpected maxim chipid = %02x\n", chipid); - return -ENODEV; } } } @@ -135,7 +140,7 @@ static irqreturn_t maxim4c_hot_plug_detect_irq_handler(int irq, void *dev_id) queue_delayed_work(maxim4c->hot_plug_work.state_check_wq, &maxim4c->hot_plug_work.state_d_work, - msecs_to_jiffies(50)); + msecs_to_jiffies(100)); } mutex_unlock(&maxim4c->mutex); @@ -209,8 +214,14 @@ static void maxim4c_hot_plug_state_check_work(struct work_struct *work) if (curr_lock_state & MAXIM4C_LINK_MASK_A) { dev_info(dev, "Link A plug in\n"); + if (maxim4c->hot_plug_irq > 0) + disable_irq(maxim4c->hot_plug_irq); + maxim4c_remote_devices_init(maxim4c, MAXIM4C_LINK_MASK_A); + if (maxim4c->hot_plug_irq > 0) + enable_irq(maxim4c->hot_plug_irq); + maxim4c_video_pipe_linkid_enable(maxim4c, link_id, true); } else { dev_info(dev, "Link A plug out\n"); @@ -225,8 +236,14 @@ static void maxim4c_hot_plug_state_check_work(struct work_struct *work) if (curr_lock_state & MAXIM4C_LINK_MASK_B) { dev_info(dev, "Link B plug in\n"); + if (maxim4c->hot_plug_irq > 0) + disable_irq(maxim4c->hot_plug_irq); + maxim4c_remote_devices_init(maxim4c, MAXIM4C_LINK_MASK_B); + if (maxim4c->hot_plug_irq > 0) + enable_irq(maxim4c->hot_plug_irq); + maxim4c_video_pipe_linkid_enable(maxim4c, link_id, true); } else { dev_info(dev, "Link B plug out\n"); @@ -241,8 +258,14 @@ static void maxim4c_hot_plug_state_check_work(struct work_struct *work) if (curr_lock_state & MAXIM4C_LINK_MASK_C) { dev_info(dev, "Link C plug in\n"); + if (maxim4c->hot_plug_irq > 0) + disable_irq(maxim4c->hot_plug_irq); + maxim4c_remote_devices_init(maxim4c, MAXIM4C_LINK_MASK_C); + if (maxim4c->hot_plug_irq > 0) + enable_irq(maxim4c->hot_plug_irq); + maxim4c_video_pipe_linkid_enable(maxim4c, link_id, true); } else { dev_info(dev, "Link C plug out\n"); @@ -257,8 +280,14 @@ static void maxim4c_hot_plug_state_check_work(struct work_struct *work) if (curr_lock_state & MAXIM4C_LINK_MASK_D) { dev_info(dev, "Link D plug in\n"); + if (maxim4c->hot_plug_irq > 0) + disable_irq(maxim4c->hot_plug_irq); + maxim4c_remote_devices_init(maxim4c, MAXIM4C_LINK_MASK_D); + if (maxim4c->hot_plug_irq > 0) + enable_irq(maxim4c->hot_plug_irq); + maxim4c_video_pipe_linkid_enable(maxim4c, link_id, true); } else { dev_info(dev, "Link D plug out\n"); @@ -273,12 +302,34 @@ static void maxim4c_hot_plug_state_check_work(struct work_struct *work) } else { queue_delayed_work(maxim4c->hot_plug_work.state_check_wq, &maxim4c->hot_plug_work.state_d_work, - msecs_to_jiffies(100)); + msecs_to_jiffies(200)); } mutex_unlock(&maxim4c->mutex); } +int maxim4c_hot_plug_detect_work_start(maxim4c_t *maxim4c) +{ + struct device *dev = &maxim4c->client->dev; + u8 link_lock_state = 0, link_enable_mask = 0; + + link_lock_state = maxim4c->link_lock_state; + link_enable_mask = maxim4c->gmsl_link.link_enable_mask; + + if (link_lock_state != link_enable_mask) { + dev_info(dev, "%s: link_lock = 0x%02x, link_mask = 0x%02x\n", + __func__, link_lock_state, link_enable_mask); + + maxim4c->hot_plug_state = MAXIM4C_HOT_PLUG_OUT; + + queue_delayed_work(maxim4c->hot_plug_work.state_check_wq, + &maxim4c->hot_plug_work.state_d_work, + msecs_to_jiffies(200)); + } + + return 0; +} + static int maxim4c_lock_state_work_init(maxim4c_t *maxim4c) { struct device *dev = &maxim4c->client->dev; @@ -328,7 +379,7 @@ static int maxim4c_local_device_power_on(maxim4c_t *maxim4c) gpiod_set_value_cansleep(maxim4c->pwdn_gpio, 1); - usleep_range(5000, 10000); + usleep_range(10000, 11000); } return 0; @@ -646,6 +697,8 @@ static int maxim4c_probe(struct i2c_client *client, maxim4c->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); if (IS_ERR(maxim4c->pwdn_gpio)) dev_warn(dev, "Failed to get pwdn-gpios, maybe no use\n"); + else + usleep_range(1000, 1100); maxim4c->lock_gpio = devm_gpiod_get(dev, "lock", GPIOD_IN); if (IS_ERR(maxim4c->lock_gpio)) diff --git a/drivers/media/i2c/maxim4c/maxim4c_link.c b/drivers/media/i2c/maxim4c/maxim4c_link.c index 688dfe85abee..26f986edfb00 100644 --- a/drivers/media/i2c/maxim4c/maxim4c_link.c +++ b/drivers/media/i2c/maxim4c/maxim4c_link.c @@ -463,7 +463,17 @@ int maxim4c_link_select_remote_enable(struct maxim4c *maxim4c, u8 link_mask) 0x0006, MAXIM4C_I2C_REG_ADDR_16BITS, link_enable, link_enable); - ret |= maxim4c_link_wait_linklock(maxim4c, link_mask); + if (ret) { + dev_err(dev, "%s: link oneshot reset or enable error, link mask = 0x%x\n", + __func__, link_mask); + return ret; + } + + maxim4c_link_wait_linklock(maxim4c, link_mask); + dev_info(dev, "link_mask = 0x%02x, link_lock = 0x%02x\n", + link_mask, maxim4c->link_lock_state); + + return 0; } return ret; diff --git a/drivers/media/i2c/maxim4c/maxim4c_v4l2.c b/drivers/media/i2c/maxim4c/maxim4c_v4l2.c index a331023da0d4..908045e89abf 100644 --- a/drivers/media/i2c/maxim4c/maxim4c_v4l2.c +++ b/drivers/media/i2c/maxim4c/maxim4c_v4l2.c @@ -532,6 +532,11 @@ static int __maxim4c_start_stream(struct maxim4c *maxim4c) if (maxim4c->hot_plug_irq > 0) enable_irq(maxim4c->hot_plug_irq); + if (maxim4c->link_lock_state != maxim4c->gmsl_link.link_enable_mask) { + dev_info(dev, "partial links are locked, start hot plug detect work.\n"); + maxim4c_hot_plug_detect_work_start(maxim4c); + } + return 0; } diff --git a/drivers/media/i2c/maxim4c/remote_max96715.c b/drivers/media/i2c/maxim4c/remote_max96715.c index 53c44d70ec5f..11aa30831acc 100644 --- a/drivers/media/i2c/maxim4c/remote_max96715.c +++ b/drivers/media/i2c/maxim4c/remote_max96715.c @@ -190,7 +190,6 @@ static int max96715_module_init(maxim4c_remote_t *max96715) { struct device *dev = max96715->dev; struct i2c_client *client = max96715->client; - struct maxim4c *maxim4c = max96715->local; int ret = 0; ret = maxim4c_remote_i2c_addr_select(max96715, MAXIM4C_I2C_SER_DEF); @@ -206,16 +205,9 @@ static int max96715_module_init(maxim4c_remote_t *max96715) return ret; #if MAX96715_MODE_SWITCH - if (maxim4c->hot_plug_irq > 0) - disable_irq(maxim4c->hot_plug_irq); - ret = max96715_link_mode_select(max96715, LINK_MODE_CONFIG); - if (ret) { - if (maxim4c->hot_plug_irq > 0) - enable_irq(maxim4c->hot_plug_irq); - + if (ret) return ret; - } #endif ret = maxim4c_i2c_run_init_seq(client, @@ -225,16 +217,11 @@ static int max96715_module_init(maxim4c_remote_t *max96715) dev_err(dev, "remote id = %d init sequence error\n", max96715->remote_id); - if (maxim4c->hot_plug_irq > 0) - enable_irq(maxim4c->hot_plug_irq); - return ret; } #if MAX96715_MODE_SWITCH ret = max96715_link_mode_select(max96715, LINK_MODE_VIDEO); - if (maxim4c->hot_plug_irq > 0) - enable_irq(maxim4c->hot_plug_irq); if (ret) return ret; #endif From 776e2515695d501803cbe0fe772ece5b69778d9c Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Wed, 8 Nov 2023 12:02:18 +0800 Subject: [PATCH 05/13] clk: rockchip: rk3562: Fix clk_uart3_frac parent clk Signed-off-by: Finley Xiao Change-Id: Ief524953ddb3875ca1e99e63b99eca6193b7f3cc --- drivers/clk/rockchip/clk-rk3562.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clk/rockchip/clk-rk3562.c b/drivers/clk/rockchip/clk-rk3562.c index cbf8ddb26406..e86f01486090 100644 --- a/drivers/clk/rockchip/clk-rk3562.c +++ b/drivers/clk/rockchip/clk-rk3562.c @@ -624,7 +624,7 @@ static struct rockchip_clk_branch rk3562_clk_branches[] __initdata = { COMPOSITE(CLK_UART3_SRC, "clk_uart3_src", gpll_cpll_p, 0, RK3562_PERI_CLKSEL_CON(25), 8, 1, MFLAGS, 0, 7, DFLAGS, RK3562_PERI_CLKGATE_CON(7), 15, GFLAGS), - COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3", CLK_SET_RATE_PARENT, + COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT, RK3562_PERI_CLKSEL_CON(26), 0, RK3562_PERI_CLKGATE_CON(8), 0, GFLAGS, &rk3562_clk_uart3_fracmux), From 87f2ffb98efd98acd92045fb20ed5f1838055225 Mon Sep 17 00:00:00 2001 From: Jkand Huang Date: Mon, 6 Nov 2023 11:52:57 +0800 Subject: [PATCH 06/13] ARM: configs: rv1106-wakeup.config: fix some sleep to slow down the process Change-Id: Ie8283ca6d1c8939f9ee6f4881c619e9d979d0a39 Signed-off-by: Jkand Huang --- arch/arm/configs/rv1106-wakeup.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm/configs/rv1106-wakeup.config b/arch/arm/configs/rv1106-wakeup.config index ae2564933d5c..ffa23b4eb4a5 100644 --- a/arch/arm/configs/rv1106-wakeup.config +++ b/arch/arm/configs/rv1106-wakeup.config @@ -1,4 +1,5 @@ # CONFIG_ETHERNET is not set +CONFIG_HIGH_RES_TIMERS=y CONFIG_INPUT=y # CONFIG_MDIO_DEVICE is not set # CONFIG_PHYLIB is not set @@ -121,9 +122,11 @@ CONFIG_KEYBOARD_GPIO=y # CONFIG_RC_CORE is not set # CONFIG_RMI4_CORE is not set # CONFIG_ROCKCHIP_REMOTECTL is not set +CONFIG_SCHED_HRTICK=y # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_SENSORS_LIS3_SPI is not set # CONFIG_SENSOR_DEVICE is not set +# CONFIG_SND_HRTIMER is not set CONFIG_SND_JACK_INPUT_DEV=y # CONFIG_SND_SOC_CS42L52 is not set # CONFIG_SND_SOC_CS42L56 is not set From ab0546fdd01a8a8df0f15d0c648fa73aba76d173 Mon Sep 17 00:00:00 2001 From: William Wu Date: Wed, 8 Nov 2023 09:49:48 +0800 Subject: [PATCH 07/13] media: uvcvideo: set system status to performance when stream on For rockchip platforms, set performance frequency for the memory controller when uvc stream on, and clear it after uvc stream off. It can improve uvc streaming stability. Signed-off-by: William Wu Change-Id: I1dc0cf10c552bba2c3a0f8a1bb37d90f546eb4a3 --- drivers/media/usb/uvc/uvc_video.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index 03dfe96bceba..79ffe93b19ae 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -20,6 +20,8 @@ #include #include "uvcvideo.h" +#include +#include /* ------------------------------------------------------------------------ * UVC Controls @@ -2139,6 +2141,8 @@ int uvc_video_start_streaming(struct uvc_streaming *stream) if (ret < 0) goto error_commit; + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); + ret = uvc_video_start_transfer(stream, GFP_KERNEL); if (ret < 0) goto error_video; @@ -2146,6 +2150,7 @@ int uvc_video_start_streaming(struct uvc_streaming *stream) return 0; error_video: + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); usb_set_interface(stream->dev->udev, stream->intfnum, 0); error_commit: uvc_video_clock_cleanup(stream); @@ -2176,4 +2181,5 @@ void uvc_video_stop_streaming(struct uvc_streaming *stream) } uvc_video_clock_cleanup(stream); + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); } From 9a4ab40b647e83c6022c7223986b0aeabcc3db7e Mon Sep 17 00:00:00 2001 From: Tao Huang Date: Wed, 8 Nov 2023 18:40:29 +0800 Subject: [PATCH 08/13] soc: rockchip: rockchip_system_monitor: simplify include Move include dt-bindings/soc/rockchip-system-status.h to soc/rockchip/rockchip-system-status.h. Signed-off-by: Tao Huang Change-Id: Ie6046f762e38458a3505a6098d5211bdc4fd60e2 --- drivers/devfreq/rockchip_dmc.c | 1 - drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 1 - drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 1 - drivers/media/platform/rockchip/cif/capture.c | 1 - drivers/media/platform/rockchip/cif/dev.c | 1 - drivers/media/platform/rockchip/cif/hw.c | 1 - drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c | 1 - drivers/media/platform/rockchip/isp/dev.c | 1 - drivers/media/platform/rockchip/isp1/dev.c | 1 - drivers/media/usb/uvc/uvc_video.c | 1 - drivers/soc/rockchip/rockchip_system_monitor.c | 1 - drivers/video/rockchip/vehicle/vehicle_cif.c | 1 - include/soc/rockchip/rockchip-system-status.h | 2 ++ sound/soc/rockchip/rockchip_utils.c | 1 - 14 files changed, 2 insertions(+), 13 deletions(-) diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c index 48764d7172d6..e3d39bd8cea0 100644 --- a/drivers/devfreq/rockchip_dmc.c +++ b/drivers/devfreq/rockchip_dmc.c @@ -7,7 +7,6 @@ */ #include -#include #include #include #include diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index b232c755f97c..014f35e77e62 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -39,7 +39,6 @@ #ifdef CONFIG_DRM_ANALOGIX_DP #include #endif -#include #include #include diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 31b3abb531e3..523070072046 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -20,7 +20,6 @@ #ifdef CONFIG_DRM_ANALOGIX_DP #include #endif -#include #include #include diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 113ce878134f..499d6b879df5 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index c2ad6c305095..9141b2a578d0 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c index c845acc0b166..9077926ff1de 100644 --- a/drivers/media/platform/rockchip/cif/hw.c +++ b/drivers/media/platform/rockchip/cif/hw.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c index 9775b20ba518..8ee15f7c49eb 100644 --- a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c +++ b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c @@ -5,7 +5,6 @@ * Author: Dingxian Wen */ -#include #include #include #include diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index 333494d76019..3125570b30c4 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -45,7 +45,6 @@ #include #include #include -#include #include #include "common.h" #include "isp_ispp.h" diff --git a/drivers/media/platform/rockchip/isp1/dev.c b/drivers/media/platform/rockchip/isp1/dev.c index cc9736689a30..653ce1bf7c39 100644 --- a/drivers/media/platform/rockchip/isp1/dev.c +++ b/drivers/media/platform/rockchip/isp1/dev.c @@ -45,7 +45,6 @@ #include #include #include -#include #include #include "regs.h" #include "rkisp1.h" diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c index 79ffe93b19ae..5344e67bdb1b 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -20,7 +20,6 @@ #include #include "uvcvideo.h" -#include #include /* ------------------------------------------------------------------------ diff --git a/drivers/soc/rockchip/rockchip_system_monitor.c b/drivers/soc/rockchip/rockchip_system_monitor.c index 4f96c079f8f7..da95bbda81f8 100644 --- a/drivers/soc/rockchip/rockchip_system_monitor.c +++ b/drivers/soc/rockchip/rockchip_system_monitor.c @@ -4,7 +4,6 @@ * Author: Finley Xiao */ -#include #include #include #include diff --git a/drivers/video/rockchip/vehicle/vehicle_cif.c b/drivers/video/rockchip/vehicle/vehicle_cif.c index 8e83a60279b4..96c2bfb95785 100644 --- a/drivers/video/rockchip/vehicle/vehicle_cif.c +++ b/drivers/video/rockchip/vehicle/vehicle_cif.c @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include diff --git a/include/soc/rockchip/rockchip-system-status.h b/include/soc/rockchip/rockchip-system-status.h index e04921240450..5eb53ff2f3f3 100644 --- a/include/soc/rockchip/rockchip-system-status.h +++ b/include/soc/rockchip/rockchip-system-status.h @@ -6,6 +6,8 @@ #ifndef __SOC_ROCKCHIP_SYSTEM_STATUS_H #define __SOC_ROCKCHIP_SYSTEM_STATUS_H +#include + #if IS_REACHABLE(CONFIG_ROCKCHIP_SYSTEM_MONITOR) int rockchip_register_system_status_notifier(struct notifier_block *nb); int rockchip_unregister_system_status_notifier(struct notifier_block *nb); diff --git a/sound/soc/rockchip/rockchip_utils.c b/sound/soc/rockchip/rockchip_utils.c index b26c33849f8b..6e81dab35091 100644 --- a/sound/soc/rockchip/rockchip_utils.c +++ b/sound/soc/rockchip/rockchip_utils.c @@ -5,7 +5,6 @@ * Copyright (c) 2023 Rockchip Electronics Co. Ltd. */ -#include #include #include #include From 4ddda80541a292c9dde742b5d6ee7b7400cc3d84 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Thu, 9 Nov 2023 10:15:05 +0800 Subject: [PATCH 09/13] video: rockchip: rga3: fix the error report of Coverity 1. Fix the issue of scheduler and hardware maximum count mismatch. 2. Fix the issue of potential GCD returning 0. Change-Id: I083553e69ab60549b26465b5d1437e817575856f Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/include/rga_drv.h | 2 +- drivers/video/rockchip/rga3/rga_policy.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index fff02e176ce7..0efa7ef9f210 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -97,7 +97,7 @@ #define RGA_JOB_TIMEOUT_DELAY HZ #define RGA_RESET_TIMEOUT 1000 -#define RGA_MAX_SCHEDULER 3 +#define RGA_MAX_SCHEDULER RGA_HW_SIZE #define RGA_MAX_BUS_CLK 10 #define RGA_BUFFER_POOL_MAX_SIZE 64 diff --git a/drivers/video/rockchip/rga3/rga_policy.c b/drivers/video/rockchip/rga3/rga_policy.c index 1afab8993fa5..c00a67066fb0 100644 --- a/drivers/video/rockchip/rga3/rga_policy.c +++ b/drivers/video/rockchip/rga3/rga_policy.c @@ -15,7 +15,7 @@ #define GET_GCD(n1, n2) \ ({ \ int i; \ - int gcd = 0; \ + int gcd = 1; \ for (i = 1; i <= (n1) && i <= (n2); i++) { \ if ((n1) % i == 0 && (n2) % i == 0) \ gcd = i; \ From af706ad8bf10478817df6a8824d7b3d653668100 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Thu, 9 Nov 2023 17:37:19 +0800 Subject: [PATCH 10/13] video: rockchip: rga3: fix iommu device sync cache causing crash When the iommu device calls the dma_sync_single_xx API, it will be regarded as being called through iova by default, so the physical address obtained will be invalid. Update driver version to 1.3.1 Change-Id: I0a2c8fcecd556eccee499e06f41d790043f1fa0d Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/include/rga_drv.h | 2 +- drivers/video/rockchip/rga3/rga_mm.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index 0efa7ef9f210..e9743a40327b 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -87,7 +87,7 @@ #define DRIVER_MAJOR_VERISON 1 #define DRIVER_MINOR_VERSION 3 -#define DRIVER_REVISION_VERSION 0 +#define DRIVER_REVISION_VERSION 1 #define DRIVER_PATCH_VERSION #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \ diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index 140952459f11..78b262013460 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -1319,7 +1319,8 @@ static int rga_mm_sync_dma_sg_for_device(struct rga_internal_buffer *buffer, return -EFAULT; } - if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS) { + if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS && + scheduler->data->mmu != RGA_IOMMU) { dma_sync_single_for_device(scheduler->dev, buffer->phys_addr, buffer->size, dir); } else { sgt = rga_mm_lookup_sgt(buffer); @@ -1349,7 +1350,8 @@ static int rga_mm_sync_dma_sg_for_cpu(struct rga_internal_buffer *buffer, return -EFAULT; } - if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS) { + if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS && + scheduler->data->mmu != RGA_IOMMU) { dma_sync_single_for_cpu(scheduler->dev, buffer->phys_addr, buffer->size, dir); } else { sgt = rga_mm_lookup_sgt(buffer); From 1ff00f4eb57b40c2cac882d01daab75ca6145018 Mon Sep 17 00:00:00 2001 From: shengfei Xu Date: Wed, 8 Nov 2023 03:45:29 +0000 Subject: [PATCH 11/13] power: supply: rk816/rk817/rk818 battery: avoid division by zero Signed-off-by: shengfei Xu Change-Id: I510263adc079f23ad52ebdf68971f7a28ce20a0d --- drivers/power/supply/rk816_battery.c | 7 ++++++- drivers/power/supply/rk817_battery.c | 10 +++++++++- drivers/power/supply/rk818_battery.c | 7 ++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/power/supply/rk816_battery.c b/drivers/power/supply/rk816_battery.c index d204a0129a8d..1e4f6cd8e54a 100644 --- a/drivers/power/supply/rk816_battery.c +++ b/drivers/power/supply/rk816_battery.c @@ -328,6 +328,9 @@ static u32 interpolate(int value, u32 *table, int size) u8 i; u16 d; + if (size < 2) + return 0; + for (i = 0; i < size; i++) { if (value < table[i]) break; @@ -2965,6 +2968,8 @@ static void rk816_bat_finish_algorithm(struct rk816_battery *di) FINISH_CHRG_CUR2 : FINISH_CHRG_CUR1; finish_sec = base2sec(di->chrg_finish_base); soc_sec = di->fcc * 3600 / 100 / DIV(finish_current); + if (soc_sec == 0) + soc_sec = 1; plus_soc = finish_sec / DIV(soc_sec); if (finish_sec > soc_sec) { rest = finish_sec % soc_sec; @@ -4671,7 +4676,7 @@ static int rk816_bat_parse_dt(struct rk816_battery *di) } pdata->ocv_size = length / sizeof(u32); - if (pdata->ocv_size <= 0) { + if (pdata->ocv_size < 2) { dev_err(dev, "invalid ocv table\n"); return -EINVAL; } diff --git a/drivers/power/supply/rk817_battery.c b/drivers/power/supply/rk817_battery.c index 6979531052cc..f6d4345cc677 100644 --- a/drivers/power/supply/rk817_battery.c +++ b/drivers/power/supply/rk817_battery.c @@ -651,6 +651,9 @@ static u32 interpolate(int value, u32 *table, int size) u8 i; u16 d; + if (size < 2) + return 0; + for (i = 0; i < size; i++) { if (value < table[i]) break; @@ -1599,6 +1602,9 @@ static void rk817_bat_first_pwron(struct rk817_battery_device *battery) battery->pwron_voltage) * 1000;/* uAH */ battery->dsoc = battery->rsoc; battery->fcc = battery->pdata->design_capacity; + if (battery->fcc < MIN_FCC) + battery->fcc = MIN_FCC; + battery->nac = rk817_bat_vol_to_cap(battery, battery->pwron_voltage); rk817_bat_update_qmax(battery, battery->qmax); @@ -1801,7 +1807,7 @@ static int rk817_bat_parse_dt(struct rk817_battery_device *battery) } pdata->ocv_size = length / sizeof(u32); - if (pdata->ocv_size <= 0) { + if (pdata->ocv_size < 2) { dev_err(dev, "invalid ocv table\n"); return -EINVAL; } @@ -2773,6 +2779,8 @@ static void rk817_bat_finish_algorithm(struct rk817_battery_device *battery) finish_sec = base2sec(battery->finish_base); soc_sec = battery->fcc * 3600 / 100 / DIV(finish_current); + if (soc_sec == 0) + soc_sec = 1; plus_soc = finish_sec / DIV(soc_sec); if (finish_sec > soc_sec) { rest = finish_sec % soc_sec; diff --git a/drivers/power/supply/rk818_battery.c b/drivers/power/supply/rk818_battery.c index 67cabe01c5d8..a538407ba522 100644 --- a/drivers/power/supply/rk818_battery.c +++ b/drivers/power/supply/rk818_battery.c @@ -287,6 +287,9 @@ static u32 interpolate(int value, u32 *table, int size) u8 i; u16 d; + if (size < 2) + return 0; + for (i = 0; i < size; i++) { if (value < table[i]) break; @@ -2101,6 +2104,8 @@ static void rk818_bat_finish_algorithm(struct rk818_battery *di) FINISH_CHRG_CUR2 : FINISH_CHRG_CUR1; finish_sec = base2sec(di->finish_base); soc_sec = di->fcc * 3600 / 100 / DIV(finish_current); + if (soc_sec == 0) + soc_sec = 1; plus_soc = finish_sec / DIV(soc_sec); if (finish_sec > soc_sec) { rest = finish_sec % soc_sec; @@ -3240,7 +3245,7 @@ static int rk818_bat_parse_dt(struct rk818_battery *di) } pdata->ocv_size = length / sizeof(u32); - if (pdata->ocv_size <= 0) { + if (pdata->ocv_size < 2) { dev_err(dev, "invalid ocv table\n"); return -EINVAL; } From 010f6eb3a49d517f4f3eab94995b7921027b6d02 Mon Sep 17 00:00:00 2001 From: Huibin Hong Date: Wed, 25 Oct 2023 09:03:23 +0000 Subject: [PATCH 12/13] pstore/ram: don't register boot_log to minidump when it is off Fixes: 08e5018b7c7d ("fs: pstore: register buffers to minidump") Signed-off-by: Huibin Hong Change-Id: I7af139c4915504650acf0c5858f96be54f76639a --- fs/pstore/ram.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index d056bcc069c8..4db798dd9b53 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -799,10 +799,12 @@ static void ramoops_register_ram_zone_info_to_minidump(struct ramoops_context *c int i = 0; struct persistent_ram_zone *prz = NULL; +#ifdef CONFIG_PSTORE_BOOT_LOG for (i = 0; i < cxt->max_boot_log_cnt; i++) { prz = cxt->boot_przs[i]; _ramoops_register_ram_zone_info_to_minidump(prz); } +#endif for (i = 0; i < cxt->max_dump_cnt; i++) { prz = cxt->dprzs[i]; From 6de3d51dcdf7e19c1484ac967943387e0621b4a5 Mon Sep 17 00:00:00 2001 From: Huibin Hong Date: Wed, 8 Nov 2023 06:23:17 +0000 Subject: [PATCH 13/13] soc: rockchip: debug: don't enable Serror when panic Signed-off-by: Huibin Hong Change-Id: I5cf12effecefe9cf31113f0453e1f9672f1d868c --- drivers/soc/rockchip/rockchip_debug.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/soc/rockchip/rockchip_debug.c b/drivers/soc/rockchip/rockchip_debug.c index 942e169756eb..2f9eac20bc4b 100644 --- a/drivers/soc/rockchip/rockchip_debug.c +++ b/drivers/soc/rockchip/rockchip_debug.c @@ -331,7 +331,6 @@ static int rockchip_panic_notify_edpcsr(struct notifier_block *nb, printed = 0; } - rockchip_debug_serror_enable(); return NOTIFY_OK; } @@ -405,7 +404,7 @@ static int rockchip_panic_notify_pmpcsr(struct notifier_block *nb, prev_pc = NULL; printed = 0; } - rockchip_debug_serror_enable(); + return NOTIFY_OK; } #else