mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
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:
@@ -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)
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user