forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/gpu/drm/sun4i/sun8i_ui_scaler.c
....@@ -10,6 +10,7 @@
1010 */
1111
1212 #include "sun8i_ui_scaler.h"
13
+#include "sun8i_vi_scaler.h"
1314
1415 static const u32 lan2coefftab16[240] = {
1516 0x00004000, 0x00033ffe, 0x00063efc, 0x000a3bfb,
....@@ -88,6 +89,20 @@
8889 0x0b1c1603, 0x0d1c1502, 0x0e1d1401, 0x0f1d1301,
8990 };
9091
92
+static u32 sun8i_ui_scaler_base(struct sun8i_mixer *mixer, int channel)
93
+{
94
+ int vi_num = mixer->cfg->vi_num;
95
+
96
+ if (mixer->cfg->is_de3)
97
+ return DE3_VI_SCALER_UNIT_BASE +
98
+ DE3_VI_SCALER_UNIT_SIZE * vi_num +
99
+ DE3_UI_SCALER_UNIT_SIZE * (channel - vi_num);
100
+ else
101
+ return DE2_VI_SCALER_UNIT_BASE +
102
+ DE2_VI_SCALER_UNIT_SIZE * vi_num +
103
+ DE2_UI_SCALER_UNIT_SIZE * (channel - vi_num);
104
+}
105
+
91106 static int sun8i_ui_scaler_coef_index(unsigned int step)
92107 {
93108 unsigned int scale, int_part, float_part;
....@@ -114,11 +129,12 @@
114129
115130 void sun8i_ui_scaler_enable(struct sun8i_mixer *mixer, int layer, bool enable)
116131 {
117
- int vi_cnt = mixer->cfg->vi_num;
118
- u32 val;
132
+ u32 val, base;
119133
120
- if (WARN_ON(layer < vi_cnt))
134
+ if (WARN_ON(layer < mixer->cfg->vi_num))
121135 return;
136
+
137
+ base = sun8i_ui_scaler_base(mixer, layer);
122138
123139 if (enable)
124140 val = SUN8I_SCALER_GSU_CTRL_EN |
....@@ -126,20 +142,21 @@
126142 else
127143 val = 0;
128144
129
- regmap_write(mixer->engine.regs,
130
- SUN8I_SCALER_GSU_CTRL(vi_cnt, layer - vi_cnt), val);
145
+ regmap_write(mixer->engine.regs, SUN8I_SCALER_GSU_CTRL(base), val);
131146 }
132147
133148 void sun8i_ui_scaler_setup(struct sun8i_mixer *mixer, int layer,
134149 u32 src_w, u32 src_h, u32 dst_w, u32 dst_h,
135150 u32 hscale, u32 vscale, u32 hphase, u32 vphase)
136151 {
137
- int vi_cnt = mixer->cfg->vi_num;
138152 u32 insize, outsize;
139153 int i, offset;
154
+ u32 base;
140155
141
- if (WARN_ON(layer < vi_cnt))
156
+ if (WARN_ON(layer < mixer->cfg->vi_num))
142157 return;
158
+
159
+ base = sun8i_ui_scaler_base(mixer, layer);
143160
144161 hphase <<= SUN8I_UI_SCALER_PHASE_FRAC - 16;
145162 vphase <<= SUN8I_UI_SCALER_PHASE_FRAC - 16;
....@@ -149,24 +166,22 @@
149166 insize = SUN8I_UI_SCALER_SIZE(src_w, src_h);
150167 outsize = SUN8I_UI_SCALER_SIZE(dst_w, dst_h);
151168
152
- layer -= vi_cnt;
153
-
154169 regmap_write(mixer->engine.regs,
155
- SUN8I_SCALER_GSU_OUTSIZE(vi_cnt, layer), outsize);
170
+ SUN8I_SCALER_GSU_OUTSIZE(base), outsize);
156171 regmap_write(mixer->engine.regs,
157
- SUN8I_SCALER_GSU_INSIZE(vi_cnt, layer), insize);
172
+ SUN8I_SCALER_GSU_INSIZE(base), insize);
158173 regmap_write(mixer->engine.regs,
159
- SUN8I_SCALER_GSU_HSTEP(vi_cnt, layer), hscale);
174
+ SUN8I_SCALER_GSU_HSTEP(base), hscale);
160175 regmap_write(mixer->engine.regs,
161
- SUN8I_SCALER_GSU_VSTEP(vi_cnt, layer), vscale);
176
+ SUN8I_SCALER_GSU_VSTEP(base), vscale);
162177 regmap_write(mixer->engine.regs,
163
- SUN8I_SCALER_GSU_HPHASE(vi_cnt, layer), hphase);
178
+ SUN8I_SCALER_GSU_HPHASE(base), hphase);
164179 regmap_write(mixer->engine.regs,
165
- SUN8I_SCALER_GSU_VPHASE(vi_cnt, layer), vphase);
180
+ SUN8I_SCALER_GSU_VPHASE(base), vphase);
166181 offset = sun8i_ui_scaler_coef_index(hscale) *
167182 SUN8I_UI_SCALER_COEFF_COUNT;
168183 for (i = 0; i < SUN8I_UI_SCALER_COEFF_COUNT; i++)
169184 regmap_write(mixer->engine.regs,
170
- SUN8I_SCALER_GSU_HCOEFF(vi_cnt, layer, i),
185
+ SUN8I_SCALER_GSU_HCOEFF(base, i),
171186 lan2coefftab16[offset + i]);
172187 }