From acd9ec5a6d2a9dde0b569676626f4992a1484597 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 10 Mar 2023 18:45:49 +0800 Subject: [PATCH 01/19] media: rockchip: isp: fix warning of vb2 cancel or done Change-Id: Icf3cc6392b7741de80487341771c8f40319a6a01 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 7 ++++++- drivers/media/platform/rockchip/isp/capture_v20.c | 6 ++++++ drivers/media/platform/rockchip/isp/capture_v21.c | 6 ++++++ drivers/media/platform/rockchip/isp/capture_v30.c | 6 ++++++ drivers/media/platform/rockchip/isp/capture_v32.c | 7 +++++++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 28f5b136af0e..115fb85eb5e6 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1559,7 +1559,12 @@ static void rkisp_buf_done_task(unsigned long arg) buf = list_first_entry(&local_list, struct rkisp_buffer, queue); list_del(&buf->queue); - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); + + v4l2_dbg(2, rkisp_debug, &stream->ispdev->v4l2_dev, + "stream:%d seq:%d buf:0x%x done\n", + stream->id, buf->vb.sequence, buf->buff_addr[0]); + vb2_buffer_done(&buf->vb.vb2_buf, + stream->streaming ? VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR); } } diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index 75df13bfd66b..ec766d08d807 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -1739,6 +1739,12 @@ static void destroy_buf_queue(struct rkisp_stream *stream, list_del(&buf->queue); vb2_buffer_done(&buf->vb.vb2_buf, state); } + while (!list_empty(&stream->buf_done_list)) { + buf = list_first_entry(&stream->buf_done_list, + struct rkisp_buffer, queue); + list_del(&buf->queue); + vb2_buffer_done(&buf->vb.vb2_buf, state); + } spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); } diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index 0b255f95d4bc..d421ed618a38 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1556,6 +1556,12 @@ static void destroy_buf_queue(struct rkisp_stream *stream, list_del(&buf->queue); vb2_buffer_done(&buf->vb.vb2_buf, state); } + while (!list_empty(&stream->buf_done_list)) { + buf = list_first_entry(&stream->buf_done_list, + struct rkisp_buffer, queue); + list_del(&buf->queue); + vb2_buffer_done(&buf->vb.vb2_buf, state); + } spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); } diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index 80e38646cdcb..3050402f2057 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -1218,6 +1218,12 @@ static void destroy_buf_queue(struct rkisp_stream *stream, list_del(&buf->queue); vb2_buffer_done(&buf->vb.vb2_buf, state); } + while (!list_empty(&stream->buf_done_list)) { + buf = list_first_entry(&stream->buf_done_list, + struct rkisp_buffer, queue); + list_del(&buf->queue); + vb2_buffer_done(&buf->vb.vb2_buf, state); + } spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); } diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index c43f50973838..59848b242795 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1672,6 +1672,13 @@ static void destroy_buf_queue(struct rkisp_stream *stream, if (buf->vb.vb2_buf.memory) vb2_buffer_done(&buf->vb.vb2_buf, state); } + while (!list_empty(&stream->buf_done_list)) { + buf = list_first_entry(&stream->buf_done_list, + struct rkisp_buffer, queue); + list_del(&buf->queue); + if (buf->vb.vb2_buf.memory) + vb2_buffer_done(&buf->vb.vb2_buf, state); + } rkisp_rockit_buf_free(stream); spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); } From 7ca7e7ce1f33d3fd67959df6c110e41ba96b1e61 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Mon, 27 Feb 2023 15:59:07 +0800 Subject: [PATCH 02/19] media: rockchip: fix isp no work due to irq_ends_mask error Change-Id: I62dc2383720adb03b8ade6affbea7ee50ffa4427 Signed-off-by: Cai YiWei --- .../media/platform/rockchip/isp/capture_v21.c | 14 ------ .../media/platform/rockchip/isp/capture_v30.c | 16 ++----- .../media/platform/rockchip/isp/capture_v32.c | 20 +++----- drivers/media/platform/rockchip/isp/rkisp.c | 47 ++++++++++++------- 4 files changed, 40 insertions(+), 57 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index d421ed618a38..75eff1643ee7 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1388,15 +1388,8 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) static int rkisp_start(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; - bool is_update = false; int ret; - if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) { - is_update = (stream->id == RKISP_STREAM_MP) ? - !dev->cap_dev.stream[RKISP_STREAM_SP].streaming : - !dev->cap_dev.stream[RKISP_STREAM_MP].streaming; - } - if (stream->ops->set_data_path) stream->ops->set_data_path(stream); ret = stream->ops->config_mi(stream); @@ -1406,9 +1399,6 @@ static int rkisp_start(struct rkisp_stream *stream) stream->ops->enable_mi(stream); if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) hdr_config_dmatx(dev); - if (is_update) - dev->irq_ends_mask |= - (stream->id == RKISP_STREAM_MP) ? ISP_FRAME_MP : ISP_FRAME_SP; stream->streaming = true; return 0; @@ -1965,16 +1955,12 @@ void rkisp_mi_v21_isr(u32 mis_val, struct rkisp_device *dev) stream = &dev->cap_dev.stream[RKISP_STREAM_MP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_MP; - else - dev->irq_ends_mask |= ISP_FRAME_MP; rkisp_check_idle(dev, ISP_FRAME_MP); } if (mis_val & CIF_MI_SP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_SP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_SP; - else - dev->irq_ends_mask |= ISP_FRAME_SP; rkisp_check_idle(dev, ISP_FRAME_SP); } } diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index 3050402f2057..56564a3f9bac 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -1029,11 +1029,13 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) bool is_wait = dev->hw_dev->is_shutdown ? false : true; stream->stopping = true; - stream->ops->disable_mi(stream); + if (dev->hw_dev->is_single) + stream->ops->disable_mi(stream); if (IS_HDR_RDBK(dev->rd_mode)) { spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); if (dev->hw_dev->cur_dev_id != dev->dev_id || dev->hw_dev->is_idle) { is_wait = false; + stream->ops->disable_mi(stream); /* force update to close */ if (dev->hw_dev->is_single) stream_self_update(stream); @@ -1074,8 +1076,6 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) */ static int rkisp_start(struct rkisp_stream *stream) { - struct rkisp_device *dev = stream->ispdev; - bool is_update = atomic_read(&dev->cap_dev.refcnt) > 1 ? false : true; int ret; if (stream->ops->set_data_path) @@ -1085,8 +1085,6 @@ static int rkisp_start(struct rkisp_stream *stream) return ret; stream->ops->enable_mi(stream); - if (is_update) - dev->irq_ends_mask |= get_stream_irq_mask(stream); stream->streaming = true; return 0; @@ -1721,32 +1719,24 @@ void rkisp_mi_v30_isr(u32 mis_val, struct rkisp_device *dev) stream = &dev->cap_dev.stream[RKISP_STREAM_MP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_MP; - else - dev->irq_ends_mask |= ISP_FRAME_MP; rkisp_check_idle(dev, ISP_FRAME_MP); } if (mis_val & ISP3X_MI_SP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_SP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_SP; - else - dev->irq_ends_mask |= ISP_FRAME_SP; rkisp_check_idle(dev, ISP_FRAME_SP); } if (mis_val & ISP3X_MI_MPFBC_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_FBC]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_MPFBC; - else - dev->irq_ends_mask |= ISP_FRAME_MPFBC; rkisp_check_idle(dev, ISP_FRAME_MPFBC); } if (mis_val & ISP3X_MI_BP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_BP]; if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_BP; - else - dev->irq_ends_mask |= ISP_FRAME_BP; rkisp_check_idle(dev, ISP_FRAME_BP); } } diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 59848b242795..2e460ca70fde 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1438,12 +1438,14 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) stream->stopping = true; stream->is_pause = false; - if (stream->ops->disable_mi) + if (stream->ops->disable_mi && dev->hw_dev->is_single) stream->ops->disable_mi(stream); if (IS_HDR_RDBK(dev->rd_mode)) { spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); if (dev->hw_dev->cur_dev_id != dev->dev_id || dev->hw_dev->is_idle) { is_wait = false; + if (stream->ops->disable_mi) + stream->ops->disable_mi(stream); /* force update to close */ if (dev->hw_dev->is_single) stream_self_update(stream); @@ -1489,7 +1491,6 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) static int rkisp_start(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; - bool is_update = atomic_read(&dev->cap_dev.refcnt) > 1 ? false : true; int ret; if (stream->ops->set_data_path) @@ -1504,10 +1505,7 @@ static int rkisp_start(struct rkisp_stream *stream) if (stream->ops->enable_mi && !stream->is_pause) stream->ops->enable_mi(stream); - if (is_update) - dev->irq_ends_mask |= get_stream_irq_mask(stream); stream->streaming = true; - return 0; } @@ -2275,26 +2273,20 @@ void rkisp_mi_v32_isr(u32 mis_val, struct rkisp_device *dev) if (mis_val & ISP3X_MI_MP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_MP]; - if (!stream->streaming || stream->is_pause) + if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_MP; - else - dev->irq_ends_mask |= ISP_FRAME_MP; rkisp_check_idle(dev, ISP_FRAME_MP); } if (mis_val & ISP3X_MI_SP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_SP]; - if (!stream->streaming || stream->is_pause) + if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_SP; - else - dev->irq_ends_mask |= ISP_FRAME_SP; rkisp_check_idle(dev, ISP_FRAME_SP); } if (mis_val & ISP3X_MI_BP_FRAME) { stream = &dev->cap_dev.stream[RKISP_STREAM_BP]; - if (!stream->streaming || stream->is_pause) + if (!stream->streaming) dev->irq_ends_mask &= ~ISP_FRAME_BP; - else - dev->irq_ends_mask |= ISP_FRAME_BP; rkisp_check_idle(dev, ISP_FRAME_BP); } } diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index bb4435bb7b64..7d6a02ed6e16 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -703,22 +703,6 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo dev->multi_mode, dev->multi_index, val); } is_upd = true; - /* if output stream enable, wait it end */ - val = rkisp_read(dev, CIF_MI_CTRL_SHD, true); - if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED && - !(dev->irq_ends_mask & ISP_FRAME_MP)) - dev->irq_ends_mask |= ISP_FRAME_MP; - if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED && - !(dev->irq_ends_mask & ISP_FRAME_SP)) - dev->irq_ends_mask |= ISP_FRAME_SP; - if (dev->isp_ver == ISP_V30 && - !(dev->irq_ends_mask & ISP_FRAME_MPFBC) && - rkisp_read(dev, ISP3X_MPFBC_CTRL, true) & ISP3X_MPFBC_EN_SHD) - dev->irq_ends_mask |= ISP_FRAME_MPFBC; - if (dev->isp_ver == ISP_V32 && - !(dev->irq_ends_mask & ISP_FRAME_BP) && - rkisp_read(dev, ISP32_MI_WR_CTRL2_SHD, true) & ISP32_BP_EN_OUT_SHD) - dev->irq_ends_mask |= ISP_FRAME_BP; } if (dev->isp_ver > ISP_V20) @@ -779,6 +763,31 @@ run_next: if (is_3dlut_upd) rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 1, true, hw->is_unite); + /* if output stream enable, wait it end */ + val = rkisp_read(dev, CIF_MI_CTRL_SHD, true); + if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED) + dev->irq_ends_mask |= ISP_FRAME_MP; + else + dev->irq_ends_mask &= ~ISP_FRAME_MP; + if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED) + dev->irq_ends_mask |= ISP_FRAME_SP; + else + dev->irq_ends_mask &= ~ISP_FRAME_SP; + if ((dev->isp_ver == ISP_V20 && + rkisp_read(dev, ISP_MPFBC_CTRL, true) & SW_MPFBC_EN) || + (dev->isp_ver == ISP_V30 && + rkisp_read(dev, ISP3X_MPFBC_CTRL, true) & ISP3X_MPFBC_EN_SHD)) + dev->irq_ends_mask |= ISP_FRAME_MPFBC; + else + dev->irq_ends_mask &= ~ISP_FRAME_MPFBC; + if ((dev->isp_ver == ISP_V30 && + rkisp_read(dev, ISP3X_BP_ENABLE, true) & ISP3X_BP_ENABLE) || + (dev->isp_ver == ISP_V32 && + rkisp_read(dev, ISP32_MI_WR_CTRL2_SHD, true) & ISP32_BP_EN_OUT_SHD)) + dev->irq_ends_mask |= ISP_FRAME_BP; + else + dev->irq_ends_mask &= ~ISP_FRAME_BP; + val = rkisp_read(dev, CSI2RX_CTRL0, true); val &= ~SW_IBUF_OP_MODE(0xf); tmp = SW_IBUF_OP_MODE(dev->rd_mode); @@ -1019,6 +1028,8 @@ end: schedule_work(&dev->rdbk_work); else rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL); + if (dev->isp_state == ISP_STOP) + wake_up(&dev->sync_onoff); } static void rkisp_set_state(u32 *state, u32 val) @@ -2826,6 +2837,10 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on) wake_up(&s->done); } } + wait_event_timeout(isp_dev->sync_onoff, + isp_dev->isp_state & ISP_STOP || + !IS_HDR_RDBK(isp_dev->rd_mode), + msecs_to_jiffies(50)); rkisp_isp_stop(isp_dev); atomic_dec(&hw_dev->refcnt); rkisp_params_stream_stop(&isp_dev->params_vdev); From 71612ae49553c7bd4ae200634d7e02ce5b9fc9e4 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Fri, 3 Mar 2023 11:49:08 +0800 Subject: [PATCH 03/19] drm/bridge: synopsys: dw_hdmi: Add support for HBR / NLPCM Bitstream Signed-off-by: Sugar Zhang Change-Id: Id8ae61602a28182a0288b7c1a6b13ab58f5283f6 --- .../drm/bridge/synopsys/dw-hdmi-i2s-audio.c | 19 +++++++++++++++++++ drivers/gpu/drm/bridge/synopsys/dw-hdmi.h | 6 ++++++ 2 files changed, 25 insertions(+) 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 9682416056ed..f7db2e8e3321 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c @@ -42,6 +42,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data, struct dw_hdmi *hdmi = audio->hdmi; u8 conf0 = 0; u8 conf1 = 0; + u8 conf2 = 0; u8 inputclkfs = 0; /* it cares I2S only */ @@ -101,6 +102,23 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data, return -EINVAL; } + switch (fmt->bit_fmt) { + case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE: + conf1 = HDMI_AUD_CONF1_WIDTH_21; + conf2 = (hparms->channels == 8) ? HDMI_AUD_CONF2_HBR : HDMI_AUD_CONF2_NLPCM; + break; + default: + /* + * dw-hdmi introduced insert_pcuv bit in version 2.10a. + * When set (1'b1), this bit enables the insertion of the PCUV + * (Parity, Channel Status, User bit and Validity) bits on the + * incoming audio stream (support limited to Linear PCM audio) + */ + if (hdmi_read(audio, HDMI_DESIGN_ID) >= 0x21) + conf2 = HDMI_AUD_CONF2_INSERT_PCUV; + break; + } + dw_hdmi_set_sample_rate(hdmi, hparms->sample_rate); dw_hdmi_set_channel_status(hdmi, hparms->iec.status); dw_hdmi_set_channel_count(hdmi, hparms->channels); @@ -109,6 +127,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data, hdmi_write(audio, inputclkfs, HDMI_AUD_INPUTCLKFS); hdmi_write(audio, conf0, HDMI_AUD_CONF0); hdmi_write(audio, conf1, HDMI_AUD_CONF1); + hdmi_write(audio, conf2, HDMI_AUD_CONF2); return 0; } diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h index 50973280048c..5f89c85ed66d 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h @@ -967,8 +967,14 @@ enum { HDMI_AUD_CONF1_MODE_BURST_1 = 0x60, HDMI_AUD_CONF1_MODE_BURST_2 = 0x80, HDMI_AUD_CONF1_WIDTH_16 = 0x10, + HDMI_AUD_CONF1_WIDTH_21 = 0x15, HDMI_AUD_CONF1_WIDTH_24 = 0x18, +/* AUD_CONF2 filed values */ + HDMI_AUD_CONF2_HBR = 0x1, + HDMI_AUD_CONF2_NLPCM = 0x2, + HDMI_AUD_CONF2_INSERT_PCUV = 0x04, + /* AUD_CTS3 field values */ HDMI_AUD_CTS3_N_SHIFT_OFFSET = 5, HDMI_AUD_CTS3_N_SHIFT_MASK = 0xe0, From 71573dc8b5a234e2276bfe53a78e81b91d7d3ffb Mon Sep 17 00:00:00 2001 From: Tao Huang Date: Fri, 10 Mar 2023 14:39:04 +0800 Subject: [PATCH 04/19] media: rockchip: vicap: make rkcif_vb_done_oneframe() static Signed-off-by: Tao Huang Change-Id: I98511206f1aae711512240a89c97c48fa26e2e5f --- drivers/media/platform/rockchip/cif/capture.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 86cecfb83957..d9f29f6a6dc7 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -6494,7 +6494,7 @@ static const struct v4l2_ioctl_ops rkcif_v4l2_ioctl_ops = { .vidioc_default = rkcif_ioctl_default, }; -void rkcif_vb_done_oneframe(struct rkcif_stream *stream, +static void rkcif_vb_done_oneframe(struct rkcif_stream *stream, struct vb2_v4l2_buffer *vb_done) { const struct cif_output_fmt *fmt = stream->cif_fmt_out; From b0fdaaa67602b9fddc81215e71b2fe4f0b92d8b6 Mon Sep 17 00:00:00 2001 From: ZiHan Huang Date: Mon, 13 Mar 2023 11:27:13 +0800 Subject: [PATCH 05/19] arm64: dts: rockchip: rk3528-evb1-ddr4-v10-linux.dts: add sdmmc status Change-Id: I6641280bbda0f48a9fb48cbc6f3b6dbfc7ab2e7c Signed-off-by: ZiHan Huang --- arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts b/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts index 28a1711f9540..787534404741 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts +++ b/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts @@ -6,3 +6,7 @@ #include "rk3528-evb1-ddr4-v10.dtsi" #include "rk3528-linux.dtsi" + +&sdmmc { + status = "okay"; +}; From c8f437af4f99413b6e3dfc9c097d3f523ce38302 Mon Sep 17 00:00:00 2001 From: ZiHan Huang Date: Mon, 13 Mar 2023 11:30:08 +0800 Subject: [PATCH 06/19] arm64: dts: rockchip: rk3528-linux.dtsi add cmdline root and optee Change-Id: I7253057f70f834ffb2d9e60741e5e5473de1696e Signed-off-by: ZiHan Huang --- arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi index ffbc0f9bf21d..dd31a07ab6c5 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi @@ -6,7 +6,7 @@ / { chosen: chosen { - bootargs = "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0"; + bootargs = "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait"; }; fiq-debugger { @@ -22,6 +22,13 @@ status = "okay"; }; + firmware { + optee { + compatible = "linaro,optee-tz"; + method = "smc"; + }; + }; + reserved_memory: reserved-memory { #address-cells = <2>; #size-cells = <2>; From 55fdcfe8b159cec46fe2608a6a42bb73d8cf0624 Mon Sep 17 00:00:00 2001 From: ZiHan Huang Date: Sat, 11 Mar 2023 16:19:52 +0800 Subject: [PATCH 07/19] arm64/config: rockchip_linux_defconfig add CONFIG_CPU_RK3528 Change-Id: Iebce03f5ee397617b434beaa743dcafa4d6a4f5d Signed-off-by: ZiHan Huang --- arch/arm64/configs/rockchip_linux_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig index 5ccb0bcac1fd..63dd66ae2566 100644 --- a/arch/arm64/configs/rockchip_linux_defconfig +++ b/arch/arm64/configs/rockchip_linux_defconfig @@ -508,6 +508,7 @@ CONFIG_CPU_PX30=y CONFIG_CPU_RK1808=y CONFIG_CPU_RK3328=y CONFIG_CPU_RK3399=y +CONFIG_CPU_RK3528=y CONFIG_CPU_RK3562=y CONFIG_CPU_RK3568=y CONFIG_CPU_RK3588=y From 5d45a6a045de35f2d7d49899bd6a0e2e39eb440c Mon Sep 17 00:00:00 2001 From: ZiHan Huang Date: Mon, 13 Mar 2023 14:34:20 +0800 Subject: [PATCH 08/19] arm64: dts: rockchip: rk3528-linux.dtsi enable route-hdmi and route-tve Change-Id: I424b2669b0256caae0368b06e7e97b0967c59eda Signed-off-by: ZiHan Huang --- arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi index dd31a07ab6c5..47f2e98ccfb6 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi @@ -65,7 +65,7 @@ route { route_hdmi: route-hdmi { - status = "disabled"; + status = "okay"; logo,uboot = "logo.bmp"; logo,kernel = "logo_kernel.bmp"; logo,mode = "center"; @@ -73,7 +73,7 @@ connect = <&vp0_out_hdmi>; }; route_tve: route-tve { - status = "disabled"; + status = "okay"; logo,uboot = "logo.bmp"; logo,kernel = "logo_kernel.bmp"; logo,mode = "center"; From c62aea05966e313100f40c48f71f944c0e9d4834 Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Fri, 24 Feb 2023 19:06:48 +0800 Subject: [PATCH 09/19] video: rockchip: mpp: rkvenc2: Add devfreq support Signed-off-by: Finley Xiao Change-Id: Id2bee52f4c92afb7e14fb44c5f2b7687c3a6de9f --- drivers/video/rockchip/mpp/mpp_rkvenc2.c | 116 +++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 5b395c6a8cc7..616e511c5c92 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -282,6 +282,11 @@ struct rkvenc_dev { dma_addr_t sram_iova; u32 sram_enabled; struct page *rcb_page; + +#ifdef CONFIG_PM_DEVFREQ + struct rockchip_opp_info opp_info; + struct monitor_dev_info *mdev_info; +#endif }; struct rkvenc_ccu { @@ -1674,6 +1679,101 @@ static inline int rkvenc_procfs_ccu_init(struct mpp_dev *mpp) } #endif +#ifdef CONFIG_PM_DEVFREQ +static int rk3588_venc_set_read_margin(struct device *dev, + struct rockchip_opp_info *opp_info, + u32 rm) +{ + if (!opp_info->grf || !opp_info->volt_rm_tbl) + return 0; + + if (rm == opp_info->current_rm || rm == UINT_MAX) + return 0; + + dev_dbg(dev, "set rm to %d\n", rm); + + regmap_write(opp_info->grf, 0x214, 0x001c0000 | (rm << 2)); + regmap_write(opp_info->grf, 0x218, 0x001c0000 | (rm << 2)); + regmap_write(opp_info->grf, 0x220, 0x003c0000 | (rm << 2)); + regmap_write(opp_info->grf, 0x224, 0x003c0000 | (rm << 2)); + + opp_info->current_rm = rm; + + return 0; +} + +static const struct rockchip_opp_data rk3588_venc_opp_data = { + .set_read_margin = rk3588_venc_set_read_margin, +}; + +static const struct of_device_id rockchip_rkvenc_of_match[] = { + { + .compatible = "rockchip,rk3588", + .data = (void *)&rk3588_venc_opp_data, + }, + {}, +}; + +static struct monitor_dev_profile venc_mdevp = { + .type = MONITOR_TPYE_DEV, + .update_volt = rockchip_monitor_check_rate_volt, +}; + +static int rkvenc_devfreq_init(struct mpp_dev *mpp) +{ + struct rkvenc_dev *enc = to_rkvenc_dev(mpp); + struct clk *clk_core = enc->core_clk_info.clk; + struct device *dev = mpp->dev; + struct opp_table *reg_table = NULL; + struct opp_table *clk_table = NULL; + const char *const reg_names[] = { "venc", "mem" }; + int ret = 0; + + if (!clk_core) + return 0; + + if (of_find_property(dev->of_node, "venc-supply", NULL) && + of_find_property(dev->of_node, "mem-supply", NULL)) { + reg_table = dev_pm_opp_set_regulators(dev, reg_names, 2); + if (IS_ERR(reg_table)) + return PTR_ERR(reg_table); + } else { + reg_table = dev_pm_opp_set_regulators(dev, reg_names, 1); + if (IS_ERR(reg_table)) + return PTR_ERR(reg_table); + } + + clk_table = dev_pm_opp_set_clkname(dev, "clk_core"); + if (IS_ERR(clk_table)) + return PTR_ERR(clk_table); + + rockchip_get_opp_data(rockchip_rkvenc_of_match, &enc->opp_info); + ret = rockchip_init_opp_table(dev, &enc->opp_info, "leakage", "venc"); + if (ret) { + dev_err(dev, "failed to init_opp_table\n"); + return ret; + } + + enc->mdev_info = rockchip_system_monitor_register(dev, &venc_mdevp); + if (IS_ERR(enc->mdev_info)) { + dev_dbg(dev, "without system monitor\n"); + enc->mdev_info = NULL; + } + + return ret; +} + +static int rkvenc_devfreq_remove(struct mpp_dev *mpp) +{ + struct rkvenc_dev *enc = to_rkvenc_dev(mpp); + + if (enc->mdev_info) + rockchip_system_monitor_unregister(enc->mdev_info); + + return 0; +} +#endif + static int rkvenc_init(struct mpp_dev *mpp) { struct rkvenc_dev *enc = to_rkvenc_dev(mpp); @@ -1710,6 +1810,21 @@ static int rkvenc_init(struct mpp_dev *mpp) if (!enc->rst_core) mpp_err("No core reset resource define\n"); +#ifdef CONFIG_PM_DEVFREQ + ret = rkvenc_devfreq_init(mpp); + if (ret) + mpp_err("failed to add venc devfreq\n"); +#endif + + return 0; +} + +static int rkvenc_exit(struct mpp_dev *mpp) +{ +#ifdef CONFIG_PM_DEVFREQ + rkvenc_devfreq_remove(mpp); +#endif + return 0; } @@ -1979,6 +2094,7 @@ task_done_ret: static struct mpp_hw_ops rkvenc_hw_ops = { .init = rkvenc_init, + .exit = rkvenc_exit, .clk_on = rkvenc_clk_on, .clk_off = rkvenc_clk_off, .set_freq = rkvenc_set_freq, From 712abc0a65d4ba49b058d19be0228bb7fce023af Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Fri, 24 Feb 2023 19:06:05 +0800 Subject: [PATCH 10/19] arm64: dts: rockchip: rk3588: Add opp table for rkvenc Signed-off-by: Finley Xiao Change-Id: I4e2ab02ae3747e26bf93f0b9c029c7e59efae9f7 --- arch/arm64/boot/dts/rockchip/rk3588s.dtsi | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi index 1cd8f2f120f0..35e456b46f72 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi @@ -3370,6 +3370,7 @@ rockchip,taskqueue-node = <7>; rockchip,task-capacity = <8>; power-domains = <&power RK3588_PD_VENC0>; + operating-points-v2 = <&venc_opp_table>; status = "disabled"; }; @@ -3408,6 +3409,7 @@ rockchip,taskqueue-node = <7>; rockchip,task-capacity = <8>; power-domains = <&power RK3588_PD_VENC1>; + operating-points-v2 = <&venc_opp_table>; status = "disabled"; }; @@ -3427,6 +3429,38 @@ status = "disabled"; }; + venc_opp_table: venc-opp-table { + compatible = "operating-points-v2"; + + nvmem-cells = <&codec_leakage>; + nvmem-cell-names = "leakage"; + rockchip,leakage-voltage-sel = < + 1 8 0 + 9 20 1 + 21 254 2 + >; + + rockchip,grf = <&sys_grf>; + volt-mem-read-margin = < + 855000 1 + 765000 2 + 675000 3 + 495000 4 + >; + + opp-800000000 { + opp-hz = /bits/ 64 <800000000>; + opp-microvolt = <750000 750000 850000>, + <750000 750000 850000>; + opp-microvolt-L0 = <800000 800000 850000>, + <800000 800000 850000>; + opp-microvolt-L1 = <775000 775000 850000>, + <775000 775000 850000>; + opp-microvolt-L2 = <750000 750000 850000>, + <750000 750000 850000>; + }; + }; + rkvdec_ccu: rkvdec-ccu@fdc30000 { compatible = "rockchip,rkv-decoder-v2-ccu"; reg = <0x0 0xfdc30000 0x0 0x100>; From 38dabca3388549fc81769daf0de9a76e7b32b687 Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Mon, 27 Feb 2023 17:37:52 +0800 Subject: [PATCH 11/19] arm64: dts: rockchip: rk3588 boards: Add supply for rkvenc Signed-off-by: Finley Xiao Change-Id: I33a45881ef143803bb0482cc86b5f838e38f1e98 --- arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi | 4 ++++ .../boot/dts/rockchip/rk3588-nvr-demo3-v10.dtsi | 12 ++++++++++++ arch/arm64/boot/dts/rockchip/rk3588-nvr.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-pc.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-toybrick.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588-vehicle.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-evb.dtsi | 4 ++++ .../dts/rockchip/rk3588s-tablet-rk806-single.dtsi | 2 ++ .../boot/dts/rockchip/rk3588s-tablet-single.dtsi | 4 ++++ arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi | 4 ++++ 10 files changed, 46 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi index d9cdc0b3072a..c9cdc0817251 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi @@ -1026,6 +1026,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -1034,6 +1036,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-nvr-demo3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-nvr-demo3-v10.dtsi index cd6000c69c70..2f6821de45b7 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-nvr-demo3-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-nvr-demo3-v10.dtsi @@ -36,6 +36,18 @@ /delete-node/ rk8602@42; }; +&rkvenc0 { + venc-supply = <&vdd_log_s0>; + mem-supply = <&vdd_log_s0>; + status = "okay"; +}; + +&rkvenc1 { + venc-supply = <&vdd_log_s0>; + mem-supply = <&vdd_log_s0>; + status = "okay"; +}; + &spi2 { rk806single@0 { regulators { diff --git a/arch/arm64/boot/dts/rockchip/rk3588-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-nvr.dtsi index 8786b4b31bdf..c39c3252ee4b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-nvr.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-nvr.dtsi @@ -274,6 +274,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -282,6 +284,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-pc.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-pc.dtsi index 172835853997..bd0c9b7189a9 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-pc.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-pc.dtsi @@ -226,6 +226,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -234,6 +236,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-toybrick.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-toybrick.dtsi index ca5c8aee8d81..ae4131045a07 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-toybrick.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-toybrick.dtsi @@ -1049,6 +1049,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -1057,6 +1059,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588-vehicle.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-vehicle.dtsi index 3e8a1aaf4585..383591104b0e 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-vehicle.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-vehicle.dtsi @@ -339,6 +339,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -347,6 +349,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-evb.dtsi index d41305fa1225..c8a1ded05051 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-evb.dtsi @@ -988,6 +988,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -996,6 +998,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi index 5799b980d15e..450a913b7c06 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi @@ -1551,6 +1551,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi index b9a9ef526170..1d60dcae0fc3 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-tablet-single.dtsi @@ -1193,6 +1193,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -1201,6 +1203,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi index e8652e4f0639..777772463f1e 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s-tablet.dtsi @@ -1104,6 +1104,8 @@ }; &rkvenc0 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; @@ -1112,6 +1114,8 @@ }; &rkvenc1 { + venc-supply = <&vdd_vdenc_s0>; + mem-supply = <&vdd_vdenc_mem_s0>; status = "okay"; }; From 03cd98a92131a198afdddbbe9794d400453ff7be Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Fri, 10 Mar 2023 18:05:02 +0800 Subject: [PATCH 12/19] arm64: dts: rockchip: rk3562: modify driver strength for pwm pins Signed-off-by: Damon Ding Change-Id: Ic7dc93a36964f39c3e159993f5195e4488b40f5e --- .../boot/dts/rockchip/rk3562-pinctrl.dtsi | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3562-pinctrl.dtsi b/arch/arm64/boot/dts/rockchip/rk3562-pinctrl.dtsi index a2c9f208d6dd..d6958635d99f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3562-pinctrl.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3562-pinctrl.dtsi @@ -942,14 +942,14 @@ pwm0m0_pins: pwm0m0-pins { rockchip,pins = /* pwm0_m0 */ - <0 RK_PC3 2 &pcfg_pull_none>; + <0 RK_PC3 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm0m1_pins: pwm0m1-pins { rockchip,pins = /* pwm0_m1 */ - <1 RK_PC5 4 &pcfg_pull_none>; + <1 RK_PC5 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -958,14 +958,14 @@ pwm1m0_pins: pwm1m0-pins { rockchip,pins = /* pwm1_m0 */ - <0 RK_PC4 2 &pcfg_pull_none>; + <0 RK_PC4 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm1m1_pins: pwm1m1-pins { rockchip,pins = /* pwm1_m1 */ - <1 RK_PC6 4 &pcfg_pull_none>; + <1 RK_PC6 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -974,14 +974,14 @@ pwm2m0_pins: pwm2m0-pins { rockchip,pins = /* pwm2_m0 */ - <0 RK_PC5 2 &pcfg_pull_none>; + <0 RK_PC5 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm2m1_pins: pwm2m1-pins { rockchip,pins = /* pwm2_m1 */ - <1 RK_PC7 3 &pcfg_pull_none>; + <1 RK_PC7 3 &pcfg_pull_none_drv_level_1>; }; }; @@ -990,14 +990,14 @@ pwm3m0_pins: pwm3m0-pins { rockchip,pins = /* pwm3_m0 */ - <0 RK_PA7 1 &pcfg_pull_none>; + <0 RK_PA7 1 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm3m1_pins: pwm3m1-pins { rockchip,pins = /* pwm3_m1 */ - <1 RK_PD0 3 &pcfg_pull_none>; + <1 RK_PD0 3 &pcfg_pull_none_drv_level_1>; }; }; @@ -1006,14 +1006,14 @@ pwm4m0_pins: pwm4m0-pins { rockchip,pins = /* pwm4_m0 */ - <0 RK_PB7 2 &pcfg_pull_none>; + <0 RK_PB7 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm4m1_pins: pwm4m1-pins { rockchip,pins = /* pwm4_m1 */ - <1 RK_PD1 4 &pcfg_pull_none>; + <1 RK_PD1 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1022,14 +1022,14 @@ pwm5m0_pins: pwm5m0-pins { rockchip,pins = /* pwm5_m0 */ - <0 RK_PC2 2 &pcfg_pull_none>; + <0 RK_PC2 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm5m1_pins: pwm5m1-pins { rockchip,pins = /* pwm5_m1 */ - <1 RK_PD2 4 &pcfg_pull_none>; + <1 RK_PD2 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1038,14 +1038,14 @@ pwm6m0_pins: pwm6m0-pins { rockchip,pins = /* pwm6_m0 */ - <0 RK_PC1 2 &pcfg_pull_none>; + <0 RK_PC1 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm6m1_pins: pwm6m1-pins { rockchip,pins = /* pwm6_m1 */ - <1 RK_PD3 4 &pcfg_pull_none>; + <1 RK_PD3 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1054,14 +1054,14 @@ pwm7m0_pins: pwm7m0-pins { rockchip,pins = /* pwm7_m0 */ - <0 RK_PC0 2 &pcfg_pull_none>; + <0 RK_PC0 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm7m1_pins: pwm7m1-pins { rockchip,pins = /* pwm7_m1 */ - <1 RK_PD4 4 &pcfg_pull_none>; + <1 RK_PD4 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1070,14 +1070,14 @@ pwm8m0_pins: pwm8m0-pins { rockchip,pins = /* pwm8_m0 */ - <3 RK_PA4 2 &pcfg_pull_none>; + <3 RK_PA4 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm8m1_pins: pwm8m1-pins { rockchip,pins = /* pwm8_m1 */ - <1 RK_PC1 4 &pcfg_pull_none>; + <1 RK_PC1 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1086,14 +1086,14 @@ pwm9m0_pins: pwm9m0-pins { rockchip,pins = /* pwm9_m0 */ - <3 RK_PA5 2 &pcfg_pull_none>; + <3 RK_PA5 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm9m1_pins: pwm9m1-pins { rockchip,pins = /* pwm9_m1 */ - <1 RK_PC2 4 &pcfg_pull_none>; + <1 RK_PC2 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1102,14 +1102,14 @@ pwm10m0_pins: pwm10m0-pins { rockchip,pins = /* pwm10_m0 */ - <1 RK_PB5 5 &pcfg_pull_none>; + <1 RK_PB5 5 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm10m1_pins: pwm10m1-pins { rockchip,pins = /* pwm10_m1 */ - <1 RK_PC3 4 &pcfg_pull_none>; + <1 RK_PC3 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1118,14 +1118,14 @@ pwm11m0_pins: pwm11m0-pins { rockchip,pins = /* pwm11_m0 */ - <1 RK_PB6 5 &pcfg_pull_none>; + <1 RK_PB6 5 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm11m1_pins: pwm11m1-pins { rockchip,pins = /* pwm11_m1 */ - <1 RK_PC4 4 &pcfg_pull_none>; + <1 RK_PC4 4 &pcfg_pull_none_drv_level_1>; }; }; @@ -1134,14 +1134,14 @@ pwm12m0_pins: pwm12m0-pins { rockchip,pins = /* pwm12_m0 */ - <4 RK_PA1 4 &pcfg_pull_none>; + <4 RK_PA1 4 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm12m1_pins: pwm12m1-pins { rockchip,pins = /* pwm12_m1 */ - <3 RK_PB4 5 &pcfg_pull_none>; + <3 RK_PB4 5 &pcfg_pull_none_drv_level_1>; }; }; @@ -1150,14 +1150,14 @@ pwm13m0_pins: pwm13m0-pins { rockchip,pins = /* pwm13_m0 */ - <4 RK_PA4 3 &pcfg_pull_none>; + <4 RK_PA4 3 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm13m1_pins: pwm13m1-pins { rockchip,pins = /* pwm13_m1 */ - <3 RK_PB5 5 &pcfg_pull_none>; + <3 RK_PB5 5 &pcfg_pull_none_drv_level_1>; }; }; @@ -1166,14 +1166,14 @@ pwm14m0_pins: pwm14m0-pins { rockchip,pins = /* pwm14_m0 */ - <3 RK_PC5 4 &pcfg_pull_none>; + <3 RK_PC5 4 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm14m1_pins: pwm14m1-pins { rockchip,pins = /* pwm14_m1 */ - <1 RK_PD7 5 &pcfg_pull_none>; + <1 RK_PD7 5 &pcfg_pull_none_drv_level_1>; }; }; @@ -1182,14 +1182,14 @@ pwm15m0_pins: pwm15m0-pins { rockchip,pins = /* pwm15_m0 */ - <3 RK_PC6 4 &pcfg_pull_none>; + <3 RK_PC6 4 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm15m1_pins: pwm15m1-pins { rockchip,pins = /* pwm15_m1 */ - <2 RK_PA0 5 &pcfg_pull_none>; + <2 RK_PA0 5 &pcfg_pull_none_drv_level_1>; }; }; From 0e161311b20abf57fa14a20fd5dc6cfbd55297b4 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Fri, 17 Jun 2022 17:26:52 -0700 Subject: [PATCH 13/19] UPSTREAM: drm/rockchip: vop: Don't crash for invalid duplicate_state() It's possible for users to try to duplicate the CRTC state even when the state doesn't exist. drm_atomic_helper_crtc_duplicate_state() (and other users of __drm_atomic_helper_crtc_duplicate_state()) already guard this with a WARN_ON() instead of crashing, so let's do that here too. Fixes: 4e257d9eee23 ("drm/rockchip: get rid of rockchip_drm_crtc_mode_config") Signed-off-by: Brian Norris Reviewed-by: Sean Paul Reviewed-by: Douglas Anderson Signed-off-by: Heiko Stuebner Link: https://patchwork.freedesktop.org/patch/msgid/20220617172623.1.I62db228170b1559ada60b8d3e1637e1688424926@changeid Change-Id: I21349e20d235fc0ffd41eed54b1668d29b034a49 Signed-off-by: Sandy Huang --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 9eac7826f337..3d9aca634ced 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -4086,6 +4086,9 @@ static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc) { struct rockchip_crtc_state *rockchip_state, *old_state; + if (WARN_ON(!crtc->state)) + return NULL; + old_state = to_rockchip_crtc_state(crtc->state); rockchip_state = kmemdup(old_state, sizeof(*old_state), GFP_KERNEL); if (!rockchip_state) From 6fad88d43682c8084aeb2bf16e09c54f6bd3b87a Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sun, 12 Mar 2023 11:29:16 +0800 Subject: [PATCH 14/19] drm/rockchip: vop2: Don't crash for invalid duplicate_state() upstream commit for vop: https://patchwork.freedesktop.org/patch/490114/ Signed-off-by: Sandy Huang Change-Id: Iefb0180bc0010379b9c5c86d1e4d4bbe22e5053e --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 39bf9c62a8f5..5897bc81cbde 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -9791,6 +9791,9 @@ static struct drm_crtc_state *vop2_crtc_duplicate_state(struct drm_crtc *crtc) struct rockchip_crtc_state *vcstate, *old_vcstate; struct vop2_video_port *vp = to_vop2_video_port(crtc); + if (WARN_ON(!crtc->state)) + return NULL; + old_vcstate = to_rockchip_crtc_state(crtc->state); vcstate = kmemdup(old_vcstate, sizeof(*old_vcstate), GFP_KERNEL); if (!vcstate) From 4b781ee0227629b4f54cc9276505d2447475acab Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Thu, 9 Mar 2023 16:15:19 +0800 Subject: [PATCH 15/19] drm/rockchip: dsi2: let te_irq_handle be called as soon as possible Signed-off-by: Sandy Huang Change-Id: I747e2cbc6f945a292cd63399cd4ef87578234efa --- drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c index 19111b487c0c..c3bcd60b17ce 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c @@ -1611,8 +1611,8 @@ static int dw_mipi_dsi2_probe(struct platform_device *pdev) if (dsi2->te_gpio) { ret = devm_request_threaded_irq(dsi2->dev, gpiod_to_irq(dsi2->te_gpio), - NULL, dw_mipi_dsi2_te_irq_handler, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + dw_mipi_dsi2_te_irq_handler, NULL, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, "PANEL-TE", dsi2); if (ret) { dev_err(dsi2->dev, "failed to request TE IRQ: %d\n", ret); From 2cd758d07c6419709857423ed9cb7295966ec425 Mon Sep 17 00:00:00 2001 From: Zhang Yubing Date: Mon, 6 Mar 2023 14:06:02 +0800 Subject: [PATCH 16/19] drm/rockchip: vop3: acquire vop private blob property reference Signed-off-by: Zhang Yubing Change-Id: Ibdc05a43dd9670741b6583f090d95d7cbfb2ec32 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 5897bc81cbde..ef5cd640d064 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -9800,6 +9800,13 @@ static struct drm_crtc_state *vop2_crtc_duplicate_state(struct drm_crtc *crtc) return NULL; vcstate->vp_id = vp->id; + if (vcstate->hdr_ext_data) + drm_property_blob_get(vcstate->hdr_ext_data); + if (vcstate->acm_lut_data) + drm_property_blob_get(vcstate->acm_lut_data); + if (vcstate->post_csc_data) + drm_property_blob_get(vcstate->post_csc_data); + __drm_atomic_helper_crtc_duplicate_state(crtc, &vcstate->base); return &vcstate->base; } @@ -9810,6 +9817,9 @@ static void vop2_crtc_destroy_state(struct drm_crtc *crtc, struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(state); __drm_atomic_helper_crtc_destroy_state(&vcstate->base); + drm_property_blob_put(vcstate->hdr_ext_data); + drm_property_blob_put(vcstate->acm_lut_data); + drm_property_blob_put(vcstate->post_csc_data); kfree(vcstate); } From fda0a5244361310d6bf162108408ba411df0637b Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Wed, 8 Mar 2023 15:43:25 +0800 Subject: [PATCH 17/19] arm64: dts: rockchip: rk3528: Add hdmi ddc io idle state Signed-off-by: Algea Cao Change-Id: I91a4a4f882dd34da939929ebe3c4170c33cdcac7 --- arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi | 11 +++++++++++ arch/arm64/boot/dts/rockchip/rk3528.dtsi | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi index 594e69e11d49..969b8c09ec23 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi @@ -190,6 +190,17 @@ /* hdmi_tx_sda */ <0 RK_PA5 1 &pcfg_pull_none>; }; + + /omit-if-no-ref/ + hdmi_pins_idle: hdmi-pins-idle { + rockchip,pins = + /* hdmi_tx_cec */ + <0 RK_PA3 1 &pcfg_pull_none>, + /* hdmi_tx_scl */ + <0 RK_PA4 0 &pcfg_output_low_pull_down>, + /* hdmi_tx_sda */ + <0 RK_PA5 0 &pcfg_output_low_pull_down>; + }; }; hsm { diff --git a/arch/arm64/boot/dts/rockchip/rk3528.dtsi b/arch/arm64/boot/dts/rockchip/rk3528.dtsi index 913fdb75014e..be4de512d84d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528.dtsi @@ -1339,8 +1339,9 @@ clock-names = "iahb", "isfr", "cec"; reg-io-width = <4>; rockchip,grf = <&grf>; - pinctrl-names = "default"; + pinctrl-names = "default", "idle"; pinctrl-0 = <&hdmi_pins>; + pinctrl-1 = <&hdmi_pins_idle>; phys = <&hdmiphy>; phy-names = "hdmi"; #sound-dai-cells = <0>; From 221a84e78a62ba357484b178e74413ce8972c48d Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Wed, 8 Mar 2023 15:44:13 +0800 Subject: [PATCH 18/19] drm: bridge: dw-hdmi: Support ddc io pull down when hdmi disconnected KONKA TV have the problem that hdmi hpd pin leakage leads to hpd interrupt and trigger incorrectly. When the hdmi cable is not securely connected, the hdmitx ddc pin will leak electricity back to hdmitx through the TV's hpd pin and pull up hpd pin voltage to 1.8v. Because rk3528 hdmi hpd interrupt trigger voltage is 1.5v, hpd irq will be triggered by mistake, resulting in edid reading error. Therefore, hdmi ddc io needs to be pull down before the hpd pin is actually contacted and stabilized. Signed-off-by: Algea Cao Change-Id: Id5f859e1de0dde751cf1d522a8d7647558f0b7f8 --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 19 +++++++--- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 39 +++++++++++++++++++++ include/drm/bridge/dw_hdmi.h | 1 + 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 2a3968c3dfac..686d48011e37 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -420,13 +420,18 @@ static void repo_hpd_event(struct work_struct *p_work) if (hdmi->bridge.dev) { bool change; + void *data = hdmi->plat_data->phy_data; change = drm_helper_hpd_irq_event(hdmi->bridge.dev); - if (change && hdmi->cec_adap && - hdmi->cec_adap->devnode.registered) - cec_queue_pin_hpd_event(hdmi->cec_adap, - hdmi->hpd_state, - ktime_get()); + + if (change) { + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(data, hdmi->hpd_state); + if (hdmi->cec_adap->devnode.registered) + cec_queue_pin_hpd_event(hdmi->cec_adap, + hdmi->hpd_state, + ktime_get()); + } drm_bridge_hpd_notify(&hdmi->bridge, status); } } @@ -4795,8 +4800,12 @@ struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev, hdmi->bridge_is_on = true; hdmi->phy.enabled = true; hdmi->initialized = true; + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(hdmi->plat_data->phy_data, true); } else if (ret & HDMI_PHY_TX_PHY_LOCK) { hdmi->phy.ops->disable(hdmi, hdmi->phy.data); + if (hdmi->plat_data->set_ddc_io) + hdmi->plat_data->set_ddc_io(hdmi->plat_data->phy_data, false); } init_hpd_work(hdmi); diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 9d53a137c57d..d7bc8ec86a6d 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -241,6 +241,9 @@ struct rockchip_hdmi { struct delayed_work work; struct workqueue_struct *workqueue; struct gpio_desc *hpd_gpiod; + struct pinctrl *p; + struct pinctrl_state *idle_state; + struct pinctrl_state *default_state; }; #define to_rockchip_hdmi(x) container_of(x, struct rockchip_hdmi, x) @@ -1516,6 +1519,24 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi) enable_irq_wake(hdmi->hpd_irq); } + hdmi->p = devm_pinctrl_get(hdmi->dev); + if (IS_ERR(hdmi->p)) { + dev_err(hdmi->dev, "could not get pinctrl\n"); + return PTR_ERR(hdmi->p); + } + + hdmi->idle_state = pinctrl_lookup_state(hdmi->p, "idle"); + if (IS_ERR(hdmi->idle_state)) { + dev_dbg(hdmi->dev, "idle state is not defined\n"); + return 0; + } + + hdmi->default_state = pinctrl_lookup_state(hdmi->p, "default"); + if (IS_ERR(hdmi->default_state)) { + dev_err(hdmi->dev, "could not find default state\n"); + return PTR_ERR(hdmi->default_state); + } + return 0; } @@ -2450,6 +2471,22 @@ static void dw_hdmi_rockchip_set_prev_bus_format(void *data, unsigned long bus_f hdmi->prev_bus_format = bus_format; } +static void dw_hdmi_rockchip_set_ddc_io(void *data, bool enable) +{ + struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; + + if (!hdmi->p || !hdmi->idle_state || !hdmi->default_state) + return; + + if (!enable) { + if (pinctrl_select_state(hdmi->p, hdmi->idle_state)) + dev_err(hdmi->dev, "could not select idle state\n"); + } else { + if (pinctrl_select_state(hdmi->p, hdmi->default_state)) + dev_err(hdmi->dev, "could not select default state\n"); + } +} + static const struct drm_prop_enum_list color_depth_enum_list[] = { { 0, "Automatic" }, /* Prefer highest color depth */ { 8, "24bit" }, @@ -3364,6 +3401,8 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, dw_hdmi_rockchip_check_hdr_color_change; plat_data->set_prev_bus_format = dw_hdmi_rockchip_set_prev_bus_format; + plat_data->set_ddc_io = + dw_hdmi_rockchip_set_ddc_io; plat_data->property_ops = &dw_hdmi_rockchip_property_ops; secondary = rockchip_hdmi_find_by_id(dev->driver, !hdmi->id); diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h index 306d504a531e..2769c15aa00f 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -256,6 +256,7 @@ struct dw_hdmi_plat_data { bool (*check_hdr_color_change)(struct drm_connector_state *conn_state, void *data); void (*set_prev_bus_format)(void *data, unsigned long bus_format); int (*get_colorimetry)(void *data, struct edid *edid); + void (*set_ddc_io)(void *data, bool enable); /* Vendor Property support */ const struct dw_hdmi_property_ops *property_ops; From 8fcc8f437c57f09dfb5745a220651e7f7f0d04d6 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Mon, 13 Mar 2023 17:58:11 +0800 Subject: [PATCH 19/19] arm64: dts: rockchip: rk3528-evb: support es7243 sound Use es7243e to record sound. This support in evb1 and evb4. Signed-off-by: Jason Zhu Change-Id: Iecb118a1b4030c3e2973047455914c81d209625b --- arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi | 39 +++++++++++++++++++ .../dts/rockchip/rk3528-evb1-ddr4-v10.dtsi | 12 ++++++ 2 files changed, 51 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi index e2a83bd941a9..c003776f46fb 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi @@ -48,6 +48,21 @@ regulator-max-microvolt = <12000000>; }; + es7243_sound: es7243-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,name = "rockchip,es7243"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + + simple-audio-card,cpu { + sound-dai = <&sai1>; + }; + simple-audio-card,codec { + sound-dai = <&es7243e>; + }; + }; + hdmi_sound: hdmi-sound { compatible = "rockchip,hdmi"; rockchip,mclk-fs = <128>; @@ -280,6 +295,30 @@ status = "okay"; }; +&i2c6 { + status = "disabled"; + es7243e: es7243e@10 { + status = "okay"; + #sound-dai-cells = <0>; + compatible = "ES7243E_MicArray_0"; + reg = <0x10>; + }; + + es7243e_11: es7243e@11 { + status = "okay"; + #sound-dai-cells = <0>; + compatible = "ES7243E_MicArray_1"; + reg = <0x11>; + }; + + es7243e_12: es7243e@12 { + status = "okay"; + #sound-dai-cells = <0>; + compatible = "ES7243E_MicArray_2"; + reg = <0x12>; + }; +}; + &iep { status = "okay"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi index a1fb60aa8747..73ed29be46d5 100644 --- a/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi @@ -45,6 +45,14 @@ }; +&es7243_sound { + status = "okay"; +}; + +&i2c6 { + status = "okay"; +}; + &gmac1 { /* Use rgmii-rxid mode to disable rx delay inside Soc */ phy-mode = "rgmii-rxid"; @@ -76,6 +84,10 @@ }; }; +&sai1 { + status = "okay"; +}; + &sdio0 { max-frequency = <200000000>; no-sd;