• R/O
  • R/W (SSH)
  • R/W (HTTPS)

pt1dvr:


File Info

Rev. 68
Tamaño 24,265 bytes
Time 2009-04-26 11:35:26
Author tomy
Log Message

複数枚対応
PT1_DEVICEのdmactlのメモリ確保方法へのパッチ取り込み
リングバッファ化し、vmallocでメモリ確保するようにパッチ取り込み

Content

  1. /* pt1-pci.c: A PT1 on PCI bus driver for Linux. */
  2. #define DRV_NAME "pt1-pci"
  3. #define DRV_VERSION "1.00"
  4. #define DRV_RELDATE "11/28/2008"
  5. #include <linux/module.h>
  6. #include <linux/kernel.h>
  7. #include <linux/errno.h>
  8. #include <linux/pci.h>
  9. #include <linux/init.h>
  10. #include <linux/interrupt.h>
  11. #include <asm/system.h>
  12. #include <asm/io.h>
  13. #include <asm/irq.h>
  14. #include <asm/uaccess.h>
  15. #include <linux/version.h>
  16. #include <linux/mutex.h>
  17. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
  18. #include <linux/freezer.h>
  19. #else
  20. #define set_freezable()
  21. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
  22. typedef struct pm_message {
  23. int event;
  24. } pm_message_t;
  25. #endif
  26. #endif
  27. #include <linux/kthread.h>
  28. #include <linux/dma-mapping.h>
  29. #include <linux/fs.h>
  30. #include <linux/cdev.h>
  31. #include <linux/ioctl.h>
  32. #include "pt1_com.h"
  33. #include "pt1_pci.h"
  34. #include "pt1_tuner.h"
  35. #include "pt1_i2c.h"
  36. #include "pt1_tuner_data.h"
  37. #include "pt1_ioctl.h"
  38. /* These identify the driver base version and may not be removed. */
  39. static char version[] __devinitdata =
  40. KERN_INFO DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " \n";
  41. MODULE_AUTHOR("Tomoaki Ishikawa tomy@users.sourceforge.jp");
  42. #define DRIVER_DESC "PCI earthsoft PT1 driver"
  43. MODULE_DESCRIPTION(DRIVER_DESC);
  44. MODULE_LICENSE("GPL");
  45. static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */
  46. static int lnb = 0; /* LNB OFF:0 +11V:1 +15V:2 */
  47. module_param(debug, int, 0);
  48. module_param(lnb, int, 0);
  49. MODULE_PARM_DESC(debug, "debug level (1-2)");
  50. MODULE_PARM_DESC(debug, "LNB level (0:OFF 1:+11V 2:+15V)");
  51. static struct pci_device_id pt1_pci_tbl[] = {
  52. { 0x10ee, 0x211a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
  53. { 0, }
  54. };
  55. MODULE_DEVICE_TABLE(pci, pt1_pci_tbl);
  56. #define DEV_NAME "pt1video"
  57. #define PACKET_SIZE 188 // 1パケット長
  58. #define MAX_READ_BLOCK 4 // 1度に読み出す最大DMAバッファ数
  59. #define MAX_PCI_DEVICE 128 // 最大64枚
  60. #define DMA_SIZE 4096 // DMAバッファサイズ
  61. #define DMA_RING_SIZE 64 // RINGサイズ
  62. #define DMA_RING_MAX 511 // 1RINGにいくつ詰めるか(1023はNGで511まで)
  63. #define CHANEL_DMA_SIZE (2*1024*1024) // 地デジ用(16Mbps)
  64. #define BS_CHANEL_DMA_SIZE (4*1024*1024) // BS用(32Mbps)
  65. typedef struct _DMA_CONTROL{
  66. dma_addr_t ring_dma[DMA_RING_MAX] ; // DMA情報
  67. __u32 *data[DMA_RING_MAX];
  68. }DMA_CONTROL;
  69. typedef struct _PT1_CHANNEL PT1_CHANNEL;
  70. typedef struct _pt1_device{
  71. unsigned long mmio_start ;
  72. __u32 mmio_len ;
  73. void __iomem *regs;
  74. struct mutex lock ;
  75. dma_addr_t ring_dma[DMA_RING_SIZE] ; // DMA情報
  76. void *dmaptr[DMA_RING_SIZE] ;
  77. struct task_struct *kthread;
  78. dev_t dev ;
  79. __u32 base_major ;
  80. __u32 base_minor ;
  81. struct cdev cdev[MAX_CHANNEL];
  82. wait_queue_head_t dma_wait_q ;// for poll on reading
  83. DMA_CONTROL *dmactl[DMA_RING_SIZE];
  84. PT1_CHANNEL *channel[MAX_CHANNEL];
  85. }PT1_DEVICE;
  86. typedef struct _MICRO_PACKET{
  87. char data[3];
  88. char head ;
  89. }MICRO_PACKET;
  90. struct _PT1_CHANNEL{
  91. __u32 valid ; // 使用中フラグ
  92. __u32 address ; // I2Cアドレス
  93. __u32 channel ; // チャネル番号
  94. int type ; // チャネルタイプ
  95. __u32 packet_size ; // パケットサイズ
  96. __u32 drop ; // パケットドロップ数
  97. struct mutex lock ; // CH別mutex_lock用
  98. __u32 size ; // DMAされたサイズ
  99. __u32 maxsize ; // DMA用バッファサイズ
  100. __u32 bufsize ; // チャネルに割り振られたサイズ
  101. __u32 overflow ; // オーバーフローエラー発生
  102. __u32 counetererr ; // 転送カウンタ1エラー
  103. __u32 transerr ; // 転送エラー
  104. __u32 minor ; // マイナー番号
  105. __u8 *buf; // CH別受信メモリ
  106. __u32 pointer;
  107. __u8 req_dma ; // 溢れたチャネル
  108. __u8 packet_buf[PACKET_SIZE] ; // 溢れたチャネル
  109. PT1_DEVICE *ptr ; // カード別情報
  110. wait_queue_head_t wait_q ; // for poll on reading
  111. };
  112. // I2Cアドレス(video0, 1 = ISDB-S) (video2, 3 = ISDB-T)
  113. int i2c_address[MAX_CHANNEL] = {T0_ISDB_S, T1_ISDB_S, T0_ISDB_T, T1_ISDB_T};
  114. int real_chanel[MAX_CHANNEL] = {0, 2, 1, 3};
  115. int channeltype[MAX_CHANNEL] = {CHANNEL_TYPE_ISDB_S, CHANNEL_TYPE_ISDB_S,
  116. CHANNEL_TYPE_ISDB_T, CHANNEL_TYPE_ISDB_T};
  117. static PT1_DEVICE *device[MAX_PCI_DEVICE];
  118. static struct class *pt1video_class;
  119. #define PT1MAJOR 251
  120. #define DRIVERNAME "pt1video"
  121. static void reset_dma(PT1_DEVICE *dev_conf)
  122. {
  123. int lp ;
  124. __u32 addr ;
  125. int ring_pos = 0;
  126. int data_pos = 0 ;
  127. __u32 *dataptr ;
  128. // データ初期化
  129. for(ring_pos = 0 ; ring_pos < DMA_RING_SIZE ; ring_pos++){
  130. for(data_pos = 0 ; data_pos < DMA_RING_MAX ; data_pos++){
  131. dataptr = (dev_conf->dmactl[ring_pos])->data[data_pos];
  132. dataptr[(DMA_SIZE / sizeof(__u32)) - 2] = 0;
  133. }
  134. }
  135. // 転送カウンタをリセット
  136. writel(0x00000010, dev_conf->regs);
  137. // 転送カウンタをインクリメント
  138. for(lp = 0 ; lp < DMA_RING_SIZE ; lp++){
  139. writel(0x00000020, dev_conf->regs);
  140. }
  141. addr = (int)dev_conf->ring_dma[0] ;
  142. addr >>= 12 ;
  143. // DMAバッファ設定
  144. writel(addr, dev_conf->regs + DMA_ADDR);
  145. // DMA開始
  146. writel(0x0c000040, dev_conf->regs);
  147. }
  148. static int pt1_thread(void *data)
  149. {
  150. PT1_DEVICE *dev_conf = data ;
  151. PT1_CHANNEL *channel ;
  152. int ring_pos = 0;
  153. int data_pos = 0 ;
  154. int lp ;
  155. int chno ;
  156. int lp2 ;
  157. int dma_channel ;
  158. int packet_pos ;
  159. __u32 addr ;
  160. __u32 *dataptr ;
  161. __u32 *curdataptr ;
  162. __u32 val ;
  163. union mpacket{
  164. __u32 val ;
  165. MICRO_PACKET packet ;
  166. }micro;
  167. set_freezable();
  168. reset_dma(dev_conf);
  169. printk(KERN_INFO "pt1_thread run\n");
  170. for(;;){
  171. if(kthread_should_stop()){
  172. break ;
  173. }
  174. for(;;){
  175. dataptr = (dev_conf->dmactl[ring_pos])->data[data_pos];
  176. // データあり?
  177. if(dataptr[(DMA_SIZE / sizeof(__u32)) - 2] == 0){
  178. break ;
  179. }
  180. micro.val = *dataptr ;
  181. curdataptr = dataptr ;
  182. data_pos += 1 ;
  183. for(lp = 0 ; lp < (DMA_SIZE / sizeof(__u32)) ; lp++, dataptr++){
  184. micro.val = *dataptr ;
  185. dma_channel = ((micro.packet.head >> 5) & 0x07);
  186. //チャネル情報不正
  187. if(dma_channel > MAX_CHANNEL){
  188. printk(KERN_ERR "DMA Channel Number Error(%d)\n", dma_channel);
  189. continue ;
  190. }
  191. chno = real_chanel[(((micro.packet.head >> 5) & 0x07) - 1)];
  192. packet_pos = ((micro.packet.head >> 2) & 0x07);
  193. channel = dev_conf->channel[chno] ;
  194. // エラーチェック
  195. if((micro.packet.head & MICROPACKET_ERROR)){
  196. val = readl(dev_conf->regs);
  197. if((val & BIT_RAM_OVERFLOW)){
  198. channel->overflow += 1 ;
  199. }
  200. if((val & BIT_INITIATOR_ERROR)){
  201. channel->counetererr += 1 ;
  202. }
  203. if((val & BIT_INITIATOR_WARNING)){
  204. channel->transerr += 1 ;
  205. }
  206. // 初期化して先頭から
  207. reset_dma(dev_conf);
  208. ring_pos = data_pos = 0 ;
  209. break ;
  210. }
  211. // 未使用チャネルは捨てる
  212. if(channel->valid == FALSE){
  213. continue ;
  214. }
  215. mutex_lock(&channel->lock);
  216. // あふれたら読み出すまで待つ
  217. while(1){
  218. if(channel->size >= (channel->maxsize - (PACKET_SIZE + 4))){
  219. // 該当チャンネルのDMA読みだし待ちにする
  220. wake_up(&channel->wait_q);
  221. channel->req_dma = TRUE ;
  222. mutex_unlock(&channel->lock);
  223. // タスクに時間を渡す為中断
  224. wait_event_timeout(dev_conf->dma_wait_q, (channel->req_dma == FALSE),
  225. msecs_to_jiffies(500));
  226. mutex_lock(&channel->lock);
  227. channel->drop += 1 ;
  228. }else{
  229. break ;
  230. }
  231. }
  232. // 先頭で、一時バッファに残っている場合
  233. if((micro.packet.head & 0x02) && (channel->packet_size != 0)){
  234. channel->packet_size = 0 ;
  235. }
  236. // データコピー
  237. for(lp2 = 2 ; lp2 >= 0 ; lp2--){
  238. channel->packet_buf[channel->packet_size] = micro.packet.data[lp2] ;
  239. channel->packet_size += 1 ;
  240. }
  241. // パケットが出来たらコピーする
  242. if(channel->packet_size >= PACKET_SIZE){
  243. if (channel->pointer + channel->size >= channel->maxsize) {
  244. // リングバッファの境界を越えていてリングバッファの先頭に戻っている場合
  245. // channel->pointer + channel->size - channel->maxsize でリングバッファ先頭からのアドレスになる
  246. memcpy(&channel->buf[channel->pointer + channel->size - channel->maxsize], channel->packet_buf, PACKET_SIZE);
  247. } else if (channel->pointer + channel->size + PACKET_SIZE > channel->maxsize) {
  248. // リングバッファの境界をまたぐように書き込まれる場合
  249. // リングバッファの境界まで書き込み
  250. __u32 tmp_size = channel->maxsize - (channel->pointer + channel->size);
  251. memcpy(&channel->buf[channel->pointer + channel->size], channel->packet_buf, tmp_size);
  252. // 先頭に戻って書き込み
  253. memcpy(channel->buf, &channel->packet_buf[tmp_size], PACKET_SIZE - tmp_size);
  254. } else {
  255. // リングバッファ内で収まる場合
  256. // 通常の書き込み
  257. memcpy(&channel->buf[channel->pointer + channel->size], channel->packet_buf, PACKET_SIZE);
  258. }
  259. channel->size += PACKET_SIZE ;
  260. channel->packet_size = 0 ;
  261. }
  262. mutex_unlock(&channel->lock);
  263. }
  264. curdataptr[(DMA_SIZE / sizeof(__u32)) - 2] = 0;
  265. if(data_pos >= DMA_RING_MAX){
  266. data_pos = 0;
  267. ring_pos += 1 ;
  268. // DMAリングが変わった場合はインクリメント
  269. writel(0x00000020, dev_conf->regs);
  270. if(ring_pos >= DMA_RING_SIZE){
  271. ring_pos = 0 ;
  272. }
  273. }
  274. // 頻度を落す(4Kで起動させる)
  275. for(lp = 0 ; lp < MAX_CHANNEL ; lp++){
  276. channel = dev_conf->channel[real_chanel[lp]] ;
  277. if((channel->size >= DMA_SIZE) && (channel->valid == TRUE)){
  278. wake_up(&channel->wait_q);
  279. }
  280. }
  281. }
  282. schedule_timeout_interruptible(msecs_to_jiffies(1));
  283. }
  284. return 0 ;
  285. }
  286. static int pt1_open(struct inode *inode, struct file *file)
  287. {
  288. int minor = iminor(inode);
  289. int major = imajor(inode);
  290. int lp ;
  291. int lp2 ;
  292. PT1_CHANNEL *channel ;
  293. for(lp = 0 ; lp < MAX_PCI_DEVICE ; lp++){
  294. if(device[lp] == NULL){
  295. return -EIO ;
  296. }
  297. if(device[lp]->base_major != major){
  298. continue ;
  299. }
  300. if((device[lp]->base_minor <= minor) &&
  301. ((device[lp]->base_minor + MAX_CHANNEL) > minor)){
  302. mutex_lock(&device[lp]->lock);
  303. for(lp2 = 0 ; lp2 < MAX_CHANNEL ; lp2++){
  304. channel = device[lp]->channel[lp2] ;
  305. if(channel->minor == minor){
  306. if(channel->valid == TRUE){
  307. mutex_unlock(&device[lp]->lock);
  308. return -EIO ;
  309. }
  310. channel->drop = 0 ;
  311. channel->valid = TRUE ;
  312. channel->overflow = 0 ;
  313. channel->counetererr = 0 ;
  314. channel->transerr = 0 ;
  315. channel->packet_size = 0 ;
  316. file->private_data = channel;
  317. mutex_lock(&channel->lock);
  318. // データ初期化
  319. channel->size = 0 ;
  320. mutex_unlock(&channel->lock);
  321. mutex_unlock(&device[lp]->lock);
  322. return 0 ;
  323. }
  324. }
  325. }
  326. }
  327. return -EIO;
  328. }
  329. static int pt1_release(struct inode *inode, struct file *file)
  330. {
  331. int minor = iminor(inode);
  332. int major = iminor(inode);
  333. PT1_CHANNEL *channel = file->private_data;
  334. mutex_lock(&channel->ptr->lock);
  335. SetStream(channel->ptr->regs, channel->channel, FALSE);
  336. channel->valid = FALSE ;
  337. printk(KERN_INFO "(%d:%d)Drop=%08d:%08d:%08d:%08d\n", major, minor, channel->drop,
  338. channel->overflow, channel->counetererr, channel->transerr);
  339. channel->overflow = 0 ;
  340. channel->counetererr = 0 ;
  341. channel->transerr = 0 ;
  342. channel->drop = 0 ;
  343. // 停止している場合は起こす
  344. if(channel->req_dma == TRUE){
  345. channel->req_dma = FALSE ;
  346. wake_up(&channel->ptr->dma_wait_q);
  347. }
  348. mutex_unlock(&channel->ptr->lock);
  349. return 0;
  350. }
  351. static ssize_t pt1_read(struct file *file, char __user *buf, size_t cnt, loff_t * ppos)
  352. {
  353. PT1_CHANNEL *channel = file->private_data;
  354. __u32 size ;
  355. // 4K単位で起こされるのを待つ(CPU負荷対策)
  356. if(channel->size < DMA_SIZE){
  357. wait_event_timeout(channel->wait_q, (channel->size >= DMA_SIZE),
  358. msecs_to_jiffies(500));
  359. }
  360. mutex_lock(&channel->lock);
  361. if(!channel->size){
  362. size = 0 ;
  363. }else{
  364. __u32 tmp_size = 0;
  365. if (cnt < channel->size) {
  366. // バッファにあるデータより小さい読み込みの場合
  367. size = cnt;
  368. } else {
  369. // バッファにあるデータ以上の読み込みの場合
  370. size = channel->size;
  371. }
  372. if (channel->maxsize <= size + channel->pointer) {
  373. // リングバッファの境界を越える場合
  374. tmp_size = channel->maxsize - channel->pointer;
  375. // 境界までコピー
  376. copy_to_user(buf, &channel->buf[channel->pointer], tmp_size);
  377. // 残りをコピー
  378. copy_to_user(&buf[tmp_size], channel->buf, size - tmp_size);
  379. channel->pointer = size - tmp_size;
  380. } else {
  381. // 普通にコピー
  382. copy_to_user(buf, &channel->buf[channel->pointer], size);
  383. channel->pointer += size;
  384. }
  385. channel->size -= size;
  386. }
  387. // 読み終わったかつ使用しているのがが4K以下
  388. if(channel->req_dma == TRUE){
  389. channel->req_dma = FALSE ;
  390. wake_up(&channel->ptr->dma_wait_q);
  391. }
  392. mutex_unlock(&channel->lock);
  393. return size ;
  394. }
  395. static int SetFreq(PT1_CHANNEL *channel, FREQUENCY *freq)
  396. {
  397. switch(channel->type){
  398. case CHANNEL_TYPE_ISDB_S:
  399. {
  400. ISDB_S_TMCC tmcc ;
  401. if(bs_tune(channel->ptr->regs,
  402. &channel->ptr->lock,
  403. channel->address,
  404. freq->frequencyno,
  405. &tmcc) < 0){
  406. return -EIO ;
  407. }
  408. #if 0
  409. printk(KERN_INFO "clockmargin = (%x)\n", (tmcc.clockmargin & 0xFF));
  410. printk(KERN_INFO "carriermargin = (%x)\n", (tmcc.carriermargin & 0xFF));
  411. for(lp = 0 ; lp < MAX_BS_TS_ID ; lp++){
  412. if(tmcc.ts_id[lp].ts_id == 0xFFFF){
  413. continue ;
  414. }
  415. printk(KERN_INFO "Slot(%d:%x)\n", lp, tmcc.ts_id[lp].ts_id);
  416. printk(KERN_INFO "mode (low/high) = (%x:%x)\n",
  417. tmcc.ts_id[lp].low_mode, tmcc.ts_id[lp].high_mode);
  418. printk(KERN_INFO "slot (low/high) = (%x:%x)\n",
  419. tmcc.ts_id[lp].low_slot,
  420. tmcc.ts_id[lp].high_slot);
  421. }
  422. #endif
  423. ts_lock(channel->ptr->regs,
  424. &channel->ptr->lock,
  425. channel->address,
  426. tmcc.ts_id[freq->slot].ts_id);
  427. }
  428. break ;
  429. case CHANNEL_TYPE_ISDB_T:
  430. {
  431. if(isdb_t_frequency(channel->ptr->regs,
  432. &channel->ptr->lock,
  433. channel->address,
  434. freq->frequencyno, freq->slot) < 0){
  435. return -EINVAL ;
  436. }
  437. }
  438. }
  439. return 0 ;
  440. }
  441. static int pt1_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
  442. {
  443. PT1_CHANNEL *channel = file->private_data;
  444. int signal ;
  445. switch(cmd){
  446. case SET_CHANNEL:
  447. {
  448. FREQUENCY freq ;
  449. copy_from_user(&freq, arg, sizeof(FREQUENCY));
  450. return SetFreq(channel, &freq);
  451. }
  452. case START_REC:
  453. SetStream(channel->ptr->regs, channel->channel, TRUE);
  454. return 0 ;
  455. case STOP_REC:
  456. SetStream(channel->ptr->regs, channel->channel, FALSE);
  457. return 0 ;
  458. case GET_SIGNAL_STRENGTH:
  459. switch(channel->type){
  460. case CHANNEL_TYPE_ISDB_S:
  461. {
  462. signal = isdb_s_read_signal_strength(channel->ptr->regs,
  463. &channel->ptr->lock,
  464. channel->address);
  465. }
  466. break ;
  467. case CHANNEL_TYPE_ISDB_T:
  468. // calc C/N
  469. signal = isdb_t_read_signal_strength(channel->ptr->regs,
  470. &channel->ptr->lock, channel->address);
  471. break ;
  472. }
  473. copy_to_user(arg, &signal, sizeof(int));
  474. return 0 ;
  475. case LNB_ENABLE:
  476. if(lnb){
  477. settuner_reset(channel->ptr->regs, lnb, TUNER_POWER_ON_RESET_DISABLE);
  478. }
  479. return 0 ;
  480. case LNB_DISABLE:
  481. if(lnb){
  482. settuner_reset(channel->ptr->regs, LNB_OFF, TUNER_POWER_ON_RESET_DISABLE);
  483. }
  484. return 0 ;
  485. }
  486. return -EINVAL;
  487. }
  488. /*
  489. */
  490. static const struct file_operations pt1_fops = {
  491. .owner = THIS_MODULE,
  492. .open = pt1_open,
  493. .release = pt1_release,
  494. .read = pt1_read,
  495. .ioctl = pt1_ioctl,
  496. .llseek = no_llseek,
  497. };
  498. int pt1_makering(struct pci_dev *pdev, PT1_DEVICE *dev_conf)
  499. {
  500. int lp ;
  501. int lp2 ;
  502. DMA_CONTROL *dmactl;
  503. __u32 *dmaptr ;
  504. __u32 addr ;
  505. __u32 *ptr ;
  506. //DMAリング作成
  507. for(lp = 0 ; lp < DMA_RING_SIZE ; lp++){
  508. ptr = dev_conf->dmaptr[lp];
  509. if(lp == (DMA_RING_SIZE - 1)){
  510. addr = (__u32)dev_conf->ring_dma[0];
  511. }else{
  512. addr = (__u32)dev_conf->ring_dma[(lp + 1)];
  513. }
  514. addr >>= 12 ;
  515. memcpy(ptr, &addr, sizeof(__u32));
  516. ptr += 1 ;
  517. dmactl = dev_conf->dmactl[lp];
  518. for(lp2 = 0 ; lp2 < DMA_RING_MAX ; lp2++){
  519. dmaptr = pci_alloc_consistent(pdev, DMA_SIZE, &dmactl->ring_dma[lp2]);
  520. if(dmaptr == NULL){
  521. printk(KERN_INFO "PT1:DMA ALLOC ERROR\n");
  522. return -1 ;
  523. }
  524. dmactl->data[lp2] = dmaptr ;
  525. // DMAデータエリア初期化
  526. dmaptr[(DMA_SIZE / sizeof(__u32)) - 2] = 0 ;
  527. addr = (__u32)dmactl->ring_dma[lp2];
  528. addr >>= 12 ;
  529. memcpy(ptr, &addr, sizeof(__u32));
  530. ptr += 1 ;
  531. }
  532. }
  533. return 0 ;
  534. }
  535. int pt1_dma_init(struct pci_dev *pdev, PT1_DEVICE *dev_conf)
  536. {
  537. int lp ;
  538. void *ptr ;
  539. for(lp = 0 ; lp < DMA_RING_SIZE ; lp++){
  540. ptr = pci_alloc_consistent(pdev, DMA_SIZE, &dev_conf->ring_dma[lp]);
  541. if(ptr == NULL){
  542. printk(KERN_INFO "PT1:DMA ALLOC ERROR\n");
  543. return -1 ;
  544. }
  545. dev_conf->dmaptr[lp] = ptr ;
  546. }
  547. return pt1_makering(pdev, dev_conf);
  548. }
  549. int pt1_dma_free(struct pci_dev *pdev, PT1_DEVICE *dev_conf)
  550. {
  551. int lp ;
  552. int lp2 ;
  553. for(lp = 0 ; lp < DMA_RING_SIZE ; lp++){
  554. if(dev_conf->dmaptr[lp] != NULL){
  555. pci_free_consistent(pdev, DMA_SIZE,
  556. dev_conf->dmaptr[lp], dev_conf->ring_dma[lp]);
  557. for(lp2 = 0 ; lp2 < DMA_RING_MAX ; lp2++){
  558. if((dev_conf->dmactl[lp])->data[lp2] != NULL){
  559. pci_free_consistent(pdev, DMA_SIZE,
  560. (dev_conf->dmactl[lp])->data[lp2],
  561. (dev_conf->dmactl[lp])->ring_dma[lp2]);
  562. }
  563. }
  564. }
  565. }
  566. return 0 ;
  567. }
  568. static int __devinit pt1_pci_init_one (struct pci_dev *pdev,
  569. const struct pci_device_id *ent)
  570. {
  571. int rc ;
  572. int lp ;
  573. int minor ;
  574. int base_minor ;
  575. u16 cmd ;
  576. PT1_DEVICE *dev_conf ;
  577. PT1_CHANNEL *channel ;
  578. int i;
  579. rc = pci_enable_device(pdev);
  580. if (rc)
  581. return rc;
  582. rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
  583. if (rc) {
  584. printk(KERN_ERR "PT1:DMA MASK ERROR");
  585. return rc;
  586. }
  587. pci_read_config_word(pdev, PCI_COMMAND, &cmd);
  588. if (!(cmd & PCI_COMMAND_MASTER)) {
  589. printk(KERN_INFO "Attempting to enable Bus Mastering\n");
  590. pci_set_master(pdev);
  591. pci_read_config_word(pdev, PCI_COMMAND, &cmd);
  592. if (!(cmd & PCI_COMMAND_MASTER)) {
  593. printk(KERN_ERR "Bus Mastering is not enabled\n");
  594. return -EIO;
  595. }
  596. }
  597. printk(KERN_INFO "Bus Mastering Enabled.\n");
  598. dev_conf = kzalloc(sizeof(PT1_DEVICE), GFP_KERNEL);
  599. if(!dev_conf){
  600. printk(KERN_ERR "PT1:out of memory !");
  601. return -ENOMEM ;
  602. }
  603. for (i = 0; i < DMA_RING_SIZE; i++) {
  604. dev_conf->dmactl[i] = kzalloc(sizeof(DMA_CONTROL), GFP_KERNEL);
  605. if(!dev_conf->dmactl[i]){
  606. int j;
  607. for (j = 0; j < i; j++) {
  608. kfree(dev_conf->dmactl[j]);
  609. }
  610. kfree(dev_conf);
  611. printk(KERN_ERR "PT1:out of memory !");
  612. return -ENOMEM ;
  613. }
  614. }
  615. // PCIアドレスをマップする
  616. dev_conf->mmio_start = pci_resource_start(pdev, 0);
  617. dev_conf->mmio_len = pci_resource_len(pdev, 0);
  618. rc = request_mem_region(dev_conf->mmio_start, dev_conf->mmio_len, DEV_NAME);
  619. if (!rc) {
  620. printk(KERN_ERR "PT1: cannot request iomem (0x%llx).\n", (unsigned long long) dev_conf->mmio_start);
  621. goto out_err_regbase;
  622. }
  623. dev_conf->regs = ioremap(dev_conf->mmio_start, dev_conf->mmio_len);
  624. if (!dev_conf->regs){
  625. printk(KERN_ERR "pt1: Can't remap register area.\n");
  626. goto out_err_regbase;
  627. }
  628. // 初期化処理
  629. if(xc3s_init(dev_conf->regs)){
  630. printk(KERN_ERR "Error xc3s_init\n");
  631. goto out_err_fpga;
  632. }
  633. // チューナリセット
  634. settuner_reset(dev_conf->regs, LNB_OFF, TUNER_POWER_ON_RESET_ENABLE);
  635. schedule_timeout_interruptible(msecs_to_jiffies(50));
  636. settuner_reset(dev_conf->regs, LNB_OFF, TUNER_POWER_ON_RESET_DISABLE);
  637. schedule_timeout_interruptible(msecs_to_jiffies(10));
  638. mutex_init(&dev_conf->lock);
  639. // Tuner 初期化処理
  640. for(lp = 0 ; lp < MAX_TUNER ; lp++){
  641. rc = tuner_init(dev_conf->regs, &dev_conf->lock, lp);
  642. if(rc < 0){
  643. printk(KERN_ERR "Error tuner_init\n");
  644. goto out_err_fpga;
  645. }
  646. }
  647. // 初期化完了
  648. for(lp = 0 ; lp < MAX_CHANNEL ; lp++){
  649. set_sleepmode(dev_conf->regs, &dev_conf->lock,
  650. i2c_address[lp], channeltype[lp], TYPE_SLEEP);
  651. schedule_timeout_interruptible(msecs_to_jiffies(50));
  652. }
  653. rc = alloc_chrdev_region(&dev_conf->dev, 0, MAX_CHANNEL, DEV_NAME);
  654. if(rc < 0){
  655. goto out_err_fpga;
  656. }
  657. // 初期化
  658. init_waitqueue_head(&dev_conf->dma_wait_q);
  659. dev_conf->base_major = MAJOR(dev_conf->dev) ;
  660. for(lp = 0 ; lp < MAX_PCI_DEVICE ; lp++){
  661. if(device[lp] == NULL){
  662. device[lp] = dev_conf ;
  663. base_minor = (lp * MAX_CHANNEL);
  664. break ;
  665. }
  666. }
  667. dev_conf->base_minor = base_minor ;
  668. for(lp = 0 ; lp < MAX_CHANNEL ; lp++){
  669. cdev_init(&dev_conf->cdev[lp], &pt1_fops);
  670. cdev_add(&dev_conf->cdev[lp], MKDEV(MAJOR(dev_conf->dev), (base_minor + lp)), 1);
  671. channel = kzalloc(sizeof(PT1_CHANNEL), GFP_KERNEL);
  672. if(!channel){
  673. printk(KERN_ERR "PT1:out of memory !");
  674. return -ENOMEM ;
  675. }
  676. // 共通情報
  677. mutex_init(&channel->lock);
  678. // 待ち状態を解除
  679. channel->req_dma = FALSE ;
  680. // マイナー番号設定
  681. channel->minor = base_minor + lp ;
  682. // 対象のI2Cデバイス
  683. channel->address = i2c_address[lp] ;
  684. channel->type = channeltype[lp] ;
  685. // 実際のチューナ番号
  686. channel->channel = real_chanel[lp] ;
  687. channel->ptr = dev_conf ;
  688. channel->size = 0 ;
  689. dev_conf->channel[lp] = channel ;
  690. init_waitqueue_head(&channel->wait_q);
  691. switch(channel->type){
  692. case CHANNEL_TYPE_ISDB_T:
  693. channel->maxsize = CHANEL_DMA_SIZE ;
  694. channel->buf = vmalloc(CHANEL_DMA_SIZE);
  695. channel->pointer = 0;
  696. break ;
  697. case CHANNEL_TYPE_ISDB_S:
  698. channel->maxsize = BS_CHANEL_DMA_SIZE ;
  699. channel->buf = vmalloc(BS_CHANEL_DMA_SIZE);
  700. channel->pointer = 0;
  701. break ;
  702. }
  703. if(channel->buf == NULL){
  704. goto out_err_v4l;
  705. }
  706. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
  707. device_create(pt1video_class, NULL, MKDEV(MAJOR(dev_conf->dev),
  708. (base_minor + lp)), NULL,
  709. "pt1video%u", base_minor + lp);
  710. #else
  711. device_create(pt1video_class, NULL, MKDEV(MAJOR(dev_conf->dev),
  712. (base_minor + lp)),
  713. "pt1video%u", base_minor + lp);
  714. #endif
  715. #if 0
  716. dev_conf->vdev[lp] = video_device_alloc();
  717. memcpy(dev_conf->vdev[lp], &pt1_template, sizeof(pt1_template));
  718. video_set_drvdata(dev_conf->vdev[lp], channel);
  719. video_register_device(dev_conf->vdev[lp], VFL_TYPE_GRABBER, -1);
  720. #endif
  721. }
  722. if(pt1_dma_init(pdev, dev_conf) < 0){
  723. goto out_err_dma;
  724. }
  725. dev_conf->kthread = kthread_run(pt1_thread, dev_conf, "pt1");
  726. pci_set_drvdata(pdev, dev_conf);
  727. return 0;
  728. out_err_dma:
  729. pt1_dma_free(pdev, dev_conf);
  730. out_err_v4l:
  731. for(lp = 0 ; lp < MAX_CHANNEL ; lp++){
  732. if(dev_conf->channel[lp] != NULL){
  733. if(dev_conf->channel[lp]->buf != NULL){
  734. vfree(dev_conf->channel[lp]->buf);
  735. }
  736. kfree(dev_conf->channel[lp]);
  737. }
  738. }
  739. out_err_fpga:
  740. writel(0xb0b0000, dev_conf->regs);
  741. writel(0, dev_conf->regs + 4);
  742. iounmap(dev_conf->regs);
  743. release_mem_region(dev_conf->mmio_start, dev_conf->mmio_len);
  744. for (i = 0; i < DMA_RING_SIZE; i++) {
  745. kfree(dev_conf->dmactl[i]);
  746. }
  747. kfree(dev_conf);
  748. out_err_regbase:
  749. return -EIO;
  750. }
  751. static void __devexit pt1_pci_remove_one(struct pci_dev *pdev)
  752. {
  753. int lp ;
  754. __u32 val ;
  755. PT1_DEVICE *dev_conf = (PT1_DEVICE *)pci_get_drvdata(pdev);
  756. int i;
  757. if(dev_conf){
  758. if(dev_conf->kthread) {
  759. kthread_stop(dev_conf->kthread);
  760. dev_conf->kthread = NULL;
  761. }
  762. // DMA終了
  763. writel(0x08080000, dev_conf->regs);
  764. for(lp = 0 ; lp < 10 ; lp++){
  765. val = readl(dev_conf->regs);
  766. if(!(val & (1 << 6))){
  767. break ;
  768. }
  769. schedule_timeout_interruptible(msecs_to_jiffies(1));
  770. }
  771. pt1_dma_free(pdev, dev_conf);
  772. for(lp = 0 ; lp < MAX_CHANNEL ; lp++){
  773. if(dev_conf->channel[lp] != NULL){
  774. cdev_del(&dev_conf->cdev[lp]);
  775. vfree(dev_conf->channel[lp]->buf);
  776. kfree(dev_conf->channel[lp]);
  777. }
  778. device_destroy(pt1video_class,
  779. MKDEV(MAJOR(dev_conf->dev), (dev_conf->base_minor + lp)));
  780. }
  781. unregister_chrdev_region(dev_conf->dev, MAX_CHANNEL);
  782. writel(0xb0b0000, dev_conf->regs);
  783. writel(0, dev_conf->regs + 4);
  784. settuner_reset(dev_conf->regs, LNB_OFF, TUNER_POWER_OFF);
  785. release_mem_region(dev_conf->mmio_start, dev_conf->mmio_len);
  786. iounmap(dev_conf->regs);
  787. for (i = 0; i < DMA_RING_SIZE; i++) {
  788. kfree(dev_conf->dmactl[i]);
  789. }
  790. kfree(dev_conf);
  791. }
  792. pci_set_drvdata(pdev, NULL);
  793. }
  794. #ifdef CONFIG_PM
  795. static int pt1_pci_suspend (struct pci_dev *pdev, pm_message_t state)
  796. {
  797. return 0;
  798. }
  799. static int pt1_pci_resume (struct pci_dev *pdev)
  800. {
  801. return 0;
  802. }
  803. #endif /* CONFIG_PM */
  804. static struct pci_driver pt1_driver = {
  805. .name = DRV_NAME,
  806. .probe = pt1_pci_init_one,
  807. .remove = __devexit_p(pt1_pci_remove_one),
  808. .id_table = pt1_pci_tbl,
  809. #ifdef CONFIG_PM
  810. .suspend = pt1_pci_suspend,
  811. .resume = pt1_pci_resume,
  812. #endif /* CONFIG_PM */
  813. };
  814. static int __init pt1_pci_init(void)
  815. {
  816. pt1video_class = class_create(THIS_MODULE, DRIVERNAME);
  817. if (IS_ERR(pt1video_class))
  818. return PTR_ERR(pt1video_class);
  819. return pci_register_driver(&pt1_driver);
  820. }
  821. static void __exit pt1_pci_cleanup(void)
  822. {
  823. class_destroy(pt1video_class);
  824. pci_unregister_driver (&pt1_driver);
  825. }
  826. module_init(pt1_pci_init);
  827. module_exit(pt1_pci_cleanup);
旧リポジトリブラウザで表示