ddbridge-max.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ddbridge-max.c: Digital Devices bridge MAX card support
  4. *
  5. * Copyright (C) 2010-2017 Digital Devices GmbH
  6. * Ralph Metzler <[email protected]>
  7. * Marcus Metzler <[email protected]>
  8. */
  9. #include <linux/module.h>
  10. #include <linux/init.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/delay.h>
  13. #include <linux/slab.h>
  14. #include <linux/poll.h>
  15. #include <linux/io.h>
  16. #include <linux/pci.h>
  17. #include <linux/pci_ids.h>
  18. #include <linux/timer.h>
  19. #include <linux/i2c.h>
  20. #include <linux/swab.h>
  21. #include <linux/vmalloc.h>
  22. #include "ddbridge.h"
  23. #include "ddbridge-regs.h"
  24. #include "ddbridge-io.h"
  25. #include "ddbridge-mci.h"
  26. #include "ddbridge-max.h"
  27. #include "mxl5xx.h"
  28. /******************************************************************************/
  29. /* MaxS4/8 related modparams */
  30. static int fmode;
  31. module_param(fmode, int, 0444);
  32. MODULE_PARM_DESC(fmode, "frontend emulation mode");
  33. static int fmode_sat = -1;
  34. module_param(fmode_sat, int, 0444);
  35. MODULE_PARM_DESC(fmode_sat, "set frontend emulation mode sat");
  36. static int old_quattro;
  37. module_param(old_quattro, int, 0444);
  38. MODULE_PARM_DESC(old_quattro, "old quattro LNB input order ");
  39. /******************************************************************************/
  40. static int lnb_command(struct ddb *dev, u32 link, u32 lnb, u32 cmd)
  41. {
  42. u32 c, v = 0, tag = DDB_LINK_TAG(link);
  43. v = LNB_TONE & (dev->link[link].lnb.tone << (15 - lnb));
  44. ddbwritel(dev, cmd | v, tag | LNB_CONTROL(lnb));
  45. for (c = 0; c < 10; c++) {
  46. v = ddbreadl(dev, tag | LNB_CONTROL(lnb));
  47. if ((v & LNB_BUSY) == 0)
  48. break;
  49. msleep(20);
  50. }
  51. if (c == 10)
  52. dev_info(dev->dev, "%s lnb = %08x cmd = %08x\n",
  53. __func__, lnb, cmd);
  54. return 0;
  55. }
  56. static int max_send_master_cmd(struct dvb_frontend *fe,
  57. struct dvb_diseqc_master_cmd *cmd)
  58. {
  59. struct ddb_input *input = fe->sec_priv;
  60. struct ddb_port *port = input->port;
  61. struct ddb *dev = port->dev;
  62. struct ddb_dvb *dvb = &port->dvb[input->nr & 1];
  63. u32 tag = DDB_LINK_TAG(port->lnr);
  64. int i;
  65. u32 fmode = dev->link[port->lnr].lnb.fmode;
  66. if (fmode == 2 || fmode == 1)
  67. return 0;
  68. if (dvb->diseqc_send_master_cmd)
  69. dvb->diseqc_send_master_cmd(fe, cmd);
  70. mutex_lock(&dev->link[port->lnr].lnb.lock);
  71. ddbwritel(dev, 0, tag | LNB_BUF_LEVEL(dvb->input));
  72. for (i = 0; i < cmd->msg_len; i++)
  73. ddbwritel(dev, cmd->msg[i], tag | LNB_BUF_WRITE(dvb->input));
  74. lnb_command(dev, port->lnr, dvb->input, LNB_CMD_DISEQC);
  75. mutex_unlock(&dev->link[port->lnr].lnb.lock);
  76. return 0;
  77. }
  78. static int lnb_send_diseqc(struct ddb *dev, u32 link, u32 input,
  79. struct dvb_diseqc_master_cmd *cmd)
  80. {
  81. u32 tag = DDB_LINK_TAG(link);
  82. int i;
  83. ddbwritel(dev, 0, tag | LNB_BUF_LEVEL(input));
  84. for (i = 0; i < cmd->msg_len; i++)
  85. ddbwritel(dev, cmd->msg[i], tag | LNB_BUF_WRITE(input));
  86. lnb_command(dev, link, input, LNB_CMD_DISEQC);
  87. return 0;
  88. }
  89. static int lnb_set_sat(struct ddb *dev, u32 link, u32 input, u32 sat, u32 band,
  90. u32 hor)
  91. {
  92. struct dvb_diseqc_master_cmd cmd = {
  93. .msg = {0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00},
  94. .msg_len = 4
  95. };
  96. cmd.msg[3] = 0xf0 | (((sat << 2) & 0x0c) | (band ? 1 : 0) |
  97. (hor ? 2 : 0));
  98. return lnb_send_diseqc(dev, link, input, &cmd);
  99. }
  100. static int lnb_set_tone(struct ddb *dev, u32 link, u32 input,
  101. enum fe_sec_tone_mode tone)
  102. {
  103. int s = 0;
  104. u32 mask = (1ULL << input);
  105. switch (tone) {
  106. case SEC_TONE_OFF:
  107. if (!(dev->link[link].lnb.tone & mask))
  108. return 0;
  109. dev->link[link].lnb.tone &= ~(1ULL << input);
  110. break;
  111. case SEC_TONE_ON:
  112. if (dev->link[link].lnb.tone & mask)
  113. return 0;
  114. dev->link[link].lnb.tone |= (1ULL << input);
  115. break;
  116. default:
  117. s = -EINVAL;
  118. break;
  119. }
  120. if (!s)
  121. s = lnb_command(dev, link, input, LNB_CMD_NOP);
  122. return s;
  123. }
  124. static int lnb_set_voltage(struct ddb *dev, u32 link, u32 input,
  125. enum fe_sec_voltage voltage)
  126. {
  127. int s = 0;
  128. if (dev->link[link].lnb.oldvoltage[input] == voltage)
  129. return 0;
  130. switch (voltage) {
  131. case SEC_VOLTAGE_OFF:
  132. if (dev->link[link].lnb.voltage[input])
  133. return 0;
  134. lnb_command(dev, link, input, LNB_CMD_OFF);
  135. break;
  136. case SEC_VOLTAGE_13:
  137. lnb_command(dev, link, input, LNB_CMD_LOW);
  138. break;
  139. case SEC_VOLTAGE_18:
  140. lnb_command(dev, link, input, LNB_CMD_HIGH);
  141. break;
  142. default:
  143. s = -EINVAL;
  144. break;
  145. }
  146. dev->link[link].lnb.oldvoltage[input] = voltage;
  147. return s;
  148. }
  149. static int max_set_input_unlocked(struct dvb_frontend *fe, int in)
  150. {
  151. struct ddb_input *input = fe->sec_priv;
  152. struct ddb_port *port = input->port;
  153. struct ddb *dev = port->dev;
  154. struct ddb_dvb *dvb = &port->dvb[input->nr & 1];
  155. int res = 0;
  156. if (in > 3)
  157. return -EINVAL;
  158. if (dvb->input != in) {
  159. u32 bit = (1ULL << input->nr);
  160. u32 obit =
  161. dev->link[port->lnr].lnb.voltage[dvb->input & 3] & bit;
  162. dev->link[port->lnr].lnb.voltage[dvb->input & 3] &= ~bit;
  163. dvb->input = in;
  164. dev->link[port->lnr].lnb.voltage[dvb->input & 3] |= obit;
  165. }
  166. res = dvb->set_input(fe, in);
  167. return res;
  168. }
  169. static int max_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
  170. {
  171. struct ddb_input *input = fe->sec_priv;
  172. struct ddb_port *port = input->port;
  173. struct ddb *dev = port->dev;
  174. struct ddb_dvb *dvb = &port->dvb[input->nr & 1];
  175. int tuner = 0;
  176. int res = 0;
  177. u32 fmode = dev->link[port->lnr].lnb.fmode;
  178. mutex_lock(&dev->link[port->lnr].lnb.lock);
  179. dvb->tone = tone;
  180. switch (fmode) {
  181. default:
  182. case 0:
  183. case 3:
  184. res = lnb_set_tone(dev, port->lnr, dvb->input, tone);
  185. break;
  186. case 1:
  187. case 2:
  188. if (old_quattro) {
  189. if (dvb->tone == SEC_TONE_ON)
  190. tuner |= 2;
  191. if (dvb->voltage == SEC_VOLTAGE_18)
  192. tuner |= 1;
  193. } else {
  194. if (dvb->tone == SEC_TONE_ON)
  195. tuner |= 1;
  196. if (dvb->voltage == SEC_VOLTAGE_18)
  197. tuner |= 2;
  198. }
  199. res = max_set_input_unlocked(fe, tuner);
  200. break;
  201. }
  202. mutex_unlock(&dev->link[port->lnr].lnb.lock);
  203. return res;
  204. }
  205. static int max_set_voltage(struct dvb_frontend *fe, enum fe_sec_voltage voltage)
  206. {
  207. struct ddb_input *input = fe->sec_priv;
  208. struct ddb_port *port = input->port;
  209. struct ddb *dev = port->dev;
  210. struct ddb_dvb *dvb = &port->dvb[input->nr & 1];
  211. int tuner = 0;
  212. u32 nv, ov = dev->link[port->lnr].lnb.voltages;
  213. int res = 0;
  214. u32 fmode = dev->link[port->lnr].lnb.fmode;
  215. mutex_lock(&dev->link[port->lnr].lnb.lock);
  216. dvb->voltage = voltage;
  217. switch (fmode) {
  218. case 3:
  219. default:
  220. case 0:
  221. if (fmode == 3)
  222. max_set_input_unlocked(fe, 0);
  223. if (voltage == SEC_VOLTAGE_OFF)
  224. dev->link[port->lnr].lnb.voltage[dvb->input] &=
  225. ~(1ULL << input->nr);
  226. else
  227. dev->link[port->lnr].lnb.voltage[dvb->input] |=
  228. (1ULL << input->nr);
  229. res = lnb_set_voltage(dev, port->lnr, dvb->input, voltage);
  230. break;
  231. case 1:
  232. case 2:
  233. if (voltage == SEC_VOLTAGE_OFF)
  234. dev->link[port->lnr].lnb.voltages &=
  235. ~(1ULL << input->nr);
  236. else
  237. dev->link[port->lnr].lnb.voltages |=
  238. (1ULL << input->nr);
  239. nv = dev->link[port->lnr].lnb.voltages;
  240. if (old_quattro) {
  241. if (dvb->tone == SEC_TONE_ON)
  242. tuner |= 2;
  243. if (dvb->voltage == SEC_VOLTAGE_18)
  244. tuner |= 1;
  245. } else {
  246. if (dvb->tone == SEC_TONE_ON)
  247. tuner |= 1;
  248. if (dvb->voltage == SEC_VOLTAGE_18)
  249. tuner |= 2;
  250. }
  251. res = max_set_input_unlocked(fe, tuner);
  252. if (nv != ov) {
  253. if (nv) {
  254. lnb_set_voltage(
  255. dev, port->lnr,
  256. 0, SEC_VOLTAGE_13);
  257. if (fmode == 1) {
  258. lnb_set_voltage(
  259. dev, port->lnr,
  260. 0, SEC_VOLTAGE_13);
  261. if (old_quattro) {
  262. lnb_set_voltage(
  263. dev, port->lnr,
  264. 1, SEC_VOLTAGE_18);
  265. lnb_set_voltage(
  266. dev, port->lnr,
  267. 2, SEC_VOLTAGE_13);
  268. } else {
  269. lnb_set_voltage(
  270. dev, port->lnr,
  271. 1, SEC_VOLTAGE_13);
  272. lnb_set_voltage(
  273. dev, port->lnr,
  274. 2, SEC_VOLTAGE_18);
  275. }
  276. lnb_set_voltage(
  277. dev, port->lnr,
  278. 3, SEC_VOLTAGE_18);
  279. }
  280. } else {
  281. lnb_set_voltage(
  282. dev, port->lnr,
  283. 0, SEC_VOLTAGE_OFF);
  284. if (fmode == 1) {
  285. lnb_set_voltage(
  286. dev, port->lnr,
  287. 1, SEC_VOLTAGE_OFF);
  288. lnb_set_voltage(
  289. dev, port->lnr,
  290. 2, SEC_VOLTAGE_OFF);
  291. lnb_set_voltage(
  292. dev, port->lnr,
  293. 3, SEC_VOLTAGE_OFF);
  294. }
  295. }
  296. }
  297. break;
  298. }
  299. mutex_unlock(&dev->link[port->lnr].lnb.lock);
  300. return res;
  301. }
  302. static int max_enable_high_lnb_voltage(struct dvb_frontend *fe, long arg)
  303. {
  304. return 0;
  305. }
  306. static int max_send_burst(struct dvb_frontend *fe, enum fe_sec_mini_cmd burst)
  307. {
  308. return 0;
  309. }
  310. static int mxl_fw_read(void *priv, u8 *buf, u32 len)
  311. {
  312. struct ddb_link *link = priv;
  313. struct ddb *dev = link->dev;
  314. dev_info(dev->dev, "Read mxl_fw from link %u\n", link->nr);
  315. return ddbridge_flashread(dev, link->nr, buf, 0xc0000, len);
  316. }
  317. int ddb_lnb_init_fmode(struct ddb *dev, struct ddb_link *link, u32 fm)
  318. {
  319. u32 l = link->nr;
  320. if (link->lnb.fmode == fm)
  321. return 0;
  322. dev_info(dev->dev, "Set fmode link %u = %u\n", l, fm);
  323. mutex_lock(&link->lnb.lock);
  324. if (fm == 2 || fm == 1) {
  325. if (fmode_sat >= 0) {
  326. lnb_set_sat(dev, l, 0, fmode_sat, 0, 0);
  327. if (old_quattro) {
  328. lnb_set_sat(dev, l, 1, fmode_sat, 0, 1);
  329. lnb_set_sat(dev, l, 2, fmode_sat, 1, 0);
  330. } else {
  331. lnb_set_sat(dev, l, 1, fmode_sat, 1, 0);
  332. lnb_set_sat(dev, l, 2, fmode_sat, 0, 1);
  333. }
  334. lnb_set_sat(dev, l, 3, fmode_sat, 1, 1);
  335. }
  336. lnb_set_tone(dev, l, 0, SEC_TONE_OFF);
  337. if (old_quattro) {
  338. lnb_set_tone(dev, l, 1, SEC_TONE_OFF);
  339. lnb_set_tone(dev, l, 2, SEC_TONE_ON);
  340. } else {
  341. lnb_set_tone(dev, l, 1, SEC_TONE_ON);
  342. lnb_set_tone(dev, l, 2, SEC_TONE_OFF);
  343. }
  344. lnb_set_tone(dev, l, 3, SEC_TONE_ON);
  345. }
  346. link->lnb.fmode = fm;
  347. mutex_unlock(&link->lnb.lock);
  348. return 0;
  349. }
  350. static struct mxl5xx_cfg mxl5xx = {
  351. .adr = 0x60,
  352. .type = 0x01,
  353. .clk = 27000000,
  354. .ts_clk = 139,
  355. .cap = 12,
  356. .fw_read = mxl_fw_read,
  357. };
  358. int ddb_fe_attach_mxl5xx(struct ddb_input *input)
  359. {
  360. struct ddb *dev = input->port->dev;
  361. struct i2c_adapter *i2c = &input->port->i2c->adap;
  362. struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1];
  363. struct ddb_port *port = input->port;
  364. struct ddb_link *link = &dev->link[port->lnr];
  365. struct mxl5xx_cfg cfg;
  366. int demod, tuner;
  367. cfg = mxl5xx;
  368. cfg.fw_priv = link;
  369. dvb->set_input = NULL;
  370. demod = input->nr;
  371. tuner = demod & 3;
  372. if (fmode == 3)
  373. tuner = 0;
  374. dvb->fe = dvb_attach(mxl5xx_attach, i2c, &cfg,
  375. demod, tuner, &dvb->set_input);
  376. if (!dvb->fe) {
  377. dev_err(dev->dev, "No MXL5XX found!\n");
  378. return -ENODEV;
  379. }
  380. if (!dvb->set_input) {
  381. dev_err(dev->dev, "No mxl5xx_set_input function pointer!\n");
  382. return -ENODEV;
  383. }
  384. if (input->nr < 4) {
  385. lnb_command(dev, port->lnr, input->nr, LNB_CMD_INIT);
  386. lnb_set_voltage(dev, port->lnr, input->nr, SEC_VOLTAGE_OFF);
  387. }
  388. ddb_lnb_init_fmode(dev, link, fmode);
  389. dvb->fe->ops.set_voltage = max_set_voltage;
  390. dvb->fe->ops.enable_high_lnb_voltage = max_enable_high_lnb_voltage;
  391. dvb->fe->ops.set_tone = max_set_tone;
  392. dvb->diseqc_send_master_cmd = dvb->fe->ops.diseqc_send_master_cmd;
  393. dvb->fe->ops.diseqc_send_master_cmd = max_send_master_cmd;
  394. dvb->fe->ops.diseqc_send_burst = max_send_burst;
  395. dvb->fe->sec_priv = input;
  396. dvb->input = tuner;
  397. return 0;
  398. }
  399. /******************************************************************************/
  400. /* MAX MCI related functions */
  401. int ddb_fe_attach_mci(struct ddb_input *input, u32 type)
  402. {
  403. struct ddb *dev = input->port->dev;
  404. struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1];
  405. struct ddb_port *port = input->port;
  406. struct ddb_link *link = &dev->link[port->lnr];
  407. int demod, tuner;
  408. struct mci_cfg cfg;
  409. demod = input->nr;
  410. tuner = demod & 3;
  411. switch (type) {
  412. case DDB_TUNER_MCI_SX8:
  413. cfg = ddb_max_sx8_cfg;
  414. if (fmode == 3)
  415. tuner = 0;
  416. break;
  417. default:
  418. return -EINVAL;
  419. }
  420. dvb->fe = ddb_mci_attach(input, &cfg, demod, &dvb->set_input);
  421. if (!dvb->fe) {
  422. dev_err(dev->dev, "No MCI card found!\n");
  423. return -ENODEV;
  424. }
  425. if (!dvb->set_input) {
  426. dev_err(dev->dev, "No MCI set_input function pointer!\n");
  427. return -ENODEV;
  428. }
  429. if (input->nr < 4) {
  430. lnb_command(dev, port->lnr, input->nr, LNB_CMD_INIT);
  431. lnb_set_voltage(dev, port->lnr, input->nr, SEC_VOLTAGE_OFF);
  432. }
  433. ddb_lnb_init_fmode(dev, link, fmode);
  434. dvb->fe->ops.set_voltage = max_set_voltage;
  435. dvb->fe->ops.enable_high_lnb_voltage = max_enable_high_lnb_voltage;
  436. dvb->fe->ops.set_tone = max_set_tone;
  437. dvb->diseqc_send_master_cmd = dvb->fe->ops.diseqc_send_master_cmd;
  438. dvb->fe->ops.diseqc_send_master_cmd = max_send_master_cmd;
  439. dvb->fe->ops.diseqc_send_burst = max_send_burst;
  440. dvb->fe->sec_priv = input;
  441. dvb->input = tuner;
  442. return 0;
  443. }