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

Configure Feed

Select the types of activity you want to include in your feed.

drm/rockchip: analogix_dp: Use formalized struct definition for grf field

The formalized struct definition will makes grf field operations more
concise and easier to extend.

Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20250224081325.96724-2-damon.ding@rock-chips.com

authored by

Damon Ding and committed by
Heiko Stuebner
2bf9f610 fd0141d1

+45 -32
+45 -32
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
··· 32 32 33 33 #include "rockchip_drm_drv.h" 34 34 35 - #define RK3288_GRF_SOC_CON6 0x25c 36 - #define RK3288_EDP_LCDC_SEL BIT(5) 37 - #define RK3399_GRF_SOC_CON20 0x6250 38 - #define RK3399_EDP_LCDC_SEL BIT(5) 39 - 40 - #define HIWORD_UPDATE(val, mask) (val | (mask) << 16) 41 - 42 35 #define PSR_WAIT_LINE_FLAG_TIMEOUT_MS 100 36 + 37 + #define GRF_REG_FIELD(_reg, _lsb, _msb) { \ 38 + .reg = _reg, \ 39 + .lsb = _lsb, \ 40 + .msb = _msb, \ 41 + .valid = true, \ 42 + } 43 + 44 + struct rockchip_grf_reg_field { 45 + u32 reg; 46 + u32 lsb; 47 + u32 msb; 48 + bool valid; 49 + }; 43 50 44 51 /** 45 52 * struct rockchip_dp_chip_data - splite the grf setting of kind of chips 46 - * @lcdsel_grf_reg: grf register offset of lcdc select 47 - * @lcdsel_big: reg value of selecting vop big for eDP 48 - * @lcdsel_lit: reg value of selecting vop little for eDP 53 + * @lcdc_sel: grf register field of lcdc_sel 49 54 * @chip_type: specific chip type 50 55 */ 51 56 struct rockchip_dp_chip_data { 52 - u32 lcdsel_grf_reg; 53 - u32 lcdsel_big; 54 - u32 lcdsel_lit; 57 + const struct rockchip_grf_reg_field lcdc_sel; 55 58 u32 chip_type; 56 59 }; 57 60 ··· 85 82 static struct rockchip_dp_device *pdata_encoder_to_dp(struct analogix_dp_plat_data *plat_data) 86 83 { 87 84 return container_of(plat_data, struct rockchip_dp_device, plat_data); 85 + } 86 + 87 + static int rockchip_grf_write(struct regmap *grf, u32 reg, u32 mask, u32 val) 88 + { 89 + return regmap_write(grf, reg, (mask << 16) | (val & mask)); 90 + } 91 + 92 + static int rockchip_grf_field_write(struct regmap *grf, 93 + const struct rockchip_grf_reg_field *field, 94 + u32 val) 95 + { 96 + u32 mask; 97 + 98 + if (!field->valid) 99 + return 0; 100 + 101 + mask = GENMASK(field->msb, field->lsb); 102 + val <<= field->lsb; 103 + 104 + return rockchip_grf_write(grf, field->reg, mask, val); 88 105 } 89 106 90 107 static int rockchip_dp_pre_init(struct rockchip_dp_device *dp) ··· 204 181 struct drm_crtc *crtc; 205 182 struct drm_crtc_state *old_crtc_state; 206 183 int ret; 207 - u32 val; 208 184 209 185 crtc = rockchip_dp_drm_get_new_crtc(encoder, state); 210 186 if (!crtc) ··· 214 192 if (old_crtc_state && old_crtc_state->self_refresh_active) 215 193 return; 216 194 217 - ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); 218 - if (ret < 0) 219 - return; 220 - 221 - if (ret) 222 - val = dp->data->lcdsel_lit; 223 - else 224 - val = dp->data->lcdsel_big; 225 - 226 - DRM_DEV_DEBUG(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); 227 - 228 195 ret = clk_prepare_enable(dp->grfclk); 229 196 if (ret < 0) { 230 197 DRM_DEV_ERROR(dp->dev, "failed to enable grfclk %d\n", ret); 231 198 return; 232 199 } 233 200 234 - ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val); 201 + ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); 202 + if (ret < 0) 203 + return; 204 + 205 + DRM_DEV_DEBUG(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); 206 + 207 + ret = rockchip_grf_field_write(dp->grf, &dp->data->lcdc_sel, ret); 235 208 if (ret != 0) 236 209 DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret); 237 210 ··· 465 448 rockchip_dp_resume, NULL); 466 449 467 450 static const struct rockchip_dp_chip_data rk3399_edp = { 468 - .lcdsel_grf_reg = RK3399_GRF_SOC_CON20, 469 - .lcdsel_big = HIWORD_UPDATE(0, RK3399_EDP_LCDC_SEL), 470 - .lcdsel_lit = HIWORD_UPDATE(RK3399_EDP_LCDC_SEL, RK3399_EDP_LCDC_SEL), 451 + .lcdc_sel = GRF_REG_FIELD(0x6250, 5, 5), 471 452 .chip_type = RK3399_EDP, 472 453 }; 473 454 474 455 static const struct rockchip_dp_chip_data rk3288_dp = { 475 - .lcdsel_grf_reg = RK3288_GRF_SOC_CON6, 476 - .lcdsel_big = HIWORD_UPDATE(0, RK3288_EDP_LCDC_SEL), 477 - .lcdsel_lit = HIWORD_UPDATE(RK3288_EDP_LCDC_SEL, RK3288_EDP_LCDC_SEL), 456 + .lcdc_sel = GRF_REG_FIELD(0x025c, 5, 5), 478 457 .chip_type = RK3288_DP, 479 458 }; 480 459