cx24117.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663
  1. /*
  2. Conexant cx24117/cx24132 - Dual DVBS/S2 Satellite demod/tuner driver
  3. Copyright (C) 2013 Luis Alves <ljalvs@gmail.com>
  4. July, 6th 2013
  5. First release based on cx24116 driver by:
  6. Steven Toth and Georg Acher, Darron Broad, Igor Liplianin
  7. Cards currently supported:
  8. TBS6980 - Dual DVBS/S2 PCIe card
  9. TBS6981 - Dual DVBS/S2 PCIe card
  10. This program is free software; you can redistribute it and/or modify
  11. it under the terms of the GNU General Public License as published by
  12. the Free Software Foundation; either version 2 of the License, or
  13. (at your option) any later version.
  14. This program is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. GNU General Public License for more details.
  18. You should have received a copy of the GNU General Public License
  19. along with this program; if not, write to the Free Software
  20. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22. #include <linux/slab.h>
  23. #include <linux/kernel.h>
  24. #include <linux/module.h>
  25. #include <linux/moduleparam.h>
  26. #include <linux/init.h>
  27. #include <linux/firmware.h>
  28. #include "tuner-i2c.h"
  29. #include "dvb_frontend.h"
  30. #include "cx24117.h"
  31. #define CX24117_DEFAULT_FIRMWARE "dvb-fe-cx24117.fw"
  32. #define CX24117_SEARCH_RANGE_KHZ 5000
  33. /* known registers */
  34. #define CX24117_REG_COMMAND (0x00) /* command buffer */
  35. #define CX24117_REG_EXECUTE (0x1f) /* execute command */
  36. #define CX24117_REG_FREQ3_0 (0x34) /* frequency */
  37. #define CX24117_REG_FREQ2_0 (0x35)
  38. #define CX24117_REG_FREQ1_0 (0x36)
  39. #define CX24117_REG_STATE0 (0x39)
  40. #define CX24117_REG_SSTATUS0 (0x3a) /* demod0 signal high / status */
  41. #define CX24117_REG_SIGNAL0 (0x3b)
  42. #define CX24117_REG_FREQ5_0 (0x3c) /* +-freq */
  43. #define CX24117_REG_FREQ6_0 (0x3d)
  44. #define CX24117_REG_SRATE2_0 (0x3e) /* +- 1000 * srate */
  45. #define CX24117_REG_SRATE1_0 (0x3f)
  46. #define CX24117_REG_QUALITY2_0 (0x40)
  47. #define CX24117_REG_QUALITY1_0 (0x41)
  48. #define CX24117_REG_BER4_0 (0x47)
  49. #define CX24117_REG_BER3_0 (0x48)
  50. #define CX24117_REG_BER2_0 (0x49)
  51. #define CX24117_REG_BER1_0 (0x4a)
  52. #define CX24117_REG_DVBS_UCB2_0 (0x4b)
  53. #define CX24117_REG_DVBS_UCB1_0 (0x4c)
  54. #define CX24117_REG_DVBS2_UCB2_0 (0x50)
  55. #define CX24117_REG_DVBS2_UCB1_0 (0x51)
  56. #define CX24117_REG_QSTATUS0 (0x93)
  57. #define CX24117_REG_CLKDIV0 (0xe6)
  58. #define CX24117_REG_RATEDIV0 (0xf0)
  59. #define CX24117_REG_FREQ3_1 (0x55) /* frequency */
  60. #define CX24117_REG_FREQ2_1 (0x56)
  61. #define CX24117_REG_FREQ1_1 (0x57)
  62. #define CX24117_REG_STATE1 (0x5a)
  63. #define CX24117_REG_SSTATUS1 (0x5b) /* demod1 signal high / status */
  64. #define CX24117_REG_SIGNAL1 (0x5c)
  65. #define CX24117_REG_FREQ5_1 (0x5d) /* +- freq */
  66. #define CX24117_REG_FREQ4_1 (0x5e)
  67. #define CX24117_REG_SRATE2_1 (0x5f)
  68. #define CX24117_REG_SRATE1_1 (0x60)
  69. #define CX24117_REG_QUALITY2_1 (0x61)
  70. #define CX24117_REG_QUALITY1_1 (0x62)
  71. #define CX24117_REG_BER4_1 (0x68)
  72. #define CX24117_REG_BER3_1 (0x69)
  73. #define CX24117_REG_BER2_1 (0x6a)
  74. #define CX24117_REG_BER1_1 (0x6b)
  75. #define CX24117_REG_DVBS_UCB2_1 (0x6c)
  76. #define CX24117_REG_DVBS_UCB1_1 (0x6d)
  77. #define CX24117_REG_DVBS2_UCB2_1 (0x71)
  78. #define CX24117_REG_DVBS2_UCB1_1 (0x72)
  79. #define CX24117_REG_QSTATUS1 (0x9f)
  80. #define CX24117_REG_CLKDIV1 (0xe7)
  81. #define CX24117_REG_RATEDIV1 (0xf1)
  82. /* arg buffer size */
  83. #define CX24117_ARGLEN (0x1e)
  84. /* rolloff */
  85. #define CX24117_ROLLOFF_020 (0x00)
  86. #define CX24117_ROLLOFF_025 (0x01)
  87. #define CX24117_ROLLOFF_035 (0x02)
  88. /* pilot bit */
  89. #define CX24117_PILOT_OFF (0x00)
  90. #define CX24117_PILOT_ON (0x40)
  91. #define CX24117_PILOT_AUTO (0x80)
  92. /* signal status */
  93. #define CX24117_HAS_SIGNAL (0x01)
  94. #define CX24117_HAS_CARRIER (0x02)
  95. #define CX24117_HAS_VITERBI (0x04)
  96. #define CX24117_HAS_SYNCLOCK (0x08)
  97. #define CX24117_STATUS_MASK (0x0f)
  98. #define CX24117_SIGNAL_MASK (0xc0)
  99. /* arg offset for DiSEqC */
  100. #define CX24117_DISEQC_DEMOD (1)
  101. #define CX24117_DISEQC_BURST (2)
  102. #define CX24117_DISEQC_ARG3_2 (3) /* unknown value=2 */
  103. #define CX24117_DISEQC_ARG4_0 (4) /* unknown value=0 */
  104. #define CX24117_DISEQC_ARG5_0 (5) /* unknown value=0 */
  105. #define CX24117_DISEQC_MSGLEN (6)
  106. #define CX24117_DISEQC_MSGOFS (7)
  107. /* DiSEqC burst */
  108. #define CX24117_DISEQC_MINI_A (0)
  109. #define CX24117_DISEQC_MINI_B (1)
  110. #define CX24117_PNE (0) /* 0 disabled / 2 enabled */
  111. #define CX24117_OCC (1) /* 0 disabled / 1 enabled */
  112. enum cmds {
  113. CMD_SET_VCOFREQ = 0x10,
  114. CMD_TUNEREQUEST = 0x11,
  115. CMD_GLOBAL_MPEGCFG = 0x13,
  116. CMD_MPEGCFG = 0x14,
  117. CMD_TUNERINIT = 0x15,
  118. CMD_GET_SRATE = 0x18,
  119. CMD_SET_GOLDCODE = 0x19,
  120. CMD_GET_AGCACC = 0x1a,
  121. CMD_DEMODINIT = 0x1b,
  122. CMD_GETCTLACC = 0x1c,
  123. CMD_LNBCONFIG = 0x20,
  124. CMD_LNBSEND = 0x21,
  125. CMD_LNBDCLEVEL = 0x22,
  126. CMD_LNBPCBCONFIG = 0x23,
  127. CMD_LNBSENDTONEBST = 0x24,
  128. CMD_LNBUPDREPLY = 0x25,
  129. CMD_SET_GPIOMODE = 0x30,
  130. CMD_SET_GPIOEN = 0x31,
  131. CMD_SET_GPIODIR = 0x32,
  132. CMD_SET_GPIOOUT = 0x33,
  133. CMD_ENABLERSCORR = 0x34,
  134. CMD_FWVERSION = 0x35,
  135. CMD_SET_SLEEPMODE = 0x36,
  136. CMD_BERCTRL = 0x3c,
  137. CMD_EVENTCTRL = 0x3d,
  138. };
  139. static LIST_HEAD(hybrid_tuner_instance_list);
  140. static DEFINE_MUTEX(cx24117_list_mutex);
  141. /* The Demod/Tuner can't easily provide these, we cache them */
  142. struct cx24117_tuning {
  143. u32 frequency;
  144. u32 symbol_rate;
  145. fe_spectral_inversion_t inversion;
  146. fe_code_rate_t fec;
  147. fe_delivery_system_t delsys;
  148. fe_modulation_t modulation;
  149. fe_pilot_t pilot;
  150. fe_rolloff_t rolloff;
  151. /* Demod values */
  152. u8 fec_val;
  153. u8 fec_mask;
  154. u8 inversion_val;
  155. u8 pilot_val;
  156. u8 rolloff_val;
  157. };
  158. /* Basic commands that are sent to the firmware */
  159. struct cx24117_cmd {
  160. u8 len;
  161. u8 args[CX24117_ARGLEN];
  162. };
  163. /* common to both fe's */
  164. struct cx24117_priv {
  165. u8 demod_address;
  166. struct i2c_adapter *i2c;
  167. u8 skip_fw_load;
  168. struct mutex fe_lock;
  169. /* Used for sharing this struct between demods */
  170. struct tuner_i2c_props i2c_props;
  171. struct list_head hybrid_tuner_instance_list;
  172. };
  173. /* one per each fe */
  174. struct cx24117_state {
  175. struct cx24117_priv *priv;
  176. struct dvb_frontend frontend;
  177. struct cx24117_tuning dcur;
  178. struct cx24117_tuning dnxt;
  179. struct cx24117_cmd dsec_cmd;
  180. int demod;
  181. };
  182. /* modfec (modulation and FEC) lookup table */
  183. /* Check cx24116.c for a detailed description of each field */
  184. static struct cx24117_modfec {
  185. fe_delivery_system_t delivery_system;
  186. fe_modulation_t modulation;
  187. fe_code_rate_t fec;
  188. u8 mask; /* In DVBS mode this is used to autodetect */
  189. u8 val; /* Passed to the firmware to indicate mode selection */
  190. } cx24117_modfec_modes[] = {
  191. /* QPSK. For unknown rates we set hardware to auto detect 0xfe 0x30 */
  192. /*mod fec mask val */
  193. { SYS_DVBS, QPSK, FEC_NONE, 0xfe, 0x30 },
  194. { SYS_DVBS, QPSK, FEC_1_2, 0x02, 0x2e }, /* 00000010 00101110 */
  195. { SYS_DVBS, QPSK, FEC_2_3, 0x04, 0x2f }, /* 00000100 00101111 */
  196. { SYS_DVBS, QPSK, FEC_3_4, 0x08, 0x30 }, /* 00001000 00110000 */
  197. { SYS_DVBS, QPSK, FEC_4_5, 0xfe, 0x30 }, /* 000?0000 ? */
  198. { SYS_DVBS, QPSK, FEC_5_6, 0x20, 0x31 }, /* 00100000 00110001 */
  199. { SYS_DVBS, QPSK, FEC_6_7, 0xfe, 0x30 }, /* 0?000000 ? */
  200. { SYS_DVBS, QPSK, FEC_7_8, 0x80, 0x32 }, /* 10000000 00110010 */
  201. { SYS_DVBS, QPSK, FEC_8_9, 0xfe, 0x30 }, /* 0000000? ? */
  202. { SYS_DVBS, QPSK, FEC_AUTO, 0xfe, 0x30 },
  203. /* NBC-QPSK */
  204. { SYS_DVBS2, QPSK, FEC_NONE, 0x00, 0x00 },
  205. { SYS_DVBS2, QPSK, FEC_1_2, 0x00, 0x04 },
  206. { SYS_DVBS2, QPSK, FEC_3_5, 0x00, 0x05 },
  207. { SYS_DVBS2, QPSK, FEC_2_3, 0x00, 0x06 },
  208. { SYS_DVBS2, QPSK, FEC_3_4, 0x00, 0x07 },
  209. { SYS_DVBS2, QPSK, FEC_4_5, 0x00, 0x08 },
  210. { SYS_DVBS2, QPSK, FEC_5_6, 0x00, 0x09 },
  211. { SYS_DVBS2, QPSK, FEC_8_9, 0x00, 0x0a },
  212. { SYS_DVBS2, QPSK, FEC_9_10, 0x00, 0x0b },
  213. { SYS_DVBS2, QPSK, FEC_AUTO, 0x00, 0x00 },
  214. /* 8PSK */
  215. { SYS_DVBS2, PSK_8, FEC_NONE, 0x00, 0x00 },
  216. { SYS_DVBS2, PSK_8, FEC_3_5, 0x00, 0x0c },
  217. { SYS_DVBS2, PSK_8, FEC_2_3, 0x00, 0x0d },
  218. { SYS_DVBS2, PSK_8, FEC_3_4, 0x00, 0x0e },
  219. { SYS_DVBS2, PSK_8, FEC_5_6, 0x00, 0x0f },
  220. { SYS_DVBS2, PSK_8, FEC_8_9, 0x00, 0x10 },
  221. { SYS_DVBS2, PSK_8, FEC_9_10, 0x00, 0x11 },
  222. { SYS_DVBS2, PSK_8, FEC_AUTO, 0x00, 0x00 },
  223. /*
  224. * 'val' can be found in the FECSTATUS register when tuning.
  225. * FECSTATUS will give the actual FEC in use if tuning was successful.
  226. */
  227. };
  228. static int cx24117_writereg(struct cx24117_state *state, u8 reg, u8 data)
  229. {
  230. u8 buf[] = { reg, data };
  231. struct i2c_msg msg = { .addr = state->priv->demod_address,
  232. .flags = 0, .buf = buf, .len = 2 };
  233. int ret;
  234. dev_dbg(&state->priv->i2c->dev,
  235. "%s() demod%d i2c wr @0x%02x=0x%02x\n",
  236. __func__, state->demod, reg, data);
  237. ret = i2c_transfer(state->priv->i2c, &msg, 1);
  238. if (ret < 0) {
  239. dev_warn(&state->priv->i2c->dev,
  240. "%s: demod%d i2c wr err(%i) @0x%02x=0x%02x\n",
  241. KBUILD_MODNAME, state->demod, ret, reg, data);
  242. return ret;
  243. }
  244. return 0;
  245. }
  246. static int cx24117_writecmd(struct cx24117_state *state,
  247. struct cx24117_cmd *cmd)
  248. {
  249. struct i2c_msg msg;
  250. u8 buf[CX24117_ARGLEN+1];
  251. int ret;
  252. dev_dbg(&state->priv->i2c->dev,
  253. "%s() demod%d i2c wr cmd len=%d\n",
  254. __func__, state->demod, cmd->len);
  255. buf[0] = CX24117_REG_COMMAND;
  256. memcpy(&buf[1], cmd->args, cmd->len);
  257. msg.addr = state->priv->demod_address;
  258. msg.flags = 0;
  259. msg.len = cmd->len+1;
  260. msg.buf = buf;
  261. ret = i2c_transfer(state->priv->i2c, &msg, 1);
  262. if (ret < 0) {
  263. dev_warn(&state->priv->i2c->dev,
  264. "%s: demod%d i2c wr cmd err(%i) len=%d\n",
  265. KBUILD_MODNAME, state->demod, ret, cmd->len);
  266. return ret;
  267. }
  268. return 0;
  269. }
  270. static int cx24117_readreg(struct cx24117_state *state, u8 reg)
  271. {
  272. int ret;
  273. u8 recv = 0;
  274. struct i2c_msg msg[] = {
  275. { .addr = state->priv->demod_address, .flags = 0,
  276. .buf = &reg, .len = 1 },
  277. { .addr = state->priv->demod_address, .flags = I2C_M_RD,
  278. .buf = &recv, .len = 1 }
  279. };
  280. ret = i2c_transfer(state->priv->i2c, msg, 2);
  281. if (ret < 0) {
  282. dev_warn(&state->priv->i2c->dev,
  283. "%s: demod%d i2c rd err(%d) @0x%x\n",
  284. KBUILD_MODNAME, state->demod, ret, reg);
  285. return ret;
  286. }
  287. dev_dbg(&state->priv->i2c->dev, "%s() demod%d i2c rd @0x%02x=0x%02x\n",
  288. __func__, state->demod, reg, recv);
  289. return recv;
  290. }
  291. static int cx24117_readregN(struct cx24117_state *state,
  292. u8 reg, u8 *buf, int len)
  293. {
  294. int ret;
  295. struct i2c_msg msg[] = {
  296. { .addr = state->priv->demod_address, .flags = 0,
  297. .buf = &reg, .len = 1 },
  298. { .addr = state->priv->demod_address, .flags = I2C_M_RD,
  299. .buf = buf, .len = len }
  300. };
  301. ret = i2c_transfer(state->priv->i2c, msg, 2);
  302. if (ret < 0) {
  303. dev_warn(&state->priv->i2c->dev,
  304. "%s: demod%d i2c rd err(%d) @0x%x\n",
  305. KBUILD_MODNAME, state->demod, ret, reg);
  306. return ret;
  307. }
  308. return 0;
  309. }
  310. static int cx24117_set_inversion(struct cx24117_state *state,
  311. fe_spectral_inversion_t inversion)
  312. {
  313. dev_dbg(&state->priv->i2c->dev, "%s(%d) demod%d\n",
  314. __func__, inversion, state->demod);
  315. switch (inversion) {
  316. case INVERSION_OFF:
  317. state->dnxt.inversion_val = 0x00;
  318. break;
  319. case INVERSION_ON:
  320. state->dnxt.inversion_val = 0x04;
  321. break;
  322. case INVERSION_AUTO:
  323. state->dnxt.inversion_val = 0x0C;
  324. break;
  325. default:
  326. return -EINVAL;
  327. }
  328. state->dnxt.inversion = inversion;
  329. return 0;
  330. }
  331. static int cx24117_lookup_fecmod(struct cx24117_state *state,
  332. fe_delivery_system_t d, fe_modulation_t m, fe_code_rate_t f)
  333. {
  334. int i, ret = -EINVAL;
  335. dev_dbg(&state->priv->i2c->dev,
  336. "%s(demod(0x%02x,0x%02x) demod%d\n",
  337. __func__, m, f, state->demod);
  338. for (i = 0; i < ARRAY_SIZE(cx24117_modfec_modes); i++) {
  339. if ((d == cx24117_modfec_modes[i].delivery_system) &&
  340. (m == cx24117_modfec_modes[i].modulation) &&
  341. (f == cx24117_modfec_modes[i].fec)) {
  342. ret = i;
  343. break;
  344. }
  345. }
  346. return ret;
  347. }
  348. static int cx24117_set_fec(struct cx24117_state *state,
  349. fe_delivery_system_t delsys, fe_modulation_t mod, fe_code_rate_t fec)
  350. {
  351. int ret;
  352. dev_dbg(&state->priv->i2c->dev,
  353. "%s(0x%02x,0x%02x) demod%d\n",
  354. __func__, mod, fec, state->demod);
  355. ret = cx24117_lookup_fecmod(state, delsys, mod, fec);
  356. if (ret < 0)
  357. return ret;
  358. state->dnxt.fec = fec;
  359. state->dnxt.fec_val = cx24117_modfec_modes[ret].val;
  360. state->dnxt.fec_mask = cx24117_modfec_modes[ret].mask;
  361. dev_dbg(&state->priv->i2c->dev,
  362. "%s() demod%d mask/val = 0x%02x/0x%02x\n", __func__,
  363. state->demod, state->dnxt.fec_mask, state->dnxt.fec_val);
  364. return 0;
  365. }
  366. static int cx24117_set_symbolrate(struct cx24117_state *state, u32 rate)
  367. {
  368. dev_dbg(&state->priv->i2c->dev, "%s(%d) demod%d\n",
  369. __func__, rate, state->demod);
  370. state->dnxt.symbol_rate = rate;
  371. dev_dbg(&state->priv->i2c->dev,
  372. "%s() demod%d symbol_rate = %d\n",
  373. __func__, state->demod, rate);
  374. return 0;
  375. }
  376. static int cx24117_load_firmware(struct dvb_frontend *fe,
  377. const struct firmware *fw);
  378. static int cx24117_firmware_ondemand(struct dvb_frontend *fe)
  379. {
  380. struct cx24117_state *state = fe->demodulator_priv;
  381. const struct firmware *fw;
  382. int ret = 0;
  383. dev_dbg(&state->priv->i2c->dev, "%s() demod%d skip_fw_load=%d\n",
  384. __func__, state->demod, state->priv->skip_fw_load);
  385. if (state->priv->skip_fw_load)
  386. return 0;
  387. /* check if firmware if already running */
  388. if (cx24117_readreg(state, 0xeb) != 0xa) {
  389. /* Load firmware */
  390. /* request the firmware, this will block until loaded */
  391. dev_dbg(&state->priv->i2c->dev,
  392. "%s: Waiting for firmware upload (%s)...\n",
  393. __func__, CX24117_DEFAULT_FIRMWARE);
  394. ret = request_firmware(&fw, CX24117_DEFAULT_FIRMWARE,
  395. state->priv->i2c->dev.parent);
  396. dev_dbg(&state->priv->i2c->dev,
  397. "%s: Waiting for firmware upload(2)...\n", __func__);
  398. if (ret) {
  399. dev_err(&state->priv->i2c->dev,
  400. "%s: No firmware uploaded "
  401. "(timeout or file not found?)\n", __func__);
  402. return ret;
  403. }
  404. /* Make sure we don't recurse back through here
  405. * during loading */
  406. state->priv->skip_fw_load = 1;
  407. ret = cx24117_load_firmware(fe, fw);
  408. if (ret)
  409. dev_err(&state->priv->i2c->dev,
  410. "%s: Writing firmware failed\n", __func__);
  411. release_firmware(fw);
  412. dev_info(&state->priv->i2c->dev,
  413. "%s: Firmware upload %s\n", __func__,
  414. ret == 0 ? "complete" : "failed");
  415. /* Ensure firmware is always loaded if required */
  416. state->priv->skip_fw_load = 0;
  417. }
  418. return ret;
  419. }
  420. /* Take a basic firmware command structure, format it
  421. * and forward it for processing
  422. */
  423. static int cx24117_cmd_execute_nolock(struct dvb_frontend *fe,
  424. struct cx24117_cmd *cmd)
  425. {
  426. struct cx24117_state *state = fe->demodulator_priv;
  427. int i, ret;
  428. dev_dbg(&state->priv->i2c->dev, "%s() demod%d\n",
  429. __func__, state->demod);
  430. /* Load the firmware if required */
  431. ret = cx24117_firmware_ondemand(fe);
  432. if (ret != 0)
  433. return ret;
  434. /* Write the command */
  435. cx24117_writecmd(state, cmd);
  436. /* Start execution and wait for cmd to terminate */
  437. cx24117_writereg(state, CX24117_REG_EXECUTE, 0x01);
  438. i = 0;
  439. while (cx24117_readreg(state, CX24117_REG_EXECUTE)) {
  440. msleep(20);
  441. if (i++ > 40) {
  442. /* Avoid looping forever if the firmware does
  443. not respond */
  444. dev_warn(&state->priv->i2c->dev,
  445. "%s() Firmware not responding\n", __func__);
  446. return -EIO;
  447. }
  448. }
  449. return 0;
  450. }
  451. static int cx24117_cmd_execute(struct dvb_frontend *fe, struct cx24117_cmd *cmd)
  452. {
  453. struct cx24117_state *state = fe->demodulator_priv;
  454. int ret;
  455. mutex_lock(&state->priv->fe_lock);
  456. ret = cx24117_cmd_execute_nolock(fe, cmd);
  457. mutex_unlock(&state->priv->fe_lock);
  458. return ret;
  459. }
  460. static int cx24117_load_firmware(struct dvb_frontend *fe,
  461. const struct firmware *fw)
  462. {
  463. struct cx24117_state *state = fe->demodulator_priv;
  464. struct cx24117_cmd cmd;
  465. int i, ret;
  466. unsigned char vers[4];
  467. struct i2c_msg msg;
  468. u8 *buf;
  469. dev_dbg(&state->priv->i2c->dev,
  470. "%s() demod%d FW is %zu bytes (%02x %02x .. %02x %02x)\n",
  471. __func__, state->demod, fw->size, fw->data[0], fw->data[1],
  472. fw->data[fw->size - 2], fw->data[fw->size - 1]);
  473. cx24117_writereg(state, 0xea, 0x00);
  474. cx24117_writereg(state, 0xea, 0x01);
  475. cx24117_writereg(state, 0xea, 0x00);
  476. cx24117_writereg(state, 0xce, 0x92);
  477. cx24117_writereg(state, 0xfb, 0x00);
  478. cx24117_writereg(state, 0xfc, 0x00);
  479. cx24117_writereg(state, 0xc3, 0x04);
  480. cx24117_writereg(state, 0xc4, 0x04);
  481. cx24117_writereg(state, 0xce, 0x00);
  482. cx24117_writereg(state, 0xcf, 0x00);
  483. cx24117_writereg(state, 0xea, 0x00);
  484. cx24117_writereg(state, 0xeb, 0x0c);
  485. cx24117_writereg(state, 0xec, 0x06);
  486. cx24117_writereg(state, 0xed, 0x05);
  487. cx24117_writereg(state, 0xee, 0x03);
  488. cx24117_writereg(state, 0xef, 0x05);
  489. cx24117_writereg(state, 0xf3, 0x03);
  490. cx24117_writereg(state, 0xf4, 0x44);
  491. cx24117_writereg(state, CX24117_REG_RATEDIV0, 0x04);
  492. cx24117_writereg(state, CX24117_REG_CLKDIV0, 0x02);
  493. cx24117_writereg(state, CX24117_REG_RATEDIV1, 0x04);
  494. cx24117_writereg(state, CX24117_REG_CLKDIV1, 0x02);
  495. cx24117_writereg(state, 0xf2, 0x04);
  496. cx24117_writereg(state, 0xe8, 0x02);
  497. cx24117_writereg(state, 0xea, 0x01);
  498. cx24117_writereg(state, 0xc8, 0x00);
  499. cx24117_writereg(state, 0xc9, 0x00);
  500. cx24117_writereg(state, 0xca, 0x00);
  501. cx24117_writereg(state, 0xcb, 0x00);
  502. cx24117_writereg(state, 0xcc, 0x00);
  503. cx24117_writereg(state, 0xcd, 0x00);
  504. cx24117_writereg(state, 0xe4, 0x03);
  505. cx24117_writereg(state, 0xeb, 0x0a);
  506. cx24117_writereg(state, 0xfb, 0x00);
  507. cx24117_writereg(state, 0xe0, 0x76);
  508. cx24117_writereg(state, 0xf7, 0x81);
  509. cx24117_writereg(state, 0xf8, 0x00);
  510. cx24117_writereg(state, 0xf9, 0x00);
  511. buf = kmalloc(fw->size + 1, GFP_KERNEL);
  512. if (buf == NULL) {
  513. state->priv->skip_fw_load = 0;
  514. return -ENOMEM;
  515. }
  516. /* fw upload reg */
  517. buf[0] = 0xfa;
  518. memcpy(&buf[1], fw->data, fw->size);
  519. /* prepare i2c message to send */
  520. msg.addr = state->priv->demod_address;
  521. msg.flags = 0;
  522. msg.len = fw->size + 1;
  523. msg.buf = buf;
  524. /* send fw */
  525. ret = i2c_transfer(state->priv->i2c, &msg, 1);
  526. if (ret < 0)
  527. return ret;
  528. kfree(buf);
  529. cx24117_writereg(state, 0xf7, 0x0c);
  530. cx24117_writereg(state, 0xe0, 0x00);
  531. /* Init demodulator */
  532. cmd.args[0] = CMD_DEMODINIT;
  533. cmd.args[1] = 0x00;
  534. cmd.args[2] = 0x01;
  535. cmd.args[3] = 0x00;
  536. cmd.len = 4;
  537. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  538. if (ret != 0)
  539. goto error;
  540. /* Set VCO frequency */
  541. cmd.args[0] = CMD_SET_VCOFREQ;
  542. cmd.args[1] = 0x06;
  543. cmd.args[2] = 0x2b;
  544. cmd.args[3] = 0xd8;
  545. cmd.args[4] = 0xa5;
  546. cmd.args[5] = 0xee;
  547. cmd.args[6] = 0x03;
  548. cmd.args[7] = 0x9d;
  549. cmd.args[8] = 0xfc;
  550. cmd.args[9] = 0x06;
  551. cmd.args[10] = 0x02;
  552. cmd.args[11] = 0x9d;
  553. cmd.args[12] = 0xfc;
  554. cmd.len = 13;
  555. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  556. if (ret != 0)
  557. goto error;
  558. /* Tuner init */
  559. cmd.args[0] = CMD_TUNERINIT;
  560. cmd.args[1] = 0x00;
  561. cmd.args[2] = 0x01;
  562. cmd.args[3] = 0x00;
  563. cmd.args[4] = 0x00;
  564. cmd.args[5] = 0x01;
  565. cmd.args[6] = 0x01;
  566. cmd.args[7] = 0x01;
  567. cmd.args[8] = 0x00;
  568. cmd.args[9] = 0x05;
  569. cmd.args[10] = 0x02;
  570. cmd.args[11] = 0x02;
  571. cmd.args[12] = 0x00;
  572. cmd.len = 13;
  573. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  574. if (ret != 0)
  575. goto error;
  576. /* Global MPEG config */
  577. cmd.args[0] = CMD_GLOBAL_MPEGCFG;
  578. cmd.args[1] = 0x00;
  579. cmd.args[2] = 0x00;
  580. cmd.args[3] = 0x00;
  581. cmd.args[4] = 0x01;
  582. cmd.args[5] = 0x00;
  583. cmd.len = 6;
  584. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  585. if (ret != 0)
  586. goto error;
  587. /* MPEG config for each demod */
  588. for (i = 0; i < 2; i++) {
  589. cmd.args[0] = CMD_MPEGCFG;
  590. cmd.args[1] = (u8) i;
  591. cmd.args[2] = 0x00;
  592. cmd.args[3] = 0x05;
  593. cmd.args[4] = 0x00;
  594. cmd.args[5] = 0x00;
  595. cmd.args[6] = 0x55;
  596. cmd.args[7] = 0x00;
  597. cmd.len = 8;
  598. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  599. if (ret != 0)
  600. goto error;
  601. }
  602. cx24117_writereg(state, 0xce, 0xc0);
  603. cx24117_writereg(state, 0xcf, 0x00);
  604. cx24117_writereg(state, 0xe5, 0x04);
  605. /* Get firmware version */
  606. cmd.args[0] = CMD_FWVERSION;
  607. cmd.len = 2;
  608. for (i = 0; i < 4; i++) {
  609. cmd.args[1] = i;
  610. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  611. if (ret != 0)
  612. goto error;
  613. vers[i] = cx24117_readreg(state, 0x33);
  614. }
  615. dev_info(&state->priv->i2c->dev,
  616. "%s: FW version %i.%i.%i.%i\n", __func__,
  617. vers[0], vers[1], vers[2], vers[3]);
  618. return 0;
  619. error:
  620. state->priv->skip_fw_load = 0;
  621. dev_err(&state->priv->i2c->dev, "%s() Error running FW.\n", __func__);
  622. return ret;
  623. }
  624. static int cx24117_read_status(struct dvb_frontend *fe, fe_status_t *status)
  625. {
  626. struct cx24117_state *state = fe->demodulator_priv;
  627. int lock;
  628. lock = cx24117_readreg(state,
  629. (state->demod == 0) ? CX24117_REG_SSTATUS0 :
  630. CX24117_REG_SSTATUS1) &
  631. CX24117_STATUS_MASK;
  632. dev_dbg(&state->priv->i2c->dev, "%s() demod%d status = 0x%02x\n",
  633. __func__, state->demod, lock);
  634. *status = 0;
  635. if (lock & CX24117_HAS_SIGNAL)
  636. *status |= FE_HAS_SIGNAL;
  637. if (lock & CX24117_HAS_CARRIER)
  638. *status |= FE_HAS_CARRIER;
  639. if (lock & CX24117_HAS_VITERBI)
  640. *status |= FE_HAS_VITERBI;
  641. if (lock & CX24117_HAS_SYNCLOCK)
  642. *status |= FE_HAS_SYNC | FE_HAS_LOCK;
  643. return 0;
  644. }
  645. static int cx24117_read_ber(struct dvb_frontend *fe, u32 *ber)
  646. {
  647. struct cx24117_state *state = fe->demodulator_priv;
  648. int ret;
  649. u8 buf[4];
  650. u8 base_reg = (state->demod == 0) ?
  651. CX24117_REG_BER4_0 :
  652. CX24117_REG_BER4_1;
  653. ret = cx24117_readregN(state, base_reg, buf, 4);
  654. if (ret != 0)
  655. return ret;
  656. *ber = (buf[0] << 24) | (buf[1] << 16) |
  657. (buf[1] << 8) | buf[0];
  658. dev_dbg(&state->priv->i2c->dev, "%s() demod%d ber=0x%04x\n",
  659. __func__, state->demod, *ber);
  660. return 0;
  661. }
  662. static int cx24117_read_signal_strength(struct dvb_frontend *fe,
  663. u16 *signal_strength)
  664. {
  665. struct cx24117_state *state = fe->demodulator_priv;
  666. struct cx24117_cmd cmd;
  667. int ret;
  668. u16 sig_reading;
  669. u8 buf[2];
  670. u8 reg = (state->demod == 0) ?
  671. CX24117_REG_SSTATUS0 : CX24117_REG_SSTATUS1;
  672. /* Read AGC accumulator register */
  673. cmd.args[0] = CMD_GET_AGCACC;
  674. cmd.args[1] = (u8) state->demod;
  675. cmd.len = 2;
  676. ret = cx24117_cmd_execute(fe, &cmd);
  677. if (ret != 0)
  678. return ret;
  679. ret = cx24117_readregN(state, reg, buf, 2);
  680. if (ret != 0)
  681. return ret;
  682. sig_reading = ((buf[0] & CX24117_SIGNAL_MASK) << 2) | buf[1];
  683. *signal_strength = -100 * sig_reading + 94324;
  684. dev_dbg(&state->priv->i2c->dev,
  685. "%s() demod%d raw / cooked = 0x%04x / 0x%04x\n",
  686. __func__, state->demod, sig_reading, *signal_strength);
  687. return 0;
  688. }
  689. static int cx24117_read_snr(struct dvb_frontend *fe, u16 *snr)
  690. {
  691. struct cx24117_state *state = fe->demodulator_priv;
  692. int ret;
  693. u8 buf[2];
  694. u8 reg = (state->demod == 0) ?
  695. CX24117_REG_QUALITY2_0 : CX24117_REG_QUALITY2_1;
  696. ret = cx24117_readregN(state, reg, buf, 2);
  697. if (ret != 0)
  698. return ret;
  699. *snr = (buf[0] << 8) | buf[1];
  700. dev_dbg(&state->priv->i2c->dev,
  701. "%s() demod%d snr = 0x%04x\n",
  702. __func__, state->demod, *snr);
  703. return ret;
  704. }
  705. static int cx24117_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  706. {
  707. struct cx24117_state *state = fe->demodulator_priv;
  708. fe_delivery_system_t delsys = fe->dtv_property_cache.delivery_system;
  709. int ret;
  710. u8 buf[2];
  711. u8 reg = (state->demod == 0) ?
  712. CX24117_REG_DVBS_UCB2_0 :
  713. CX24117_REG_DVBS_UCB2_1;
  714. switch (delsys) {
  715. case SYS_DVBS:
  716. break;
  717. case SYS_DVBS2:
  718. reg += (CX24117_REG_DVBS2_UCB2_0 - CX24117_REG_DVBS_UCB2_0);
  719. break;
  720. default:
  721. return -EINVAL;
  722. }
  723. ret = cx24117_readregN(state, reg, buf, 2);
  724. if (ret != 0)
  725. return ret;
  726. *ucblocks = (buf[0] << 8) | buf[1];
  727. dev_dbg(&state->priv->i2c->dev, "%s() demod%d ucb=0x%04x\n",
  728. __func__, state->demod, *ucblocks);
  729. return 0;
  730. }
  731. /* Overwrite the current tuning params, we are about to tune */
  732. static void cx24117_clone_params(struct dvb_frontend *fe)
  733. {
  734. struct cx24117_state *state = fe->demodulator_priv;
  735. state->dcur = state->dnxt;
  736. }
  737. /* Wait for LNB */
  738. static int cx24117_wait_for_lnb(struct dvb_frontend *fe)
  739. {
  740. struct cx24117_state *state = fe->demodulator_priv;
  741. int i;
  742. u8 val, reg = (state->demod == 0) ? CX24117_REG_QSTATUS0 :
  743. CX24117_REG_QSTATUS1;
  744. dev_dbg(&state->priv->i2c->dev, "%s() demod%d qstatus = 0x%02x\n",
  745. __func__, state->demod, cx24117_readreg(state, reg));
  746. /* Wait for up to 300 ms */
  747. for (i = 0; i < 10; i++) {
  748. val = cx24117_readreg(state, reg) & 0x01;
  749. if (val != 0)
  750. return 0;
  751. msleep(30);
  752. }
  753. dev_warn(&state->priv->i2c->dev, "%s: demod%d LNB not ready\n",
  754. KBUILD_MODNAME, state->demod);
  755. return -ETIMEDOUT; /* -EBUSY ? */
  756. }
  757. static int cx24117_set_voltage(struct dvb_frontend *fe,
  758. fe_sec_voltage_t voltage)
  759. {
  760. struct cx24117_state *state = fe->demodulator_priv;
  761. struct cx24117_cmd cmd;
  762. int ret;
  763. u8 reg = (state->demod == 0) ? 0x10 : 0x20;
  764. dev_dbg(&state->priv->i2c->dev, "%s() demod%d %s\n",
  765. __func__, state->demod,
  766. voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
  767. voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" :
  768. "SEC_VOLTAGE_OFF");
  769. /* Prepare a set GPIO logic level CMD */
  770. cmd.args[0] = CMD_SET_GPIOOUT;
  771. cmd.args[2] = reg; /* mask */
  772. cmd.len = 3;
  773. if ((voltage == SEC_VOLTAGE_13) ||
  774. (voltage == SEC_VOLTAGE_18)) {
  775. /* power on LNB */
  776. cmd.args[1] = reg;
  777. ret = cx24117_cmd_execute(fe, &cmd);
  778. if (ret != 0)
  779. return ret;
  780. ret = cx24117_wait_for_lnb(fe);
  781. if (ret != 0)
  782. return ret;
  783. /* Wait for voltage/min repeat delay */
  784. msleep(100);
  785. /* Set 13V/18V select pin */
  786. cmd.args[0] = CMD_LNBDCLEVEL;
  787. cmd.args[1] = state->demod ? 0 : 1;
  788. cmd.args[2] = (voltage == SEC_VOLTAGE_18 ? 0x01 : 0x00);
  789. cmd.len = 3;
  790. ret = cx24117_cmd_execute(fe, &cmd);
  791. /* Min delay time before DiSEqC send */
  792. msleep(20);
  793. } else {
  794. /* power off LNB */
  795. cmd.args[1] = 0x00;
  796. ret = cx24117_cmd_execute(fe, &cmd);
  797. }
  798. return ret;
  799. }
  800. static int cx24117_set_tone(struct dvb_frontend *fe,
  801. fe_sec_tone_mode_t tone)
  802. {
  803. struct cx24117_state *state = fe->demodulator_priv;
  804. struct cx24117_cmd cmd;
  805. int ret;
  806. dev_dbg(&state->priv->i2c->dev, "%s(%d) demod%d\n",
  807. __func__, state->demod, tone);
  808. if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
  809. dev_warn(&state->priv->i2c->dev, "%s: demod%d invalid tone=%d\n",
  810. KBUILD_MODNAME, state->demod, tone);
  811. return -EINVAL;
  812. }
  813. /* Wait for LNB ready */
  814. ret = cx24117_wait_for_lnb(fe);
  815. if (ret != 0)
  816. return ret;
  817. /* Min delay time after DiSEqC send */
  818. msleep(20);
  819. /* Set the tone */
  820. cmd.args[0] = CMD_LNBPCBCONFIG;
  821. cmd.args[1] = (state->demod ? 0 : 1);
  822. cmd.args[2] = 0x00;
  823. cmd.args[3] = 0x00;
  824. cmd.len = 5;
  825. switch (tone) {
  826. case SEC_TONE_ON:
  827. cmd.args[4] = 0x01;
  828. break;
  829. case SEC_TONE_OFF:
  830. cmd.args[4] = 0x00;
  831. break;
  832. }
  833. msleep(20);
  834. return cx24117_cmd_execute(fe, &cmd);
  835. }
  836. /* Initialise DiSEqC */
  837. static int cx24117_diseqc_init(struct dvb_frontend *fe)
  838. {
  839. struct cx24117_state *state = fe->demodulator_priv;
  840. /* Prepare a DiSEqC command */
  841. state->dsec_cmd.args[0] = CMD_LNBSEND;
  842. /* demod */
  843. state->dsec_cmd.args[CX24117_DISEQC_DEMOD] = state->demod ? 0 : 1;
  844. /* DiSEqC burst */
  845. state->dsec_cmd.args[CX24117_DISEQC_BURST] = CX24117_DISEQC_MINI_A;
  846. /* Unknown */
  847. state->dsec_cmd.args[CX24117_DISEQC_ARG3_2] = 0x02;
  848. state->dsec_cmd.args[CX24117_DISEQC_ARG4_0] = 0x00;
  849. /* Continuation flag? */
  850. state->dsec_cmd.args[CX24117_DISEQC_ARG5_0] = 0x00;
  851. /* DiSEqC message length */
  852. state->dsec_cmd.args[CX24117_DISEQC_MSGLEN] = 0x00;
  853. /* Command length */
  854. state->dsec_cmd.len = 7;
  855. return 0;
  856. }
  857. /* Send DiSEqC message */
  858. static int cx24117_send_diseqc_msg(struct dvb_frontend *fe,
  859. struct dvb_diseqc_master_cmd *d)
  860. {
  861. struct cx24117_state *state = fe->demodulator_priv;
  862. int i, ret;
  863. /* Dump DiSEqC message */
  864. dev_dbg(&state->priv->i2c->dev, "%s: demod %d (",
  865. __func__, state->demod);
  866. for (i = 0; i < d->msg_len; i++)
  867. dev_dbg(&state->priv->i2c->dev, "0x%02x ", d->msg[i]);
  868. dev_dbg(&state->priv->i2c->dev, ")\n");
  869. /* Validate length */
  870. if (d->msg_len > 15)
  871. return -EINVAL;
  872. /* DiSEqC message */
  873. for (i = 0; i < d->msg_len; i++)
  874. state->dsec_cmd.args[CX24117_DISEQC_MSGOFS + i] = d->msg[i];
  875. /* DiSEqC message length */
  876. state->dsec_cmd.args[CX24117_DISEQC_MSGLEN] = d->msg_len;
  877. /* Command length */
  878. state->dsec_cmd.len = CX24117_DISEQC_MSGOFS +
  879. state->dsec_cmd.args[CX24117_DISEQC_MSGLEN];
  880. /*
  881. * Message is sent with derived else cached burst
  882. *
  883. * WRITE PORT GROUP COMMAND 38
  884. *
  885. * 0/A/A: E0 10 38 F0..F3
  886. * 1/B/B: E0 10 38 F4..F7
  887. * 2/C/A: E0 10 38 F8..FB
  888. * 3/D/B: E0 10 38 FC..FF
  889. *
  890. * databyte[3]= 8421:8421
  891. * ABCD:WXYZ
  892. * CLR :SET
  893. *
  894. * WX= PORT SELECT 0..3 (X=TONEBURST)
  895. * Y = VOLTAGE (0=13V, 1=18V)
  896. * Z = BAND (0=LOW, 1=HIGH(22K))
  897. */
  898. if (d->msg_len >= 4 && d->msg[2] == 0x38)
  899. state->dsec_cmd.args[CX24117_DISEQC_BURST] =
  900. ((d->msg[3] & 4) >> 2);
  901. dev_dbg(&state->priv->i2c->dev, "%s() demod%d burst=%d\n",
  902. __func__, state->demod,
  903. state->dsec_cmd.args[CX24117_DISEQC_BURST]);
  904. /* Wait for LNB ready */
  905. ret = cx24117_wait_for_lnb(fe);
  906. if (ret != 0)
  907. return ret;
  908. /* Wait for voltage/min repeat delay */
  909. msleep(100);
  910. /* Command */
  911. ret = cx24117_cmd_execute(fe, &state->dsec_cmd);
  912. if (ret != 0)
  913. return ret;
  914. /*
  915. * Wait for send
  916. *
  917. * Eutelsat spec:
  918. * >15ms delay + (XXX determine if FW does this, see set_tone)
  919. * 13.5ms per byte +
  920. * >15ms delay +
  921. * 12.5ms burst +
  922. * >15ms delay (XXX determine if FW does this, see set_tone)
  923. */
  924. msleep((state->dsec_cmd.args[CX24117_DISEQC_MSGLEN] << 4) + 60);
  925. return 0;
  926. }
  927. /* Send DiSEqC burst */
  928. static int cx24117_diseqc_send_burst(struct dvb_frontend *fe,
  929. fe_sec_mini_cmd_t burst)
  930. {
  931. struct cx24117_state *state = fe->demodulator_priv;
  932. dev_dbg(&state->priv->i2c->dev, "%s(%d) demod=%d\n",
  933. __func__, burst, state->demod);
  934. /* DiSEqC burst */
  935. if (burst == SEC_MINI_A)
  936. state->dsec_cmd.args[CX24117_DISEQC_BURST] =
  937. CX24117_DISEQC_MINI_A;
  938. else if (burst == SEC_MINI_B)
  939. state->dsec_cmd.args[CX24117_DISEQC_BURST] =
  940. CX24117_DISEQC_MINI_B;
  941. else
  942. return -EINVAL;
  943. return 0;
  944. }
  945. static int cx24117_get_priv(struct cx24117_priv **priv,
  946. struct i2c_adapter *i2c, u8 client_address)
  947. {
  948. int ret;
  949. mutex_lock(&cx24117_list_mutex);
  950. ret = hybrid_tuner_request_state(struct cx24117_priv, (*priv),
  951. hybrid_tuner_instance_list, i2c, client_address, "cx24117");
  952. mutex_unlock(&cx24117_list_mutex);
  953. return ret;
  954. }
  955. static void cx24117_release_priv(struct cx24117_priv *priv)
  956. {
  957. mutex_lock(&cx24117_list_mutex);
  958. if (priv != NULL)
  959. hybrid_tuner_release_state(priv);
  960. mutex_unlock(&cx24117_list_mutex);
  961. }
  962. static void cx24117_release(struct dvb_frontend *fe)
  963. {
  964. struct cx24117_state *state = fe->demodulator_priv;
  965. dev_dbg(&state->priv->i2c->dev, "%s demod%d\n",
  966. __func__, state->demod);
  967. cx24117_release_priv(state->priv);
  968. kfree(state);
  969. }
  970. static struct dvb_frontend_ops cx24117_ops;
  971. struct dvb_frontend *cx24117_attach(const struct cx24117_config *config,
  972. struct i2c_adapter *i2c)
  973. {
  974. struct cx24117_state *state = NULL;
  975. struct cx24117_priv *priv = NULL;
  976. int demod = 0;
  977. /* get the common data struct for both demods */
  978. demod = cx24117_get_priv(&priv, i2c, config->demod_address);
  979. switch (demod) {
  980. case 0:
  981. dev_err(&i2c->dev,
  982. "%s: Error attaching frontend %d\n",
  983. KBUILD_MODNAME, demod);
  984. goto error1;
  985. break;
  986. case 1:
  987. /* new priv instance */
  988. priv->i2c = i2c;
  989. priv->demod_address = config->demod_address;
  990. mutex_init(&priv->fe_lock);
  991. break;
  992. default:
  993. /* existing priv instance */
  994. break;
  995. }
  996. /* allocate memory for the internal state */
  997. state = kzalloc(sizeof(struct cx24117_state), GFP_KERNEL);
  998. if (state == NULL)
  999. goto error2;
  1000. state->demod = demod - 1;
  1001. state->priv = priv;
  1002. dev_info(&state->priv->i2c->dev,
  1003. "%s: Attaching frontend %d\n",
  1004. KBUILD_MODNAME, state->demod);
  1005. /* create dvb_frontend */
  1006. memcpy(&state->frontend.ops, &cx24117_ops,
  1007. sizeof(struct dvb_frontend_ops));
  1008. state->frontend.demodulator_priv = state;
  1009. return &state->frontend;
  1010. error2:
  1011. cx24117_release_priv(priv);
  1012. error1:
  1013. return NULL;
  1014. }
  1015. EXPORT_SYMBOL_GPL(cx24117_attach);
  1016. /*
  1017. * Initialise or wake up device
  1018. *
  1019. * Power config will reset and load initial firmware if required
  1020. */
  1021. static int cx24117_initfe(struct dvb_frontend *fe)
  1022. {
  1023. struct cx24117_state *state = fe->demodulator_priv;
  1024. struct cx24117_cmd cmd;
  1025. int ret;
  1026. dev_dbg(&state->priv->i2c->dev, "%s() demod%d\n",
  1027. __func__, state->demod);
  1028. mutex_lock(&state->priv->fe_lock);
  1029. /* Set sleep mode off */
  1030. cmd.args[0] = CMD_SET_SLEEPMODE;
  1031. cmd.args[1] = (state->demod ? 1 : 0);
  1032. cmd.args[2] = 0;
  1033. cmd.len = 3;
  1034. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  1035. if (ret != 0)
  1036. goto exit;
  1037. ret = cx24117_diseqc_init(fe);
  1038. if (ret != 0)
  1039. goto exit;
  1040. /* Set BER control */
  1041. cmd.args[0] = CMD_BERCTRL;
  1042. cmd.args[1] = (state->demod ? 1 : 0);
  1043. cmd.args[2] = 0x10;
  1044. cmd.args[3] = 0x10;
  1045. cmd.len = 4;
  1046. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  1047. if (ret != 0)
  1048. goto exit;
  1049. /* Set RS correction (enable/disable) */
  1050. cmd.args[0] = CMD_ENABLERSCORR;
  1051. cmd.args[1] = (state->demod ? 1 : 0);
  1052. cmd.args[2] = CX24117_OCC;
  1053. cmd.len = 3;
  1054. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  1055. if (ret != 0)
  1056. goto exit;
  1057. /* Set GPIO direction */
  1058. /* Set as output - controls LNB power on/off */
  1059. cmd.args[0] = CMD_SET_GPIODIR;
  1060. cmd.args[1] = 0x30;
  1061. cmd.args[2] = 0x30;
  1062. cmd.len = 3;
  1063. ret = cx24117_cmd_execute_nolock(fe, &cmd);
  1064. exit:
  1065. mutex_unlock(&state->priv->fe_lock);
  1066. return ret;
  1067. }
  1068. /*
  1069. * Put device to sleep
  1070. */
  1071. static int cx24117_sleep(struct dvb_frontend *fe)
  1072. {
  1073. struct cx24117_state *state = fe->demodulator_priv;
  1074. struct cx24117_cmd cmd;
  1075. dev_dbg(&state->priv->i2c->dev, "%s() demod%d\n",
  1076. __func__, state->demod);
  1077. /* Set sleep mode on */
  1078. cmd.args[0] = CMD_SET_SLEEPMODE;
  1079. cmd.args[1] = (state->demod ? 1 : 0);
  1080. cmd.args[2] = 1;
  1081. cmd.len = 3;
  1082. return cx24117_cmd_execute(fe, &cmd);
  1083. }
  1084. /* dvb-core told us to tune, the tv property cache will be complete,
  1085. * it's safe for is to pull values and use them for tuning purposes.
  1086. */
  1087. static int cx24117_set_frontend(struct dvb_frontend *fe)
  1088. {
  1089. struct cx24117_state *state = fe->demodulator_priv;
  1090. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  1091. struct cx24117_cmd cmd;
  1092. fe_status_t tunerstat;
  1093. int i, status, ret, retune = 1;
  1094. u8 reg_clkdiv, reg_ratediv;
  1095. dev_dbg(&state->priv->i2c->dev, "%s() demod%d\n",
  1096. __func__, state->demod);
  1097. switch (c->delivery_system) {
  1098. case SYS_DVBS:
  1099. dev_dbg(&state->priv->i2c->dev, "%s() demod%d DVB-S\n",
  1100. __func__, state->demod);
  1101. /* Only QPSK is supported for DVB-S */
  1102. if (c->modulation != QPSK) {
  1103. dev_dbg(&state->priv->i2c->dev,
  1104. "%s() demod%d unsupported modulation (%d)\n",
  1105. __func__, state->demod, c->modulation);
  1106. return -EINVAL;
  1107. }
  1108. /* Pilot doesn't exist in DVB-S, turn bit off */
  1109. state->dnxt.pilot_val = CX24117_PILOT_OFF;
  1110. /* DVB-S only supports 0.35 */
  1111. state->dnxt.rolloff_val = CX24117_ROLLOFF_035;
  1112. break;
  1113. case SYS_DVBS2:
  1114. dev_dbg(&state->priv->i2c->dev, "%s() demod%d DVB-S2\n",
  1115. __func__, state->demod);
  1116. /*
  1117. * NBC 8PSK/QPSK with DVB-S is supported for DVB-S2,
  1118. * but not hardware auto detection
  1119. */
  1120. if (c->modulation != PSK_8 && c->modulation != QPSK) {
  1121. dev_dbg(&state->priv->i2c->dev,
  1122. "%s() demod%d unsupported modulation (%d)\n",
  1123. __func__, state->demod, c->modulation);
  1124. return -EOPNOTSUPP;
  1125. }
  1126. switch (c->pilot) {
  1127. case PILOT_AUTO:
  1128. state->dnxt.pilot_val = CX24117_PILOT_AUTO;
  1129. break;
  1130. case PILOT_OFF:
  1131. state->dnxt.pilot_val = CX24117_PILOT_OFF;
  1132. break;
  1133. case PILOT_ON:
  1134. state->dnxt.pilot_val = CX24117_PILOT_ON;
  1135. break;
  1136. default:
  1137. dev_dbg(&state->priv->i2c->dev,
  1138. "%s() demod%d unsupported pilot mode (%d)\n",
  1139. __func__, state->demod, c->pilot);
  1140. return -EOPNOTSUPP;
  1141. }
  1142. switch (c->rolloff) {
  1143. case ROLLOFF_20:
  1144. state->dnxt.rolloff_val = CX24117_ROLLOFF_020;
  1145. break;
  1146. case ROLLOFF_25:
  1147. state->dnxt.rolloff_val = CX24117_ROLLOFF_025;
  1148. break;
  1149. case ROLLOFF_35:
  1150. state->dnxt.rolloff_val = CX24117_ROLLOFF_035;
  1151. break;
  1152. case ROLLOFF_AUTO:
  1153. state->dnxt.rolloff_val = CX24117_ROLLOFF_035;
  1154. /* soft-auto rolloff */
  1155. retune = 3;
  1156. break;
  1157. default:
  1158. dev_warn(&state->priv->i2c->dev,
  1159. "%s: demod%d unsupported rolloff (%d)\n",
  1160. KBUILD_MODNAME, state->demod, c->rolloff);
  1161. return -EOPNOTSUPP;
  1162. }
  1163. break;
  1164. default:
  1165. dev_warn(&state->priv->i2c->dev,
  1166. "%s: demod %d unsupported delivery system (%d)\n",
  1167. KBUILD_MODNAME, state->demod, c->delivery_system);
  1168. return -EINVAL;
  1169. }
  1170. state->dnxt.delsys = c->delivery_system;
  1171. state->dnxt.modulation = c->modulation;
  1172. state->dnxt.frequency = c->frequency;
  1173. state->dnxt.pilot = c->pilot;
  1174. state->dnxt.rolloff = c->rolloff;
  1175. ret = cx24117_set_inversion(state, c->inversion);
  1176. if (ret != 0)
  1177. return ret;
  1178. ret = cx24117_set_fec(state,
  1179. c->delivery_system, c->modulation, c->fec_inner);
  1180. if (ret != 0)
  1181. return ret;
  1182. ret = cx24117_set_symbolrate(state, c->symbol_rate);
  1183. if (ret != 0)
  1184. return ret;
  1185. /* discard the 'current' tuning parameters and prepare to tune */
  1186. cx24117_clone_params(fe);
  1187. dev_dbg(&state->priv->i2c->dev,
  1188. "%s: delsys = %d\n", __func__, state->dcur.delsys);
  1189. dev_dbg(&state->priv->i2c->dev,
  1190. "%s: modulation = %d\n", __func__, state->dcur.modulation);
  1191. dev_dbg(&state->priv->i2c->dev,
  1192. "%s: frequency = %d\n", __func__, state->dcur.frequency);
  1193. dev_dbg(&state->priv->i2c->dev,
  1194. "%s: pilot = %d (val = 0x%02x)\n", __func__,
  1195. state->dcur.pilot, state->dcur.pilot_val);
  1196. dev_dbg(&state->priv->i2c->dev,
  1197. "%s: retune = %d\n", __func__, retune);
  1198. dev_dbg(&state->priv->i2c->dev,
  1199. "%s: rolloff = %d (val = 0x%02x)\n", __func__,
  1200. state->dcur.rolloff, state->dcur.rolloff_val);
  1201. dev_dbg(&state->priv->i2c->dev,
  1202. "%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
  1203. dev_dbg(&state->priv->i2c->dev,
  1204. "%s: FEC = %d (mask/val = 0x%02x/0x%02x)\n", __func__,
  1205. state->dcur.fec, state->dcur.fec_mask, state->dcur.fec_val);
  1206. dev_dbg(&state->priv->i2c->dev,
  1207. "%s: Inversion = %d (val = 0x%02x)\n", __func__,
  1208. state->dcur.inversion, state->dcur.inversion_val);
  1209. /* Prepare a tune request */
  1210. cmd.args[0] = CMD_TUNEREQUEST;
  1211. /* demod */
  1212. cmd.args[1] = state->demod;
  1213. /* Frequency */
  1214. cmd.args[2] = (state->dcur.frequency & 0xff0000) >> 16;
  1215. cmd.args[3] = (state->dcur.frequency & 0x00ff00) >> 8;
  1216. cmd.args[4] = (state->dcur.frequency & 0x0000ff);
  1217. /* Symbol Rate */
  1218. cmd.args[5] = ((state->dcur.symbol_rate / 1000) & 0xff00) >> 8;
  1219. cmd.args[6] = ((state->dcur.symbol_rate / 1000) & 0x00ff);
  1220. /* Automatic Inversion */
  1221. cmd.args[7] = state->dcur.inversion_val;
  1222. /* Modulation / FEC / Pilot */
  1223. cmd.args[8] = state->dcur.fec_val | state->dcur.pilot_val;
  1224. cmd.args[9] = CX24117_SEARCH_RANGE_KHZ >> 8;
  1225. cmd.args[10] = CX24117_SEARCH_RANGE_KHZ & 0xff;
  1226. cmd.args[11] = state->dcur.rolloff_val;
  1227. cmd.args[12] = state->dcur.fec_mask;
  1228. if (state->dcur.symbol_rate > 30000000) {
  1229. reg_ratediv = 0x04;
  1230. reg_clkdiv = 0x02;
  1231. } else if (state->dcur.symbol_rate > 10000000) {
  1232. reg_ratediv = 0x06;
  1233. reg_clkdiv = 0x03;
  1234. } else {
  1235. reg_ratediv = 0x0a;
  1236. reg_clkdiv = 0x05;
  1237. }
  1238. cmd.args[13] = reg_ratediv;
  1239. cmd.args[14] = reg_clkdiv;
  1240. cx24117_writereg(state, (state->demod == 0) ?
  1241. CX24117_REG_CLKDIV0 : CX24117_REG_CLKDIV1, reg_clkdiv);
  1242. cx24117_writereg(state, (state->demod == 0) ?
  1243. CX24117_REG_RATEDIV0 : CX24117_REG_RATEDIV1, reg_ratediv);
  1244. cmd.args[15] = CX24117_PNE;
  1245. cmd.len = 16;
  1246. do {
  1247. /* Reset status register */
  1248. status = cx24117_readreg(state, (state->demod == 0) ?
  1249. CX24117_REG_SSTATUS0 : CX24117_REG_SSTATUS1) &
  1250. CX24117_SIGNAL_MASK;
  1251. dev_dbg(&state->priv->i2c->dev,
  1252. "%s() demod%d status_setfe = %02x\n",
  1253. __func__, state->demod, status);
  1254. cx24117_writereg(state, (state->demod == 0) ?
  1255. CX24117_REG_SSTATUS0 : CX24117_REG_SSTATUS1, status);
  1256. /* Tune */
  1257. ret = cx24117_cmd_execute(fe, &cmd);
  1258. if (ret != 0)
  1259. break;
  1260. /*
  1261. * Wait for up to 500 ms before retrying
  1262. *
  1263. * If we are able to tune then generally it occurs within 100ms.
  1264. * If it takes longer, try a different rolloff setting.
  1265. */
  1266. for (i = 0; i < 50; i++) {
  1267. cx24117_read_status(fe, &tunerstat);
  1268. status = tunerstat & (FE_HAS_SIGNAL | FE_HAS_SYNC);
  1269. if (status == (FE_HAS_SIGNAL | FE_HAS_SYNC)) {
  1270. dev_dbg(&state->priv->i2c->dev,
  1271. "%s() demod%d tuned\n",
  1272. __func__, state->demod);
  1273. return 0;
  1274. }
  1275. msleep(20);
  1276. }
  1277. dev_dbg(&state->priv->i2c->dev, "%s() demod%d not tuned\n",
  1278. __func__, state->demod);
  1279. /* try next rolloff value */
  1280. if (state->dcur.rolloff == 3)
  1281. cmd.args[11]--;
  1282. } while (--retune);
  1283. return -EINVAL;
  1284. }
  1285. static int cx24117_tune(struct dvb_frontend *fe, bool re_tune,
  1286. unsigned int mode_flags, unsigned int *delay, fe_status_t *status)
  1287. {
  1288. struct cx24117_state *state = fe->demodulator_priv;
  1289. dev_dbg(&state->priv->i2c->dev, "%s() demod%d\n",
  1290. __func__, state->demod);
  1291. *delay = HZ / 5;
  1292. if (re_tune) {
  1293. int ret = cx24117_set_frontend(fe);
  1294. if (ret)
  1295. return ret;
  1296. }
  1297. return cx24117_read_status(fe, status);
  1298. }
  1299. static int cx24117_get_algo(struct dvb_frontend *fe)
  1300. {
  1301. return DVBFE_ALGO_HW;
  1302. }
  1303. static int cx24117_get_frontend(struct dvb_frontend *fe)
  1304. {
  1305. struct cx24117_state *state = fe->demodulator_priv;
  1306. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  1307. struct cx24117_cmd cmd;
  1308. u8 reg, st, inv;
  1309. int ret, idx;
  1310. unsigned int freq;
  1311. short srate_os, freq_os;
  1312. u8 buf[0x1f-4];
  1313. /* Read current tune parameters */
  1314. cmd.args[0] = CMD_GETCTLACC;
  1315. cmd.args[1] = (u8) state->demod;
  1316. cmd.len = 2;
  1317. ret = cx24117_cmd_execute(fe, &cmd);
  1318. if (ret != 0)
  1319. return ret;
  1320. /* read all required regs at once */
  1321. reg = (state->demod == 0) ? CX24117_REG_FREQ3_0 : CX24117_REG_FREQ3_1;
  1322. ret = cx24117_readregN(state, reg, buf, 0x1f-4);
  1323. if (ret != 0)
  1324. return ret;
  1325. st = buf[5];
  1326. /* get spectral inversion */
  1327. inv = (((state->demod == 0) ? ~st : st) >> 6) & 1;
  1328. if (inv == 0)
  1329. c->inversion = INVERSION_OFF;
  1330. else
  1331. c->inversion = INVERSION_ON;
  1332. /* modulation and fec */
  1333. idx = st & 0x3f;
  1334. if (c->delivery_system == SYS_DVBS2) {
  1335. if (idx > 11)
  1336. idx += 9;
  1337. else
  1338. idx += 7;
  1339. }
  1340. c->modulation = cx24117_modfec_modes[idx].modulation;
  1341. c->fec_inner = cx24117_modfec_modes[idx].fec;
  1342. /* frequency */
  1343. freq = (buf[0] << 16) | (buf[1] << 8) | buf[2];
  1344. freq_os = (buf[8] << 8) | buf[9];
  1345. c->frequency = freq + freq_os;
  1346. /* symbol rate */
  1347. srate_os = (buf[10] << 8) | buf[11];
  1348. c->symbol_rate = -1000 * srate_os + state->dcur.symbol_rate;
  1349. return 0;
  1350. }
  1351. static struct dvb_frontend_ops cx24117_ops = {
  1352. .delsys = { SYS_DVBS, SYS_DVBS2 },
  1353. .info = {
  1354. .name = "Conexant CX24117/CX24132",
  1355. .frequency_min = 950000,
  1356. .frequency_max = 2150000,
  1357. .frequency_stepsize = 1011, /* kHz for QPSK frontends */
  1358. .frequency_tolerance = 5000,
  1359. .symbol_rate_min = 1000000,
  1360. .symbol_rate_max = 45000000,
  1361. .caps = FE_CAN_INVERSION_AUTO |
  1362. FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
  1363. FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
  1364. FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
  1365. FE_CAN_2G_MODULATION |
  1366. FE_CAN_QPSK | FE_CAN_RECOVER
  1367. },
  1368. .release = cx24117_release,
  1369. .init = cx24117_initfe,
  1370. .sleep = cx24117_sleep,
  1371. .read_status = cx24117_read_status,
  1372. .read_ber = cx24117_read_ber,
  1373. .read_signal_strength = cx24117_read_signal_strength,
  1374. .read_snr = cx24117_read_snr,
  1375. .read_ucblocks = cx24117_read_ucblocks,
  1376. .set_tone = cx24117_set_tone,
  1377. .set_voltage = cx24117_set_voltage,
  1378. .diseqc_send_master_cmd = cx24117_send_diseqc_msg,
  1379. .diseqc_send_burst = cx24117_diseqc_send_burst,
  1380. .get_frontend_algo = cx24117_get_algo,
  1381. .tune = cx24117_tune,
  1382. .set_frontend = cx24117_set_frontend,
  1383. .get_frontend = cx24117_get_frontend,
  1384. };
  1385. MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24117/cx24132 hardware");
  1386. MODULE_AUTHOR("Luis Alves (ljalvs@gmail.com)");
  1387. MODULE_LICENSE("GPL");
  1388. MODULE_VERSION("1.1");
  1389. MODULE_FIRMWARE(CX24117_DEFAULT_FIRMWARE);