Merge commit '8fcc8f437c57f09dfb5745a220651e7f7f0d04d6'

* commit '8fcc8f437c57f09dfb5745a220651e7f7f0d04d6':
  arm64: dts: rockchip: rk3528-evb: support es7243 sound
  drm: bridge: dw-hdmi: Support ddc io pull down when hdmi disconnected
  arm64: dts: rockchip: rk3528: Add hdmi ddc io idle state
  drm/rockchip: vop3: acquire vop private blob property reference
  drm/rockchip: dsi2: let te_irq_handle be called as soon as possible
  drm/rockchip: vop2: Don't crash for invalid duplicate_state()
  UPSTREAM: drm/rockchip: vop: Don't crash for invalid duplicate_state()
  arm64: dts: rockchip: rk3562: modify driver strength for pwm pins
  arm64: dts: rockchip: rk3588 boards: Add supply for rkvenc
  arm64: dts: rockchip: rk3588: Add opp table for rkvenc
  video: rockchip: mpp: rkvenc2: Add devfreq support
  arm64: dts: rockchip: rk3528-linux.dtsi enable route-hdmi and route-tve
  arm64/config: rockchip_linux_defconfig add CONFIG_CPU_RK3528
  arm64: dts: rockchip: rk3528-linux.dtsi add cmdline root and optee
  arm64: dts: rockchip: rk3528-evb1-ddr4-v10-linux.dts: add sdmmc status
  media: rockchip: vicap: make rkcif_vb_done_oneframe() static
  drm/bridge: synopsys: dw_hdmi: Add support for HBR / NLPCM Bitstream
  media: rockchip: fix isp no work due to irq_ends_mask error
  media: rockchip: isp: fix warning of vb2 cancel or done

Change-Id: Ic308e6755a2e44fd7caca67cfb36a713a87951aa
This commit is contained in:
Tao Huang
2023-03-14 16:53:04 +08:00
35 changed files with 476 additions and 102 deletions

View File

@@ -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";
};

View File

@@ -6,3 +6,7 @@
#include "rk3528-evb1-ddr4-v10.dtsi"
#include "rk3528-linux.dtsi"
&sdmmc {
status = "okay";
};

View File

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

View File

@@ -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>;
@@ -58,7 +65,7 @@
route {
route_hdmi: route-hdmi {
status = "disabled";
status = "okay";
logo,uboot = "logo.bmp";
logo,kernel = "logo_kernel.bmp";
logo,mode = "center";
@@ -66,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";

View File

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

View File

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

View File

@@ -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>;
};
};

View File

@@ -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";
};

View File

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

View File

@@ -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";
};

View File

@@ -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";
};

View File

@@ -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";
};

View File

@@ -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";
};

View File

@@ -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";
};

View File

@@ -1551,6 +1551,8 @@
};
&rkvenc0 {
venc-supply = <&vdd_vdenc_s0>;
mem-supply = <&vdd_vdenc_mem_s0>;
status = "okay";
};

View File

@@ -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";
};

View File

@@ -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";
};

View File

@@ -3371,6 +3371,7 @@
rockchip,taskqueue-node = <7>;
rockchip,task-capacity = <8>;
power-domains = <&power RK3588_PD_VENC0>;
operating-points-v2 = <&venc_opp_table>;
status = "disabled";
};
@@ -3409,6 +3410,7 @@
rockchip,taskqueue-node = <7>;
rockchip,task-capacity = <8>;
power-domains = <&power RK3588_PD_VENC1>;
operating-points-v2 = <&venc_opp_table>;
status = "disabled";
};
@@ -3428,6 +3430,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>;

View File

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

View File

@@ -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;
}

View File

@@ -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);
}
}
@@ -4794,8 +4799,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);

View File

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

View File

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

View File

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

View File

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

View File

@@ -9791,12 +9791,22 @@ 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)
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;
}
@@ -9807,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);
}

View File

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

View File

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

View File

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

View File

@@ -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;
@@ -1556,6 +1546,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);
}
@@ -1959,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);
}
}

View File

@@ -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;
@@ -1218,6 +1216,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);
}
@@ -1715,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);
}
}

View File

@@ -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;
}
@@ -1672,6 +1670,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);
}
@@ -2268,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);
}
}

View File

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

View File

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

View File

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