bcm27xx: add kernel 5.10 support
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.10 / 950-0580-drm-vc4-Separate-VEC-compatible-variants.patch
1 From 8d75ba91d48ee9fd39284bf44ca5e729e134e18c Mon Sep 17 00:00:00 2001
2 From: kFYatek <4499762+kFYatek@users.noreply.github.com>
3 Date: Sat, 27 Mar 2021 21:43:40 +0100
4 Subject: [PATCH] drm/vc4: Separate VEC compatible variants
5
6 The VEC's DAC on BCM2711 is slightly different compared to the one on
7 BCM283x and needs different configuration. In particular, bit 3
8 (mask 0x8) switches the BCM2711 DAC input to "self-test input data",
9 which makes the output unusable. Separating two compatible variants in
10 devicetrees and the DRM driver was therefore necessary.
11
12 The configurations used for both variants have been borrowed from
13 Raspberry Pi (model 3B for BCM283x, 4B for BCM2711) firmware defaults.
14
15 Signed-off-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com>
16 ---
17 .../bindings/display/brcm,bcm2835-vec.yaml | 4 ++-
18 arch/arm/boot/dts/bcm2711.dtsi | 2 +-
19 drivers/gpu/drm/vc4/vc4_vec.c | 27 +++++++++++++++----
20 3 files changed, 26 insertions(+), 7 deletions(-)
21
22 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml
23 +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml
24 @@ -11,7 +11,9 @@ maintainers:
25
26 properties:
27 compatible:
28 - const: brcm,bcm2835-vec
29 + enum:
30 + - brcm,bcm2835-vec
31 + - brcm,bcm2711-vec
32
33 reg:
34 maxItems: 1
35 --- a/arch/arm/boot/dts/bcm2711.dtsi
36 +++ b/arch/arm/boot/dts/bcm2711.dtsi
37 @@ -301,7 +301,7 @@
38 };
39
40 vec: vec@7ec13000 {
41 - compatible = "brcm,bcm2835-vec";
42 + compatible = "brcm,bcm2711-vec";
43 reg = <0x7ec13000 0x1000>;
44 clocks = <&clocks BCM2835_CLOCK_VEC>;
45 interrupts = <2 27>;
46 --- a/drivers/gpu/drm/vc4/vc4_vec.c
47 +++ b/drivers/gpu/drm/vc4/vc4_vec.c
48 @@ -154,9 +154,14 @@
49 #define VEC_DAC_MISC_DAC_RST_N BIT(0)
50
51
52 +struct vc4_vec_variant {
53 + u32 dac_config;
54 +};
55 +
56 /* General VEC hardware state. */
57 struct vc4_vec {
58 struct platform_device *pdev;
59 + const struct vc4_vec_variant *variant;
60
61 struct drm_encoder *encoder;
62 struct drm_connector *connector;
63 @@ -451,10 +456,7 @@ static void vc4_vec_encoder_enable(struc
64 VEC_WRITE(VEC_CONFIG2,
65 VEC_CONFIG2_UV_DIG_DIS | VEC_CONFIG2_RGB_DIG_DIS);
66 VEC_WRITE(VEC_CONFIG3, VEC_CONFIG3_HORIZ_LEN_STD);
67 - VEC_WRITE(VEC_DAC_CONFIG,
68 - VEC_DAC_CONFIG_DAC_CTRL(0xc) |
69 - VEC_DAC_CONFIG_DRIVER_CTRL(0xc) |
70 - VEC_DAC_CONFIG_LDO_BIAS_CTRL(0x46));
71 + VEC_WRITE(VEC_DAC_CONFIG, vec->variant->dac_config);
72
73 /* Mask all interrupts. */
74 VEC_WRITE(VEC_MASK0, 0);
75 @@ -507,8 +509,21 @@ static const struct drm_encoder_helper_f
76 .atomic_mode_set = vc4_vec_encoder_atomic_mode_set,
77 };
78
79 +static const struct vc4_vec_variant bcm2835_vec_variant = {
80 + .dac_config = VEC_DAC_CONFIG_DAC_CTRL(0xc) |
81 + VEC_DAC_CONFIG_DRIVER_CTRL(0xc) |
82 + VEC_DAC_CONFIG_LDO_BIAS_CTRL(0x46)
83 +};
84 +
85 +static const struct vc4_vec_variant bcm2711_vec_variant = {
86 + .dac_config = VEC_DAC_CONFIG_DAC_CTRL(0x0) |
87 + VEC_DAC_CONFIG_DRIVER_CTRL(0x80) |
88 + VEC_DAC_CONFIG_LDO_BIAS_CTRL(0x61)
89 +};
90 +
91 static const struct of_device_id vc4_vec_dt_match[] = {
92 - { .compatible = "brcm,bcm2835-vec", .data = NULL },
93 + { .compatible = "brcm,bcm2835-vec", .data = &bcm2835_vec_variant },
94 + { .compatible = "brcm,bcm2711-vec", .data = &bcm2711_vec_variant },
95 { /* sentinel */ },
96 };
97
98 @@ -546,6 +561,8 @@ static int vc4_vec_bind(struct device *d
99 vec->encoder = &vc4_vec_encoder->base.base;
100
101 vec->pdev = pdev;
102 + vec->variant = (const struct vc4_vec_variant *)
103 + of_device_get_match_data(dev);
104 vec->regs = vc4_ioremap_regs(pdev, 0);
105 if (IS_ERR(vec->regs))
106 return PTR_ERR(vec->regs);