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_qp: switch to FIELD_PREP_WM16 macro

The era of hand-rolled HIWORD_UPDATE macros is over, at least for those
drivers that use constant masks.

Replace this driver's HIWORD_UPDATE with the FIELD_PREP_WM16 macro from
hw_bitfield.h. While at it, disambiguate the GRF write to SOC_CON7 by
splitting the definition into the individual bitflags. This is done
because FIELD_PREP_WM16 shifts the value for us according to the mask,
so writing the mask to itself to enable two bits is no longer something
that can be done. It should also not be done anyway because it hides the
true meaning of those two individual bit flags.

HDMI output with this patch has been tested on both RK3588 and RK3576.
On the former, with both present HDMI connectors.

Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Tested-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>

authored by

Nicolas Frattaroli and committed by
Yury Norov
ad24f6e1 d6de45fd

+33 -35
+33 -35
drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
··· 9 9 10 10 #include <linux/clk.h> 11 11 #include <linux/gpio/consumer.h> 12 + #include <linux/hw_bitfield.h> 12 13 #include <linux/mfd/syscon.h> 13 14 #include <linux/module.h> 14 15 #include <linux/platform_device.h> ··· 67 66 #define RK3588_HDMI1_HPD_INT_MSK BIT(15) 68 67 #define RK3588_HDMI1_HPD_INT_CLR BIT(14) 69 68 #define RK3588_GRF_SOC_CON7 0x031c 70 - #define RK3588_SET_HPD_PATH_MASK GENMASK(13, 12) 69 + #define RK3588_HPD_HDMI0_IO_EN_MASK BIT(12) 70 + #define RK3588_HPD_HDMI1_IO_EN_MASK BIT(13) 71 71 #define RK3588_GRF_SOC_STATUS1 0x0384 72 72 #define RK3588_HDMI0_LEVEL_INT BIT(16) 73 73 #define RK3588_HDMI1_LEVEL_INT BIT(24) ··· 82 80 #define RK3588_HDMI0_GRANT_SEL BIT(10) 83 81 #define RK3588_HDMI1_GRANT_SEL BIT(12) 84 82 85 - #define HIWORD_UPDATE(val, mask) ((val) | (mask) << 16) 86 83 #define HOTPLUG_DEBOUNCE_MS 150 87 84 #define MAX_HDMI_PORT_NUM 2 88 85 ··· 186 185 u32 val; 187 186 188 187 if (hdmi->port_id) 189 - val = HIWORD_UPDATE(RK3588_HDMI1_HPD_INT_CLR, 190 - RK3588_HDMI1_HPD_INT_CLR | RK3588_HDMI1_HPD_INT_MSK); 188 + val = (FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_CLR, 1) | 189 + FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 0)); 191 190 else 192 - val = HIWORD_UPDATE(RK3588_HDMI0_HPD_INT_CLR, 193 - RK3588_HDMI0_HPD_INT_CLR | RK3588_HDMI0_HPD_INT_MSK); 191 + val = (FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_CLR, 1) | 192 + FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 0)); 194 193 195 194 regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); 196 195 } ··· 219 218 struct rockchip_hdmi_qp *hdmi = (struct rockchip_hdmi_qp *)data; 220 219 u32 val; 221 220 222 - val = HIWORD_UPDATE(RK3576_HDMI_HPD_INT_CLR, 223 - RK3576_HDMI_HPD_INT_CLR | RK3576_HDMI_HPD_INT_MSK); 221 + val = (FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_CLR, 1) | 222 + FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0)); 224 223 225 224 regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); 226 225 regmap_write(hdmi->regmap, 0xa404, 0xffff0102); ··· 255 254 256 255 regmap_read(hdmi->regmap, RK3576_IOC_HDMI_HPD_STATUS, &intr_stat); 257 256 if (intr_stat) { 258 - val = HIWORD_UPDATE(RK3576_HDMI_HPD_INT_MSK, RK3576_HDMI_HPD_INT_MSK); 257 + val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1); 259 258 260 259 regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); 261 260 return IRQ_WAKE_THREAD; ··· 274 273 if (!intr_stat) 275 274 return IRQ_NONE; 276 275 277 - val = HIWORD_UPDATE(RK3576_HDMI_HPD_INT_CLR, RK3576_HDMI_HPD_INT_CLR); 276 + val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_CLR, 1); 278 277 regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); 279 278 mod_delayed_work(system_wq, &hdmi->hpd_work, 280 279 msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); 281 280 282 - val = HIWORD_UPDATE(0, RK3576_HDMI_HPD_INT_MSK); 281 + val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0); 283 282 regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); 284 283 285 284 return IRQ_HANDLED; ··· 294 293 295 294 if (intr_stat) { 296 295 if (hdmi->port_id) 297 - val = HIWORD_UPDATE(RK3588_HDMI1_HPD_INT_MSK, 298 - RK3588_HDMI1_HPD_INT_MSK); 296 + val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1); 299 297 else 300 - val = HIWORD_UPDATE(RK3588_HDMI0_HPD_INT_MSK, 301 - RK3588_HDMI0_HPD_INT_MSK); 298 + val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1); 302 299 regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); 303 300 return IRQ_WAKE_THREAD; 304 301 } ··· 314 315 return IRQ_NONE; 315 316 316 317 if (hdmi->port_id) 317 - val = HIWORD_UPDATE(RK3588_HDMI1_HPD_INT_CLR, 318 - RK3588_HDMI1_HPD_INT_CLR); 318 + val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_CLR, 1); 319 319 else 320 - val = HIWORD_UPDATE(RK3588_HDMI0_HPD_INT_CLR, 321 - RK3588_HDMI0_HPD_INT_CLR); 320 + val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_CLR, 1); 322 321 regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); 323 322 324 323 mod_delayed_work(system_wq, &hdmi->hpd_work, 325 324 msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); 326 325 327 326 if (hdmi->port_id) 328 - val |= HIWORD_UPDATE(0, RK3588_HDMI1_HPD_INT_MSK); 327 + val |= FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 0); 329 328 else 330 - val |= HIWORD_UPDATE(0, RK3588_HDMI0_HPD_INT_MSK); 329 + val |= FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 0); 331 330 regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); 332 331 333 332 return IRQ_HANDLED; ··· 335 338 { 336 339 u32 val; 337 340 338 - val = HIWORD_UPDATE(RK3576_SCLIN_MASK, RK3576_SCLIN_MASK) | 339 - HIWORD_UPDATE(RK3576_SDAIN_MASK, RK3576_SDAIN_MASK) | 340 - HIWORD_UPDATE(RK3576_HDMI_GRANT_SEL, RK3576_HDMI_GRANT_SEL) | 341 - HIWORD_UPDATE(RK3576_I2S_SEL_MASK, RK3576_I2S_SEL_MASK); 341 + val = FIELD_PREP_WM16(RK3576_SCLIN_MASK, 1) | 342 + FIELD_PREP_WM16(RK3576_SDAIN_MASK, 1) | 343 + FIELD_PREP_WM16(RK3576_HDMI_GRANT_SEL, 1) | 344 + FIELD_PREP_WM16(RK3576_I2S_SEL_MASK, 1); 342 345 343 346 regmap_write(hdmi->vo_regmap, RK3576_VO0_GRF_SOC_CON14, val); 344 347 345 - val = HIWORD_UPDATE(0, RK3576_HDMI_HPD_INT_MSK); 348 + val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0); 346 349 regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); 347 350 } 348 351 ··· 350 353 { 351 354 u32 val; 352 355 353 - val = HIWORD_UPDATE(RK3588_SCLIN_MASK, RK3588_SCLIN_MASK) | 354 - HIWORD_UPDATE(RK3588_SDAIN_MASK, RK3588_SDAIN_MASK) | 355 - HIWORD_UPDATE(RK3588_MODE_MASK, RK3588_MODE_MASK) | 356 - HIWORD_UPDATE(RK3588_I2S_SEL_MASK, RK3588_I2S_SEL_MASK); 356 + val = FIELD_PREP_WM16(RK3588_SCLIN_MASK, 1) | 357 + FIELD_PREP_WM16(RK3588_SDAIN_MASK, 1) | 358 + FIELD_PREP_WM16(RK3588_MODE_MASK, 1) | 359 + FIELD_PREP_WM16(RK3588_I2S_SEL_MASK, 1); 357 360 regmap_write(hdmi->vo_regmap, 358 361 hdmi->port_id ? RK3588_GRF_VO1_CON6 : RK3588_GRF_VO1_CON3, 359 362 val); 360 363 361 - val = HIWORD_UPDATE(RK3588_SET_HPD_PATH_MASK, RK3588_SET_HPD_PATH_MASK); 364 + val = FIELD_PREP_WM16(RK3588_HPD_HDMI0_IO_EN_MASK, 1) | 365 + FIELD_PREP_WM16(RK3588_HPD_HDMI1_IO_EN_MASK, 1); 362 366 regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON7, val); 363 367 364 368 if (hdmi->port_id) 365 - val = HIWORD_UPDATE(RK3588_HDMI1_GRANT_SEL, RK3588_HDMI1_GRANT_SEL); 369 + val = FIELD_PREP_WM16(RK3588_HDMI1_GRANT_SEL, 1); 366 370 else 367 - val = HIWORD_UPDATE(RK3588_HDMI0_GRANT_SEL, RK3588_HDMI0_GRANT_SEL); 371 + val = FIELD_PREP_WM16(RK3588_HDMI0_GRANT_SEL, 1); 368 372 regmap_write(hdmi->vo_regmap, RK3588_GRF_VO1_CON9, val); 369 373 370 374 if (hdmi->port_id) 371 - val = HIWORD_UPDATE(RK3588_HDMI1_HPD_INT_MSK, RK3588_HDMI1_HPD_INT_MSK); 375 + val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1); 372 376 else 373 - val = HIWORD_UPDATE(RK3588_HDMI0_HPD_INT_MSK, RK3588_HDMI0_HPD_INT_MSK); 377 + val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1); 374 378 regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); 375 379 } 376 380