GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / media / pci / ddbridge / ddbridge-hw.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * ddbridge-hw.c: Digital Devices bridge hardware maps
4  *
5  * Copyright (C) 2010-2017 Digital Devices GmbH
6  *                         Ralph Metzler <rjkm@metzlerbros.de>
7  *                         Marcus Metzler <mocm@metzlerbros.de>
8  */
9
10 #include "ddbridge.h"
11 #include "ddbridge-hw.h"
12
13 /******************************************************************************/
14
15 static const struct ddb_regset octopus_input = {
16         .base = 0x200,
17         .num  = 0x08,
18         .size = 0x10,
19 };
20
21 static const struct ddb_regset octopus_output = {
22         .base = 0x280,
23         .num  = 0x08,
24         .size = 0x10,
25 };
26
27 static const struct ddb_regset octopus_idma = {
28         .base = 0x300,
29         .num  = 0x08,
30         .size = 0x10,
31 };
32
33 static const struct ddb_regset octopus_idma_buf = {
34         .base = 0x2000,
35         .num  = 0x08,
36         .size = 0x100,
37 };
38
39 static const struct ddb_regset octopus_odma = {
40         .base = 0x380,
41         .num  = 0x04,
42         .size = 0x10,
43 };
44
45 static const struct ddb_regset octopus_odma_buf = {
46         .base = 0x2800,
47         .num  = 0x04,
48         .size = 0x100,
49 };
50
51 static const struct ddb_regset octopus_i2c = {
52         .base = 0x80,
53         .num  = 0x04,
54         .size = 0x20,
55 };
56
57 static const struct ddb_regset octopus_i2c_buf = {
58         .base = 0x1000,
59         .num  = 0x04,
60         .size = 0x200,
61 };
62
63 /****************************************************************************/
64
65 static const struct ddb_regmap octopus_map = {
66         .irq_base_i2c = 0,
67         .irq_base_idma = 8,
68         .irq_base_odma = 16,
69         .i2c = &octopus_i2c,
70         .i2c_buf = &octopus_i2c_buf,
71         .idma = &octopus_idma,
72         .idma_buf = &octopus_idma_buf,
73         .odma = &octopus_odma,
74         .odma_buf = &octopus_odma_buf,
75         .input = &octopus_input,
76         .output = &octopus_output,
77 };
78
79 /****************************************************************************/
80
81 static const struct ddb_info ddb_none = {
82         .type     = DDB_NONE,
83         .name     = "unknown Digital Devices PCIe card, install newer driver",
84         .regmap   = &octopus_map,
85 };
86
87 static const struct ddb_info ddb_octopus = {
88         .type     = DDB_OCTOPUS,
89         .name     = "Digital Devices Octopus DVB adapter",
90         .regmap   = &octopus_map,
91         .port_num = 4,
92         .i2c_mask = 0x0f,
93 };
94
95 static const struct ddb_info ddb_octopusv3 = {
96         .type     = DDB_OCTOPUS,
97         .name     = "Digital Devices Octopus V3 DVB adapter",
98         .regmap   = &octopus_map,
99         .port_num = 4,
100         .i2c_mask = 0x0f,
101 };
102
103 static const struct ddb_info ddb_octopus_le = {
104         .type     = DDB_OCTOPUS,
105         .name     = "Digital Devices Octopus LE DVB adapter",
106         .regmap   = &octopus_map,
107         .port_num = 2,
108         .i2c_mask = 0x03,
109 };
110
111 static const struct ddb_info ddb_octopus_oem = {
112         .type     = DDB_OCTOPUS,
113         .name     = "Digital Devices Octopus OEM",
114         .regmap   = &octopus_map,
115         .port_num = 4,
116         .i2c_mask = 0x0f,
117         .led_num  = 1,
118         .fan_num  = 1,
119         .temp_num = 1,
120         .temp_bus = 0,
121 };
122
123 static const struct ddb_info ddb_octopus_mini = {
124         .type     = DDB_OCTOPUS,
125         .name     = "Digital Devices Octopus Mini",
126         .regmap   = &octopus_map,
127         .port_num = 4,
128         .i2c_mask = 0x0f,
129 };
130
131 static const struct ddb_info ddb_v6 = {
132         .type     = DDB_OCTOPUS,
133         .name     = "Digital Devices Cine S2 V6 DVB adapter",
134         .regmap   = &octopus_map,
135         .port_num = 3,
136         .i2c_mask = 0x07,
137 };
138
139 static const struct ddb_info ddb_v6_5 = {
140         .type     = DDB_OCTOPUS,
141         .name     = "Digital Devices Cine S2 V6.5 DVB adapter",
142         .regmap   = &octopus_map,
143         .port_num = 4,
144         .i2c_mask = 0x0f,
145 };
146
147 static const struct ddb_info ddb_v7 = {
148         .type     = DDB_OCTOPUS,
149         .name     = "Digital Devices Cine S2 V7 DVB adapter",
150         .regmap   = &octopus_map,
151         .port_num = 4,
152         .i2c_mask = 0x0f,
153         .board_control   = 2,
154         .board_control_2 = 4,
155         .ts_quirks = TS_QUIRK_REVERSED,
156 };
157
158 static const struct ddb_info ddb_v7a = {
159         .type     = DDB_OCTOPUS,
160         .name     = "Digital Devices Cine S2 V7 Advanced DVB adapter",
161         .regmap   = &octopus_map,
162         .port_num = 4,
163         .i2c_mask = 0x0f,
164         .board_control   = 2,
165         .board_control_2 = 4,
166         .ts_quirks = TS_QUIRK_REVERSED,
167 };
168
169 static const struct ddb_info ddb_ctv7 = {
170         .type     = DDB_OCTOPUS,
171         .name     = "Digital Devices Cine CT V7 DVB adapter",
172         .regmap   = &octopus_map,
173         .port_num = 4,
174         .i2c_mask = 0x0f,
175         .board_control   = 3,
176         .board_control_2 = 4,
177 };
178
179 static const struct ddb_info ddb_satixs2v3 = {
180         .type     = DDB_OCTOPUS,
181         .name     = "Mystique SaTiX-S2 V3 DVB adapter",
182         .regmap   = &octopus_map,
183         .port_num = 3,
184         .i2c_mask = 0x07,
185 };
186
187 static const struct ddb_info ddb_ci = {
188         .type     = DDB_OCTOPUS_CI,
189         .name     = "Digital Devices Octopus CI",
190         .regmap   = &octopus_map,
191         .port_num = 4,
192         .i2c_mask = 0x03,
193 };
194
195 static const struct ddb_info ddb_cis = {
196         .type     = DDB_OCTOPUS_CI,
197         .name     = "Digital Devices Octopus CI single",
198         .regmap   = &octopus_map,
199         .port_num = 3,
200         .i2c_mask = 0x03,
201 };
202
203 static const struct ddb_info ddb_ci_s2_pro = {
204         .type     = DDB_OCTOPUS_CI,
205         .name     = "Digital Devices Octopus CI S2 Pro",
206         .regmap   = &octopus_map,
207         .port_num = 4,
208         .i2c_mask = 0x01,
209         .board_control   = 2,
210         .board_control_2 = 4,
211 };
212
213 static const struct ddb_info ddb_ci_s2_pro_a = {
214         .type     = DDB_OCTOPUS_CI,
215         .name     = "Digital Devices Octopus CI S2 Pro Advanced",
216         .regmap   = &octopus_map,
217         .port_num = 4,
218         .i2c_mask = 0x01,
219         .board_control   = 2,
220         .board_control_2 = 4,
221 };
222
223 static const struct ddb_info ddb_dvbct = {
224         .type     = DDB_OCTOPUS,
225         .name     = "Digital Devices DVBCT V6.1 DVB adapter",
226         .regmap   = &octopus_map,
227         .port_num = 3,
228         .i2c_mask = 0x07,
229 };
230
231 /****************************************************************************/
232
233 static const struct ddb_info ddb_ct2_8 = {
234         .type     = DDB_OCTOPUS_MAX_CT,
235         .name     = "Digital Devices MAX A8 CT2",
236         .regmap   = &octopus_map,
237         .port_num = 4,
238         .i2c_mask = 0x0f,
239         .board_control   = 0x0ff,
240         .board_control_2 = 0xf00,
241         .ts_quirks = TS_QUIRK_SERIAL,
242         .tempmon_irq = 24,
243 };
244
245 static const struct ddb_info ddb_c2t2_8 = {
246         .type     = DDB_OCTOPUS_MAX_CT,
247         .name     = "Digital Devices MAX A8 C2T2",
248         .regmap   = &octopus_map,
249         .port_num = 4,
250         .i2c_mask = 0x0f,
251         .board_control   = 0x0ff,
252         .board_control_2 = 0xf00,
253         .ts_quirks = TS_QUIRK_SERIAL,
254         .tempmon_irq = 24,
255 };
256
257 static const struct ddb_info ddb_isdbt_8 = {
258         .type     = DDB_OCTOPUS_MAX_CT,
259         .name     = "Digital Devices MAX A8 ISDBT",
260         .regmap   = &octopus_map,
261         .port_num = 4,
262         .i2c_mask = 0x0f,
263         .board_control   = 0x0ff,
264         .board_control_2 = 0xf00,
265         .ts_quirks = TS_QUIRK_SERIAL,
266         .tempmon_irq = 24,
267 };
268
269 static const struct ddb_info ddb_c2t2i_v0_8 = {
270         .type     = DDB_OCTOPUS_MAX_CT,
271         .name     = "Digital Devices MAX A8 C2T2I V0",
272         .regmap   = &octopus_map,
273         .port_num = 4,
274         .i2c_mask = 0x0f,
275         .board_control   = 0x0ff,
276         .board_control_2 = 0xf00,
277         .ts_quirks = TS_QUIRK_SERIAL | TS_QUIRK_ALT_OSC,
278         .tempmon_irq = 24,
279 };
280
281 static const struct ddb_info ddb_c2t2i_8 = {
282         .type     = DDB_OCTOPUS_MAX_CT,
283         .name     = "Digital Devices MAX A8 C2T2I",
284         .regmap   = &octopus_map,
285         .port_num = 4,
286         .i2c_mask = 0x0f,
287         .board_control   = 0x0ff,
288         .board_control_2 = 0xf00,
289         .ts_quirks = TS_QUIRK_SERIAL,
290         .tempmon_irq = 24,
291 };
292
293 /****************************************************************************/
294
295 static const struct ddb_info ddb_s2_48 = {
296         .type     = DDB_OCTOPUS_MAX,
297         .name     = "Digital Devices MAX S8 4/8",
298         .regmap   = &octopus_map,
299         .port_num = 4,
300         .i2c_mask = 0x01,
301         .board_control = 1,
302         .tempmon_irq = 24,
303 };
304
305 static const struct ddb_info ddb_s2x_48 = {
306         .type     = DDB_OCTOPUS_MCI,
307         .name     = "Digital Devices MAX SX8",
308         .regmap   = &octopus_map,
309         .port_num = 4,
310         .i2c_mask = 0x00,
311         .tempmon_irq = 24,
312         .mci_ports = 4,
313         .mci_type = 0,
314 };
315
316 /****************************************************************************/
317 /****************************************************************************/
318 /****************************************************************************/
319
320 #define DDB_DEVID(_device, _subdevice, _info) { \
321         .vendor = DDVID, \
322         .device = _device, \
323         .subvendor = DDVID, \
324         .subdevice = _subdevice, \
325         .info = &_info }
326
327 static const struct ddb_device_id ddb_device_ids[] = {
328         /* PCIe devices */
329         DDB_DEVID(0x0002, 0x0001, ddb_octopus),
330         DDB_DEVID(0x0003, 0x0001, ddb_octopus),
331         DDB_DEVID(0x0005, 0x0004, ddb_octopusv3),
332         DDB_DEVID(0x0003, 0x0002, ddb_octopus_le),
333         DDB_DEVID(0x0003, 0x0003, ddb_octopus_oem),
334         DDB_DEVID(0x0003, 0x0010, ddb_octopus_mini),
335         DDB_DEVID(0x0005, 0x0011, ddb_octopus_mini),
336         DDB_DEVID(0x0003, 0x0020, ddb_v6),
337         DDB_DEVID(0x0003, 0x0021, ddb_v6_5),
338         DDB_DEVID(0x0006, 0x0022, ddb_v7),
339         DDB_DEVID(0x0006, 0x0024, ddb_v7a),
340         DDB_DEVID(0x0003, 0x0030, ddb_dvbct),
341         DDB_DEVID(0x0003, 0xdb03, ddb_satixs2v3),
342         DDB_DEVID(0x0006, 0x0031, ddb_ctv7),
343         DDB_DEVID(0x0006, 0x0032, ddb_ctv7),
344         DDB_DEVID(0x0006, 0x0033, ddb_ctv7),
345         DDB_DEVID(0x0007, 0x0023, ddb_s2_48),
346         DDB_DEVID(0x0008, 0x0034, ddb_ct2_8),
347         DDB_DEVID(0x0008, 0x0035, ddb_c2t2_8),
348         DDB_DEVID(0x0008, 0x0036, ddb_isdbt_8),
349         DDB_DEVID(0x0008, 0x0037, ddb_c2t2i_v0_8),
350         DDB_DEVID(0x0008, 0x0038, ddb_c2t2i_8),
351         DDB_DEVID(0x0009, 0x0025, ddb_s2x_48),
352         DDB_DEVID(0x0006, 0x0039, ddb_ctv7),
353         DDB_DEVID(0x0011, 0x0040, ddb_ci),
354         DDB_DEVID(0x0011, 0x0041, ddb_cis),
355         DDB_DEVID(0x0012, 0x0042, ddb_ci),
356         DDB_DEVID(0x0013, 0x0043, ddb_ci_s2_pro),
357         DDB_DEVID(0x0013, 0x0044, ddb_ci_s2_pro_a),
358 };
359
360 /****************************************************************************/
361
362 const struct ddb_info *get_ddb_info(u16 vendor, u16 device,
363                                     u16 subvendor, u16 subdevice)
364 {
365         int i;
366
367         for (i = 0; i < ARRAY_SIZE(ddb_device_ids); i++) {
368                 const struct ddb_device_id *id = &ddb_device_ids[i];
369
370                 if (vendor == id->vendor &&
371                     device == id->device &&
372                     subvendor == id->subvendor &&
373                     (subdevice == id->subdevice ||
374                      id->subdevice == 0xffff))
375                         return id->info;
376         }
377
378         return &ddb_none;
379 }