diff --git a/arch/arm/kernel/reboot.c b/arch/arm/kernel/reboot.c index bd6f14336a23..3f0d5c3dae11 100644 --- a/arch/arm/kernel/reboot.c +++ b/arch/arm/kernel/reboot.c @@ -136,7 +136,6 @@ void machine_restart(char *cmd) local_irq_disable(); smp_send_stop(); - do_kernel_pre_restart(cmd); do_kernel_restart(cmd); /* Give a grace period for failure to restart of 1s */ diff --git a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi index c17a5d233d45..a01f98aee14c 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi @@ -2927,7 +2927,7 @@ 675000 3 495000 4 >; - low-volt-read-margin = <4>; + low-volt-mem-read-margin = <4>; intermediate-threshold-freq = <500000>; /* KHz*/ rockchip,init-freq = <1000000>; /* KHz */ @@ -3463,9 +3463,9 @@ interrupt-names = "irq_rkvenc1"; clocks = <&cru ACLK_RKVENC1>, <&cru HCLK_RKVENC1>, <&cru CLK_RKVENC1_CORE>; clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core"; - rockchip,normal-rates = <600000000>, <0>, <800000000>; + rockchip,normal-rates = <500000000>, <0>, <800000000>; assigned-clocks = <&cru ACLK_RKVENC1>, <&cru CLK_RKVENC1_CORE>; - assigned-clock-rates = <600000000>, <800000000>; + assigned-clock-rates = <500000000>, <800000000>; resets = <&cru SRST_A_RKVENC1>, <&cru SRST_H_RKVENC1>, <&cru SRST_RKVENC1_CORE>; reset-names = "video_a", "video_h", "video_core"; rockchip,skip-pmu-idle-request; diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index d627df7f4730..1568425095c1 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c @@ -132,8 +132,6 @@ void machine_restart(char *cmd) local_irq_disable(); smp_send_stop(); - do_kernel_pre_restart(cmd); - /* * UpdateCapsule() depends on the system being reset via * ResetSystem(). diff --git a/drivers/cpufreq/rockchip-cpufreq.c b/drivers/cpufreq/rockchip-cpufreq.c index 3317792e906f..599f164a17e2 100644 --- a/drivers/cpufreq/rockchip-cpufreq.c +++ b/drivers/cpufreq/rockchip-cpufreq.c @@ -714,7 +714,7 @@ static int rockchip_cpufreq_add_monitor(struct cluster_info *cluster, if (!mdevp) return -ENOMEM; - mdevp->type = MONITOR_TPYE_CPU; + mdevp->type = MONITOR_TYPE_CPU; mdevp->low_temp_adjust = rockchip_monitor_cpu_low_temp_adjust; mdevp->high_temp_adjust = rockchip_monitor_cpu_high_temp_adjust; mdevp->update_volt = rockchip_monitor_check_rate_volt; diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c index b32d32b7cef2..01edb773ea32 100644 --- a/drivers/devfreq/rockchip_dmc.c +++ b/drivers/devfreq/rockchip_dmc.c @@ -180,7 +180,7 @@ static struct pm_qos_request pm_qos; static int rockchip_dmcfreq_opp_helper(struct dev_pm_set_opp_data *data); static struct monitor_dev_profile dmc_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, .update_volt = rockchip_monitor_check_rate_volt, diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c index 7fa134310f7d..4e21334ceeb8 100644 --- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c +++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c @@ -46,7 +46,7 @@ static struct devfreq_simple_ondemand_data ondemand_data; static struct monitor_dev_profile mali_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, .update_volt = rockchip_monitor_check_rate_volt, diff --git a/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c b/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c index 6023495e571a..7438cb4951e2 100644 --- a/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c +++ b/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c @@ -41,7 +41,7 @@ #include static struct monitor_dev_profile mali_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; diff --git a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c index a8bb5eae52e0..4e8e56e9baf2 100644 --- a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c +++ b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c @@ -51,7 +51,7 @@ static struct devfreq_simple_ondemand_data ondemand_data; static struct monitor_dev_profile mali_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; diff --git a/drivers/gpu/drm/panel/panel-maxim-max96752f.c b/drivers/gpu/drm/panel/panel-maxim-max96752f.c index 75a560279764..bdb8e1ebb50f 100644 --- a/drivers/gpu/drm/panel/panel-maxim-max96752f.c +++ b/drivers/gpu/drm/panel/panel-maxim-max96752f.c @@ -406,12 +406,11 @@ static int hannstar_hsd123jpw3_a15_prepare(struct max96752f *max96752f) { maxim_deserializer_write(max96752f, 0x0002, 0x43); maxim_deserializer_write(max96752f, 0x0140, 0x20); + maxim_deserializer_write(max96752f, 0x01ce, 0x5e); - maxim_deserializer_write(max96752f, 0x01ce, 0x5e); /* oldi */ - maxim_deserializer_write(max96752f, 0x0226, 0x40); /* bl_pwm */ - maxim_deserializer_write(max96752f, 0x0224, 0x84); - maxim_deserializer_write(max96752f, 0x0204, 0xa1); /* tp_int */ - maxim_deserializer_write(max96752f, 0x0203, 0x83); + maxim_deserializer_write(max96752f, 0x0203, 0x83); /* GPIO1 <- TP_INT */ + maxim_deserializer_write(max96752f, 0x0206, 0x84); /* GPIO2 -> TP_RST */ + maxim_deserializer_write(max96752f, 0x0224, 0x84); /* GPIO12 -> LCD_BL_PWM */ return 0; } @@ -423,8 +422,7 @@ static int hannstar_hsd123jpw3_a15_unprepare(struct max96752f *max96752f) static int hannstar_hsd123jpw3_a15_enable(struct max96752f *max96752f) { - maxim_deserializer_write(max96752f, 0x0221, 0x90); /* lcd_rst */ - maxim_deserializer_write(max96752f, 0x0206, 0x90); /* tp_rst */ + maxim_deserializer_write(max96752f, 0x0221, 0x90); /* GPIO11 -> LCD_RESET */ msleep(20); return 0; @@ -432,8 +430,7 @@ static int hannstar_hsd123jpw3_a15_enable(struct max96752f *max96752f) static int hannstar_hsd123jpw3_a15_disable(struct max96752f *max96752f) { - maxim_deserializer_write(max96752f, 0x0206, 0x80); /* tp_rst */ - maxim_deserializer_write(max96752f, 0x0227, 0x80); /* lcd_rst */ + maxim_deserializer_write(max96752f, 0x0221, 0x80); /* GPIO11 -> LCD_RESET */ msleep(20); return 0; diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c index 841401b83e9e..2d2f3b552d26 100644 --- a/drivers/i2c/busses/i2c-rk3x.c +++ b/drivers/i2c/busses/i2c-rk3x.c @@ -1536,8 +1536,8 @@ static int rk3x_i2c_probe(struct platform_device *pdev) init_waitqueue_head(&i2c->wait); i2c->i2c_restart_nb.notifier_call = rk3x_i2c_restart_notify; - i2c->i2c_restart_nb.priority = 128; - ret = register_pre_restart_handler(&i2c->i2c_restart_nb); + i2c->i2c_restart_nb.priority = 255; + ret = register_restart_handler(&i2c->i2c_restart_nb); if (ret) { dev_err(&pdev->dev, "failed to setup i2c restart handler.\n"); return ret; @@ -1682,7 +1682,7 @@ static int rk3x_i2c_remove(struct platform_device *pdev) i2c_del_adapter(&i2c->adap); clk_notifier_unregister(i2c->clk, &i2c->clk_rate_nb); - unregister_pre_restart_handler(&i2c->i2c_restart_nb); + unregister_restart_handler(&i2c->i2c_restart_nb); clk_unprepare(i2c->pclk); clk_unprepare(i2c->clk); diff --git a/drivers/media/i2c/max96712.c b/drivers/media/i2c/max96712.c index f8d1ca376e30..ae47b2db0113 100644 --- a/drivers/media/i2c/max96712.c +++ b/drivers/media/i2c/max96712.c @@ -15,12 +15,15 @@ * mipi dpll predef rate set api. * V1.4.00 i2c read/write api update. * support for GMSL1 Link. + * V1.5.00 only check max96712 chipid when probe. + * enable stream out if not all link are locked. * */ #include #include #include +#include #include #include #include @@ -42,7 +45,7 @@ #include #include -#define DRIVER_VERSION KERNEL_VERSION(1, 0x04, 0x00) +#define DRIVER_VERSION KERNEL_VERSION(1, 0x05, 0x00) #ifndef V4L2_CID_DIGITAL_GAIN #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN @@ -76,7 +79,7 @@ #define MAX96712_LOCK_STATE_LINK_D BIT(3) #define MAX96712_LOCK_STATE_MASK 0x0F /* bit[3:0], GMSL link mask: 1 = disable, 1 = enable */ -#define MAX96712_FORCE_ALL_CLOCK_EN 0 /* 1: enable, 0: disable */ +#define MAX96712_FORCE_ALL_CLOCK_EN 1 /* 1: enable, 0: disable */ #define REG_NULL 0xFFFF @@ -473,6 +476,62 @@ static int max96712_write_array(struct i2c_client *client, return ret; } +static int max96712_check_local_chipid(struct max96712 *max96712) +{ + struct i2c_client *client = max96712->client; + struct device *dev = &max96712->client->dev; + int ret; + u8 id = 0; + + ret = max96712_read_reg(client, MAX96712_I2C_ADDR, + MAX96712_REG_CHIP_ID, MAX96712_REG_LENGTH_16BIT, + MAX96712_REG_VALUE_08BIT, &id); + if ((ret != 0) || (id != MAX96712_CHIP_ID)) { + dev_err(dev, "Unexpected MAX96712 chip id(%02x), ret(%d)\n", id, ret); + return -ENODEV; + } + + dev_info(dev, "Detected MAX96712 chipid: %02x\n", id); + + return 0; +} + +static int __maybe_unused max96712_check_remote_chipid(struct max96712 *max96712) +{ + struct device *dev = &max96712->client->dev; + int ret = 0; + u8 id; + + dev_info(dev, "Check remote chipid\n"); + + id = 0; +#if 0 + // max96717 + ret = max96712_read_reg(max96712->client, MAX96717_I2C_ADDR, + MAX96717_REG_CHIP_ID, MAX96712_REG_LENGTH_16BIT, + MAX96712_REG_VALUE_08BIT, &id); + if ((ret != 0) || (id != MAX96717_CHIP_ID)) { + dev_err(dev, "Unexpected MAX96717 chip id(%02x), ret(%d)\n", id, ret); + return -ENODEV; + } + dev_info(dev, "Detected MAX96717 chipid: 0x%02x\n", id); +#endif + +#if 0 + // max96715 + ret = max96712_read_reg(max96712->client, MAX96715_I2C_ADDR, + MAX96715_REG_CHIP_ID, MAX96712_REG_LENGTH_08BIT, + MAX96712_REG_VALUE_08BIT, &id); + if ((ret != 0) || (id != MAX96715_CHIP_ID)) { + dev_err(dev, "Unexpected MAX96715 chip id(%02x), ret(%d)\n", id, ret); + return -ENODEV; + } + dev_info(dev, "Detected MAX96715 chipid: 0x%02x\n", id); +#endif + + return ret; +} + static u8 max96712_get_link_lock_state(struct max96712 *max96712, u8 link_mask) { struct i2c_client *client = max96712->client; @@ -577,18 +636,12 @@ static int max96712_check_link_lock_state(struct max96712 *max96712) { struct i2c_client *client = max96712->client; struct device *dev = &max96712->client->dev; - u8 id = 0, lock_state = 0, link_mask = 0, link_type = 0; + u8 lock_state = 0, link_mask = 0, link_type = 0; int ret, i, time_ms; - ret = max96712_read_reg(client, MAX96712_I2C_ADDR, - MAX96712_REG_CHIP_ID, MAX96712_REG_LENGTH_16BIT, - MAX96712_REG_VALUE_08BIT, &id); - if (id != MAX96712_CHIP_ID) { - dev_err(dev, "Unexpected MAX96712 chip id(%02x), ret(%d)\n", id, ret); - return -ENODEV; - } - - dev_info(dev, "Detected MAX96712 chipid: %02x\n", id); + ret = max96712_check_local_chipid(max96712); + if (ret) + return ret; /* IF VDD = 1.2V: Enable REG_ENABLE and REG_MNL * CTRL0: Enable REG_ENABLE @@ -691,26 +744,9 @@ static int max96712_check_link_lock_state(struct max96712 *max96712) } if ((lock_state & link_mask) == link_mask) { - dev_info(dev, "All Links are locked: 0x%x\n", lock_state); + dev_info(dev, "All Links are locked: 0x%x, time_ms = %d\n", lock_state, time_ms); #if 0 - ret = max96712_read_reg(client, MAX96717_I2C_ADDR, - MAX96717_REG_CHIP_ID, MAX96712_REG_LENGTH_16BIT, - MAX96712_REG_VALUE_08BIT, &id); - if (id != MAX96717_CHIP_ID) { - dev_err(dev, "Unexpected MAX96717 chip id(%02x), ret(%d)\n", id, ret); - return -ENODEV; - } - dev_info(dev, "Detected MAX96717 chipid: 0x%02x\n", id); -#endif -#if 0 - ret = max96712_read_reg(client, MAX96715_I2C_ADDR, - MAX96715_REG_CHIP_ID, MAX96712_REG_LENGTH_08BIT, - MAX96712_REG_VALUE_08BIT, &id); - if (id != MAX96715_CHIP_ID) { - dev_err(dev, "Unexpected MAX96715 chip id(%02x), ret(%d)\n", id, ret); - return -ENODEV; - } - dev_info(dev, "Detected MAX96715 chipid: 0x%02x\n", id); + max96712_check_remote_chipid(max96712); #endif return 0; } @@ -719,8 +755,13 @@ static int max96712_check_link_lock_state(struct max96712 *max96712) time_ms += 10; } - dev_err(dev, "Failed to detect camera link!\n"); - return -ENODEV; + if ((lock_state & link_mask) != 0) { + dev_info(dev, "Partial links are locked: 0x%x, time_ms = %d\n", lock_state, time_ms); + return 0; + } else { + dev_err(dev, "Failed to detect camera link, time_ms = %d!\n", time_ms); + return -ENODEV; + } } static irqreturn_t max96712_hot_plug_detect_irq_handler(int irq, void *dev_id) @@ -828,15 +869,24 @@ static int __maybe_unused max96712_dphy_dpll_predef_set(struct i2c_client *clien MAX96712_REG_VALUE_08BIT, 0xf5); } - ret |= max96712_read_reg(client, MAX96712_I2C_ADDR, - 0x0400, MAX96712_REG_LENGTH_16BIT, - MAX96712_REG_VALUE_08BIT, &dpll_lock); - if (ret) + if (ret) { + dev_err(&client->dev, "DPLL predef set error!\n"); return ret; + } - dev_info(&client->dev, "DPLL predef set: dpll_lock = 0x%02x\n", dpll_lock); - - return ret; + ret = read_poll_timeout(max96712_read_reg, ret, + !(ret < 0) && (dpll_lock & 0xF0), + 1000, 10000, false, + client, MAX96712_I2C_ADDR, + 0x0400, MAX96712_REG_LENGTH_16BIT, + MAX96712_REG_VALUE_08BIT, &dpll_lock); + if (ret < 0) { + dev_err(&client->dev, "DPLL is not locked, dpll_lock = 0x%02x\n", dpll_lock); + return ret; + } else { + dev_err(&client->dev, "DPLL is locked, dpll_lock = 0x%02x\n", dpll_lock); + return 0; + } } static int max96712_auto_init_deskew(struct i2c_client *client, u32 deskew_mask) @@ -1363,6 +1413,12 @@ static int __max96712_start_stream(struct max96712 *max96712) if (ret) return ret; + link_freq_idx = max96712->cur_mode->link_freq_idx; + link_freq_mhz = (u32)div_s64(link_freq_items[link_freq_idx], 1000000L); + ret = max96712_dphy_dpll_predef_set(max96712->client, link_freq_mhz); + if (ret) + return ret; + if (max96712->auto_init_deskew_mask != 0) { ret = max96712_auto_init_deskew(max96712->client, max96712->auto_init_deskew_mask); @@ -1370,12 +1426,6 @@ static int __max96712_start_stream(struct max96712 *max96712) return ret; } - link_freq_idx = max96712->cur_mode->link_freq_idx; - link_freq_mhz = (u32)div_s64(link_freq_items[link_freq_idx], 1000000L); - ret = max96712_dphy_dpll_predef_set(max96712->client, link_freq_mhz); - if (ret) - return ret; - if (max96712->frame_sync_period != 0) { ret = max96712_frame_sync_period(max96712->client, max96712->frame_sync_period); @@ -1938,7 +1988,7 @@ static int max96712_probe(struct i2c_client *client, if (ret) goto err_free_handler; - ret = max96712_check_link_lock_state(max96712); + ret = max96712_check_local_chipid(max96712); if (ret) goto err_power_off; diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c b/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c index 9f53b3d0e0d1..e0c40c3d6061 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-dcphy.c @@ -1731,15 +1731,31 @@ static void samsung_mipi_cphy_power_on(struct samsung_mipi_dcphy *samsung) reset_control_deassert(samsung->m_phy_rst); } +static struct v4l2_subdev *get_remote_sensor(struct v4l2_subdev *sd); + static int samsung_mipi_dcphy_power_on(struct phy *phy) { struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy); enum phy_mode mode = phy_get_mode(phy); + int on = 0; + struct v4l2_subdev *sensor_sd = NULL; pm_runtime_get_sync(samsung->dev); reset_control_assert(samsung->apb_rst); udelay(1); reset_control_deassert(samsung->apb_rst); + if (atomic_read(&samsung->stream_cnt)) { + sensor_sd = get_remote_sensor(&samsung->dphy_dev[0]->sd); + samsung->stream_off(samsung->dphy_dev[0], &samsung->dphy_dev[0]->sd); + if (sensor_sd) + v4l2_subdev_call(sensor_sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + samsung->stream_on(samsung->dphy_dev[0], &samsung->dphy_dev[0]->sd); + on = 1; + if (sensor_sd) + v4l2_subdev_call(sensor_sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + } switch (mode) { case PHY_MODE_MIPI_DPHY: diff --git a/drivers/power/reset/reboot-mode.c b/drivers/power/reset/reboot-mode.c index 11ba9691f977..f5e38849d3eb 100644 --- a/drivers/power/reset/reboot-mode.c +++ b/drivers/power/reset/reboot-mode.c @@ -169,9 +169,10 @@ int reboot_mode_register(struct reboot_mode_driver *reboot) boot_mode_parse(reboot); reboot->reboot_notifier.notifier_call = reboot_mode_notify; reboot->pre_restart_notifier.notifier_call = reboot_mode_pre_restart_notify; + reboot->pre_restart_notifier.priority = 254; reboot->panic_notifier.notifier_call = reboot_mode_panic_notify; register_reboot_notifier(&reboot->reboot_notifier); - register_pre_restart_handler(&reboot->pre_restart_notifier); + register_restart_handler(&reboot->pre_restart_notifier); atomic_notifier_chain_register(&panic_notifier_list, &reboot->panic_notifier); ret = sysfs_create_file(kernel_kobj, &kobj_boot_mode.attr); diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index 4ddcea08771b..77f3430cad32 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -40,6 +40,14 @@ #define PWM_OUTPUT_CENTER (1 << 5) #define PWM_LOCK_EN (1 << 6) #define PWM_LP_DISABLE (0 << 8) +#define PWM_CLK_SEL_SHIFT 9 +#define PWM_CLK_SEL_MASK (1 << PWM_CLK_SEL_SHIFT) +#define PWM_SEL_NO_SCALED_CLOCK (0 << PWM_CLK_SEL_SHIFT) +#define PWM_SEL_SCALED_CLOCK (1 << PWM_CLK_SEL_SHIFT) +#define PWM_PRESCELE_SHIFT 12 +#define PWM_PRESCALE_MASK (0x3 << PWM_PRESCELE_SHIFT) +#define PWM_SCALE_SHIFT 16 +#define PWM_SCALE_MASK (0xff << PWM_SCALE_SHIFT) #define PWM_ONESHOT_COUNT_SHIFT 24 #define PWM_ONESHOT_COUNT_MASK (0xff << PWM_ONESHOT_COUNT_SHIFT) @@ -96,6 +104,7 @@ static void rockchip_pwm_get_state(struct pwm_chip *chip, u32 enable_conf = pc->data->enable_conf; u64 tmp; u32 val; + u32 dclk_div; int ret; if (!pc->oneshot_en) { @@ -104,12 +113,14 @@ static void rockchip_pwm_get_state(struct pwm_chip *chip, return; } + dclk_div = pc->oneshot_en ? 2 : 1; + tmp = readl_relaxed(pc->base + pc->data->regs.period); - tmp *= pc->data->prescaler * NSEC_PER_SEC; + tmp *= dclk_div * pc->data->prescaler * NSEC_PER_SEC; state->period = DIV_ROUND_CLOSEST_ULL(tmp, pc->clk_rate); tmp = readl_relaxed(pc->base + pc->data->regs.duty); - tmp *= pc->data->prescaler * NSEC_PER_SEC; + tmp *= dclk_div * pc->data->prescaler * NSEC_PER_SEC; state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, pc->clk_rate); val = readl_relaxed(pc->base + pc->data->regs.ctrl); @@ -162,6 +173,12 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, unsigned long flags; u64 div; u32 ctrl; + u8 dclk_div = 1; + +#ifdef CONFIG_PWM_ROCKCHIP_ONESHOT + if (state->oneshot_count > 0 && state->oneshot_count <= PWM_ONESHOT_COUNT_MAX) + dclk_div = 2; +#endif /* * Since period and duty cycle registers have a width of 32 @@ -169,11 +186,10 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, * default prescaler value for all practical clock rate values. */ div = (u64)pc->clk_rate * state->period; - period = DIV_ROUND_CLOSEST_ULL(div, - pc->data->prescaler * NSEC_PER_SEC); + period = DIV_ROUND_CLOSEST_ULL(div, dclk_div * pc->data->prescaler * NSEC_PER_SEC); div = (u64)pc->clk_rate * state->duty_cycle; - duty = DIV_ROUND_CLOSEST_ULL(div, pc->data->prescaler * NSEC_PER_SEC); + duty = DIV_ROUND_CLOSEST_ULL(div, dclk_div * pc->data->prescaler * NSEC_PER_SEC); local_irq_save(flags); /* @@ -192,6 +208,19 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, if (state->oneshot_count > 0 && state->oneshot_count <= PWM_ONESHOT_COUNT_MAX) { u32 int_ctrl; + /* + * This is a workaround, an uncertain waveform will be + * generated after oneshot ends. It is needed to enable + * the dclk scale function to resolve it. It doesn't + * matter what the scale factor is, just make sure the + * scale function is turned on, for which we set scale + * factor to 2. + */ + ctrl &= ~PWM_SCALE_MASK; + ctrl |= (dclk_div / 2) << PWM_SCALE_SHIFT; + ctrl &= ~PWM_CLK_SEL_MASK; + ctrl |= PWM_SEL_SCALED_CLOCK; + pc->oneshot_en = true; ctrl &= ~PWM_MODE_MASK; ctrl |= PWM_ONESHOT; @@ -205,6 +234,10 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, } else { u32 int_ctrl; + ctrl &= ~PWM_SCALE_MASK; + ctrl &= ~PWM_CLK_SEL_MASK; + ctrl |= PWM_SEL_NO_SCALED_CLOCK; + if (state->oneshot_count) dev_err(chip->dev, "Oneshot_count must be between 1 and 256.\n"); diff --git a/drivers/rknpu/rknpu_drv.c b/drivers/rknpu/rknpu_drv.c index 34a691b04ce3..78e69d9315f4 100644 --- a/drivers/rknpu/rknpu_drv.c +++ b/drivers/rknpu/rknpu_drv.c @@ -881,7 +881,7 @@ static int rknpu_power_off(struct rknpu_device *rknpu_dev) #ifndef FPGA_PLATFORM static struct monitor_dev_profile npu_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, #if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE diff --git a/drivers/soc/rockchip/rockchip_pm_config.c b/drivers/soc/rockchip/rockchip_pm_config.c index 639a0042b298..5f8e98a3aaa8 100644 --- a/drivers/soc/rockchip/rockchip_pm_config.c +++ b/drivers/soc/rockchip/rockchip_pm_config.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,7 @@ static const struct of_device_id pm_match_table[] = { }; #ifndef MODULE -static void rockchip_pm_virt_pwroff_prepare(void) +static int rockchip_pm_virt_pwroff_prepare(struct sys_off_data *data) { int error; @@ -79,11 +80,13 @@ static void rockchip_pm_virt_pwroff_prepare(void) error = suspend_disable_secondary_cpus(); if (error) { pr_err("Disable nonboot cpus failed!\n"); - return; + return NOTIFY_DONE; } sip_smc_set_suspend_mode(VIRTUAL_POWEROFF, 0, 1); sip_smc_virtual_poweroff(); + + return NOTIFY_DONE; } static int parse_sleep_config(struct device_node *node, enum rk_pm_state state) @@ -274,8 +277,15 @@ static int pm_config_probe(struct platform_device *pdev) if (!of_property_read_u32_array(node, "rockchip,virtual-poweroff", &virtual_poweroff_en, 1) && - virtual_poweroff_en) - pm_power_off_prepare = rockchip_pm_virt_pwroff_prepare; + virtual_poweroff_en) { + ret = devm_register_sys_off_handler(&pdev->dev, + SYS_OFF_MODE_POWER_OFF_PREPARE, + SYS_OFF_PRIO_DEFAULT, + rockchip_pm_virt_pwroff_prepare, + NULL); + if (ret) + dev_err(&pdev->dev, "failed to register sys-off handler: %d\n", ret); + } for (i = RK_PM_MEM; i < RK_PM_STATE_MAX; i++) { parse_sleep_config(node, i); diff --git a/drivers/soc/rockchip/rockchip_system_monitor.c b/drivers/soc/rockchip/rockchip_system_monitor.c index 89693035420a..0b1f48d6854f 100644 --- a/drivers/soc/rockchip/rockchip_system_monitor.c +++ b/drivers/soc/rockchip/rockchip_system_monitor.c @@ -708,7 +708,7 @@ static int monitor_device_parse_status_config(struct device_node *np, &info->video_4k_freq); ret &= of_property_read_u32(np, "rockchip,reboot-freq", &info->reboot_freq); - if (info->devp->type == MONITOR_TPYE_CPU) { + if (info->devp->type == MONITOR_TYPE_CPU) { if (!info->reboot_freq) { info->reboot_freq = CPU_REBOOT_FREQ; ret = 0; @@ -960,7 +960,7 @@ int rockchip_monitor_suspend_low_temp_adjust(int cpu) struct monitor_dev_info *info = NULL, *tmp; list_for_each_entry(tmp, &monitor_dev_list, node) { - if (tmp->devp->type != MONITOR_TPYE_CPU) + if (tmp->devp->type != MONITOR_TYPE_CPU) continue; if (cpumask_test_cpu(cpu, &tmp->devp->allowed_cpus)) { info = tmp; @@ -1103,7 +1103,7 @@ rockchip_system_monitor_freq_qos_requset(struct monitor_dev_info *info) else if (info->is_high_temp && info->high_limit) max_default_value = info->high_limit / 1000; - if (info->devp->type == MONITOR_TPYE_CPU) { + if (info->devp->type == MONITOR_TYPE_CPU) { policy = (struct cpufreq_policy *)info->devp->data; ret = freq_qos_add_request(&policy->constraints, &info->max_temp_freq_req, @@ -1135,7 +1135,7 @@ rockchip_system_monitor_freq_qos_requset(struct monitor_dev_info *info) freq_qos_remove_request(&info->min_sta_freq_req); return ret; } - } else if (info->devp->type == MONITOR_TPYE_DEV) { + } else if (info->devp->type == MONITOR_TYPE_DEV) { devfreq = (struct devfreq *)info->devp->data; ret = dev_pm_qos_add_request(devfreq->dev.parent, &info->dev_max_freq_req, @@ -1320,7 +1320,7 @@ int rockchip_monitor_check_rate_volt(struct monitor_dev_info *info) if (opp_info && opp_info->data && opp_info->data->set_read_margin) { is_set_rm = true; - if (info->devp->type == MONITOR_TPYE_DEV) { + if (info->devp->type == MONITOR_TYPE_DEV) { if (!pm_runtime_active(dev)) { is_set_rm = false; if (opp_info->scmi_clk) @@ -1458,7 +1458,7 @@ void rockchip_system_monitor_unregister(struct monitor_dev_info *info) list_del(&info->node); up_write(&mdev_list_sem); - if (info->devp->type == MONITOR_TPYE_CPU) { + if (info->devp->type == MONITOR_TYPE_CPU) { if (freq_qos_request_active(&info->max_temp_freq_req)) freq_qos_remove_request(&info->max_temp_freq_req); if (freq_qos_request_active(&info->min_sta_freq_req)) @@ -1690,7 +1690,7 @@ static void rockchip_system_status_limit_freq(unsigned long status) down_read(&mdev_list_sem); list_for_each_entry(info, &monitor_dev_list, node) { - if (info->devp->type == MONITOR_TPYE_CPU) + if (info->devp->type == MONITOR_TYPE_CPU) rockchip_system_status_cpu_limit_freq(info, status); } up_read(&mdev_list_sem); @@ -1730,7 +1730,7 @@ static int rockchip_system_monitor_set_cpu_uevent_suppress(bool is_suppress) struct cpufreq_policy *policy; list_for_each_entry(info, &monitor_dev_list, node) { - if (info->devp->type != MONITOR_TPYE_CPU) + if (info->devp->type != MONITOR_TYPE_CPU) continue; policy = (struct cpufreq_policy *)info->devp->data; if (!policy || !policy->cdev) diff --git a/drivers/soc/rockchip/rockchip_thunderboot_service.c b/drivers/soc/rockchip/rockchip_thunderboot_service.c index a698c9f5981e..805042daa58a 100644 --- a/drivers/soc/rockchip/rockchip_thunderboot_service.c +++ b/drivers/soc/rockchip/rockchip_thunderboot_service.c @@ -97,7 +97,6 @@ static void do_mcu_done(struct rk_tb_serv *serv) return; } - atomic_set(&mcu_done, 1); list_for_each_entry_safe(client, client_s, &clients_list, node) { spin_unlock(&lock); if (client->cb) @@ -105,6 +104,7 @@ static void do_mcu_done(struct rk_tb_serv *serv) spin_lock(&lock); list_del(&client->node); } + atomic_set(&mcu_done, 1); spin_unlock(&lock); } } diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c index 0bf3737c7e96..f832b720417b 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -813,7 +813,7 @@ static struct devfreq_governor devfreq_vdec2_ondemand = { }; static struct monitor_dev_profile vdec2_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index 2d5840ca8db8..68e4d6523cea 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -951,7 +951,7 @@ static struct devfreq_governor devfreq_venc_ondemand = { }; static struct monitor_dev_profile enc_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 0b0f623c95b7..fa44979c935e 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -1712,7 +1712,7 @@ static const struct of_device_id rockchip_rkvenc_of_match[] = { }; static struct monitor_dev_profile venc_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .update_volt = rockchip_monitor_check_rate_volt, }; diff --git a/include/linux/reboot.h b/include/linux/reboot.h index d107ef8ca386..2b6bb593be5b 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -50,26 +50,6 @@ extern int register_restart_handler(struct notifier_block *); extern int unregister_restart_handler(struct notifier_block *); extern void do_kernel_restart(char *cmd); -#ifdef CONFIG_NO_GKI -extern int register_pre_restart_handler(struct notifier_block *nb); -extern int unregister_pre_restart_handler(struct notifier_block *nb); -extern void do_kernel_pre_restart(char *cmd); -#else -static inline int register_pre_restart_handler(struct notifier_block *nb) -{ - return 0; -} - -static inline int unregister_pre_restart_handler(struct notifier_block *nb) -{ - return 0; -} - -static inline void do_kernel_pre_restart(char *cmd) -{ -} -#endif - /* * Architecture-specific implementations of sys_reboot commands. */ diff --git a/include/soc/rockchip/rockchip_system_monitor.h b/include/soc/rockchip/rockchip_system_monitor.h index 8613838416ea..0ca822d1041f 100644 --- a/include/soc/rockchip/rockchip_system_monitor.h +++ b/include/soc/rockchip/rockchip_system_monitor.h @@ -11,8 +11,8 @@ #include enum monitor_dev_type { - MONITOR_TPYE_CPU = 0, /* CPU */ - MONITOR_TPYE_DEV, /* GPU, NPU, DMC, and so on */ + MONITOR_TYPE_CPU = 0, /* CPU */ + MONITOR_TYPE_DEV, /* GPU, NPU, DMC, and so on */ }; enum system_monitor_event_type { diff --git a/kernel/reboot.c b/kernel/reboot.c index 1d7a7e33c9d8..a0323121c91f 100644 --- a/kernel/reboot.c +++ b/kernel/reboot.c @@ -226,27 +226,6 @@ void do_kernel_restart(char *cmd) atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd); } -#ifdef CONFIG_NO_GKI -static ATOMIC_NOTIFIER_HEAD(pre_restart_handler_list); - -int register_pre_restart_handler(struct notifier_block *nb) -{ - return atomic_notifier_chain_register(&pre_restart_handler_list, nb); -} -EXPORT_SYMBOL(register_pre_restart_handler); - -int unregister_pre_restart_handler(struct notifier_block *nb) -{ - return atomic_notifier_chain_unregister(&pre_restart_handler_list, nb); -} -EXPORT_SYMBOL(unregister_pre_restart_handler); - -void do_kernel_pre_restart(char *cmd) -{ - atomic_notifier_call_chain(&pre_restart_handler_list, reboot_mode, cmd); -} -#endif - void migrate_to_reboot_cpu(void) { /* The boot cpu is always logical cpu 0 */ diff --git a/sound/soc/rockchip/rockchip_multi_dais_pcm.c b/sound/soc/rockchip/rockchip_multi_dais_pcm.c index d69395f70139..8063bbbbd24f 100644 --- a/sound/soc/rockchip/rockchip_multi_dais_pcm.c +++ b/sound/soc/rockchip/rockchip_multi_dais_pcm.c @@ -93,8 +93,6 @@ static void snd_dmaengine_mpcm_set_config_from_dai_data( if (dma_data->addr_width != DMA_SLAVE_BUSWIDTH_UNDEFINED) slave_config->src_addr_width = dma_data->addr_width; } - - slave_config->slave_id = dma_data->slave_id; } static void dmaengine_mpcm_dma_complete(void *arg) diff --git a/sound/soc/rockchip/rockchip_vad.c b/sound/soc/rockchip/rockchip_vad.c index 7ed19d43e3b5..cae1be76c201 100644 --- a/sound/soc/rockchip/rockchip_vad.c +++ b/sound/soc/rockchip/rockchip_vad.c @@ -249,15 +249,14 @@ static int rockchip_vad_setup(struct rockchip_vad *vad) static struct rockchip_vad *substream_get_drvdata(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai; struct rockchip_vad *vad = NULL; unsigned int i; if (!rtd) return NULL; - for (i = 0; i < rtd->num_codecs; i++) { - struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, i); - + for_each_rtd_codec_dais(rtd, i, codec_dai) { if (strstr(codec_dai->name, "vad")) vad = snd_soc_component_get_drvdata(codec_dai->component); }