netup_unidvb_ci.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*
  2. * netup_unidvb_ci.c
  3. *
  4. * DVB CAM support for NetUP Universal Dual DVB-CI
  5. *
  6. * Copyright (C) 2014 NetUP Inc.
  7. * Copyright (C) 2014 Sergey Kozlov <serjk@netup.ru>
  8. * Copyright (C) 2014 Abylay Ospan <aospan@netup.ru>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. */
  20. #include <linux/init.h>
  21. #include <linux/module.h>
  22. #include <linux/moduleparam.h>
  23. #include <linux/kmod.h>
  24. #include <linux/kernel.h>
  25. #include <linux/slab.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/delay.h>
  28. #include "netup_unidvb.h"
  29. /* CI slot 0 base address */
  30. #define CAM0_CONFIG 0x0
  31. #define CAM0_IO 0x8000
  32. #define CAM0_MEM 0x10000
  33. #define CAM0_SZ 32
  34. /* CI slot 1 base address */
  35. #define CAM1_CONFIG 0x20000
  36. #define CAM1_IO 0x28000
  37. #define CAM1_MEM 0x30000
  38. #define CAM1_SZ 32
  39. /* ctrlstat registers */
  40. #define CAM_CTRLSTAT_READ_SET 0x4980
  41. #define CAM_CTRLSTAT_CLR 0x4982
  42. /* register bits */
  43. #define BIT_CAM_STCHG (1<<0)
  44. #define BIT_CAM_PRESENT (1<<1)
  45. #define BIT_CAM_RESET (1<<2)
  46. #define BIT_CAM_BYPASS (1<<3)
  47. #define BIT_CAM_READY (1<<4)
  48. #define BIT_CAM_ERROR (1<<5)
  49. #define BIT_CAM_OVERCURR (1<<6)
  50. /* BIT_CAM_BYPASS bit shift for SLOT 1 */
  51. #define CAM1_SHIFT 8
  52. irqreturn_t netup_ci_interrupt(struct netup_unidvb_dev *ndev)
  53. {
  54. writew(0x101, ndev->bmmio0 + CAM_CTRLSTAT_CLR);
  55. return IRQ_HANDLED;
  56. }
  57. static int netup_unidvb_ci_slot_ts_ctl(struct dvb_ca_en50221 *en50221,
  58. int slot)
  59. {
  60. struct netup_ci_state *state = en50221->data;
  61. struct netup_unidvb_dev *dev = state->dev;
  62. u16 shift = (state->nr == 1) ? CAM1_SHIFT : 0;
  63. dev_dbg(&dev->pci_dev->dev, "%s(): CAM_CTRLSTAT=0x%x\n",
  64. __func__, readw(dev->bmmio0 + CAM_CTRLSTAT_READ_SET));
  65. if (slot != 0)
  66. return -EINVAL;
  67. /* pass data to CAM module */
  68. writew(BIT_CAM_BYPASS << shift, dev->bmmio0 + CAM_CTRLSTAT_CLR);
  69. dev_dbg(&dev->pci_dev->dev, "%s(): CAM_CTRLSTAT=0x%x done\n",
  70. __func__, readw(dev->bmmio0 + CAM_CTRLSTAT_READ_SET));
  71. return 0;
  72. }
  73. static int netup_unidvb_ci_slot_shutdown(struct dvb_ca_en50221 *en50221,
  74. int slot)
  75. {
  76. struct netup_ci_state *state = en50221->data;
  77. struct netup_unidvb_dev *dev = state->dev;
  78. dev_dbg(&dev->pci_dev->dev, "%s()\n", __func__);
  79. return 0;
  80. }
  81. static int netup_unidvb_ci_slot_reset(struct dvb_ca_en50221 *en50221,
  82. int slot)
  83. {
  84. struct netup_ci_state *state = en50221->data;
  85. struct netup_unidvb_dev *dev = state->dev;
  86. unsigned long timeout = 0;
  87. u16 shift = (state->nr == 1) ? CAM1_SHIFT : 0;
  88. u16 ci_stat = 0;
  89. int reset_counter = 3;
  90. dev_dbg(&dev->pci_dev->dev, "%s(): CAM_CTRLSTAT_READ_SET=0x%x\n",
  91. __func__, readw(dev->bmmio0 + CAM_CTRLSTAT_READ_SET));
  92. reset:
  93. timeout = jiffies + msecs_to_jiffies(5000);
  94. /* start reset */
  95. writew(BIT_CAM_RESET << shift, dev->bmmio0 + CAM_CTRLSTAT_READ_SET);
  96. dev_dbg(&dev->pci_dev->dev, "%s(): waiting for reset\n", __func__);
  97. /* wait until reset done */
  98. while (time_before(jiffies, timeout)) {
  99. ci_stat = readw(dev->bmmio0 + CAM_CTRLSTAT_READ_SET);
  100. if (ci_stat & (BIT_CAM_READY << shift))
  101. break;
  102. udelay(1000);
  103. }
  104. if (!(ci_stat & (BIT_CAM_READY << shift)) && reset_counter > 0) {
  105. dev_dbg(&dev->pci_dev->dev,
  106. "%s(): CAMP reset timeout! Will try again..\n",
  107. __func__);
  108. reset_counter--;
  109. goto reset;
  110. }
  111. return 0;
  112. }
  113. static int netup_unidvb_poll_ci_slot_status(struct dvb_ca_en50221 *en50221,
  114. int slot, int open)
  115. {
  116. struct netup_ci_state *state = en50221->data;
  117. struct netup_unidvb_dev *dev = state->dev;
  118. u16 shift = (state->nr == 1) ? CAM1_SHIFT : 0;
  119. u16 ci_stat = 0;
  120. dev_dbg(&dev->pci_dev->dev, "%s(): CAM_CTRLSTAT_READ_SET=0x%x\n",
  121. __func__, readw(dev->bmmio0 + CAM_CTRLSTAT_READ_SET));
  122. ci_stat = readw(dev->bmmio0 + CAM_CTRLSTAT_READ_SET);
  123. if (ci_stat & (BIT_CAM_READY << shift)) {
  124. state->status = DVB_CA_EN50221_POLL_CAM_PRESENT |
  125. DVB_CA_EN50221_POLL_CAM_READY;
  126. } else if (ci_stat & (BIT_CAM_PRESENT << shift)) {
  127. state->status = DVB_CA_EN50221_POLL_CAM_PRESENT;
  128. } else {
  129. state->status = 0;
  130. }
  131. return state->status;
  132. }
  133. static int netup_unidvb_ci_read_attribute_mem(struct dvb_ca_en50221 *en50221,
  134. int slot, int addr)
  135. {
  136. struct netup_ci_state *state = en50221->data;
  137. struct netup_unidvb_dev *dev = state->dev;
  138. u8 val = *((u8 __force *)state->membase8_io + addr);
  139. dev_dbg(&dev->pci_dev->dev,
  140. "%s(): addr=0x%x val=0x%x\n", __func__, addr, val);
  141. return val;
  142. }
  143. static int netup_unidvb_ci_write_attribute_mem(struct dvb_ca_en50221 *en50221,
  144. int slot, int addr, u8 data)
  145. {
  146. struct netup_ci_state *state = en50221->data;
  147. struct netup_unidvb_dev *dev = state->dev;
  148. dev_dbg(&dev->pci_dev->dev,
  149. "%s(): addr=0x%x data=0x%x\n", __func__, addr, data);
  150. *((u8 __force *)state->membase8_io + addr) = data;
  151. return 0;
  152. }
  153. static int netup_unidvb_ci_read_cam_ctl(struct dvb_ca_en50221 *en50221,
  154. int slot, u8 addr)
  155. {
  156. struct netup_ci_state *state = en50221->data;
  157. struct netup_unidvb_dev *dev = state->dev;
  158. u8 val = *((u8 __force *)state->membase8_io + addr);
  159. dev_dbg(&dev->pci_dev->dev,
  160. "%s(): addr=0x%x val=0x%x\n", __func__, addr, val);
  161. return val;
  162. }
  163. static int netup_unidvb_ci_write_cam_ctl(struct dvb_ca_en50221 *en50221,
  164. int slot, u8 addr, u8 data)
  165. {
  166. struct netup_ci_state *state = en50221->data;
  167. struct netup_unidvb_dev *dev = state->dev;
  168. dev_dbg(&dev->pci_dev->dev,
  169. "%s(): addr=0x%x data=0x%x\n", __func__, addr, data);
  170. *((u8 __force *)state->membase8_io + addr) = data;
  171. return 0;
  172. }
  173. int netup_unidvb_ci_register(struct netup_unidvb_dev *dev,
  174. int num, struct pci_dev *pci_dev)
  175. {
  176. int result;
  177. struct netup_ci_state *state;
  178. if (num < 0 || num > 1) {
  179. dev_err(&pci_dev->dev, "%s(): invalid CI adapter %d\n",
  180. __func__, num);
  181. return -EINVAL;
  182. }
  183. state = &dev->ci[num];
  184. state->nr = num;
  185. state->membase8_config = dev->bmmio1 +
  186. ((num == 0) ? CAM0_CONFIG : CAM1_CONFIG);
  187. state->membase8_io = dev->bmmio1 +
  188. ((num == 0) ? CAM0_IO : CAM1_IO);
  189. state->dev = dev;
  190. state->ca.owner = THIS_MODULE;
  191. state->ca.read_attribute_mem = netup_unidvb_ci_read_attribute_mem;
  192. state->ca.write_attribute_mem = netup_unidvb_ci_write_attribute_mem;
  193. state->ca.read_cam_control = netup_unidvb_ci_read_cam_ctl;
  194. state->ca.write_cam_control = netup_unidvb_ci_write_cam_ctl;
  195. state->ca.slot_reset = netup_unidvb_ci_slot_reset;
  196. state->ca.slot_shutdown = netup_unidvb_ci_slot_shutdown;
  197. state->ca.slot_ts_enable = netup_unidvb_ci_slot_ts_ctl;
  198. state->ca.poll_slot_status = netup_unidvb_poll_ci_slot_status;
  199. state->ca.data = state;
  200. result = dvb_ca_en50221_init(&dev->frontends[num].adapter,
  201. &state->ca, 0, 1);
  202. if (result < 0) {
  203. dev_err(&pci_dev->dev,
  204. "%s(): dvb_ca_en50221_init result %d\n",
  205. __func__, result);
  206. return result;
  207. }
  208. writew(NETUP_UNIDVB_IRQ_CI, dev->bmmio0 + REG_IMASK_SET);
  209. dev_info(&pci_dev->dev,
  210. "%s(): CI adapter %d init done\n", __func__, num);
  211. return 0;
  212. }
  213. void netup_unidvb_ci_unregister(struct netup_unidvb_dev *dev, int num)
  214. {
  215. struct netup_ci_state *state;
  216. dev_dbg(&dev->pci_dev->dev, "%s()\n", __func__);
  217. if (num < 0 || num > 1) {
  218. dev_err(&dev->pci_dev->dev, "%s(): invalid CI adapter %d\n",
  219. __func__, num);
  220. return;
  221. }
  222. state = &dev->ci[num];
  223. dvb_ca_en50221_release(&state->ca);
  224. }