Merge commit '87d068845824b89f96208feb628be75bdd2b1f1e'

* commit '87d068845824b89f96208feb628be75bdd2b1f1e':
  drm/bridge: synopsys: Fix no sound on some TVs
  spi: spidev_rkslv: Support dynamic adjustment of system performance
  drm/rockchip: vop2: fix other display dev do disable and enable when disable writeback

Change-Id: If3e04127be92d57f0897432223fba9e4fea7fde5
This commit is contained in:
Tao Huang
2023-12-27 11:05:49 +08:00
3 changed files with 52 additions and 19 deletions

View File

@@ -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)

View File

@@ -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 = {

View File

@@ -13,6 +13,8 @@
#include <linux/slab.h>
#include <linux/spi/spi.h>
#include <soc/rockchip/rockchip-system-status.h>
#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);