Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/sun4i: layers: Make regmap for layers configurable

Till DE33, there were no reason to decouple registers from mixer.
However, with future new plane driver, this will be necessary.

Reviewed-by: Chen-Yu Tsai <wens@kernel.org>
Tested-by: Ryan Walklin <ryan@testtoast.com>
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Link: https://patch.msgid.link/20251104180942.61538-21-jernej.skrabec@gmail.com
Signed-off-by: Chen-Yu Tsai <wens@kernel.org>

authored by

Jernej Skrabec and committed by
Chen-Yu Tsai
37aba59f f54c353c

+50 -41
+5 -2
drivers/gpu/drm/sun4i/sun8i_mixer.c
··· 332 332 else 333 333 type = DRM_PLANE_TYPE_OVERLAY; 334 334 335 - layer = sun8i_vi_layer_init_one(drm, mixer, type, i, plane_cnt); 335 + layer = sun8i_vi_layer_init_one(drm, mixer, type, 336 + mixer->engine.regs, i, 337 + plane_cnt); 336 338 if (IS_ERR(layer)) { 337 339 dev_err(drm->dev, 338 340 "Couldn't initialize overlay plane\n"); ··· 353 351 else 354 352 type = DRM_PLANE_TYPE_OVERLAY; 355 353 356 - layer = sun8i_ui_layer_init_one(drm, mixer, type, index, 354 + layer = sun8i_ui_layer_init_one(drm, mixer, type, 355 + mixer->engine.regs, index, 357 356 plane_cnt); 358 357 if (IS_ERR(layer)) { 359 358 dev_err(drm->dev, "Couldn't initialize %s plane\n",
+1
drivers/gpu/drm/sun4i/sun8i_mixer.h
··· 214 214 int type; 215 215 int channel; 216 216 int overlay; 217 + struct regmap *regs; 217 218 }; 218 219 219 220 static inline struct sun8i_layer *
+7 -5
drivers/gpu/drm/sun4i/sun8i_ui_layer.c
··· 54 54 val |= hw_fmt << SUN8I_MIXER_CHAN_UI_LAYER_ATTR_FBFMT_OFFSET; 55 55 val |= SUN8I_MIXER_CHAN_UI_LAYER_ATTR_EN; 56 56 57 - regmap_write(mixer->engine.regs, 57 + regmap_write(layer->regs, 58 58 SUN8I_MIXER_CHAN_UI_LAYER_ATTR(ch_base, layer->overlay), val); 59 59 } 60 60 ··· 88 88 DRM_DEBUG_DRIVER("Layer source offset X: %d Y: %d\n", 89 89 state->src.x1 >> 16, state->src.y1 >> 16); 90 90 DRM_DEBUG_DRIVER("Layer source size W: %d H: %d\n", src_w, src_h); 91 - regmap_write(mixer->engine.regs, 91 + regmap_write(layer->regs, 92 92 SUN8I_MIXER_CHAN_UI_LAYER_SIZE(ch_base, layer->overlay), 93 93 insize); 94 - regmap_write(mixer->engine.regs, 94 + regmap_write(layer->regs, 95 95 SUN8I_MIXER_CHAN_UI_OVL_SIZE(ch_base), 96 96 insize); 97 97 ··· 150 150 151 151 /* Set the line width */ 152 152 DRM_DEBUG_DRIVER("Layer line width: %d bytes\n", fb->pitches[0]); 153 - regmap_write(mixer->engine.regs, 153 + regmap_write(layer->regs, 154 154 SUN8I_MIXER_CHAN_UI_LAYER_PITCH(ch_base, layer->overlay), 155 155 fb->pitches[0]); 156 156 157 157 DRM_DEBUG_DRIVER("Setting buffer address to %pad\n", &dma_addr); 158 158 159 - regmap_write(mixer->engine.regs, 159 + regmap_write(layer->regs, 160 160 SUN8I_MIXER_CHAN_UI_LAYER_TOP_LADDR(ch_base, layer->overlay), 161 161 lower_32_bits(dma_addr)); 162 162 } ··· 264 264 struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm, 265 265 struct sun8i_mixer *mixer, 266 266 enum drm_plane_type type, 267 + struct regmap *regs, 267 268 int index, 268 269 int plane_cnt) 269 270 { ··· 279 278 layer->type = SUN8I_LAYER_TYPE_UI; 280 279 layer->channel = index; 281 280 layer->overlay = 0; 281 + layer->regs = regs; 282 282 283 283 /* possible crtcs are set later */ 284 284 ret = drm_universal_plane_init(drm, &layer->plane, 0,
+1
drivers/gpu/drm/sun4i/sun8i_ui_layer.h
··· 52 52 struct sun8i_layer *sun8i_ui_layer_init_one(struct drm_device *drm, 53 53 struct sun8i_mixer *mixer, 54 54 enum drm_plane_type type, 55 + struct regmap *regs, 55 56 int index, 56 57 int plane_cnt); 57 58 #endif /* _SUN8I_UI_LAYER_H_ */
+8 -8
drivers/gpu/drm/sun4i/sun8i_ui_scaler.c
··· 143 143 else 144 144 val = 0; 145 145 146 - regmap_write(mixer->engine.regs, SUN8I_SCALER_GSU_CTRL(base), val); 146 + regmap_write(layer->regs, SUN8I_SCALER_GSU_CTRL(base), val); 147 147 } 148 148 149 149 void sun8i_ui_scaler_setup(struct sun8i_layer *layer, ··· 168 168 insize = SUN8I_UI_SCALER_SIZE(src_w, src_h); 169 169 outsize = SUN8I_UI_SCALER_SIZE(dst_w, dst_h); 170 170 171 - regmap_write(mixer->engine.regs, 171 + regmap_write(layer->regs, 172 172 SUN8I_SCALER_GSU_OUTSIZE(base), outsize); 173 - regmap_write(mixer->engine.regs, 173 + regmap_write(layer->regs, 174 174 SUN8I_SCALER_GSU_INSIZE(base), insize); 175 - regmap_write(mixer->engine.regs, 175 + regmap_write(layer->regs, 176 176 SUN8I_SCALER_GSU_HSTEP(base), hscale); 177 - regmap_write(mixer->engine.regs, 177 + regmap_write(layer->regs, 178 178 SUN8I_SCALER_GSU_VSTEP(base), vscale); 179 - regmap_write(mixer->engine.regs, 179 + regmap_write(layer->regs, 180 180 SUN8I_SCALER_GSU_HPHASE(base), hphase); 181 - regmap_write(mixer->engine.regs, 181 + regmap_write(layer->regs, 182 182 SUN8I_SCALER_GSU_VPHASE(base), vphase); 183 183 offset = sun8i_ui_scaler_coef_index(hscale) * 184 184 SUN8I_UI_SCALER_COEFF_COUNT; 185 185 for (i = 0; i < SUN8I_UI_SCALER_COEFF_COUNT; i++) 186 - regmap_write(mixer->engine.regs, 186 + regmap_write(layer->regs, 187 187 SUN8I_SCALER_GSU_HCOEFF(base, i), 188 188 lan2coefftab16[offset + i]); 189 189 }
+12 -10
drivers/gpu/drm/sun4i/sun8i_vi_layer.c
··· 50 50 SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_PIXEL : 51 51 SUN50I_MIXER_CHAN_VI_LAYER_ATTR_ALPHA_MODE_COMBINED; 52 52 } else if (mixer->cfg->vi_num == 1) { 53 - regmap_write(mixer->engine.regs, 53 + regmap_write(layer->regs, 54 54 SUN8I_MIXER_FCC_GLOBAL_ALPHA_REG, 55 55 SUN8I_MIXER_FCC_GLOBAL_ALPHA(state->alpha >> 8)); 56 56 } 57 57 58 - regmap_write(mixer->engine.regs, 58 + regmap_write(layer->regs, 59 59 SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, layer->overlay), val); 60 60 } 61 61 ··· 113 113 (state->src.x1 >> 16) & ~(format->hsub - 1), 114 114 (state->src.y1 >> 16) & ~(format->vsub - 1)); 115 115 DRM_DEBUG_DRIVER("Layer source size W: %d H: %d\n", src_w, src_h); 116 - regmap_write(mixer->engine.regs, 116 + regmap_write(layer->regs, 117 117 SUN8I_MIXER_CHAN_VI_LAYER_SIZE(ch_base, layer->overlay), 118 118 insize); 119 - regmap_write(mixer->engine.regs, 119 + regmap_write(layer->regs, 120 120 SUN8I_MIXER_CHAN_VI_OVL_SIZE(ch_base), 121 121 insize); 122 122 ··· 171 171 sun8i_vi_scaler_enable(layer, false); 172 172 } 173 173 174 - regmap_write(mixer->engine.regs, 174 + regmap_write(layer->regs, 175 175 SUN8I_MIXER_CHAN_VI_HDS_Y(ch_base), 176 176 SUN8I_MIXER_CHAN_VI_DS_N(hn) | 177 177 SUN8I_MIXER_CHAN_VI_DS_M(hm)); 178 - regmap_write(mixer->engine.regs, 178 + regmap_write(layer->regs, 179 179 SUN8I_MIXER_CHAN_VI_HDS_UV(ch_base), 180 180 SUN8I_MIXER_CHAN_VI_DS_N(hn) | 181 181 SUN8I_MIXER_CHAN_VI_DS_M(hm)); 182 - regmap_write(mixer->engine.regs, 182 + regmap_write(layer->regs, 183 183 SUN8I_MIXER_CHAN_VI_VDS_Y(ch_base), 184 184 SUN8I_MIXER_CHAN_VI_DS_N(vn) | 185 185 SUN8I_MIXER_CHAN_VI_DS_M(vm)); 186 - regmap_write(mixer->engine.regs, 186 + regmap_write(layer->regs, 187 187 SUN8I_MIXER_CHAN_VI_VDS_UV(ch_base), 188 188 SUN8I_MIXER_CHAN_VI_DS_N(vn) | 189 189 SUN8I_MIXER_CHAN_VI_DS_M(vm)); ··· 232 232 /* Set the line width */ 233 233 DRM_DEBUG_DRIVER("Layer %d. line width: %d bytes\n", 234 234 i + 1, fb->pitches[i]); 235 - regmap_write(mixer->engine.regs, 235 + regmap_write(layer->regs, 236 236 SUN8I_MIXER_CHAN_VI_LAYER_PITCH(ch_base, 237 237 layer->overlay, i), 238 238 fb->pitches[i]); ··· 240 240 DRM_DEBUG_DRIVER("Setting %d. buffer address to %pad\n", 241 241 i + 1, &dma_addr); 242 242 243 - regmap_write(mixer->engine.regs, 243 + regmap_write(layer->regs, 244 244 SUN8I_MIXER_CHAN_VI_LAYER_TOP_LADDR(ch_base, 245 245 layer->overlay, i), 246 246 lower_32_bits(dma_addr)); ··· 410 410 struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm, 411 411 struct sun8i_mixer *mixer, 412 412 enum drm_plane_type type, 413 + struct regmap *regs, 413 414 int index, 414 415 int plane_cnt) 415 416 { ··· 428 427 layer->type = SUN8I_LAYER_TYPE_VI; 429 428 layer->channel = index; 430 429 layer->overlay = 0; 430 + layer->regs = regs; 431 431 432 432 if (mixer->cfg->de_type >= SUN8I_MIXER_DE3) { 433 433 formats = sun8i_vi_layer_de3_formats;
+1
drivers/gpu/drm/sun4i/sun8i_vi_layer.h
··· 57 57 struct sun8i_layer *sun8i_vi_layer_init_one(struct drm_device *drm, 58 58 struct sun8i_mixer *mixer, 59 59 enum drm_plane_type type, 60 + struct regmap *regs, 60 61 int index, 61 62 int plane_cnt); 62 63 #endif /* _SUN8I_VI_LAYER_H_ */
+15 -16
drivers/gpu/drm/sun4i/sun8i_vi_scaler.c
··· 911 911 912 912 void sun8i_vi_scaler_enable(struct sun8i_layer *layer, bool enable) 913 913 { 914 - struct sun8i_mixer *mixer = layer->mixer; 915 914 u32 val, base; 916 915 917 - base = sun8i_vi_scaler_base(mixer, layer->channel); 916 + base = sun8i_vi_scaler_base(layer->mixer, layer->channel); 918 917 919 918 if (enable) 920 919 val = SUN8I_SCALER_VSU_CTRL_EN | ··· 921 922 else 922 923 val = 0; 923 924 924 - regmap_write(mixer->engine.regs, 925 + regmap_write(layer->regs, 925 926 SUN8I_SCALER_VSU_CTRL(base), val); 926 927 } 927 928 ··· 967 968 else 968 969 val = SUN50I_SCALER_VSU_SCALE_MODE_NORMAL; 969 970 970 - regmap_write(mixer->engine.regs, 971 + regmap_write(layer->regs, 971 972 SUN50I_SCALER_VSU_SCALE_MODE(base), val); 972 973 } 973 974 974 - regmap_write(mixer->engine.regs, 975 + regmap_write(layer->regs, 975 976 SUN8I_SCALER_VSU_OUTSIZE(base), outsize); 976 - regmap_write(mixer->engine.regs, 977 + regmap_write(layer->regs, 977 978 SUN8I_SCALER_VSU_YINSIZE(base), insize); 978 - regmap_write(mixer->engine.regs, 979 + regmap_write(layer->regs, 979 980 SUN8I_SCALER_VSU_YHSTEP(base), hscale); 980 - regmap_write(mixer->engine.regs, 981 + regmap_write(layer->regs, 981 982 SUN8I_SCALER_VSU_YVSTEP(base), vscale); 982 - regmap_write(mixer->engine.regs, 983 + regmap_write(layer->regs, 983 984 SUN8I_SCALER_VSU_YHPHASE(base), hphase); 984 - regmap_write(mixer->engine.regs, 985 + regmap_write(layer->regs, 985 986 SUN8I_SCALER_VSU_YVPHASE(base), vphase); 986 - regmap_write(mixer->engine.regs, 987 + regmap_write(layer->regs, 987 988 SUN8I_SCALER_VSU_CINSIZE(base), 988 989 SUN8I_VI_SCALER_SIZE(src_w / format->hsub, 989 990 src_h / format->vsub)); 990 - regmap_write(mixer->engine.regs, 991 + regmap_write(layer->regs, 991 992 SUN8I_SCALER_VSU_CHSTEP(base), 992 993 hscale / format->hsub); 993 - regmap_write(mixer->engine.regs, 994 + regmap_write(layer->regs, 994 995 SUN8I_SCALER_VSU_CVSTEP(base), 995 996 vscale / format->vsub); 996 - regmap_write(mixer->engine.regs, 997 + regmap_write(layer->regs, 997 998 SUN8I_SCALER_VSU_CHPHASE(base), chphase); 998 - regmap_write(mixer->engine.regs, 999 + regmap_write(layer->regs, 999 1000 SUN8I_SCALER_VSU_CVPHASE(base), cvphase); 1000 - sun8i_vi_scaler_set_coeff(mixer->engine.regs, base, 1001 + sun8i_vi_scaler_set_coeff(layer->regs, base, 1001 1002 hscale, vscale, format); 1002 1003 }