ddbridge-hw.c 9.7 KB

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