diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c index 629d72a3b83f..f10c85bce57a 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c @@ -145,18 +145,7 @@ static int dw_hdmi_i2s_prepare(struct device *dev, void *data, struct hdmi_codec_daifmt *fmt, struct hdmi_codec_params *hparms) { - struct dw_hdmi_i2s_audio_data *audio = data; - struct dw_hdmi *hdmi = audio->hdmi; - - dw_hdmi_audio_disable(hdmi); - - hdmi_update_bits(audio, HDMI_AUD_CONF0_SW_RESET, - HDMI_AUD_CONF0_SW_RESET, HDMI_AUD_CONF0); - hdmi_write(audio, (u8)~HDMI_MC_SWRSTZ_I2SSWRST_REQ, HDMI_MC_SWRSTZ); - - dw_hdmi_audio_enable(hdmi); - - return 0; + return dw_hdmi_i2s_hw_params(dev, data, fmt, hparms); } static int dw_hdmi_i2s_audio_startup(struct device *dev, void *data) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 9e08ff8a25f1..6817416e93ef 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3254,8 +3254,21 @@ static int vop2_wb_encoder_atomic_check(struct drm_encoder *encoder, return 0; } +static void vop2_wb_encoder_atomic_disable(struct drm_encoder *encoder, + struct drm_atomic_state *state) +{ + struct drm_crtc *crtc = encoder->crtc; + struct vop2_video_port *vp = to_vop2_video_port(crtc); + + if (!crtc->state->active_changed && !crtc->state->mode_changed) { + crtc->state->connectors_changed = false; + DRM_DEBUG("VP%d force change connectors_changed to false when disable wb\n", vp->id); + } +} + static const struct drm_encoder_helper_funcs vop2_wb_encoder_helper_funcs = { .atomic_check = vop2_wb_encoder_atomic_check, + .atomic_disable = vop2_wb_encoder_atomic_disable, }; static const struct drm_connector_helper_funcs vop2_wb_connector_helper_funcs = { diff --git a/drivers/spi/spidev-rkslv.c b/drivers/spi/spidev-rkslv.c index 0ff4415ff7e3..9f8cfcc6d8ee 100644 --- a/drivers/spi/spidev-rkslv.c +++ b/drivers/spi/spidev-rkslv.c @@ -13,6 +13,8 @@ #include #include +#include + #define SPI_OBJ_MAX_XFER_SIZE 0x1040 #define SPI_OBJ_APP_RAM_SIZE 0x10000 @@ -22,6 +24,8 @@ #define SPI_OBJ_CTRL_CMD_WRITE 0x4B #define SPI_OBJ_CTRL_CMD_DUPLEX 0x5C +#define SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD 0x20 + struct spi_obj_ctrl { u16 cmd; u16 addr; @@ -38,42 +42,60 @@ struct spidev_rkslv_data { struct task_struct *tsk; bool tsk_run; struct miscdevice misc_dev; + + /* + * If the DRAM frequency conversion jitters during the transmission process, + * it will cause the DMA to be unable to transport SPI FIFO data in a timely + * manner, resulting in FIFO overflow/underflow. + * + * However, since the command packet length is smaller than FIFO, this + * problem does not exist. So set performance status dynamically for data packet. + */ + bool dyq_perf; }; static u32 bit_per_word = 8; -static int spidev_slv_write(struct spidev_rkslv_data *spidev, const void *txbuf, size_t n) +static int spidev_slv_write(struct spidev_rkslv_data *spidev, const void *txbuf, size_t len) { - int ret = -1; struct spi_device *spi = spidev->spi; struct spi_transfer t = { .tx_buf = txbuf, - .len = n, + .len = len, .bits_per_word = bit_per_word, }; struct spi_message m; + int ret; spi_message_init(&m); spi_message_add_tail(&t, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); ret = spi_sync(spi, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); return ret; } -static int spidev_slv_read(struct spidev_rkslv_data *spidev, void *rxbuf, size_t n) +static int spidev_slv_read(struct spidev_rkslv_data *spidev, void *rxbuf, size_t len) { - int ret = -1; struct spi_device *spi = spidev->spi; struct spi_transfer t = { .rx_buf = rxbuf, - .len = n, + .len = len, .bits_per_word = bit_per_word, }; struct spi_message m; + int ret; spi_message_init(&m); spi_message_add_tail(&t, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); ret = spi_sync(spi, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); return ret; } @@ -88,10 +110,18 @@ static int spidev_slv_write_and_read(struct spidev_rkslv_data *spidev, const voi .len = len, }; struct spi_message m; + int ret; spi_message_init(&m); spi_message_add_tail(&t, &m); - return spi_sync(spi, &m); + + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); + ret = spi_sync(spi, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); + + return ret; } static ssize_t spidev_rkslv_misc_write(struct file *filp, const char __user *buf, @@ -318,6 +348,7 @@ static int spidev_rkslv_probe(struct spi_device *spi) if (!spidev->tempbuf) return -ENOMEM; + spidev->dyq_perf = true; spidev->spi = spi; spidev->dev = &spi->dev; dev_set_drvdata(&spi->dev, spidev);