forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/sun4i/sun8i_vi_scaler.c
....@@ -833,6 +833,16 @@
833833 0x1012110d, 0x1012110d, 0x1013110c, 0x1013110c,
834834 };
835835
836
+static u32 sun8i_vi_scaler_base(struct sun8i_mixer *mixer, int channel)
837
+{
838
+ if (mixer->cfg->is_de3)
839
+ return DE3_VI_SCALER_UNIT_BASE +
840
+ DE3_VI_SCALER_UNIT_SIZE * channel;
841
+ else
842
+ return DE2_VI_SCALER_UNIT_BASE +
843
+ DE2_VI_SCALER_UNIT_SIZE * channel;
844
+}
845
+
836846 static int sun8i_vi_scaler_coef_index(unsigned int step)
837847 {
838848 unsigned int scale, int_part, float_part;
....@@ -857,7 +867,7 @@
857867 }
858868 }
859869
860
-static void sun8i_vi_scaler_set_coeff(struct regmap *map, int layer,
870
+static void sun8i_vi_scaler_set_coeff(struct regmap *map, u32 base,
861871 u32 hstep, u32 vstep,
862872 const struct drm_format_info *format)
863873 {
....@@ -877,29 +887,31 @@
877887 offset = sun8i_vi_scaler_coef_index(hstep) *
878888 SUN8I_VI_SCALER_COEFF_COUNT;
879889 for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
880
- regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF0(layer, i),
890
+ regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF0(base, i),
881891 lan3coefftab32_left[offset + i]);
882
- regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF1(layer, i),
892
+ regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF1(base, i),
883893 lan3coefftab32_right[offset + i]);
884
- regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF0(layer, i),
894
+ regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF0(base, i),
885895 ch_left[offset + i]);
886
- regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF1(layer, i),
896
+ regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF1(base, i),
887897 ch_right[offset + i]);
888898 }
889899
890900 offset = sun8i_vi_scaler_coef_index(hstep) *
891901 SUN8I_VI_SCALER_COEFF_COUNT;
892902 for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
893
- regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(layer, i),
903
+ regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(base, i),
894904 lan2coefftab32[offset + i]);
895
- regmap_write(map, SUN8I_SCALER_VSU_CVCOEFF(layer, i),
905
+ regmap_write(map, SUN8I_SCALER_VSU_CVCOEFF(base, i),
896906 cy[offset + i]);
897907 }
898908 }
899909
900910 void sun8i_vi_scaler_enable(struct sun8i_mixer *mixer, int layer, bool enable)
901911 {
902
- u32 val;
912
+ u32 val, base;
913
+
914
+ base = sun8i_vi_scaler_base(mixer, layer);
903915
904916 if (enable)
905917 val = SUN8I_SCALER_VSU_CTRL_EN |
....@@ -907,7 +919,8 @@
907919 else
908920 val = 0;
909921
910
- regmap_write(mixer->engine.regs, SUN8I_SCALER_VSU_CTRL(layer), val);
922
+ regmap_write(mixer->engine.regs,
923
+ SUN8I_SCALER_VSU_CTRL(base), val);
911924 }
912925
913926 void sun8i_vi_scaler_setup(struct sun8i_mixer *mixer, int layer,
....@@ -917,6 +930,9 @@
917930 {
918931 u32 chphase, cvphase;
919932 u32 insize, outsize;
933
+ u32 base;
934
+
935
+ base = sun8i_vi_scaler_base(mixer, layer);
920936
921937 hphase <<= SUN8I_VI_SCALER_PHASE_FRAC - 16;
922938 vphase <<= SUN8I_VI_SCALER_PHASE_FRAC - 16;
....@@ -940,32 +956,44 @@
940956 cvphase = vphase;
941957 }
942958
959
+ if (mixer->cfg->is_de3) {
960
+ u32 val;
961
+
962
+ if (format->hsub == 1 && format->vsub == 1)
963
+ val = SUN50I_SCALER_VSU_SCALE_MODE_UI;
964
+ else
965
+ val = SUN50I_SCALER_VSU_SCALE_MODE_NORMAL;
966
+
967
+ regmap_write(mixer->engine.regs,
968
+ SUN50I_SCALER_VSU_SCALE_MODE(base), val);
969
+ }
970
+
943971 regmap_write(mixer->engine.regs,
944
- SUN8I_SCALER_VSU_OUTSIZE(layer), outsize);
972
+ SUN8I_SCALER_VSU_OUTSIZE(base), outsize);
945973 regmap_write(mixer->engine.regs,
946
- SUN8I_SCALER_VSU_YINSIZE(layer), insize);
974
+ SUN8I_SCALER_VSU_YINSIZE(base), insize);
947975 regmap_write(mixer->engine.regs,
948
- SUN8I_SCALER_VSU_YHSTEP(layer), hscale);
976
+ SUN8I_SCALER_VSU_YHSTEP(base), hscale);
949977 regmap_write(mixer->engine.regs,
950
- SUN8I_SCALER_VSU_YVSTEP(layer), vscale);
978
+ SUN8I_SCALER_VSU_YVSTEP(base), vscale);
951979 regmap_write(mixer->engine.regs,
952
- SUN8I_SCALER_VSU_YHPHASE(layer), hphase);
980
+ SUN8I_SCALER_VSU_YHPHASE(base), hphase);
953981 regmap_write(mixer->engine.regs,
954
- SUN8I_SCALER_VSU_YVPHASE(layer), vphase);
982
+ SUN8I_SCALER_VSU_YVPHASE(base), vphase);
955983 regmap_write(mixer->engine.regs,
956
- SUN8I_SCALER_VSU_CINSIZE(layer),
984
+ SUN8I_SCALER_VSU_CINSIZE(base),
957985 SUN8I_VI_SCALER_SIZE(src_w / format->hsub,
958986 src_h / format->vsub));
959987 regmap_write(mixer->engine.regs,
960
- SUN8I_SCALER_VSU_CHSTEP(layer),
988
+ SUN8I_SCALER_VSU_CHSTEP(base),
961989 hscale / format->hsub);
962990 regmap_write(mixer->engine.regs,
963
- SUN8I_SCALER_VSU_CVSTEP(layer),
991
+ SUN8I_SCALER_VSU_CVSTEP(base),
964992 vscale / format->vsub);
965993 regmap_write(mixer->engine.regs,
966
- SUN8I_SCALER_VSU_CHPHASE(layer), chphase);
994
+ SUN8I_SCALER_VSU_CHPHASE(base), chphase);
967995 regmap_write(mixer->engine.regs,
968
- SUN8I_SCALER_VSU_CVPHASE(layer), cvphase);
969
- sun8i_vi_scaler_set_coeff(mixer->engine.regs, layer,
996
+ SUN8I_SCALER_VSU_CVPHASE(base), cvphase);
997
+ sun8i_vi_scaler_set_coeff(mixer->engine.regs, base,
970998 hscale, vscale, format);
971999 }