cx23885-core.c 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267
  1. /*
  2. * Driver for the Conexant CX23885 PCIe bridge
  3. *
  4. * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. *
  15. * GNU General Public License for more details.
  16. */
  17. #include "cx23885.h"
  18. #include <linux/init.h>
  19. #include <linux/list.h>
  20. #include <linux/module.h>
  21. #include <linux/moduleparam.h>
  22. #include <linux/kmod.h>
  23. #include <linux/kernel.h>
  24. #include <linux/pci.h>
  25. #include <linux/slab.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/delay.h>
  28. #include <asm/div64.h>
  29. #include <linux/firmware.h>
  30. #include "cimax2.h"
  31. #include "altera-ci.h"
  32. #include "cx23888-ir.h"
  33. #include "cx23885-ir.h"
  34. #include "cx23885-av.h"
  35. #include "cx23885-input.h"
  36. MODULE_DESCRIPTION("Driver for cx23885 based TV cards");
  37. MODULE_AUTHOR("Steven Toth <stoth@linuxtv.org>");
  38. MODULE_LICENSE("GPL");
  39. MODULE_VERSION(CX23885_VERSION);
  40. /*
  41. * Some platforms have been found to require periodic resetting of the DMA
  42. * engine. Ryzen and XEON platforms are known to be affected. The symptom
  43. * encountered is "mpeg risc op code error". Only Ryzen platforms employ
  44. * this workaround if the option equals 1. The workaround can be explicitly
  45. * disabled for all platforms by setting to 0, the workaround can be forced
  46. * on for any platform by setting to 2.
  47. */
  48. static unsigned int dma_reset_workaround = 1;
  49. module_param(dma_reset_workaround, int, 0644);
  50. MODULE_PARM_DESC(dma_reset_workaround, "periodic RiSC dma engine reset; 0-force disable, 1-driver detect (default), 2-force enable");
  51. static unsigned int debug;
  52. module_param(debug, int, 0644);
  53. MODULE_PARM_DESC(debug, "enable debug messages");
  54. static unsigned int card[] = {[0 ... (CX23885_MAXBOARDS - 1)] = UNSET };
  55. module_param_array(card, int, NULL, 0444);
  56. MODULE_PARM_DESC(card, "card type");
  57. #define dprintk(level, fmt, arg...)\
  58. do { if (debug >= level)\
  59. printk(KERN_DEBUG pr_fmt("%s: " fmt), \
  60. __func__, ##arg); \
  61. } while (0)
  62. static unsigned int cx23885_devcount;
  63. #define NO_SYNC_LINE (-1U)
  64. /* FIXME, these allocations will change when
  65. * analog arrives. The be reviewed.
  66. * CX23887 Assumptions
  67. * 1 line = 16 bytes of CDT
  68. * cmds size = 80
  69. * cdt size = 16 * linesize
  70. * iqsize = 64
  71. * maxlines = 6
  72. *
  73. * Address Space:
  74. * 0x00000000 0x00008fff FIFO clusters
  75. * 0x00010000 0x000104af Channel Management Data Structures
  76. * 0x000104b0 0x000104ff Free
  77. * 0x00010500 0x000108bf 15 channels * iqsize
  78. * 0x000108c0 0x000108ff Free
  79. * 0x00010900 0x00010e9f IQ's + Cluster Descriptor Tables
  80. * 15 channels * (iqsize + (maxlines * linesize))
  81. * 0x00010ea0 0x00010xxx Free
  82. */
  83. static struct sram_channel cx23885_sram_channels[] = {
  84. [SRAM_CH01] = {
  85. .name = "VID A",
  86. .cmds_start = 0x10000,
  87. .ctrl_start = 0x10380,
  88. .cdt = 0x104c0,
  89. .fifo_start = 0x40,
  90. .fifo_size = 0x2800,
  91. .ptr1_reg = DMA1_PTR1,
  92. .ptr2_reg = DMA1_PTR2,
  93. .cnt1_reg = DMA1_CNT1,
  94. .cnt2_reg = DMA1_CNT2,
  95. },
  96. [SRAM_CH02] = {
  97. .name = "ch2",
  98. .cmds_start = 0x0,
  99. .ctrl_start = 0x0,
  100. .cdt = 0x0,
  101. .fifo_start = 0x0,
  102. .fifo_size = 0x0,
  103. .ptr1_reg = DMA2_PTR1,
  104. .ptr2_reg = DMA2_PTR2,
  105. .cnt1_reg = DMA2_CNT1,
  106. .cnt2_reg = DMA2_CNT2,
  107. },
  108. [SRAM_CH03] = {
  109. .name = "TS1 B",
  110. .cmds_start = 0x100A0,
  111. .ctrl_start = 0x10400,
  112. .cdt = 0x10580,
  113. .fifo_start = 0x5000,
  114. .fifo_size = 0x1000,
  115. .ptr1_reg = DMA3_PTR1,
  116. .ptr2_reg = DMA3_PTR2,
  117. .cnt1_reg = DMA3_CNT1,
  118. .cnt2_reg = DMA3_CNT2,
  119. },
  120. [SRAM_CH04] = {
  121. .name = "ch4",
  122. .cmds_start = 0x0,
  123. .ctrl_start = 0x0,
  124. .cdt = 0x0,
  125. .fifo_start = 0x0,
  126. .fifo_size = 0x0,
  127. .ptr1_reg = DMA4_PTR1,
  128. .ptr2_reg = DMA4_PTR2,
  129. .cnt1_reg = DMA4_CNT1,
  130. .cnt2_reg = DMA4_CNT2,
  131. },
  132. [SRAM_CH05] = {
  133. .name = "ch5",
  134. .cmds_start = 0x0,
  135. .ctrl_start = 0x0,
  136. .cdt = 0x0,
  137. .fifo_start = 0x0,
  138. .fifo_size = 0x0,
  139. .ptr1_reg = DMA5_PTR1,
  140. .ptr2_reg = DMA5_PTR2,
  141. .cnt1_reg = DMA5_CNT1,
  142. .cnt2_reg = DMA5_CNT2,
  143. },
  144. [SRAM_CH06] = {
  145. .name = "TS2 C",
  146. .cmds_start = 0x10140,
  147. .ctrl_start = 0x10440,
  148. .cdt = 0x105e0,
  149. .fifo_start = 0x6000,
  150. .fifo_size = 0x1000,
  151. .ptr1_reg = DMA5_PTR1,
  152. .ptr2_reg = DMA5_PTR2,
  153. .cnt1_reg = DMA5_CNT1,
  154. .cnt2_reg = DMA5_CNT2,
  155. },
  156. [SRAM_CH07] = {
  157. .name = "TV Audio",
  158. .cmds_start = 0x10190,
  159. .ctrl_start = 0x10480,
  160. .cdt = 0x10a00,
  161. .fifo_start = 0x7000,
  162. .fifo_size = 0x1000,
  163. .ptr1_reg = DMA6_PTR1,
  164. .ptr2_reg = DMA6_PTR2,
  165. .cnt1_reg = DMA6_CNT1,
  166. .cnt2_reg = DMA6_CNT2,
  167. },
  168. [SRAM_CH08] = {
  169. .name = "ch8",
  170. .cmds_start = 0x0,
  171. .ctrl_start = 0x0,
  172. .cdt = 0x0,
  173. .fifo_start = 0x0,
  174. .fifo_size = 0x0,
  175. .ptr1_reg = DMA7_PTR1,
  176. .ptr2_reg = DMA7_PTR2,
  177. .cnt1_reg = DMA7_CNT1,
  178. .cnt2_reg = DMA7_CNT2,
  179. },
  180. [SRAM_CH09] = {
  181. .name = "ch9",
  182. .cmds_start = 0x0,
  183. .ctrl_start = 0x0,
  184. .cdt = 0x0,
  185. .fifo_start = 0x0,
  186. .fifo_size = 0x0,
  187. .ptr1_reg = DMA8_PTR1,
  188. .ptr2_reg = DMA8_PTR2,
  189. .cnt1_reg = DMA8_CNT1,
  190. .cnt2_reg = DMA8_CNT2,
  191. },
  192. };
  193. static struct sram_channel cx23887_sram_channels[] = {
  194. [SRAM_CH01] = {
  195. .name = "VID A",
  196. .cmds_start = 0x10000,
  197. .ctrl_start = 0x105b0,
  198. .cdt = 0x107b0,
  199. .fifo_start = 0x40,
  200. .fifo_size = 0x2800,
  201. .ptr1_reg = DMA1_PTR1,
  202. .ptr2_reg = DMA1_PTR2,
  203. .cnt1_reg = DMA1_CNT1,
  204. .cnt2_reg = DMA1_CNT2,
  205. },
  206. [SRAM_CH02] = {
  207. .name = "VID A (VBI)",
  208. .cmds_start = 0x10050,
  209. .ctrl_start = 0x105F0,
  210. .cdt = 0x10810,
  211. .fifo_start = 0x3000,
  212. .fifo_size = 0x1000,
  213. .ptr1_reg = DMA2_PTR1,
  214. .ptr2_reg = DMA2_PTR2,
  215. .cnt1_reg = DMA2_CNT1,
  216. .cnt2_reg = DMA2_CNT2,
  217. },
  218. [SRAM_CH03] = {
  219. .name = "TS1 B",
  220. .cmds_start = 0x100A0,
  221. .ctrl_start = 0x10630,
  222. .cdt = 0x10870,
  223. .fifo_start = 0x5000,
  224. .fifo_size = 0x1000,
  225. .ptr1_reg = DMA3_PTR1,
  226. .ptr2_reg = DMA3_PTR2,
  227. .cnt1_reg = DMA3_CNT1,
  228. .cnt2_reg = DMA3_CNT2,
  229. },
  230. [SRAM_CH04] = {
  231. .name = "ch4",
  232. .cmds_start = 0x0,
  233. .ctrl_start = 0x0,
  234. .cdt = 0x0,
  235. .fifo_start = 0x0,
  236. .fifo_size = 0x0,
  237. .ptr1_reg = DMA4_PTR1,
  238. .ptr2_reg = DMA4_PTR2,
  239. .cnt1_reg = DMA4_CNT1,
  240. .cnt2_reg = DMA4_CNT2,
  241. },
  242. [SRAM_CH05] = {
  243. .name = "ch5",
  244. .cmds_start = 0x0,
  245. .ctrl_start = 0x0,
  246. .cdt = 0x0,
  247. .fifo_start = 0x0,
  248. .fifo_size = 0x0,
  249. .ptr1_reg = DMA5_PTR1,
  250. .ptr2_reg = DMA5_PTR2,
  251. .cnt1_reg = DMA5_CNT1,
  252. .cnt2_reg = DMA5_CNT2,
  253. },
  254. [SRAM_CH06] = {
  255. .name = "TS2 C",
  256. .cmds_start = 0x10140,
  257. .ctrl_start = 0x10670,
  258. .cdt = 0x108d0,
  259. .fifo_start = 0x6000,
  260. .fifo_size = 0x1000,
  261. .ptr1_reg = DMA5_PTR1,
  262. .ptr2_reg = DMA5_PTR2,
  263. .cnt1_reg = DMA5_CNT1,
  264. .cnt2_reg = DMA5_CNT2,
  265. },
  266. [SRAM_CH07] = {
  267. .name = "TV Audio",
  268. .cmds_start = 0x10190,
  269. .ctrl_start = 0x106B0,
  270. .cdt = 0x10930,
  271. .fifo_start = 0x7000,
  272. .fifo_size = 0x1000,
  273. .ptr1_reg = DMA6_PTR1,
  274. .ptr2_reg = DMA6_PTR2,
  275. .cnt1_reg = DMA6_CNT1,
  276. .cnt2_reg = DMA6_CNT2,
  277. },
  278. [SRAM_CH08] = {
  279. .name = "ch8",
  280. .cmds_start = 0x0,
  281. .ctrl_start = 0x0,
  282. .cdt = 0x0,
  283. .fifo_start = 0x0,
  284. .fifo_size = 0x0,
  285. .ptr1_reg = DMA7_PTR1,
  286. .ptr2_reg = DMA7_PTR2,
  287. .cnt1_reg = DMA7_CNT1,
  288. .cnt2_reg = DMA7_CNT2,
  289. },
  290. [SRAM_CH09] = {
  291. .name = "ch9",
  292. .cmds_start = 0x0,
  293. .ctrl_start = 0x0,
  294. .cdt = 0x0,
  295. .fifo_start = 0x0,
  296. .fifo_size = 0x0,
  297. .ptr1_reg = DMA8_PTR1,
  298. .ptr2_reg = DMA8_PTR2,
  299. .cnt1_reg = DMA8_CNT1,
  300. .cnt2_reg = DMA8_CNT2,
  301. },
  302. };
  303. static void cx23885_irq_add(struct cx23885_dev *dev, u32 mask)
  304. {
  305. unsigned long flags;
  306. spin_lock_irqsave(&dev->pci_irqmask_lock, flags);
  307. dev->pci_irqmask |= mask;
  308. spin_unlock_irqrestore(&dev->pci_irqmask_lock, flags);
  309. }
  310. void cx23885_irq_add_enable(struct cx23885_dev *dev, u32 mask)
  311. {
  312. unsigned long flags;
  313. spin_lock_irqsave(&dev->pci_irqmask_lock, flags);
  314. dev->pci_irqmask |= mask;
  315. cx_set(PCI_INT_MSK, mask);
  316. spin_unlock_irqrestore(&dev->pci_irqmask_lock, flags);
  317. }
  318. void cx23885_irq_enable(struct cx23885_dev *dev, u32 mask)
  319. {
  320. u32 v;
  321. unsigned long flags;
  322. spin_lock_irqsave(&dev->pci_irqmask_lock, flags);
  323. v = mask & dev->pci_irqmask;
  324. if (v)
  325. cx_set(PCI_INT_MSK, v);
  326. spin_unlock_irqrestore(&dev->pci_irqmask_lock, flags);
  327. }
  328. static inline void cx23885_irq_enable_all(struct cx23885_dev *dev)
  329. {
  330. cx23885_irq_enable(dev, 0xffffffff);
  331. }
  332. void cx23885_irq_disable(struct cx23885_dev *dev, u32 mask)
  333. {
  334. unsigned long flags;
  335. spin_lock_irqsave(&dev->pci_irqmask_lock, flags);
  336. cx_clear(PCI_INT_MSK, mask);
  337. spin_unlock_irqrestore(&dev->pci_irqmask_lock, flags);
  338. }
  339. static inline void cx23885_irq_disable_all(struct cx23885_dev *dev)
  340. {
  341. cx23885_irq_disable(dev, 0xffffffff);
  342. }
  343. void cx23885_irq_remove(struct cx23885_dev *dev, u32 mask)
  344. {
  345. unsigned long flags;
  346. spin_lock_irqsave(&dev->pci_irqmask_lock, flags);
  347. dev->pci_irqmask &= ~mask;
  348. cx_clear(PCI_INT_MSK, mask);
  349. spin_unlock_irqrestore(&dev->pci_irqmask_lock, flags);
  350. }
  351. static u32 cx23885_irq_get_mask(struct cx23885_dev *dev)
  352. {
  353. u32 v;
  354. unsigned long flags;
  355. spin_lock_irqsave(&dev->pci_irqmask_lock, flags);
  356. v = cx_read(PCI_INT_MSK);
  357. spin_unlock_irqrestore(&dev->pci_irqmask_lock, flags);
  358. return v;
  359. }
  360. static int cx23885_risc_decode(u32 risc)
  361. {
  362. static char *instr[16] = {
  363. [RISC_SYNC >> 28] = "sync",
  364. [RISC_WRITE >> 28] = "write",
  365. [RISC_WRITEC >> 28] = "writec",
  366. [RISC_READ >> 28] = "read",
  367. [RISC_READC >> 28] = "readc",
  368. [RISC_JUMP >> 28] = "jump",
  369. [RISC_SKIP >> 28] = "skip",
  370. [RISC_WRITERM >> 28] = "writerm",
  371. [RISC_WRITECM >> 28] = "writecm",
  372. [RISC_WRITECR >> 28] = "writecr",
  373. };
  374. static int incr[16] = {
  375. [RISC_WRITE >> 28] = 3,
  376. [RISC_JUMP >> 28] = 3,
  377. [RISC_SKIP >> 28] = 1,
  378. [RISC_SYNC >> 28] = 1,
  379. [RISC_WRITERM >> 28] = 3,
  380. [RISC_WRITECM >> 28] = 3,
  381. [RISC_WRITECR >> 28] = 4,
  382. };
  383. static char *bits[] = {
  384. "12", "13", "14", "resync",
  385. "cnt0", "cnt1", "18", "19",
  386. "20", "21", "22", "23",
  387. "irq1", "irq2", "eol", "sol",
  388. };
  389. int i;
  390. printk(KERN_DEBUG "0x%08x [ %s", risc,
  391. instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
  392. for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--)
  393. if (risc & (1 << (i + 12)))
  394. pr_cont(" %s", bits[i]);
  395. pr_cont(" count=%d ]\n", risc & 0xfff);
  396. return incr[risc >> 28] ? incr[risc >> 28] : 1;
  397. }
  398. static void cx23885_wakeup(struct cx23885_tsport *port,
  399. struct cx23885_dmaqueue *q, u32 count)
  400. {
  401. struct cx23885_buffer *buf;
  402. int count_delta;
  403. int max_buf_done = 5; /* service maximum five buffers */
  404. do {
  405. if (list_empty(&q->active))
  406. return;
  407. buf = list_entry(q->active.next,
  408. struct cx23885_buffer, queue);
  409. buf->vb.vb2_buf.timestamp = ktime_get_ns();
  410. buf->vb.sequence = q->count++;
  411. if (count != (q->count % 65536)) {
  412. dprintk(1, "[%p/%d] wakeup reg=%d buf=%d\n", buf,
  413. buf->vb.vb2_buf.index, count, q->count);
  414. } else {
  415. dprintk(7, "[%p/%d] wakeup reg=%d buf=%d\n", buf,
  416. buf->vb.vb2_buf.index, count, q->count);
  417. }
  418. list_del(&buf->queue);
  419. vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
  420. max_buf_done--;
  421. /* count register is 16 bits so apply modulo appropriately */
  422. count_delta = ((int)count - (int)(q->count % 65536));
  423. } while ((count_delta > 0) && (max_buf_done > 0));
  424. }
  425. int cx23885_sram_channel_setup(struct cx23885_dev *dev,
  426. struct sram_channel *ch,
  427. unsigned int bpl, u32 risc)
  428. {
  429. unsigned int i, lines;
  430. u32 cdt;
  431. if (ch->cmds_start == 0) {
  432. dprintk(1, "%s() Erasing channel [%s]\n", __func__,
  433. ch->name);
  434. cx_write(ch->ptr1_reg, 0);
  435. cx_write(ch->ptr2_reg, 0);
  436. cx_write(ch->cnt2_reg, 0);
  437. cx_write(ch->cnt1_reg, 0);
  438. return 0;
  439. } else {
  440. dprintk(1, "%s() Configuring channel [%s]\n", __func__,
  441. ch->name);
  442. }
  443. bpl = (bpl + 7) & ~7; /* alignment */
  444. cdt = ch->cdt;
  445. lines = ch->fifo_size / bpl;
  446. if (lines > 6)
  447. lines = 6;
  448. BUG_ON(lines < 2);
  449. cx_write(8 + 0, RISC_JUMP | RISC_CNT_RESET);
  450. cx_write(8 + 4, 12);
  451. cx_write(8 + 8, 0);
  452. /* write CDT */
  453. for (i = 0; i < lines; i++) {
  454. dprintk(2, "%s() 0x%08x <- 0x%08x\n", __func__, cdt + 16*i,
  455. ch->fifo_start + bpl*i);
  456. cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
  457. cx_write(cdt + 16*i + 4, 0);
  458. cx_write(cdt + 16*i + 8, 0);
  459. cx_write(cdt + 16*i + 12, 0);
  460. }
  461. /* write CMDS */
  462. if (ch->jumponly)
  463. cx_write(ch->cmds_start + 0, 8);
  464. else
  465. cx_write(ch->cmds_start + 0, risc);
  466. cx_write(ch->cmds_start + 4, 0); /* 64 bits 63-32 */
  467. cx_write(ch->cmds_start + 8, cdt);
  468. cx_write(ch->cmds_start + 12, (lines*16) >> 3);
  469. cx_write(ch->cmds_start + 16, ch->ctrl_start);
  470. if (ch->jumponly)
  471. cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
  472. else
  473. cx_write(ch->cmds_start + 20, 64 >> 2);
  474. for (i = 24; i < 80; i += 4)
  475. cx_write(ch->cmds_start + i, 0);
  476. /* fill registers */
  477. cx_write(ch->ptr1_reg, ch->fifo_start);
  478. cx_write(ch->ptr2_reg, cdt);
  479. cx_write(ch->cnt2_reg, (lines*16) >> 3);
  480. cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
  481. dprintk(2, "[bridge %d] sram setup %s: bpl=%d lines=%d\n",
  482. dev->bridge,
  483. ch->name,
  484. bpl,
  485. lines);
  486. return 0;
  487. }
  488. void cx23885_sram_channel_dump(struct cx23885_dev *dev,
  489. struct sram_channel *ch)
  490. {
  491. static char *name[] = {
  492. "init risc lo",
  493. "init risc hi",
  494. "cdt base",
  495. "cdt size",
  496. "iq base",
  497. "iq size",
  498. "risc pc lo",
  499. "risc pc hi",
  500. "iq wr ptr",
  501. "iq rd ptr",
  502. "cdt current",
  503. "pci target lo",
  504. "pci target hi",
  505. "line / byte",
  506. };
  507. u32 risc;
  508. unsigned int i, j, n;
  509. pr_warn("%s: %s - dma channel status dump\n",
  510. dev->name, ch->name);
  511. for (i = 0; i < ARRAY_SIZE(name); i++)
  512. pr_warn("%s: cmds: %-15s: 0x%08x\n",
  513. dev->name, name[i],
  514. cx_read(ch->cmds_start + 4*i));
  515. for (i = 0; i < 4; i++) {
  516. risc = cx_read(ch->cmds_start + 4 * (i + 14));
  517. pr_warn("%s: risc%d: ", dev->name, i);
  518. cx23885_risc_decode(risc);
  519. }
  520. for (i = 0; i < (64 >> 2); i += n) {
  521. risc = cx_read(ch->ctrl_start + 4 * i);
  522. /* No consideration for bits 63-32 */
  523. pr_warn("%s: (0x%08x) iq %x: ", dev->name,
  524. ch->ctrl_start + 4 * i, i);
  525. n = cx23885_risc_decode(risc);
  526. for (j = 1; j < n; j++) {
  527. risc = cx_read(ch->ctrl_start + 4 * (i + j));
  528. pr_warn("%s: iq %x: 0x%08x [ arg #%d ]\n",
  529. dev->name, i+j, risc, j);
  530. }
  531. }
  532. pr_warn("%s: fifo: 0x%08x -> 0x%x\n",
  533. dev->name, ch->fifo_start, ch->fifo_start+ch->fifo_size);
  534. pr_warn("%s: ctrl: 0x%08x -> 0x%x\n",
  535. dev->name, ch->ctrl_start, ch->ctrl_start + 6*16);
  536. pr_warn("%s: ptr1_reg: 0x%08x\n",
  537. dev->name, cx_read(ch->ptr1_reg));
  538. pr_warn("%s: ptr2_reg: 0x%08x\n",
  539. dev->name, cx_read(ch->ptr2_reg));
  540. pr_warn("%s: cnt1_reg: 0x%08x\n",
  541. dev->name, cx_read(ch->cnt1_reg));
  542. pr_warn("%s: cnt2_reg: 0x%08x\n",
  543. dev->name, cx_read(ch->cnt2_reg));
  544. }
  545. static void cx23885_risc_disasm(struct cx23885_tsport *port,
  546. struct cx23885_riscmem *risc)
  547. {
  548. struct cx23885_dev *dev = port->dev;
  549. unsigned int i, j, n;
  550. pr_info("%s: risc disasm: %p [dma=0x%08lx]\n",
  551. dev->name, risc->cpu, (unsigned long)risc->dma);
  552. for (i = 0; i < (risc->size >> 2); i += n) {
  553. pr_info("%s: %04d: ", dev->name, i);
  554. n = cx23885_risc_decode(le32_to_cpu(risc->cpu[i]));
  555. for (j = 1; j < n; j++)
  556. pr_info("%s: %04d: 0x%08x [ arg #%d ]\n",
  557. dev->name, i + j, risc->cpu[i + j], j);
  558. if (risc->cpu[i] == cpu_to_le32(RISC_JUMP))
  559. break;
  560. }
  561. }
  562. static void cx23885_clear_bridge_error(struct cx23885_dev *dev)
  563. {
  564. uint32_t reg1_val, reg2_val;
  565. if (!dev->need_dma_reset)
  566. return;
  567. reg1_val = cx_read(TC_REQ); /* read-only */
  568. reg2_val = cx_read(TC_REQ_SET);
  569. if (reg1_val && reg2_val) {
  570. cx_write(TC_REQ, reg1_val);
  571. cx_write(TC_REQ_SET, reg2_val);
  572. cx_read(VID_B_DMA);
  573. cx_read(VBI_B_DMA);
  574. cx_read(VID_C_DMA);
  575. cx_read(VBI_C_DMA);
  576. dev_info(&dev->pci->dev,
  577. "dma in progress detected 0x%08x 0x%08x, clearing\n",
  578. reg1_val, reg2_val);
  579. }
  580. }
  581. static void cx23885_shutdown(struct cx23885_dev *dev)
  582. {
  583. /* disable RISC controller */
  584. cx_write(DEV_CNTRL2, 0);
  585. /* Disable all IR activity */
  586. cx_write(IR_CNTRL_REG, 0);
  587. /* Disable Video A/B activity */
  588. cx_write(VID_A_DMA_CTL, 0);
  589. cx_write(VID_B_DMA_CTL, 0);
  590. cx_write(VID_C_DMA_CTL, 0);
  591. /* Disable Audio activity */
  592. cx_write(AUD_INT_DMA_CTL, 0);
  593. cx_write(AUD_EXT_DMA_CTL, 0);
  594. /* Disable Serial port */
  595. cx_write(UART_CTL, 0);
  596. /* Disable Interrupts */
  597. cx23885_irq_disable_all(dev);
  598. cx_write(VID_A_INT_MSK, 0);
  599. cx_write(VID_B_INT_MSK, 0);
  600. cx_write(VID_C_INT_MSK, 0);
  601. cx_write(AUDIO_INT_INT_MSK, 0);
  602. cx_write(AUDIO_EXT_INT_MSK, 0);
  603. }
  604. static void cx23885_reset(struct cx23885_dev *dev)
  605. {
  606. dprintk(1, "%s()\n", __func__);
  607. cx23885_shutdown(dev);
  608. cx_write(PCI_INT_STAT, 0xffffffff);
  609. cx_write(VID_A_INT_STAT, 0xffffffff);
  610. cx_write(VID_B_INT_STAT, 0xffffffff);
  611. cx_write(VID_C_INT_STAT, 0xffffffff);
  612. cx_write(AUDIO_INT_INT_STAT, 0xffffffff);
  613. cx_write(AUDIO_EXT_INT_STAT, 0xffffffff);
  614. cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
  615. cx_write(PAD_CTRL, 0x00500300);
  616. /* clear dma in progress */
  617. cx23885_clear_bridge_error(dev);
  618. msleep(100);
  619. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH01],
  620. 720*4, 0);
  621. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH02], 128, 0);
  622. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH03],
  623. 188*4, 0);
  624. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH04], 128, 0);
  625. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH05], 128, 0);
  626. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH06],
  627. 188*4, 0);
  628. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH07], 128, 0);
  629. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH08], 128, 0);
  630. cx23885_sram_channel_setup(dev, &dev->sram_channels[SRAM_CH09], 128, 0);
  631. cx23885_gpio_setup(dev);
  632. cx23885_irq_get_mask(dev);
  633. /* clear dma in progress */
  634. cx23885_clear_bridge_error(dev);
  635. }
  636. static int cx23885_pci_quirks(struct cx23885_dev *dev)
  637. {
  638. dprintk(1, "%s()\n", __func__);
  639. /* The cx23885 bridge has a weird bug which causes NMI to be asserted
  640. * when DMA begins if RDR_TLCTL0 bit4 is not cleared. It does not
  641. * occur on the cx23887 bridge.
  642. */
  643. if (dev->bridge == CX23885_BRIDGE_885)
  644. cx_clear(RDR_TLCTL0, 1 << 4);
  645. /* clear dma in progress */
  646. cx23885_clear_bridge_error(dev);
  647. return 0;
  648. }
  649. static int get_resources(struct cx23885_dev *dev)
  650. {
  651. if (request_mem_region(pci_resource_start(dev->pci, 0),
  652. pci_resource_len(dev->pci, 0),
  653. dev->name))
  654. return 0;
  655. pr_err("%s: can't get MMIO memory @ 0x%llx\n",
  656. dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
  657. return -EBUSY;
  658. }
  659. static int cx23885_init_tsport(struct cx23885_dev *dev,
  660. struct cx23885_tsport *port, int portno)
  661. {
  662. dprintk(1, "%s(portno=%d)\n", __func__, portno);
  663. /* Transport bus init dma queue - Common settings */
  664. port->dma_ctl_val = 0x11; /* Enable RISC controller and Fifo */
  665. port->ts_int_msk_val = 0x1111; /* TS port bits for RISC */
  666. port->vld_misc_val = 0x0;
  667. port->hw_sop_ctrl_val = (0x47 << 16 | 188 << 4);
  668. spin_lock_init(&port->slock);
  669. port->dev = dev;
  670. port->nr = portno;
  671. INIT_LIST_HEAD(&port->mpegq.active);
  672. mutex_init(&port->frontends.lock);
  673. INIT_LIST_HEAD(&port->frontends.felist);
  674. port->frontends.active_fe_id = 0;
  675. /* This should be hardcoded allow a single frontend
  676. * attachment to this tsport, keeping the -dvb.c
  677. * code clean and safe.
  678. */
  679. if (!port->num_frontends)
  680. port->num_frontends = 1;
  681. switch (portno) {
  682. case 1:
  683. port->reg_gpcnt = VID_B_GPCNT;
  684. port->reg_gpcnt_ctl = VID_B_GPCNT_CTL;
  685. port->reg_dma_ctl = VID_B_DMA_CTL;
  686. port->reg_lngth = VID_B_LNGTH;
  687. port->reg_hw_sop_ctrl = VID_B_HW_SOP_CTL;
  688. port->reg_gen_ctrl = VID_B_GEN_CTL;
  689. port->reg_bd_pkt_status = VID_B_BD_PKT_STATUS;
  690. port->reg_sop_status = VID_B_SOP_STATUS;
  691. port->reg_fifo_ovfl_stat = VID_B_FIFO_OVFL_STAT;
  692. port->reg_vld_misc = VID_B_VLD_MISC;
  693. port->reg_ts_clk_en = VID_B_TS_CLK_EN;
  694. port->reg_src_sel = VID_B_SRC_SEL;
  695. port->reg_ts_int_msk = VID_B_INT_MSK;
  696. port->reg_ts_int_stat = VID_B_INT_STAT;
  697. port->sram_chno = SRAM_CH03; /* VID_B */
  698. port->pci_irqmask = 0x02; /* VID_B bit1 */
  699. break;
  700. case 2:
  701. port->reg_gpcnt = VID_C_GPCNT;
  702. port->reg_gpcnt_ctl = VID_C_GPCNT_CTL;
  703. port->reg_dma_ctl = VID_C_DMA_CTL;
  704. port->reg_lngth = VID_C_LNGTH;
  705. port->reg_hw_sop_ctrl = VID_C_HW_SOP_CTL;
  706. port->reg_gen_ctrl = VID_C_GEN_CTL;
  707. port->reg_bd_pkt_status = VID_C_BD_PKT_STATUS;
  708. port->reg_sop_status = VID_C_SOP_STATUS;
  709. port->reg_fifo_ovfl_stat = VID_C_FIFO_OVFL_STAT;
  710. port->reg_vld_misc = VID_C_VLD_MISC;
  711. port->reg_ts_clk_en = VID_C_TS_CLK_EN;
  712. port->reg_src_sel = 0;
  713. port->reg_ts_int_msk = VID_C_INT_MSK;
  714. port->reg_ts_int_stat = VID_C_INT_STAT;
  715. port->sram_chno = SRAM_CH06; /* VID_C */
  716. port->pci_irqmask = 0x04; /* VID_C bit2 */
  717. break;
  718. default:
  719. BUG();
  720. }
  721. return 0;
  722. }
  723. static void cx23885_dev_checkrevision(struct cx23885_dev *dev)
  724. {
  725. switch (cx_read(RDR_CFG2) & 0xff) {
  726. case 0x00:
  727. /* cx23885 */
  728. dev->hwrevision = 0xa0;
  729. break;
  730. case 0x01:
  731. /* CX23885-12Z */
  732. dev->hwrevision = 0xa1;
  733. break;
  734. case 0x02:
  735. /* CX23885-13Z/14Z */
  736. dev->hwrevision = 0xb0;
  737. break;
  738. case 0x03:
  739. if (dev->pci->device == 0x8880) {
  740. /* CX23888-21Z/22Z */
  741. dev->hwrevision = 0xc0;
  742. } else {
  743. /* CX23885-14Z */
  744. dev->hwrevision = 0xa4;
  745. }
  746. break;
  747. case 0x04:
  748. if (dev->pci->device == 0x8880) {
  749. /* CX23888-31Z */
  750. dev->hwrevision = 0xd0;
  751. } else {
  752. /* CX23885-15Z, CX23888-31Z */
  753. dev->hwrevision = 0xa5;
  754. }
  755. break;
  756. case 0x0e:
  757. /* CX23887-15Z */
  758. dev->hwrevision = 0xc0;
  759. break;
  760. case 0x0f:
  761. /* CX23887-14Z */
  762. dev->hwrevision = 0xb1;
  763. break;
  764. default:
  765. pr_err("%s() New hardware revision found 0x%x\n",
  766. __func__, dev->hwrevision);
  767. }
  768. if (dev->hwrevision)
  769. pr_info("%s() Hardware revision = 0x%02x\n",
  770. __func__, dev->hwrevision);
  771. else
  772. pr_err("%s() Hardware revision unknown 0x%x\n",
  773. __func__, dev->hwrevision);
  774. }
  775. /* Find the first v4l2_subdev member of the group id in hw */
  776. struct v4l2_subdev *cx23885_find_hw(struct cx23885_dev *dev, u32 hw)
  777. {
  778. struct v4l2_subdev *result = NULL;
  779. struct v4l2_subdev *sd;
  780. spin_lock(&dev->v4l2_dev.lock);
  781. v4l2_device_for_each_subdev(sd, &dev->v4l2_dev) {
  782. if (sd->grp_id == hw) {
  783. result = sd;
  784. break;
  785. }
  786. }
  787. spin_unlock(&dev->v4l2_dev.lock);
  788. return result;
  789. }
  790. static int cx23885_dev_setup(struct cx23885_dev *dev)
  791. {
  792. int i;
  793. spin_lock_init(&dev->pci_irqmask_lock);
  794. spin_lock_init(&dev->slock);
  795. mutex_init(&dev->lock);
  796. mutex_init(&dev->gpio_lock);
  797. atomic_inc(&dev->refcount);
  798. dev->nr = cx23885_devcount++;
  799. sprintf(dev->name, "cx23885[%d]", dev->nr);
  800. /* Configure the internal memory */
  801. if (dev->pci->device == 0x8880) {
  802. /* Could be 887 or 888, assume an 888 default */
  803. dev->bridge = CX23885_BRIDGE_888;
  804. /* Apply a sensible clock frequency for the PCIe bridge */
  805. dev->clk_freq = 50000000;
  806. dev->sram_channels = cx23887_sram_channels;
  807. } else
  808. if (dev->pci->device == 0x8852) {
  809. dev->bridge = CX23885_BRIDGE_885;
  810. /* Apply a sensible clock frequency for the PCIe bridge */
  811. dev->clk_freq = 28000000;
  812. dev->sram_channels = cx23885_sram_channels;
  813. } else
  814. BUG();
  815. dprintk(1, "%s() Memory configured for PCIe bridge type %d\n",
  816. __func__, dev->bridge);
  817. /* board config */
  818. dev->board = UNSET;
  819. if (card[dev->nr] < cx23885_bcount)
  820. dev->board = card[dev->nr];
  821. for (i = 0; UNSET == dev->board && i < cx23885_idcount; i++)
  822. if (dev->pci->subsystem_vendor == cx23885_subids[i].subvendor &&
  823. dev->pci->subsystem_device == cx23885_subids[i].subdevice)
  824. dev->board = cx23885_subids[i].card;
  825. if (UNSET == dev->board) {
  826. dev->board = CX23885_BOARD_UNKNOWN;
  827. cx23885_card_list(dev);
  828. }
  829. if (dev->pci->device == 0x8852) {
  830. /* no DIF on cx23885, so no analog tuner support possible */
  831. if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC)
  832. dev->board = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885;
  833. else if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_DVB)
  834. dev->board = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885;
  835. }
  836. /* If the user specific a clk freq override, apply it */
  837. if (cx23885_boards[dev->board].clk_freq > 0)
  838. dev->clk_freq = cx23885_boards[dev->board].clk_freq;
  839. if (dev->board == CX23885_BOARD_HAUPPAUGE_IMPACTVCBE &&
  840. dev->pci->subsystem_device == 0x7137) {
  841. /* Hauppauge ImpactVCBe device ID 0x7137 is populated
  842. * with an 888, and a 25Mhz crystal, instead of the
  843. * usual third overtone 50Mhz. The default clock rate must
  844. * be overridden so the cx25840 is properly configured
  845. */
  846. dev->clk_freq = 25000000;
  847. }
  848. dev->pci_bus = dev->pci->bus->number;
  849. dev->pci_slot = PCI_SLOT(dev->pci->devfn);
  850. cx23885_irq_add(dev, 0x001f00);
  851. /* External Master 1 Bus */
  852. dev->i2c_bus[0].nr = 0;
  853. dev->i2c_bus[0].dev = dev;
  854. dev->i2c_bus[0].reg_stat = I2C1_STAT;
  855. dev->i2c_bus[0].reg_ctrl = I2C1_CTRL;
  856. dev->i2c_bus[0].reg_addr = I2C1_ADDR;
  857. dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
  858. dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
  859. dev->i2c_bus[0].i2c_period = (0x9d << 24); /* 100kHz */
  860. /* External Master 2 Bus */
  861. dev->i2c_bus[1].nr = 1;
  862. dev->i2c_bus[1].dev = dev;
  863. dev->i2c_bus[1].reg_stat = I2C2_STAT;
  864. dev->i2c_bus[1].reg_ctrl = I2C2_CTRL;
  865. dev->i2c_bus[1].reg_addr = I2C2_ADDR;
  866. dev->i2c_bus[1].reg_rdata = I2C2_RDATA;
  867. dev->i2c_bus[1].reg_wdata = I2C2_WDATA;
  868. dev->i2c_bus[1].i2c_period = (0x9d << 24); /* 100kHz */
  869. /* Internal Master 3 Bus */
  870. dev->i2c_bus[2].nr = 2;
  871. dev->i2c_bus[2].dev = dev;
  872. dev->i2c_bus[2].reg_stat = I2C3_STAT;
  873. dev->i2c_bus[2].reg_ctrl = I2C3_CTRL;
  874. dev->i2c_bus[2].reg_addr = I2C3_ADDR;
  875. dev->i2c_bus[2].reg_rdata = I2C3_RDATA;
  876. dev->i2c_bus[2].reg_wdata = I2C3_WDATA;
  877. dev->i2c_bus[2].i2c_period = (0x07 << 24); /* 1.95MHz */
  878. if ((cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) ||
  879. (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER))
  880. cx23885_init_tsport(dev, &dev->ts1, 1);
  881. if ((cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) ||
  882. (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER))
  883. cx23885_init_tsport(dev, &dev->ts2, 2);
  884. if (get_resources(dev) < 0) {
  885. pr_err("CORE %s No more PCIe resources for subsystem: %04x:%04x\n",
  886. dev->name, dev->pci->subsystem_vendor,
  887. dev->pci->subsystem_device);
  888. cx23885_devcount--;
  889. return -ENODEV;
  890. }
  891. /* PCIe stuff */
  892. dev->lmmio = ioremap(pci_resource_start(dev->pci, 0),
  893. pci_resource_len(dev->pci, 0));
  894. dev->bmmio = (u8 __iomem *)dev->lmmio;
  895. pr_info("CORE %s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
  896. dev->name, dev->pci->subsystem_vendor,
  897. dev->pci->subsystem_device, cx23885_boards[dev->board].name,
  898. dev->board, card[dev->nr] == dev->board ?
  899. "insmod option" : "autodetected");
  900. cx23885_pci_quirks(dev);
  901. /* Assume some sensible defaults */
  902. dev->tuner_type = cx23885_boards[dev->board].tuner_type;
  903. dev->tuner_addr = cx23885_boards[dev->board].tuner_addr;
  904. dev->tuner_bus = cx23885_boards[dev->board].tuner_bus;
  905. dev->radio_type = cx23885_boards[dev->board].radio_type;
  906. dev->radio_addr = cx23885_boards[dev->board].radio_addr;
  907. dprintk(1, "%s() tuner_type = 0x%x tuner_addr = 0x%x tuner_bus = %d\n",
  908. __func__, dev->tuner_type, dev->tuner_addr, dev->tuner_bus);
  909. dprintk(1, "%s() radio_type = 0x%x radio_addr = 0x%x\n",
  910. __func__, dev->radio_type, dev->radio_addr);
  911. /* The cx23417 encoder has GPIO's that need to be initialised
  912. * before DVB, so that demodulators and tuners are out of
  913. * reset before DVB uses them.
  914. */
  915. if ((cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) ||
  916. (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER))
  917. cx23885_mc417_init(dev);
  918. /* init hardware */
  919. cx23885_reset(dev);
  920. cx23885_i2c_register(&dev->i2c_bus[0]);
  921. cx23885_i2c_register(&dev->i2c_bus[1]);
  922. cx23885_i2c_register(&dev->i2c_bus[2]);
  923. cx23885_card_setup(dev);
  924. call_all(dev, tuner, standby);
  925. cx23885_ir_init(dev);
  926. if (dev->board == CX23885_BOARD_VIEWCAST_460E) {
  927. /*
  928. * GPIOs 9/8 are input detection bits for the breakout video
  929. * (gpio 8) and audio (gpio 9) cables. When they're attached,
  930. * this gpios are pulled high. Make sure these GPIOs are marked
  931. * as inputs.
  932. */
  933. cx23885_gpio_enable(dev, 0x300, 0);
  934. }
  935. if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO) {
  936. if (cx23885_video_register(dev) < 0) {
  937. pr_err("%s() Failed to register analog video adapters on VID_A\n",
  938. __func__);
  939. }
  940. }
  941. if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
  942. if (cx23885_boards[dev->board].num_fds_portb)
  943. dev->ts1.num_frontends =
  944. cx23885_boards[dev->board].num_fds_portb;
  945. if (cx23885_dvb_register(&dev->ts1) < 0) {
  946. pr_err("%s() Failed to register dvb adapters on VID_B\n",
  947. __func__);
  948. }
  949. } else
  950. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
  951. if (cx23885_417_register(dev) < 0) {
  952. pr_err("%s() Failed to register 417 on VID_B\n",
  953. __func__);
  954. }
  955. }
  956. if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
  957. if (cx23885_boards[dev->board].num_fds_portc)
  958. dev->ts2.num_frontends =
  959. cx23885_boards[dev->board].num_fds_portc;
  960. if (cx23885_dvb_register(&dev->ts2) < 0) {
  961. pr_err("%s() Failed to register dvb on VID_C\n",
  962. __func__);
  963. }
  964. } else
  965. if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER) {
  966. if (cx23885_417_register(dev) < 0) {
  967. pr_err("%s() Failed to register 417 on VID_C\n",
  968. __func__);
  969. }
  970. }
  971. cx23885_dev_checkrevision(dev);
  972. /* disable MSI for NetUP cards, otherwise CI is not working */
  973. if (cx23885_boards[dev->board].ci_type > 0)
  974. cx_clear(RDR_RDRCTL1, 1 << 8);
  975. switch (dev->board) {
  976. case CX23885_BOARD_TEVII_S470:
  977. case CX23885_BOARD_TEVII_S471:
  978. cx_clear(RDR_RDRCTL1, 1 << 8);
  979. break;
  980. }
  981. return 0;
  982. }
  983. static void cx23885_dev_unregister(struct cx23885_dev *dev)
  984. {
  985. release_mem_region(pci_resource_start(dev->pci, 0),
  986. pci_resource_len(dev->pci, 0));
  987. if (!atomic_dec_and_test(&dev->refcount))
  988. return;
  989. if (cx23885_boards[dev->board].porta == CX23885_ANALOG_VIDEO)
  990. cx23885_video_unregister(dev);
  991. if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
  992. cx23885_dvb_unregister(&dev->ts1);
  993. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
  994. cx23885_417_unregister(dev);
  995. if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB)
  996. cx23885_dvb_unregister(&dev->ts2);
  997. if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER)
  998. cx23885_417_unregister(dev);
  999. cx23885_i2c_unregister(&dev->i2c_bus[2]);
  1000. cx23885_i2c_unregister(&dev->i2c_bus[1]);
  1001. cx23885_i2c_unregister(&dev->i2c_bus[0]);
  1002. iounmap(dev->lmmio);
  1003. }
  1004. static __le32 *cx23885_risc_field(__le32 *rp, struct scatterlist *sglist,
  1005. unsigned int offset, u32 sync_line,
  1006. unsigned int bpl, unsigned int padding,
  1007. unsigned int lines, unsigned int lpi, bool jump)
  1008. {
  1009. struct scatterlist *sg;
  1010. unsigned int line, todo, sol;
  1011. if (jump) {
  1012. *(rp++) = cpu_to_le32(RISC_JUMP);
  1013. *(rp++) = cpu_to_le32(0);
  1014. *(rp++) = cpu_to_le32(0); /* bits 63-32 */
  1015. }
  1016. /* sync instruction */
  1017. if (sync_line != NO_SYNC_LINE)
  1018. *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
  1019. /* scan lines */
  1020. sg = sglist;
  1021. for (line = 0; line < lines; line++) {
  1022. while (offset && offset >= sg_dma_len(sg)) {
  1023. offset -= sg_dma_len(sg);
  1024. sg = sg_next(sg);
  1025. }
  1026. if (lpi && line > 0 && !(line % lpi))
  1027. sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
  1028. else
  1029. sol = RISC_SOL;
  1030. if (bpl <= sg_dma_len(sg)-offset) {
  1031. /* fits into current chunk */
  1032. *(rp++) = cpu_to_le32(RISC_WRITE|sol|RISC_EOL|bpl);
  1033. *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
  1034. *(rp++) = cpu_to_le32(0); /* bits 63-32 */
  1035. offset += bpl;
  1036. } else {
  1037. /* scanline needs to be split */
  1038. todo = bpl;
  1039. *(rp++) = cpu_to_le32(RISC_WRITE|sol|
  1040. (sg_dma_len(sg)-offset));
  1041. *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
  1042. *(rp++) = cpu_to_le32(0); /* bits 63-32 */
  1043. todo -= (sg_dma_len(sg)-offset);
  1044. offset = 0;
  1045. sg = sg_next(sg);
  1046. while (todo > sg_dma_len(sg)) {
  1047. *(rp++) = cpu_to_le32(RISC_WRITE|
  1048. sg_dma_len(sg));
  1049. *(rp++) = cpu_to_le32(sg_dma_address(sg));
  1050. *(rp++) = cpu_to_le32(0); /* bits 63-32 */
  1051. todo -= sg_dma_len(sg);
  1052. sg = sg_next(sg);
  1053. }
  1054. *(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
  1055. *(rp++) = cpu_to_le32(sg_dma_address(sg));
  1056. *(rp++) = cpu_to_le32(0); /* bits 63-32 */
  1057. offset += todo;
  1058. }
  1059. offset += padding;
  1060. }
  1061. return rp;
  1062. }
  1063. int cx23885_risc_buffer(struct pci_dev *pci, struct cx23885_riscmem *risc,
  1064. struct scatterlist *sglist, unsigned int top_offset,
  1065. unsigned int bottom_offset, unsigned int bpl,
  1066. unsigned int padding, unsigned int lines)
  1067. {
  1068. u32 instructions, fields;
  1069. __le32 *rp;
  1070. fields = 0;
  1071. if (UNSET != top_offset)
  1072. fields++;
  1073. if (UNSET != bottom_offset)
  1074. fields++;
  1075. /* estimate risc mem: worst case is one write per page border +
  1076. one write per scan line + syncs + jump (all 2 dwords). Padding
  1077. can cause next bpl to start close to a page border. First DMA
  1078. region may be smaller than PAGE_SIZE */
  1079. /* write and jump need and extra dword */
  1080. instructions = fields * (1 + ((bpl + padding) * lines)
  1081. / PAGE_SIZE + lines);
  1082. instructions += 5;
  1083. risc->size = instructions * 12;
  1084. risc->cpu = pci_alloc_consistent(pci, risc->size, &risc->dma);
  1085. if (risc->cpu == NULL)
  1086. return -ENOMEM;
  1087. /* write risc instructions */
  1088. rp = risc->cpu;
  1089. if (UNSET != top_offset)
  1090. rp = cx23885_risc_field(rp, sglist, top_offset, 0,
  1091. bpl, padding, lines, 0, true);
  1092. if (UNSET != bottom_offset)
  1093. rp = cx23885_risc_field(rp, sglist, bottom_offset, 0x200,
  1094. bpl, padding, lines, 0, UNSET == top_offset);
  1095. /* save pointer to jmp instruction address */
  1096. risc->jmp = rp;
  1097. BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
  1098. return 0;
  1099. }
  1100. int cx23885_risc_databuffer(struct pci_dev *pci,
  1101. struct cx23885_riscmem *risc,
  1102. struct scatterlist *sglist,
  1103. unsigned int bpl,
  1104. unsigned int lines, unsigned int lpi)
  1105. {
  1106. u32 instructions;
  1107. __le32 *rp;
  1108. /* estimate risc mem: worst case is one write per page border +
  1109. one write per scan line + syncs + jump (all 2 dwords). Here
  1110. there is no padding and no sync. First DMA region may be smaller
  1111. than PAGE_SIZE */
  1112. /* Jump and write need an extra dword */
  1113. instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
  1114. instructions += 4;
  1115. risc->size = instructions * 12;
  1116. risc->cpu = pci_alloc_consistent(pci, risc->size, &risc->dma);
  1117. if (risc->cpu == NULL)
  1118. return -ENOMEM;
  1119. /* write risc instructions */
  1120. rp = risc->cpu;
  1121. rp = cx23885_risc_field(rp, sglist, 0, NO_SYNC_LINE,
  1122. bpl, 0, lines, lpi, lpi == 0);
  1123. /* save pointer to jmp instruction address */
  1124. risc->jmp = rp;
  1125. BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
  1126. return 0;
  1127. }
  1128. int cx23885_risc_vbibuffer(struct pci_dev *pci, struct cx23885_riscmem *risc,
  1129. struct scatterlist *sglist, unsigned int top_offset,
  1130. unsigned int bottom_offset, unsigned int bpl,
  1131. unsigned int padding, unsigned int lines)
  1132. {
  1133. u32 instructions, fields;
  1134. __le32 *rp;
  1135. fields = 0;
  1136. if (UNSET != top_offset)
  1137. fields++;
  1138. if (UNSET != bottom_offset)
  1139. fields++;
  1140. /* estimate risc mem: worst case is one write per page border +
  1141. one write per scan line + syncs + jump (all 2 dwords). Padding
  1142. can cause next bpl to start close to a page border. First DMA
  1143. region may be smaller than PAGE_SIZE */
  1144. /* write and jump need and extra dword */
  1145. instructions = fields * (1 + ((bpl + padding) * lines)
  1146. / PAGE_SIZE + lines);
  1147. instructions += 5;
  1148. risc->size = instructions * 12;
  1149. risc->cpu = pci_alloc_consistent(pci, risc->size, &risc->dma);
  1150. if (risc->cpu == NULL)
  1151. return -ENOMEM;
  1152. /* write risc instructions */
  1153. rp = risc->cpu;
  1154. /* Sync to line 6, so US CC line 21 will appear in line '12'
  1155. * in the userland vbi payload */
  1156. if (UNSET != top_offset)
  1157. rp = cx23885_risc_field(rp, sglist, top_offset, 0,
  1158. bpl, padding, lines, 0, true);
  1159. if (UNSET != bottom_offset)
  1160. rp = cx23885_risc_field(rp, sglist, bottom_offset, 0x200,
  1161. bpl, padding, lines, 0, UNSET == top_offset);
  1162. /* save pointer to jmp instruction address */
  1163. risc->jmp = rp;
  1164. BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
  1165. return 0;
  1166. }
  1167. void cx23885_free_buffer(struct cx23885_dev *dev, struct cx23885_buffer *buf)
  1168. {
  1169. struct cx23885_riscmem *risc = &buf->risc;
  1170. BUG_ON(in_interrupt());
  1171. pci_free_consistent(dev->pci, risc->size, risc->cpu, risc->dma);
  1172. }
  1173. static void cx23885_tsport_reg_dump(struct cx23885_tsport *port)
  1174. {
  1175. struct cx23885_dev *dev = port->dev;
  1176. dprintk(1, "%s() Register Dump\n", __func__);
  1177. dprintk(1, "%s() DEV_CNTRL2 0x%08X\n", __func__,
  1178. cx_read(DEV_CNTRL2));
  1179. dprintk(1, "%s() PCI_INT_MSK 0x%08X\n", __func__,
  1180. cx23885_irq_get_mask(dev));
  1181. dprintk(1, "%s() AUD_INT_INT_MSK 0x%08X\n", __func__,
  1182. cx_read(AUDIO_INT_INT_MSK));
  1183. dprintk(1, "%s() AUD_INT_DMA_CTL 0x%08X\n", __func__,
  1184. cx_read(AUD_INT_DMA_CTL));
  1185. dprintk(1, "%s() AUD_EXT_INT_MSK 0x%08X\n", __func__,
  1186. cx_read(AUDIO_EXT_INT_MSK));
  1187. dprintk(1, "%s() AUD_EXT_DMA_CTL 0x%08X\n", __func__,
  1188. cx_read(AUD_EXT_DMA_CTL));
  1189. dprintk(1, "%s() PAD_CTRL 0x%08X\n", __func__,
  1190. cx_read(PAD_CTRL));
  1191. dprintk(1, "%s() ALT_PIN_OUT_SEL 0x%08X\n", __func__,
  1192. cx_read(ALT_PIN_OUT_SEL));
  1193. dprintk(1, "%s() GPIO2 0x%08X\n", __func__,
  1194. cx_read(GPIO2));
  1195. dprintk(1, "%s() gpcnt(0x%08X) 0x%08X\n", __func__,
  1196. port->reg_gpcnt, cx_read(port->reg_gpcnt));
  1197. dprintk(1, "%s() gpcnt_ctl(0x%08X) 0x%08x\n", __func__,
  1198. port->reg_gpcnt_ctl, cx_read(port->reg_gpcnt_ctl));
  1199. dprintk(1, "%s() dma_ctl(0x%08X) 0x%08x\n", __func__,
  1200. port->reg_dma_ctl, cx_read(port->reg_dma_ctl));
  1201. if (port->reg_src_sel)
  1202. dprintk(1, "%s() src_sel(0x%08X) 0x%08x\n", __func__,
  1203. port->reg_src_sel, cx_read(port->reg_src_sel));
  1204. dprintk(1, "%s() lngth(0x%08X) 0x%08x\n", __func__,
  1205. port->reg_lngth, cx_read(port->reg_lngth));
  1206. dprintk(1, "%s() hw_sop_ctrl(0x%08X) 0x%08x\n", __func__,
  1207. port->reg_hw_sop_ctrl, cx_read(port->reg_hw_sop_ctrl));
  1208. dprintk(1, "%s() gen_ctrl(0x%08X) 0x%08x\n", __func__,
  1209. port->reg_gen_ctrl, cx_read(port->reg_gen_ctrl));
  1210. dprintk(1, "%s() bd_pkt_status(0x%08X) 0x%08x\n", __func__,
  1211. port->reg_bd_pkt_status, cx_read(port->reg_bd_pkt_status));
  1212. dprintk(1, "%s() sop_status(0x%08X) 0x%08x\n", __func__,
  1213. port->reg_sop_status, cx_read(port->reg_sop_status));
  1214. dprintk(1, "%s() fifo_ovfl_stat(0x%08X) 0x%08x\n", __func__,
  1215. port->reg_fifo_ovfl_stat, cx_read(port->reg_fifo_ovfl_stat));
  1216. dprintk(1, "%s() vld_misc(0x%08X) 0x%08x\n", __func__,
  1217. port->reg_vld_misc, cx_read(port->reg_vld_misc));
  1218. dprintk(1, "%s() ts_clk_en(0x%08X) 0x%08x\n", __func__,
  1219. port->reg_ts_clk_en, cx_read(port->reg_ts_clk_en));
  1220. dprintk(1, "%s() ts_int_msk(0x%08X) 0x%08x\n", __func__,
  1221. port->reg_ts_int_msk, cx_read(port->reg_ts_int_msk));
  1222. dprintk(1, "%s() ts_int_status(0x%08X) 0x%08x\n", __func__,
  1223. port->reg_ts_int_stat, cx_read(port->reg_ts_int_stat));
  1224. dprintk(1, "%s() PCI_INT_STAT 0x%08X\n", __func__,
  1225. cx_read(PCI_INT_STAT));
  1226. dprintk(1, "%s() VID_B_INT_MSTAT 0x%08X\n", __func__,
  1227. cx_read(VID_B_INT_MSTAT));
  1228. dprintk(1, "%s() VID_B_INT_SSTAT 0x%08X\n", __func__,
  1229. cx_read(VID_B_INT_SSTAT));
  1230. dprintk(1, "%s() VID_C_INT_MSTAT 0x%08X\n", __func__,
  1231. cx_read(VID_C_INT_MSTAT));
  1232. dprintk(1, "%s() VID_C_INT_SSTAT 0x%08X\n", __func__,
  1233. cx_read(VID_C_INT_SSTAT));
  1234. }
  1235. int cx23885_start_dma(struct cx23885_tsport *port,
  1236. struct cx23885_dmaqueue *q,
  1237. struct cx23885_buffer *buf)
  1238. {
  1239. struct cx23885_dev *dev = port->dev;
  1240. u32 reg;
  1241. dprintk(1, "%s() w: %d, h: %d, f: %d\n", __func__,
  1242. dev->width, dev->height, dev->field);
  1243. /* clear dma in progress */
  1244. cx23885_clear_bridge_error(dev);
  1245. /* Stop the fifo and risc engine for this port */
  1246. cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
  1247. /* setup fifo + format */
  1248. cx23885_sram_channel_setup(dev,
  1249. &dev->sram_channels[port->sram_chno],
  1250. port->ts_packet_size, buf->risc.dma);
  1251. if (debug > 5) {
  1252. cx23885_sram_channel_dump(dev,
  1253. &dev->sram_channels[port->sram_chno]);
  1254. cx23885_risc_disasm(port, &buf->risc);
  1255. }
  1256. /* write TS length to chip */
  1257. cx_write(port->reg_lngth, port->ts_packet_size);
  1258. if ((!(cx23885_boards[dev->board].portb & CX23885_MPEG_DVB)) &&
  1259. (!(cx23885_boards[dev->board].portc & CX23885_MPEG_DVB))) {
  1260. pr_err("%s() Unsupported .portb/c (0x%08x)/(0x%08x)\n",
  1261. __func__,
  1262. cx23885_boards[dev->board].portb,
  1263. cx23885_boards[dev->board].portc);
  1264. return -EINVAL;
  1265. }
  1266. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
  1267. cx23885_av_clk(dev, 0);
  1268. udelay(100);
  1269. /* If the port supports SRC SELECT, configure it */
  1270. if (port->reg_src_sel)
  1271. cx_write(port->reg_src_sel, port->src_sel_val);
  1272. cx_write(port->reg_hw_sop_ctrl, port->hw_sop_ctrl_val);
  1273. cx_write(port->reg_ts_clk_en, port->ts_clk_en_val);
  1274. cx_write(port->reg_vld_misc, port->vld_misc_val);
  1275. cx_write(port->reg_gen_ctrl, port->gen_ctrl_val);
  1276. udelay(100);
  1277. /* NOTE: this is 2 (reserved) for portb, does it matter? */
  1278. /* reset counter to zero */
  1279. cx_write(port->reg_gpcnt_ctl, 3);
  1280. q->count = 0;
  1281. /* Set VIDB pins to input */
  1282. if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
  1283. reg = cx_read(PAD_CTRL);
  1284. reg &= ~0x3; /* Clear TS1_OE & TS1_SOP_OE */
  1285. cx_write(PAD_CTRL, reg);
  1286. }
  1287. /* Set VIDC pins to input */
  1288. if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
  1289. reg = cx_read(PAD_CTRL);
  1290. reg &= ~0x4; /* Clear TS2_SOP_OE */
  1291. cx_write(PAD_CTRL, reg);
  1292. }
  1293. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
  1294. reg = cx_read(PAD_CTRL);
  1295. reg = reg & ~0x1; /* Clear TS1_OE */
  1296. /* FIXME, bit 2 writing here is questionable */
  1297. /* set TS1_SOP_OE and TS1_OE_HI */
  1298. reg = reg | 0xa;
  1299. cx_write(PAD_CTRL, reg);
  1300. /* Sets MOE_CLK_DIS to disable MoE clock */
  1301. /* sets MCLK_DLY_SEL/BCLK_DLY_SEL to 1 buffer delay each */
  1302. cx_write(CLK_DELAY, cx_read(CLK_DELAY) | 0x80000011);
  1303. /* ALT_GPIO_ALT_SET: GPIO[0]
  1304. * IR_ALT_TX_SEL: GPIO[1]
  1305. * GPIO1_ALT_SEL: VIP_656_DATA[0]
  1306. * GPIO0_ALT_SEL: VIP_656_CLK
  1307. */
  1308. cx_write(ALT_PIN_OUT_SEL, 0x10100045);
  1309. }
  1310. switch (dev->bridge) {
  1311. case CX23885_BRIDGE_885:
  1312. case CX23885_BRIDGE_887:
  1313. case CX23885_BRIDGE_888:
  1314. /* enable irqs */
  1315. dprintk(1, "%s() enabling TS int's and DMA\n", __func__);
  1316. /* clear dma in progress */
  1317. cx23885_clear_bridge_error(dev);
  1318. cx_set(port->reg_ts_int_msk, port->ts_int_msk_val);
  1319. cx_set(port->reg_dma_ctl, port->dma_ctl_val);
  1320. /* clear dma in progress */
  1321. cx23885_clear_bridge_error(dev);
  1322. cx23885_irq_add(dev, port->pci_irqmask);
  1323. cx23885_irq_enable_all(dev);
  1324. /* clear dma in progress */
  1325. cx23885_clear_bridge_error(dev);
  1326. break;
  1327. default:
  1328. BUG();
  1329. }
  1330. cx_set(DEV_CNTRL2, (1<<5)); /* Enable RISC controller */
  1331. /* clear dma in progress */
  1332. cx23885_clear_bridge_error(dev);
  1333. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
  1334. cx23885_av_clk(dev, 1);
  1335. if (debug > 4)
  1336. cx23885_tsport_reg_dump(port);
  1337. cx23885_irq_get_mask(dev);
  1338. /* clear dma in progress */
  1339. cx23885_clear_bridge_error(dev);
  1340. return 0;
  1341. }
  1342. static int cx23885_stop_dma(struct cx23885_tsport *port)
  1343. {
  1344. struct cx23885_dev *dev = port->dev;
  1345. u32 reg;
  1346. int delay = 0;
  1347. uint32_t reg1_val;
  1348. uint32_t reg2_val;
  1349. dprintk(1, "%s()\n", __func__);
  1350. /* Stop interrupts and DMA */
  1351. cx_clear(port->reg_ts_int_msk, port->ts_int_msk_val);
  1352. cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
  1353. /* just in case wait for any dma to complete before allowing dealloc */
  1354. mdelay(20);
  1355. for (delay = 0; delay < 100; delay++) {
  1356. reg1_val = cx_read(TC_REQ);
  1357. reg2_val = cx_read(TC_REQ_SET);
  1358. if (reg1_val == 0 || reg2_val == 0)
  1359. break;
  1360. mdelay(1);
  1361. }
  1362. dev_dbg(&dev->pci->dev, "delay=%d reg1=0x%08x reg2=0x%08x\n",
  1363. delay, reg1_val, reg2_val);
  1364. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
  1365. reg = cx_read(PAD_CTRL);
  1366. /* Set TS1_OE */
  1367. reg = reg | 0x1;
  1368. /* clear TS1_SOP_OE and TS1_OE_HI */
  1369. reg = reg & ~0xa;
  1370. cx_write(PAD_CTRL, reg);
  1371. cx_write(port->reg_src_sel, 0);
  1372. cx_write(port->reg_gen_ctrl, 8);
  1373. }
  1374. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
  1375. cx23885_av_clk(dev, 0);
  1376. return 0;
  1377. }
  1378. /* ------------------------------------------------------------------ */
  1379. int cx23885_buf_prepare(struct cx23885_buffer *buf, struct cx23885_tsport *port)
  1380. {
  1381. struct cx23885_dev *dev = port->dev;
  1382. int size = port->ts_packet_size * port->ts_packet_count;
  1383. struct sg_table *sgt = vb2_dma_sg_plane_desc(&buf->vb.vb2_buf, 0);
  1384. dprintk(1, "%s: %p\n", __func__, buf);
  1385. if (vb2_plane_size(&buf->vb.vb2_buf, 0) < size)
  1386. return -EINVAL;
  1387. vb2_set_plane_payload(&buf->vb.vb2_buf, 0, size);
  1388. cx23885_risc_databuffer(dev->pci, &buf->risc,
  1389. sgt->sgl,
  1390. port->ts_packet_size, port->ts_packet_count, 0);
  1391. return 0;
  1392. }
  1393. /*
  1394. * The risc program for each buffer works as follows: it starts with a simple
  1395. * 'JUMP to addr + 12', which is effectively a NOP. Then the code to DMA the
  1396. * buffer follows and at the end we have a JUMP back to the start + 12 (skipping
  1397. * the initial JUMP).
  1398. *
  1399. * This is the risc program of the first buffer to be queued if the active list
  1400. * is empty and it just keeps DMAing this buffer without generating any
  1401. * interrupts.
  1402. *
  1403. * If a new buffer is added then the initial JUMP in the code for that buffer
  1404. * will generate an interrupt which signals that the previous buffer has been
  1405. * DMAed successfully and that it can be returned to userspace.
  1406. *
  1407. * It also sets the final jump of the previous buffer to the start of the new
  1408. * buffer, thus chaining the new buffer into the DMA chain. This is a single
  1409. * atomic u32 write, so there is no race condition.
  1410. *
  1411. * The end-result of all this that you only get an interrupt when a buffer
  1412. * is ready, so the control flow is very easy.
  1413. */
  1414. void cx23885_buf_queue(struct cx23885_tsport *port, struct cx23885_buffer *buf)
  1415. {
  1416. struct cx23885_buffer *prev;
  1417. struct cx23885_dev *dev = port->dev;
  1418. struct cx23885_dmaqueue *cx88q = &port->mpegq;
  1419. unsigned long flags;
  1420. buf->risc.cpu[1] = cpu_to_le32(buf->risc.dma + 12);
  1421. buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_CNT_INC);
  1422. buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma + 12);
  1423. buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */
  1424. spin_lock_irqsave(&dev->slock, flags);
  1425. if (list_empty(&cx88q->active)) {
  1426. list_add_tail(&buf->queue, &cx88q->active);
  1427. dprintk(1, "[%p/%d] %s - first active\n",
  1428. buf, buf->vb.vb2_buf.index, __func__);
  1429. } else {
  1430. buf->risc.cpu[0] |= cpu_to_le32(RISC_IRQ1);
  1431. prev = list_entry(cx88q->active.prev, struct cx23885_buffer,
  1432. queue);
  1433. list_add_tail(&buf->queue, &cx88q->active);
  1434. prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
  1435. dprintk(1, "[%p/%d] %s - append to active\n",
  1436. buf, buf->vb.vb2_buf.index, __func__);
  1437. }
  1438. spin_unlock_irqrestore(&dev->slock, flags);
  1439. }
  1440. /* ----------------------------------------------------------- */
  1441. static void do_cancel_buffers(struct cx23885_tsport *port, char *reason)
  1442. {
  1443. struct cx23885_dmaqueue *q = &port->mpegq;
  1444. struct cx23885_buffer *buf;
  1445. unsigned long flags;
  1446. spin_lock_irqsave(&port->slock, flags);
  1447. while (!list_empty(&q->active)) {
  1448. buf = list_entry(q->active.next, struct cx23885_buffer,
  1449. queue);
  1450. list_del(&buf->queue);
  1451. vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
  1452. dprintk(1, "[%p/%d] %s - dma=0x%08lx\n",
  1453. buf, buf->vb.vb2_buf.index, reason,
  1454. (unsigned long)buf->risc.dma);
  1455. }
  1456. spin_unlock_irqrestore(&port->slock, flags);
  1457. }
  1458. void cx23885_cancel_buffers(struct cx23885_tsport *port)
  1459. {
  1460. dprintk(1, "%s()\n", __func__);
  1461. cx23885_stop_dma(port);
  1462. do_cancel_buffers(port, "cancel");
  1463. }
  1464. int cx23885_irq_417(struct cx23885_dev *dev, u32 status)
  1465. {
  1466. /* FIXME: port1 assumption here. */
  1467. struct cx23885_tsport *port = &dev->ts1;
  1468. int count = 0;
  1469. int handled = 0;
  1470. if (status == 0)
  1471. return handled;
  1472. count = cx_read(port->reg_gpcnt);
  1473. dprintk(7, "status: 0x%08x mask: 0x%08x count: 0x%x\n",
  1474. status, cx_read(port->reg_ts_int_msk), count);
  1475. if ((status & VID_B_MSK_BAD_PKT) ||
  1476. (status & VID_B_MSK_OPC_ERR) ||
  1477. (status & VID_B_MSK_VBI_OPC_ERR) ||
  1478. (status & VID_B_MSK_SYNC) ||
  1479. (status & VID_B_MSK_VBI_SYNC) ||
  1480. (status & VID_B_MSK_OF) ||
  1481. (status & VID_B_MSK_VBI_OF)) {
  1482. pr_err("%s: V4L mpeg risc op code error, status = 0x%x\n",
  1483. dev->name, status);
  1484. if (status & VID_B_MSK_BAD_PKT)
  1485. dprintk(1, " VID_B_MSK_BAD_PKT\n");
  1486. if (status & VID_B_MSK_OPC_ERR)
  1487. dprintk(1, " VID_B_MSK_OPC_ERR\n");
  1488. if (status & VID_B_MSK_VBI_OPC_ERR)
  1489. dprintk(1, " VID_B_MSK_VBI_OPC_ERR\n");
  1490. if (status & VID_B_MSK_SYNC)
  1491. dprintk(1, " VID_B_MSK_SYNC\n");
  1492. if (status & VID_B_MSK_VBI_SYNC)
  1493. dprintk(1, " VID_B_MSK_VBI_SYNC\n");
  1494. if (status & VID_B_MSK_OF)
  1495. dprintk(1, " VID_B_MSK_OF\n");
  1496. if (status & VID_B_MSK_VBI_OF)
  1497. dprintk(1, " VID_B_MSK_VBI_OF\n");
  1498. cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
  1499. cx23885_sram_channel_dump(dev,
  1500. &dev->sram_channels[port->sram_chno]);
  1501. cx23885_417_check_encoder(dev);
  1502. } else if (status & VID_B_MSK_RISCI1) {
  1503. dprintk(7, " VID_B_MSK_RISCI1\n");
  1504. spin_lock(&port->slock);
  1505. cx23885_wakeup(port, &port->mpegq, count);
  1506. spin_unlock(&port->slock);
  1507. }
  1508. if (status) {
  1509. cx_write(port->reg_ts_int_stat, status);
  1510. handled = 1;
  1511. }
  1512. return handled;
  1513. }
  1514. static int cx23885_irq_ts(struct cx23885_tsport *port, u32 status)
  1515. {
  1516. struct cx23885_dev *dev = port->dev;
  1517. int handled = 0;
  1518. u32 count;
  1519. if ((status & VID_BC_MSK_OPC_ERR) ||
  1520. (status & VID_BC_MSK_BAD_PKT) ||
  1521. (status & VID_BC_MSK_SYNC) ||
  1522. (status & VID_BC_MSK_OF)) {
  1523. if (status & VID_BC_MSK_OPC_ERR)
  1524. dprintk(7, " (VID_BC_MSK_OPC_ERR 0x%08x)\n",
  1525. VID_BC_MSK_OPC_ERR);
  1526. if (status & VID_BC_MSK_BAD_PKT)
  1527. dprintk(7, " (VID_BC_MSK_BAD_PKT 0x%08x)\n",
  1528. VID_BC_MSK_BAD_PKT);
  1529. if (status & VID_BC_MSK_SYNC)
  1530. dprintk(7, " (VID_BC_MSK_SYNC 0x%08x)\n",
  1531. VID_BC_MSK_SYNC);
  1532. if (status & VID_BC_MSK_OF)
  1533. dprintk(7, " (VID_BC_MSK_OF 0x%08x)\n",
  1534. VID_BC_MSK_OF);
  1535. pr_err("%s: mpeg risc op code error\n", dev->name);
  1536. cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
  1537. cx23885_sram_channel_dump(dev,
  1538. &dev->sram_channels[port->sram_chno]);
  1539. } else if (status & VID_BC_MSK_RISCI1) {
  1540. dprintk(7, " (RISCI1 0x%08x)\n", VID_BC_MSK_RISCI1);
  1541. spin_lock(&port->slock);
  1542. count = cx_read(port->reg_gpcnt);
  1543. cx23885_wakeup(port, &port->mpegq, count);
  1544. spin_unlock(&port->slock);
  1545. }
  1546. if (status) {
  1547. cx_write(port->reg_ts_int_stat, status);
  1548. handled = 1;
  1549. }
  1550. return handled;
  1551. }
  1552. static irqreturn_t cx23885_irq(int irq, void *dev_id)
  1553. {
  1554. struct cx23885_dev *dev = dev_id;
  1555. struct cx23885_tsport *ts1 = &dev->ts1;
  1556. struct cx23885_tsport *ts2 = &dev->ts2;
  1557. u32 pci_status, pci_mask;
  1558. u32 vida_status, vida_mask;
  1559. u32 audint_status, audint_mask;
  1560. u32 ts1_status, ts1_mask;
  1561. u32 ts2_status, ts2_mask;
  1562. int vida_count = 0, ts1_count = 0, ts2_count = 0, handled = 0;
  1563. int audint_count = 0;
  1564. bool subdev_handled;
  1565. pci_status = cx_read(PCI_INT_STAT);
  1566. pci_mask = cx23885_irq_get_mask(dev);
  1567. if ((pci_status & pci_mask) == 0) {
  1568. dprintk(7, "pci_status: 0x%08x pci_mask: 0x%08x\n",
  1569. pci_status, pci_mask);
  1570. goto out;
  1571. }
  1572. vida_status = cx_read(VID_A_INT_STAT);
  1573. vida_mask = cx_read(VID_A_INT_MSK);
  1574. audint_status = cx_read(AUDIO_INT_INT_STAT);
  1575. audint_mask = cx_read(AUDIO_INT_INT_MSK);
  1576. ts1_status = cx_read(VID_B_INT_STAT);
  1577. ts1_mask = cx_read(VID_B_INT_MSK);
  1578. ts2_status = cx_read(VID_C_INT_STAT);
  1579. ts2_mask = cx_read(VID_C_INT_MSK);
  1580. if (((pci_status & pci_mask) == 0) &&
  1581. ((ts2_status & ts2_mask) == 0) &&
  1582. ((ts1_status & ts1_mask) == 0))
  1583. goto out;
  1584. vida_count = cx_read(VID_A_GPCNT);
  1585. audint_count = cx_read(AUD_INT_A_GPCNT);
  1586. ts1_count = cx_read(ts1->reg_gpcnt);
  1587. ts2_count = cx_read(ts2->reg_gpcnt);
  1588. dprintk(7, "pci_status: 0x%08x pci_mask: 0x%08x\n",
  1589. pci_status, pci_mask);
  1590. dprintk(7, "vida_status: 0x%08x vida_mask: 0x%08x count: 0x%x\n",
  1591. vida_status, vida_mask, vida_count);
  1592. dprintk(7, "audint_status: 0x%08x audint_mask: 0x%08x count: 0x%x\n",
  1593. audint_status, audint_mask, audint_count);
  1594. dprintk(7, "ts1_status: 0x%08x ts1_mask: 0x%08x count: 0x%x\n",
  1595. ts1_status, ts1_mask, ts1_count);
  1596. dprintk(7, "ts2_status: 0x%08x ts2_mask: 0x%08x count: 0x%x\n",
  1597. ts2_status, ts2_mask, ts2_count);
  1598. if (pci_status & (PCI_MSK_RISC_RD | PCI_MSK_RISC_WR |
  1599. PCI_MSK_AL_RD | PCI_MSK_AL_WR | PCI_MSK_APB_DMA |
  1600. PCI_MSK_VID_C | PCI_MSK_VID_B | PCI_MSK_VID_A |
  1601. PCI_MSK_AUD_INT | PCI_MSK_AUD_EXT |
  1602. PCI_MSK_GPIO0 | PCI_MSK_GPIO1 |
  1603. PCI_MSK_AV_CORE | PCI_MSK_IR)) {
  1604. if (pci_status & PCI_MSK_RISC_RD)
  1605. dprintk(7, " (PCI_MSK_RISC_RD 0x%08x)\n",
  1606. PCI_MSK_RISC_RD);
  1607. if (pci_status & PCI_MSK_RISC_WR)
  1608. dprintk(7, " (PCI_MSK_RISC_WR 0x%08x)\n",
  1609. PCI_MSK_RISC_WR);
  1610. if (pci_status & PCI_MSK_AL_RD)
  1611. dprintk(7, " (PCI_MSK_AL_RD 0x%08x)\n",
  1612. PCI_MSK_AL_RD);
  1613. if (pci_status & PCI_MSK_AL_WR)
  1614. dprintk(7, " (PCI_MSK_AL_WR 0x%08x)\n",
  1615. PCI_MSK_AL_WR);
  1616. if (pci_status & PCI_MSK_APB_DMA)
  1617. dprintk(7, " (PCI_MSK_APB_DMA 0x%08x)\n",
  1618. PCI_MSK_APB_DMA);
  1619. if (pci_status & PCI_MSK_VID_C)
  1620. dprintk(7, " (PCI_MSK_VID_C 0x%08x)\n",
  1621. PCI_MSK_VID_C);
  1622. if (pci_status & PCI_MSK_VID_B)
  1623. dprintk(7, " (PCI_MSK_VID_B 0x%08x)\n",
  1624. PCI_MSK_VID_B);
  1625. if (pci_status & PCI_MSK_VID_A)
  1626. dprintk(7, " (PCI_MSK_VID_A 0x%08x)\n",
  1627. PCI_MSK_VID_A);
  1628. if (pci_status & PCI_MSK_AUD_INT)
  1629. dprintk(7, " (PCI_MSK_AUD_INT 0x%08x)\n",
  1630. PCI_MSK_AUD_INT);
  1631. if (pci_status & PCI_MSK_AUD_EXT)
  1632. dprintk(7, " (PCI_MSK_AUD_EXT 0x%08x)\n",
  1633. PCI_MSK_AUD_EXT);
  1634. if (pci_status & PCI_MSK_GPIO0)
  1635. dprintk(7, " (PCI_MSK_GPIO0 0x%08x)\n",
  1636. PCI_MSK_GPIO0);
  1637. if (pci_status & PCI_MSK_GPIO1)
  1638. dprintk(7, " (PCI_MSK_GPIO1 0x%08x)\n",
  1639. PCI_MSK_GPIO1);
  1640. if (pci_status & PCI_MSK_AV_CORE)
  1641. dprintk(7, " (PCI_MSK_AV_CORE 0x%08x)\n",
  1642. PCI_MSK_AV_CORE);
  1643. if (pci_status & PCI_MSK_IR)
  1644. dprintk(7, " (PCI_MSK_IR 0x%08x)\n",
  1645. PCI_MSK_IR);
  1646. }
  1647. if (cx23885_boards[dev->board].ci_type == 1 &&
  1648. (pci_status & (PCI_MSK_GPIO1 | PCI_MSK_GPIO0)))
  1649. handled += netup_ci_slot_status(dev, pci_status);
  1650. if (cx23885_boards[dev->board].ci_type == 2 &&
  1651. (pci_status & PCI_MSK_GPIO0))
  1652. handled += altera_ci_irq(dev);
  1653. if (ts1_status) {
  1654. if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB)
  1655. handled += cx23885_irq_ts(ts1, ts1_status);
  1656. else
  1657. if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER)
  1658. handled += cx23885_irq_417(dev, ts1_status);
  1659. }
  1660. if (ts2_status) {
  1661. if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB)
  1662. handled += cx23885_irq_ts(ts2, ts2_status);
  1663. else
  1664. if (cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER)
  1665. handled += cx23885_irq_417(dev, ts2_status);
  1666. }
  1667. if (vida_status)
  1668. handled += cx23885_video_irq(dev, vida_status);
  1669. if (audint_status)
  1670. handled += cx23885_audio_irq(dev, audint_status, audint_mask);
  1671. if (pci_status & PCI_MSK_IR) {
  1672. subdev_handled = false;
  1673. v4l2_subdev_call(dev->sd_ir, core, interrupt_service_routine,
  1674. pci_status, &subdev_handled);
  1675. if (subdev_handled)
  1676. handled++;
  1677. }
  1678. if ((pci_status & pci_mask) & PCI_MSK_AV_CORE) {
  1679. cx23885_irq_disable(dev, PCI_MSK_AV_CORE);
  1680. schedule_work(&dev->cx25840_work);
  1681. handled++;
  1682. }
  1683. if (handled)
  1684. cx_write(PCI_INT_STAT, pci_status & pci_mask);
  1685. out:
  1686. return IRQ_RETVAL(handled);
  1687. }
  1688. static void cx23885_v4l2_dev_notify(struct v4l2_subdev *sd,
  1689. unsigned int notification, void *arg)
  1690. {
  1691. struct cx23885_dev *dev;
  1692. if (sd == NULL)
  1693. return;
  1694. dev = to_cx23885(sd->v4l2_dev);
  1695. switch (notification) {
  1696. case V4L2_SUBDEV_IR_RX_NOTIFY: /* Possibly called in an IRQ context */
  1697. if (sd == dev->sd_ir)
  1698. cx23885_ir_rx_v4l2_dev_notify(sd, *(u32 *)arg);
  1699. break;
  1700. case V4L2_SUBDEV_IR_TX_NOTIFY: /* Possibly called in an IRQ context */
  1701. if (sd == dev->sd_ir)
  1702. cx23885_ir_tx_v4l2_dev_notify(sd, *(u32 *)arg);
  1703. break;
  1704. }
  1705. }
  1706. static void cx23885_v4l2_dev_notify_init(struct cx23885_dev *dev)
  1707. {
  1708. INIT_WORK(&dev->cx25840_work, cx23885_av_work_handler);
  1709. INIT_WORK(&dev->ir_rx_work, cx23885_ir_rx_work_handler);
  1710. INIT_WORK(&dev->ir_tx_work, cx23885_ir_tx_work_handler);
  1711. dev->v4l2_dev.notify = cx23885_v4l2_dev_notify;
  1712. }
  1713. static inline int encoder_on_portb(struct cx23885_dev *dev)
  1714. {
  1715. return cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER;
  1716. }
  1717. static inline int encoder_on_portc(struct cx23885_dev *dev)
  1718. {
  1719. return cx23885_boards[dev->board].portc == CX23885_MPEG_ENCODER;
  1720. }
  1721. /* Mask represents 32 different GPIOs, GPIO's are split into multiple
  1722. * registers depending on the board configuration (and whether the
  1723. * 417 encoder (wi it's own GPIO's) are present. Each GPIO bit will
  1724. * be pushed into the correct hardware register, regardless of the
  1725. * physical location. Certain registers are shared so we sanity check
  1726. * and report errors if we think we're tampering with a GPIo that might
  1727. * be assigned to the encoder (and used for the host bus).
  1728. *
  1729. * GPIO 2 thru 0 - On the cx23885 bridge
  1730. * GPIO 18 thru 3 - On the cx23417 host bus interface
  1731. * GPIO 23 thru 19 - On the cx25840 a/v core
  1732. */
  1733. void cx23885_gpio_set(struct cx23885_dev *dev, u32 mask)
  1734. {
  1735. if (mask & 0x7)
  1736. cx_set(GP0_IO, mask & 0x7);
  1737. if (mask & 0x0007fff8) {
  1738. if (encoder_on_portb(dev) || encoder_on_portc(dev))
  1739. pr_err("%s: Setting GPIO on encoder ports\n",
  1740. dev->name);
  1741. cx_set(MC417_RWD, (mask & 0x0007fff8) >> 3);
  1742. }
  1743. /* TODO: 23-19 */
  1744. if (mask & 0x00f80000)
  1745. pr_info("%s: Unsupported\n", dev->name);
  1746. }
  1747. void cx23885_gpio_clear(struct cx23885_dev *dev, u32 mask)
  1748. {
  1749. if (mask & 0x00000007)
  1750. cx_clear(GP0_IO, mask & 0x7);
  1751. if (mask & 0x0007fff8) {
  1752. if (encoder_on_portb(dev) || encoder_on_portc(dev))
  1753. pr_err("%s: Clearing GPIO moving on encoder ports\n",
  1754. dev->name);
  1755. cx_clear(MC417_RWD, (mask & 0x7fff8) >> 3);
  1756. }
  1757. /* TODO: 23-19 */
  1758. if (mask & 0x00f80000)
  1759. pr_info("%s: Unsupported\n", dev->name);
  1760. }
  1761. u32 cx23885_gpio_get(struct cx23885_dev *dev, u32 mask)
  1762. {
  1763. if (mask & 0x00000007)
  1764. return (cx_read(GP0_IO) >> 8) & mask & 0x7;
  1765. if (mask & 0x0007fff8) {
  1766. if (encoder_on_portb(dev) || encoder_on_portc(dev))
  1767. pr_err("%s: Reading GPIO moving on encoder ports\n",
  1768. dev->name);
  1769. return (cx_read(MC417_RWD) & ((mask & 0x7fff8) >> 3)) << 3;
  1770. }
  1771. /* TODO: 23-19 */
  1772. if (mask & 0x00f80000)
  1773. pr_info("%s: Unsupported\n", dev->name);
  1774. return 0;
  1775. }
  1776. void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput)
  1777. {
  1778. if ((mask & 0x00000007) && asoutput)
  1779. cx_set(GP0_IO, (mask & 0x7) << 16);
  1780. else if ((mask & 0x00000007) && !asoutput)
  1781. cx_clear(GP0_IO, (mask & 0x7) << 16);
  1782. if (mask & 0x0007fff8) {
  1783. if (encoder_on_portb(dev) || encoder_on_portc(dev))
  1784. pr_err("%s: Enabling GPIO on encoder ports\n",
  1785. dev->name);
  1786. }
  1787. /* MC417_OEN is active low for output, write 1 for an input */
  1788. if ((mask & 0x0007fff8) && asoutput)
  1789. cx_clear(MC417_OEN, (mask & 0x7fff8) >> 3);
  1790. else if ((mask & 0x0007fff8) && !asoutput)
  1791. cx_set(MC417_OEN, (mask & 0x7fff8) >> 3);
  1792. /* TODO: 23-19 */
  1793. }
  1794. static struct {
  1795. int vendor, dev;
  1796. } const broken_dev_id[] = {
  1797. /* According with
  1798. * https://openbenchmarking.org/system/1703021-RI-AMDZEN08075/Ryzen%207%201800X/lspci,
  1799. * 0x1451 is PCI ID for the IOMMU found on Ryzen
  1800. */
  1801. { PCI_VENDOR_ID_AMD, 0x1451 },
  1802. };
  1803. static bool cx23885_does_need_dma_reset(void)
  1804. {
  1805. int i;
  1806. struct pci_dev *pdev = NULL;
  1807. if (dma_reset_workaround == 0)
  1808. return false;
  1809. else if (dma_reset_workaround == 2)
  1810. return true;
  1811. for (i = 0; i < ARRAY_SIZE(broken_dev_id); i++) {
  1812. pdev = pci_get_device(broken_dev_id[i].vendor,
  1813. broken_dev_id[i].dev, NULL);
  1814. if (pdev) {
  1815. pci_dev_put(pdev);
  1816. return true;
  1817. }
  1818. }
  1819. return false;
  1820. }
  1821. static int cx23885_initdev(struct pci_dev *pci_dev,
  1822. const struct pci_device_id *pci_id)
  1823. {
  1824. struct cx23885_dev *dev;
  1825. struct v4l2_ctrl_handler *hdl;
  1826. int err;
  1827. dev = kzalloc(sizeof(*dev), GFP_KERNEL);
  1828. if (NULL == dev)
  1829. return -ENOMEM;
  1830. dev->need_dma_reset = cx23885_does_need_dma_reset();
  1831. err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
  1832. if (err < 0)
  1833. goto fail_free;
  1834. hdl = &dev->ctrl_handler;
  1835. v4l2_ctrl_handler_init(hdl, 6);
  1836. if (hdl->error) {
  1837. err = hdl->error;
  1838. goto fail_ctrl;
  1839. }
  1840. dev->v4l2_dev.ctrl_handler = hdl;
  1841. /* Prepare to handle notifications from subdevices */
  1842. cx23885_v4l2_dev_notify_init(dev);
  1843. /* pci init */
  1844. dev->pci = pci_dev;
  1845. if (pci_enable_device(pci_dev)) {
  1846. err = -EIO;
  1847. goto fail_ctrl;
  1848. }
  1849. if (cx23885_dev_setup(dev) < 0) {
  1850. err = -EINVAL;
  1851. goto fail_ctrl;
  1852. }
  1853. /* print pci info */
  1854. dev->pci_rev = pci_dev->revision;
  1855. pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
  1856. pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
  1857. dev->name,
  1858. pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
  1859. dev->pci_lat,
  1860. (unsigned long long)pci_resource_start(pci_dev, 0));
  1861. pci_set_master(pci_dev);
  1862. err = pci_set_dma_mask(pci_dev, 0xffffffff);
  1863. if (err) {
  1864. pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
  1865. goto fail_ctrl;
  1866. }
  1867. err = request_irq(pci_dev->irq, cx23885_irq,
  1868. IRQF_SHARED, dev->name, dev);
  1869. if (err < 0) {
  1870. pr_err("%s: can't get IRQ %d\n",
  1871. dev->name, pci_dev->irq);
  1872. goto fail_irq;
  1873. }
  1874. switch (dev->board) {
  1875. case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
  1876. cx23885_irq_add_enable(dev, PCI_MSK_GPIO1 | PCI_MSK_GPIO0);
  1877. break;
  1878. case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
  1879. cx23885_irq_add_enable(dev, PCI_MSK_GPIO0);
  1880. break;
  1881. }
  1882. /*
  1883. * The CX2388[58] IR controller can start firing interrupts when
  1884. * enabled, so these have to take place after the cx23885_irq() handler
  1885. * is hooked up by the call to request_irq() above.
  1886. */
  1887. cx23885_ir_pci_int_enable(dev);
  1888. cx23885_input_init(dev);
  1889. return 0;
  1890. fail_irq:
  1891. cx23885_dev_unregister(dev);
  1892. fail_ctrl:
  1893. v4l2_ctrl_handler_free(hdl);
  1894. v4l2_device_unregister(&dev->v4l2_dev);
  1895. fail_free:
  1896. kfree(dev);
  1897. return err;
  1898. }
  1899. static void cx23885_finidev(struct pci_dev *pci_dev)
  1900. {
  1901. struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
  1902. struct cx23885_dev *dev = to_cx23885(v4l2_dev);
  1903. cx23885_input_fini(dev);
  1904. cx23885_ir_fini(dev);
  1905. cx23885_shutdown(dev);
  1906. /* unregister stuff */
  1907. free_irq(pci_dev->irq, dev);
  1908. pci_disable_device(pci_dev);
  1909. cx23885_dev_unregister(dev);
  1910. v4l2_ctrl_handler_free(&dev->ctrl_handler);
  1911. v4l2_device_unregister(v4l2_dev);
  1912. kfree(dev);
  1913. }
  1914. static const struct pci_device_id cx23885_pci_tbl[] = {
  1915. {
  1916. /* CX23885 */
  1917. .vendor = 0x14f1,
  1918. .device = 0x8852,
  1919. .subvendor = PCI_ANY_ID,
  1920. .subdevice = PCI_ANY_ID,
  1921. }, {
  1922. /* CX23887 Rev 2 */
  1923. .vendor = 0x14f1,
  1924. .device = 0x8880,
  1925. .subvendor = PCI_ANY_ID,
  1926. .subdevice = PCI_ANY_ID,
  1927. }, {
  1928. /* --- end of list --- */
  1929. }
  1930. };
  1931. MODULE_DEVICE_TABLE(pci, cx23885_pci_tbl);
  1932. static struct pci_driver cx23885_pci_driver = {
  1933. .name = "cx23885",
  1934. .id_table = cx23885_pci_tbl,
  1935. .probe = cx23885_initdev,
  1936. .remove = cx23885_finidev,
  1937. /* TODO */
  1938. .suspend = NULL,
  1939. .resume = NULL,
  1940. };
  1941. static int __init cx23885_init(void)
  1942. {
  1943. pr_info("cx23885 driver version %s loaded\n",
  1944. CX23885_VERSION);
  1945. return pci_register_driver(&cx23885_pci_driver);
  1946. }
  1947. static void __exit cx23885_fini(void)
  1948. {
  1949. pci_unregister_driver(&cx23885_pci_driver);
  1950. }
  1951. module_init(cx23885_init);
  1952. module_exit(cx23885_fini);