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: dw_hdmi: add RK3399 HDMI support

RK3399 and RK3288 shared the same HDMI IP controller, only some light
difference with GRF configure.

Signed-off-by: Yakir Yang <ykk@rock-chips.com>
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
Acked-by: Rob Herring <robh@kernel.org>

Mark Yao 6445e394 364a7bf5

+59 -12
+3 -1
Documentation/devicetree/bindings/display/rockchip/dw_hdmi-rockchip.txt
··· 11 11 12 12 Required properties: 13 13 14 - - compatible: Shall contain "rockchip,rk3288-dw-hdmi". 14 + - compatible: should be one of the following: 15 + "rockchip,rk3288-dw-hdmi" 16 + "rockchip,rk3399-dw-hdmi" 15 17 - reg: See dw_hdmi.txt. 16 18 - reg-io-width: See dw_hdmi.txt. Shall be 4. 17 19 - interrupts: HDMI interrupt number
+56 -11
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
··· 20 20 #include "rockchip_drm_drv.h" 21 21 #include "rockchip_drm_vop.h" 22 22 23 - #define GRF_SOC_CON6 0x025c 24 - #define HDMI_SEL_VOP_LIT (1 << 4) 23 + #define RK3288_GRF_SOC_CON6 0x025C 24 + #define RK3288_HDMI_LCDC_SEL BIT(4) 25 + #define RK3399_GRF_SOC_CON20 0x6250 26 + #define RK3399_HDMI_LCDC_SEL BIT(6) 27 + 28 + #define HIWORD_UPDATE(val, mask) (val | (mask) << 16) 29 + 30 + /** 31 + * struct rockchip_hdmi_chip_data - splite the grf setting of kind of chips 32 + * @lcdsel_grf_reg: grf register offset of lcdc select 33 + * @lcdsel_big: reg value of selecting vop big for HDMI 34 + * @lcdsel_lit: reg value of selecting vop little for HDMI 35 + */ 36 + struct rockchip_hdmi_chip_data { 37 + u32 lcdsel_grf_reg; 38 + u32 lcdsel_big; 39 + u32 lcdsel_lit; 40 + }; 25 41 26 42 struct rockchip_hdmi { 27 43 struct device *dev; 28 44 struct regmap *regmap; 29 45 struct drm_encoder encoder; 46 + const struct rockchip_hdmi_chip_data *chip_data; 30 47 }; 31 48 32 49 #define to_rockchip_hdmi(x) container_of(x, struct rockchip_hdmi, x) ··· 215 198 { 216 199 struct rockchip_hdmi *hdmi = to_rockchip_hdmi(encoder); 217 200 u32 val; 218 - int mux; 201 + int ret; 219 202 220 - mux = drm_of_encoder_active_endpoint_id(hdmi->dev->of_node, encoder); 221 - if (mux) 222 - val = HDMI_SEL_VOP_LIT | (HDMI_SEL_VOP_LIT << 16); 203 + ret = drm_of_encoder_active_endpoint_id(hdmi->dev->of_node, encoder); 204 + if (ret) 205 + val = hdmi->chip_data->lcdsel_lit; 223 206 else 224 - val = HDMI_SEL_VOP_LIT << 16; 207 + val = hdmi->chip_data->lcdsel_big; 225 208 226 - regmap_write(hdmi->regmap, GRF_SOC_CON6, val); 209 + ret = regmap_write(hdmi->regmap, hdmi->chip_data->lcdsel_grf_reg, val); 210 + if (ret != 0) 211 + dev_err(hdmi->dev, "Could not write to GRF: %d\n", ret); 212 + 227 213 dev_dbg(hdmi->dev, "vop %s output to hdmi\n", 228 - (mux) ? "LIT" : "BIG"); 214 + ret ? "LIT" : "BIG"); 229 215 } 230 216 231 217 static int ··· 252 232 .atomic_check = dw_hdmi_rockchip_encoder_atomic_check, 253 233 }; 254 234 255 - static const struct dw_hdmi_plat_data rockchip_hdmi_drv_data = { 235 + static struct rockchip_hdmi_chip_data rk3288_chip_data = { 236 + .lcdsel_grf_reg = RK3288_GRF_SOC_CON6, 237 + .lcdsel_big = HIWORD_UPDATE(0, RK3288_HDMI_LCDC_SEL), 238 + .lcdsel_lit = HIWORD_UPDATE(RK3288_HDMI_LCDC_SEL, RK3288_HDMI_LCDC_SEL), 239 + }; 240 + 241 + static const struct dw_hdmi_plat_data rk3288_hdmi_drv_data = { 256 242 .mode_valid = dw_hdmi_rockchip_mode_valid, 257 243 .mpll_cfg = rockchip_mpll_cfg, 258 244 .cur_ctr = rockchip_cur_ctr, 259 245 .phy_config = rockchip_phy_config, 246 + .phy_data = &rk3288_chip_data, 247 + }; 248 + 249 + static struct rockchip_hdmi_chip_data rk3399_chip_data = { 250 + .lcdsel_grf_reg = RK3399_GRF_SOC_CON20, 251 + .lcdsel_big = HIWORD_UPDATE(0, RK3399_HDMI_LCDC_SEL), 252 + .lcdsel_lit = HIWORD_UPDATE(RK3399_HDMI_LCDC_SEL, RK3399_HDMI_LCDC_SEL), 253 + }; 254 + 255 + static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = { 256 + .mode_valid = dw_hdmi_rockchip_mode_valid, 257 + .mpll_cfg = rockchip_mpll_cfg, 258 + .cur_ctr = rockchip_cur_ctr, 259 + .phy_config = rockchip_phy_config, 260 + .phy_data = &rk3399_chip_data, 260 261 }; 261 262 262 263 static const struct of_device_id dw_hdmi_rockchip_dt_ids[] = { 263 264 { .compatible = "rockchip,rk3288-dw-hdmi", 264 - .data = &rockchip_hdmi_drv_data 265 + .data = &rk3288_hdmi_drv_data 266 + }, 267 + { .compatible = "rockchip,rk3399-dw-hdmi", 268 + .data = &rk3399_hdmi_drv_data 265 269 }, 266 270 {}, 267 271 }; ··· 312 268 match = of_match_node(dw_hdmi_rockchip_dt_ids, pdev->dev.of_node); 313 269 plat_data = match->data; 314 270 hdmi->dev = &pdev->dev; 271 + hdmi->chip_data = plat_data->phy_data; 315 272 encoder = &hdmi->encoder; 316 273 317 274 encoder->possible_crtcs = drm_of_find_possible_crtcs(drm, dev->of_node);