1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
From 2aa3a92e409ed4ad416eceacef998f0027016a81 Mon Sep 17 00:00:00 2001
From: Dom Cobley <popcornmix@gmail.com>
Date: Thu, 7 May 2020 18:16:07 +0100
Subject: [PATCH] vc4_hdmi_regs: Add Intr2 register block
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
---
arch/arm/boot/dts/bcm2711.dtsi | 14 ++++++++++----
drivers/gpu/drm/vc4/vc4_hdmi.c | 8 ++++++++
drivers/gpu/drm/vc4/vc4_hdmi.h | 2 ++
drivers/gpu/drm/vc4/vc4_hdmi_regs.h | 17 +++++++++++++++++
4 files changed, 37 insertions(+), 4 deletions(-)
--- a/arch/arm/boot/dts/bcm2711.dtsi
+++ b/arch/arm/boot/dts/bcm2711.dtsi
@@ -316,7 +316,8 @@
<0x7ef01f00 0x400>,
<0x7ef00200 0x80>,
<0x7ef04300 0x100>,
- <0x7ef20000 0x100>;
+ <0x7ef20000 0x100>,
+ <0x7ef00100 0x30>;
reg-names = "hdmi",
"dvp",
"phy",
@@ -325,13 +326,15 @@
"metadata",
"csc",
"cec",
- "hd";
+ "hd",
+ "intr2";
clocks = <&firmware_clocks 13>;
clock-names = "hdmi";
resets = <&dvp 0>;
ddc = <&ddc0>;
dmas = <&dma 10>;
dma-names = "audio-rx";
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
@@ -353,7 +356,8 @@
<0x7ef06f00 0x400>,
<0x7ef00280 0x80>,
<0x7ef09300 0x100>,
- <0x7ef20000 0x100>;
+ <0x7ef20000 0x100>,
+ <0x7ef00100 0x30>;
reg-names = "hdmi",
"dvp",
"phy",
@@ -362,13 +366,15 @@
"metadata",
"csc",
"cec",
- "hd";
+ "hd",
+ "intr2";
ddc = <&ddc1>;
clocks = <&firmware_clocks 13>;
clock-names = "hdmi";
resets = <&dvp 1>;
dmas = <&dma 17>;
dma-names = "audio-rx";
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1582,6 +1582,14 @@ static int vc5_hdmi_init_resources(struc
if (IS_ERR(vc4_hdmi->dvp_regs))
return PTR_ERR(vc4_hdmi->dvp_regs);
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "intr2");
+ if (!res)
+ return -ENODEV;
+
+ vc4_hdmi->intr2_regs = devm_ioremap(dev, res->start, resource_size(res));
+ if (IS_ERR(vc4_hdmi->intr2_regs))
+ return PTR_ERR(vc4_hdmi->intr2_regs);
+
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
if (!res)
return -ENODEV;
--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
@@ -140,6 +140,8 @@ struct vc4_hdmi {
void __iomem *ram_regs;
/* VC5 Only */
void __iomem *rm_regs;
+ /* VC5 Only */
+ void __iomem *intr2_regs;
int hpd_gpio;
bool hpd_active_low;
--- a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h
@@ -24,6 +24,7 @@ enum vc4_hdmi_regs {
VC5_PHY,
VC5_RAM,
VC5_RM,
+ VC5_INTR2,
};
enum vc4_hdmi_field {
@@ -148,6 +149,7 @@ struct vc4_hdmi_register {
#define VC5_CEC_REG(reg, offset) _VC4_REG(VC5_CEC, reg, offset)
#define VC5_CSC_REG(reg, offset) _VC4_REG(VC5_CSC, reg, offset)
#define VC5_DVP_REG(reg, offset) _VC4_REG(VC5_DVP, reg, offset)
+#define VC5_INTR2_REG(reg, offset) _VC4_REG(VC5_INTR2, reg, offset)
#define VC5_PHY_REG(reg, offset) _VC4_REG(VC5_PHY, reg, offset)
#define VC5_RAM_REG(reg, offset) _VC4_REG(VC5_RAM, reg, offset)
#define VC5_RM_REG(reg, offset) _VC4_REG(VC5_RM, reg, offset)
@@ -280,6 +282,12 @@ static const struct vc4_hdmi_register vc
VC5_CEC_REG(HDMI_CEC_RX_DATA_2, 0x03c),
VC5_CEC_REG(HDMI_CEC_RX_DATA_3, 0x040),
VC5_CEC_REG(HDMI_CEC_RX_DATA_4, 0x044),
+ VC5_INTR2_REG(HDMI_CEC_CPU_STATUS, 0x0000),
+ VC5_INTR2_REG(HDMI_CEC_CPU_SET, 0x0004),
+ VC5_INTR2_REG(HDMI_CEC_CPU_CLEAR, 0x0008),
+ VC5_INTR2_REG(HDMI_CEC_CPU_MASK_STATUS, 0x000c),
+ VC5_INTR2_REG(HDMI_CEC_CPU_MASK_SET, 0x0010),
+ VC5_INTR2_REG(HDMI_CEC_CPU_MASK_CLEAR, 0x0014),
VC5_CSC_REG(HDMI_CSC_CTL, 0x000),
VC5_CSC_REG(HDMI_CSC_12_11, 0x004),
@@ -356,6 +364,12 @@ static const struct vc4_hdmi_register vc
VC5_CEC_REG(HDMI_CEC_RX_DATA_2, 0x03c),
VC5_CEC_REG(HDMI_CEC_RX_DATA_3, 0x040),
VC5_CEC_REG(HDMI_CEC_RX_DATA_4, 0x044),
+ VC5_INTR2_REG(HDMI_CEC_CPU_STATUS, 0x0000),
+ VC5_INTR2_REG(HDMI_CEC_CPU_SET, 0x0004),
+ VC5_INTR2_REG(HDMI_CEC_CPU_CLEAR, 0x0008),
+ VC5_INTR2_REG(HDMI_CEC_CPU_MASK_STATUS, 0x000c),
+ VC5_INTR2_REG(HDMI_CEC_CPU_MASK_SET, 0x0010),
+ VC5_INTR2_REG(HDMI_CEC_CPU_MASK_CLEAR, 0x0014),
VC5_CSC_REG(HDMI_CSC_CTL, 0x000),
VC5_CSC_REG(HDMI_CSC_12_11, 0x004),
@@ -386,6 +400,9 @@ void __iomem *__vc4_hdmi_get_field_base(
case VC5_DVP:
return hdmi->dvp_regs;
+ case VC5_INTR2:
+ return hdmi->intr2_regs;
+
case VC5_PHY:
return hdmi->phy_regs;
|