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