dvbdev.c 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  1. /*
  2. * dvbdev.c
  3. *
  4. * Copyright (C) 2000 Ralph Metzler <ralph@convergence.de>
  5. * & Marcus Metzler <marcus@convergence.de>
  6. * for convergence integrated media GmbH
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public License
  10. * as published by the Free Software Foundation; either version 2.1
  11. * of the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. */
  19. #define pr_fmt(fmt) "dvbdev: " fmt
  20. #include <linux/types.h>
  21. #include <linux/errno.h>
  22. #include <linux/string.h>
  23. #include <linux/module.h>
  24. #include <linux/kernel.h>
  25. #include <linux/init.h>
  26. #include <linux/slab.h>
  27. #include <linux/device.h>
  28. #include <linux/fs.h>
  29. #include <linux/cdev.h>
  30. #include <linux/mutex.h>
  31. #include "dvbdev.h"
  32. /* Due to enum tuner_pad_index */
  33. #include <media/tuner.h>
  34. static DEFINE_MUTEX(dvbdev_mutex);
  35. static int dvbdev_debug;
  36. module_param(dvbdev_debug, int, 0644);
  37. MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");
  38. #define dprintk(fmt, arg...) do { \
  39. if (dvbdev_debug) \
  40. printk(KERN_DEBUG pr_fmt("%s: " fmt), \
  41. __func__, ##arg); \
  42. } while (0)
  43. static LIST_HEAD(dvb_adapter_list);
  44. static DEFINE_MUTEX(dvbdev_register_lock);
  45. static const char * const dnames[] = {
  46. [DVB_DEVICE_VIDEO] = "video",
  47. [DVB_DEVICE_AUDIO] = "audio",
  48. [DVB_DEVICE_SEC] = "sec",
  49. [DVB_DEVICE_FRONTEND] = "frontend",
  50. [DVB_DEVICE_DEMUX] = "demux",
  51. [DVB_DEVICE_DVR] = "dvr",
  52. [DVB_DEVICE_CA] = "ca",
  53. [DVB_DEVICE_NET] = "net",
  54. [DVB_DEVICE_OSD] = "osd"
  55. };
  56. #ifdef CONFIG_DVB_DYNAMIC_MINORS
  57. #define MAX_DVB_MINORS 256
  58. #define DVB_MAX_IDS MAX_DVB_MINORS
  59. #else
  60. #define DVB_MAX_IDS 4
  61. static const u8 minor_type[] = {
  62. [DVB_DEVICE_VIDEO] = 0,
  63. [DVB_DEVICE_AUDIO] = 1,
  64. [DVB_DEVICE_SEC] = 2,
  65. [DVB_DEVICE_FRONTEND] = 3,
  66. [DVB_DEVICE_DEMUX] = 4,
  67. [DVB_DEVICE_DVR] = 5,
  68. [DVB_DEVICE_CA] = 6,
  69. [DVB_DEVICE_NET] = 7,
  70. [DVB_DEVICE_OSD] = 8,
  71. };
  72. #define nums2minor(num, type, id) \
  73. (((num) << 6) | ((id) << 4) | minor_type[type])
  74. #define MAX_DVB_MINORS (DVB_MAX_ADAPTERS*64)
  75. #endif
  76. static struct class *dvb_class;
  77. static struct dvb_device *dvb_minors[MAX_DVB_MINORS];
  78. static DECLARE_RWSEM(minor_rwsem);
  79. static int dvb_device_open(struct inode *inode, struct file *file)
  80. {
  81. struct dvb_device *dvbdev;
  82. mutex_lock(&dvbdev_mutex);
  83. down_read(&minor_rwsem);
  84. dvbdev = dvb_minors[iminor(inode)];
  85. if (dvbdev && dvbdev->fops) {
  86. int err = 0;
  87. const struct file_operations *new_fops;
  88. new_fops = fops_get(dvbdev->fops);
  89. if (!new_fops)
  90. goto fail;
  91. file->private_data = dvbdev;
  92. replace_fops(file, new_fops);
  93. if (file->f_op->open)
  94. err = file->f_op->open(inode, file);
  95. up_read(&minor_rwsem);
  96. mutex_unlock(&dvbdev_mutex);
  97. return err;
  98. }
  99. fail:
  100. up_read(&minor_rwsem);
  101. mutex_unlock(&dvbdev_mutex);
  102. return -ENODEV;
  103. }
  104. static const struct file_operations dvb_device_fops =
  105. {
  106. .owner = THIS_MODULE,
  107. .open = dvb_device_open,
  108. .llseek = noop_llseek,
  109. };
  110. static struct cdev dvb_device_cdev;
  111. int dvb_generic_open(struct inode *inode, struct file *file)
  112. {
  113. struct dvb_device *dvbdev = file->private_data;
  114. if (!dvbdev)
  115. return -ENODEV;
  116. if (!dvbdev->users)
  117. return -EBUSY;
  118. if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
  119. if (!dvbdev->readers)
  120. return -EBUSY;
  121. dvbdev->readers--;
  122. } else {
  123. if (!dvbdev->writers)
  124. return -EBUSY;
  125. dvbdev->writers--;
  126. }
  127. dvbdev->users--;
  128. return 0;
  129. }
  130. EXPORT_SYMBOL(dvb_generic_open);
  131. int dvb_generic_release(struct inode *inode, struct file *file)
  132. {
  133. struct dvb_device *dvbdev = file->private_data;
  134. if (!dvbdev)
  135. return -ENODEV;
  136. if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
  137. dvbdev->readers++;
  138. } else {
  139. dvbdev->writers++;
  140. }
  141. dvbdev->users++;
  142. return 0;
  143. }
  144. EXPORT_SYMBOL(dvb_generic_release);
  145. long dvb_generic_ioctl(struct file *file,
  146. unsigned int cmd, unsigned long arg)
  147. {
  148. struct dvb_device *dvbdev = file->private_data;
  149. if (!dvbdev)
  150. return -ENODEV;
  151. if (!dvbdev->kernel_ioctl)
  152. return -EINVAL;
  153. return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
  154. }
  155. EXPORT_SYMBOL(dvb_generic_ioctl);
  156. static int dvbdev_get_free_id (struct dvb_adapter *adap, int type)
  157. {
  158. u32 id = 0;
  159. while (id < DVB_MAX_IDS) {
  160. struct dvb_device *dev;
  161. list_for_each_entry(dev, &adap->device_list, list_head)
  162. if (dev->type == type && dev->id == id)
  163. goto skip;
  164. return id;
  165. skip:
  166. id++;
  167. }
  168. return -ENFILE;
  169. }
  170. static void dvb_media_device_free(struct dvb_device *dvbdev)
  171. {
  172. #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
  173. if (dvbdev->entity) {
  174. media_device_unregister_entity(dvbdev->entity);
  175. kfree(dvbdev->entity);
  176. kfree(dvbdev->pads);
  177. dvbdev->entity = NULL;
  178. dvbdev->pads = NULL;
  179. }
  180. if (dvbdev->tsout_entity) {
  181. int i;
  182. for (i = 0; i < dvbdev->tsout_num_entities; i++) {
  183. media_device_unregister_entity(&dvbdev->tsout_entity[i]);
  184. kfree(dvbdev->tsout_entity[i].name);
  185. }
  186. kfree(dvbdev->tsout_entity);
  187. kfree(dvbdev->tsout_pads);
  188. dvbdev->tsout_entity = NULL;
  189. dvbdev->tsout_pads = NULL;
  190. dvbdev->tsout_num_entities = 0;
  191. }
  192. if (dvbdev->intf_devnode) {
  193. media_devnode_remove(dvbdev->intf_devnode);
  194. dvbdev->intf_devnode = NULL;
  195. }
  196. if (dvbdev->adapter->conn) {
  197. media_device_unregister_entity(dvbdev->adapter->conn);
  198. dvbdev->adapter->conn = NULL;
  199. kfree(dvbdev->adapter->conn_pads);
  200. dvbdev->adapter->conn_pads = NULL;
  201. }
  202. #endif
  203. }
  204. #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
  205. static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
  206. const char *name, int npads)
  207. {
  208. int i, ret = 0;
  209. dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads),
  210. GFP_KERNEL);
  211. if (!dvbdev->tsout_pads)
  212. return -ENOMEM;
  213. dvbdev->tsout_entity = kcalloc(npads, sizeof(*dvbdev->tsout_entity),
  214. GFP_KERNEL);
  215. if (!dvbdev->tsout_entity)
  216. return -ENOMEM;
  217. dvbdev->tsout_num_entities = npads;
  218. for (i = 0; i < npads; i++) {
  219. struct media_pad *pads = &dvbdev->tsout_pads[i];
  220. struct media_entity *entity = &dvbdev->tsout_entity[i];
  221. entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i);
  222. if (!entity->name)
  223. return -ENOMEM;
  224. entity->function = MEDIA_ENT_F_IO_DTV;
  225. pads->flags = MEDIA_PAD_FL_SINK;
  226. ret = media_entity_pads_init(entity, 1, pads);
  227. if (ret < 0)
  228. return ret;
  229. ret = media_device_register_entity(dvbdev->adapter->mdev,
  230. entity);
  231. if (ret < 0)
  232. return ret;
  233. }
  234. return 0;
  235. }
  236. #define DEMUX_TSOUT "demux-tsout"
  237. #define DVR_TSOUT "dvr-tsout"
  238. static int dvb_create_media_entity(struct dvb_device *dvbdev,
  239. int type, int demux_sink_pads)
  240. {
  241. int i, ret, npads;
  242. switch (type) {
  243. case DVB_DEVICE_FRONTEND:
  244. npads = 2;
  245. break;
  246. case DVB_DEVICE_DVR:
  247. ret = dvb_create_tsout_entity(dvbdev, DVR_TSOUT,
  248. demux_sink_pads);
  249. return ret;
  250. case DVB_DEVICE_DEMUX:
  251. npads = 1 + demux_sink_pads;
  252. ret = dvb_create_tsout_entity(dvbdev, DEMUX_TSOUT,
  253. demux_sink_pads);
  254. if (ret < 0)
  255. return ret;
  256. break;
  257. case DVB_DEVICE_CA:
  258. npads = 2;
  259. break;
  260. case DVB_DEVICE_NET:
  261. /*
  262. * We should be creating entities for the MPE/ULE
  263. * decapsulation hardware (or software implementation).
  264. *
  265. * However, the number of for the MPE/ULE decaps may not be
  266. * fixed. As we don't have yet dynamic support for PADs at
  267. * the Media Controller, let's not create the decap
  268. * entities yet.
  269. */
  270. return 0;
  271. default:
  272. return 0;
  273. }
  274. dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
  275. if (!dvbdev->entity)
  276. return -ENOMEM;
  277. dvbdev->entity->name = dvbdev->name;
  278. if (npads) {
  279. dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads),
  280. GFP_KERNEL);
  281. if (!dvbdev->pads)
  282. return -ENOMEM;
  283. }
  284. switch (type) {
  285. case DVB_DEVICE_FRONTEND:
  286. dvbdev->entity->function = MEDIA_ENT_F_DTV_DEMOD;
  287. dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
  288. dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
  289. break;
  290. case DVB_DEVICE_DEMUX:
  291. dvbdev->entity->function = MEDIA_ENT_F_TS_DEMUX;
  292. dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
  293. for (i = 1; i < npads; i++)
  294. dvbdev->pads[i].flags = MEDIA_PAD_FL_SOURCE;
  295. break;
  296. case DVB_DEVICE_CA:
  297. dvbdev->entity->function = MEDIA_ENT_F_DTV_CA;
  298. dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
  299. dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
  300. break;
  301. default:
  302. /* Should never happen, as the first switch prevents it */
  303. kfree(dvbdev->entity);
  304. kfree(dvbdev->pads);
  305. dvbdev->entity = NULL;
  306. dvbdev->pads = NULL;
  307. return 0;
  308. }
  309. if (npads) {
  310. ret = media_entity_pads_init(dvbdev->entity, npads, dvbdev->pads);
  311. if (ret)
  312. return ret;
  313. }
  314. ret = media_device_register_entity(dvbdev->adapter->mdev,
  315. dvbdev->entity);
  316. if (ret)
  317. return ret;
  318. pr_info("%s: media entity '%s' registered.\n",
  319. __func__, dvbdev->entity->name);
  320. return 0;
  321. }
  322. #endif
  323. static int dvb_register_media_device(struct dvb_device *dvbdev,
  324. int type, int minor,
  325. unsigned demux_sink_pads)
  326. {
  327. #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
  328. struct media_link *link;
  329. u32 intf_type;
  330. int ret;
  331. if (!dvbdev->adapter->mdev)
  332. return 0;
  333. ret = dvb_create_media_entity(dvbdev, type, demux_sink_pads);
  334. if (ret)
  335. return ret;
  336. switch (type) {
  337. case DVB_DEVICE_FRONTEND:
  338. intf_type = MEDIA_INTF_T_DVB_FE;
  339. break;
  340. case DVB_DEVICE_DEMUX:
  341. intf_type = MEDIA_INTF_T_DVB_DEMUX;
  342. break;
  343. case DVB_DEVICE_DVR:
  344. intf_type = MEDIA_INTF_T_DVB_DVR;
  345. break;
  346. case DVB_DEVICE_CA:
  347. intf_type = MEDIA_INTF_T_DVB_CA;
  348. break;
  349. case DVB_DEVICE_NET:
  350. intf_type = MEDIA_INTF_T_DVB_NET;
  351. break;
  352. default:
  353. return 0;
  354. }
  355. dvbdev->intf_devnode = media_devnode_create(dvbdev->adapter->mdev,
  356. intf_type, 0,
  357. DVB_MAJOR, minor);
  358. if (!dvbdev->intf_devnode)
  359. return -ENOMEM;
  360. /*
  361. * Create the "obvious" link, e. g. the ones that represent
  362. * a direct association between an interface and an entity.
  363. * Other links should be created elsewhere, like:
  364. * DVB FE intf -> tuner
  365. * DVB demux intf -> dvr
  366. */
  367. if (!dvbdev->entity)
  368. return 0;
  369. link = media_create_intf_link(dvbdev->entity, &dvbdev->intf_devnode->intf,
  370. MEDIA_LNK_FL_ENABLED);
  371. if (!link)
  372. return -ENOMEM;
  373. #endif
  374. return 0;
  375. }
  376. int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
  377. const struct dvb_device *template, void *priv,
  378. enum dvb_device_type type, int demux_sink_pads)
  379. {
  380. struct dvb_device *dvbdev;
  381. struct file_operations *dvbdevfops;
  382. struct device *clsdev;
  383. int minor;
  384. int id, ret;
  385. mutex_lock(&dvbdev_register_lock);
  386. if ((id = dvbdev_get_free_id (adap, type)) < 0){
  387. mutex_unlock(&dvbdev_register_lock);
  388. *pdvbdev = NULL;
  389. pr_err("%s: couldn't find free device id\n", __func__);
  390. return -ENFILE;
  391. }
  392. *pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
  393. if (!dvbdev){
  394. mutex_unlock(&dvbdev_register_lock);
  395. return -ENOMEM;
  396. }
  397. dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL);
  398. if (!dvbdevfops){
  399. kfree (dvbdev);
  400. mutex_unlock(&dvbdev_register_lock);
  401. return -ENOMEM;
  402. }
  403. memcpy(dvbdev, template, sizeof(struct dvb_device));
  404. dvbdev->type = type;
  405. dvbdev->id = id;
  406. dvbdev->adapter = adap;
  407. dvbdev->priv = priv;
  408. dvbdev->fops = dvbdevfops;
  409. init_waitqueue_head (&dvbdev->wait_queue);
  410. memcpy(dvbdevfops, template->fops, sizeof(struct file_operations));
  411. dvbdevfops->owner = adap->module;
  412. list_add_tail (&dvbdev->list_head, &adap->device_list);
  413. down_write(&minor_rwsem);
  414. #ifdef CONFIG_DVB_DYNAMIC_MINORS
  415. for (minor = 0; minor < MAX_DVB_MINORS; minor++)
  416. if (dvb_minors[minor] == NULL)
  417. break;
  418. if (minor == MAX_DVB_MINORS) {
  419. kfree(dvbdevfops);
  420. kfree(dvbdev);
  421. up_write(&minor_rwsem);
  422. mutex_unlock(&dvbdev_register_lock);
  423. return -EINVAL;
  424. }
  425. #else
  426. minor = nums2minor(adap->num, type, id);
  427. #endif
  428. dvbdev->minor = minor;
  429. dvb_minors[minor] = dvbdev;
  430. up_write(&minor_rwsem);
  431. ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
  432. if (ret) {
  433. pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
  434. __func__);
  435. dvb_media_device_free(dvbdev);
  436. kfree(dvbdevfops);
  437. kfree(dvbdev);
  438. up_write(&minor_rwsem);
  439. mutex_unlock(&dvbdev_register_lock);
  440. return ret;
  441. }
  442. mutex_unlock(&dvbdev_register_lock);
  443. clsdev = device_create(dvb_class, adap->device,
  444. MKDEV(DVB_MAJOR, minor),
  445. dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
  446. if (IS_ERR(clsdev)) {
  447. pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
  448. __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
  449. return PTR_ERR(clsdev);
  450. }
  451. dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
  452. adap->num, dnames[type], id, minor, minor);
  453. return 0;
  454. }
  455. EXPORT_SYMBOL(dvb_register_device);
  456. void dvb_remove_device(struct dvb_device *dvbdev)
  457. {
  458. if (!dvbdev)
  459. return;
  460. down_write(&minor_rwsem);
  461. dvb_minors[dvbdev->minor] = NULL;
  462. up_write(&minor_rwsem);
  463. dvb_media_device_free(dvbdev);
  464. device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
  465. list_del (&dvbdev->list_head);
  466. }
  467. EXPORT_SYMBOL(dvb_remove_device);
  468. void dvb_free_device(struct dvb_device *dvbdev)
  469. {
  470. if (!dvbdev)
  471. return;
  472. kfree (dvbdev->fops);
  473. kfree (dvbdev);
  474. }
  475. EXPORT_SYMBOL(dvb_free_device);
  476. void dvb_unregister_device(struct dvb_device *dvbdev)
  477. {
  478. dvb_remove_device(dvbdev);
  479. dvb_free_device(dvbdev);
  480. }
  481. EXPORT_SYMBOL(dvb_unregister_device);
  482. #ifdef CONFIG_MEDIA_CONTROLLER_DVB
  483. static int dvb_create_io_intf_links(struct dvb_adapter *adap,
  484. struct media_interface *intf,
  485. char *name)
  486. {
  487. struct media_device *mdev = adap->mdev;
  488. struct media_entity *entity;
  489. struct media_link *link;
  490. media_device_for_each_entity(entity, mdev) {
  491. if (entity->function == MEDIA_ENT_F_IO_DTV) {
  492. if (strncmp(entity->name, name, strlen(name)))
  493. continue;
  494. link = media_create_intf_link(entity, intf,
  495. MEDIA_LNK_FL_ENABLED);
  496. if (!link)
  497. return -ENOMEM;
  498. }
  499. }
  500. return 0;
  501. }
  502. int dvb_create_media_graph(struct dvb_adapter *adap,
  503. bool create_rf_connector)
  504. {
  505. struct media_device *mdev = adap->mdev;
  506. struct media_entity *entity, *tuner = NULL, *demod = NULL, *conn;
  507. struct media_entity *demux = NULL, *ca = NULL;
  508. struct media_link *link;
  509. struct media_interface *intf;
  510. unsigned demux_pad = 0;
  511. unsigned dvr_pad = 0;
  512. unsigned ntuner = 0, ndemod = 0;
  513. int ret;
  514. static const char *connector_name = "Television";
  515. if (!mdev)
  516. return 0;
  517. media_device_for_each_entity(entity, mdev) {
  518. switch (entity->function) {
  519. case MEDIA_ENT_F_TUNER:
  520. tuner = entity;
  521. ntuner++;
  522. break;
  523. case MEDIA_ENT_F_DTV_DEMOD:
  524. demod = entity;
  525. ndemod++;
  526. break;
  527. case MEDIA_ENT_F_TS_DEMUX:
  528. demux = entity;
  529. break;
  530. case MEDIA_ENT_F_DTV_CA:
  531. ca = entity;
  532. break;
  533. }
  534. }
  535. /*
  536. * Prepare to signalize to media_create_pad_links() that multiple
  537. * entities of the same type exists and a 1:n or n:1 links need to be
  538. * created.
  539. * NOTE: if both tuner and demod have multiple instances, it is up
  540. * to the caller driver to create such links.
  541. */
  542. if (ntuner > 1)
  543. tuner = NULL;
  544. if (ndemod > 1)
  545. demod = NULL;
  546. if (create_rf_connector) {
  547. conn = kzalloc(sizeof(*conn), GFP_KERNEL);
  548. if (!conn)
  549. return -ENOMEM;
  550. adap->conn = conn;
  551. adap->conn_pads = kzalloc(sizeof(*adap->conn_pads), GFP_KERNEL);
  552. if (!adap->conn_pads)
  553. return -ENOMEM;
  554. conn->flags = MEDIA_ENT_FL_CONNECTOR;
  555. conn->function = MEDIA_ENT_F_CONN_RF;
  556. conn->name = connector_name;
  557. adap->conn_pads->flags = MEDIA_PAD_FL_SOURCE;
  558. ret = media_entity_pads_init(conn, 1, adap->conn_pads);
  559. if (ret)
  560. return ret;
  561. ret = media_device_register_entity(mdev, conn);
  562. if (ret)
  563. return ret;
  564. if (!ntuner)
  565. ret = media_create_pad_links(mdev,
  566. MEDIA_ENT_F_CONN_RF,
  567. conn, 0,
  568. MEDIA_ENT_F_DTV_DEMOD,
  569. demod, 0,
  570. MEDIA_LNK_FL_ENABLED,
  571. false);
  572. else
  573. ret = media_create_pad_links(mdev,
  574. MEDIA_ENT_F_CONN_RF,
  575. conn, 0,
  576. MEDIA_ENT_F_TUNER,
  577. tuner, TUNER_PAD_RF_INPUT,
  578. MEDIA_LNK_FL_ENABLED,
  579. false);
  580. if (ret)
  581. return ret;
  582. }
  583. if (ntuner && ndemod) {
  584. ret = media_create_pad_links(mdev,
  585. MEDIA_ENT_F_TUNER,
  586. tuner, TUNER_PAD_OUTPUT,
  587. MEDIA_ENT_F_DTV_DEMOD,
  588. demod, 0, MEDIA_LNK_FL_ENABLED,
  589. false);
  590. if (ret)
  591. return ret;
  592. }
  593. if (ndemod && demux) {
  594. ret = media_create_pad_links(mdev,
  595. MEDIA_ENT_F_DTV_DEMOD,
  596. demod, 1,
  597. MEDIA_ENT_F_TS_DEMUX,
  598. demux, 0, MEDIA_LNK_FL_ENABLED,
  599. false);
  600. if (ret)
  601. return ret;
  602. }
  603. if (demux && ca) {
  604. ret = media_create_pad_link(demux, 1, ca,
  605. 0, MEDIA_LNK_FL_ENABLED);
  606. if (ret)
  607. return ret;
  608. }
  609. /* Create demux links for each ringbuffer/pad */
  610. if (demux) {
  611. media_device_for_each_entity(entity, mdev) {
  612. if (entity->function == MEDIA_ENT_F_IO_DTV) {
  613. if (!strncmp(entity->name, DVR_TSOUT,
  614. strlen(DVR_TSOUT))) {
  615. ret = media_create_pad_link(demux,
  616. ++dvr_pad,
  617. entity, 0, 0);
  618. if (ret)
  619. return ret;
  620. }
  621. if (!strncmp(entity->name, DEMUX_TSOUT,
  622. strlen(DEMUX_TSOUT))) {
  623. ret = media_create_pad_link(demux,
  624. ++demux_pad,
  625. entity, 0, 0);
  626. if (ret)
  627. return ret;
  628. }
  629. }
  630. }
  631. }
  632. /* Create interface links for FE->tuner, DVR->demux and CA->ca */
  633. media_device_for_each_intf(intf, mdev) {
  634. if (intf->type == MEDIA_INTF_T_DVB_CA && ca) {
  635. link = media_create_intf_link(ca, intf,
  636. MEDIA_LNK_FL_ENABLED);
  637. if (!link)
  638. return -ENOMEM;
  639. }
  640. if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) {
  641. link = media_create_intf_link(tuner, intf,
  642. MEDIA_LNK_FL_ENABLED);
  643. if (!link)
  644. return -ENOMEM;
  645. }
  646. #if 0
  647. /*
  648. * Indirect link - let's not create yet, as we don't know how
  649. * to handle indirect links, nor if this will
  650. * actually be needed.
  651. */
  652. if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) {
  653. link = media_create_intf_link(demux, intf,
  654. MEDIA_LNK_FL_ENABLED);
  655. if (!link)
  656. return -ENOMEM;
  657. }
  658. #endif
  659. if (intf->type == MEDIA_INTF_T_DVB_DVR) {
  660. ret = dvb_create_io_intf_links(adap, intf, DVR_TSOUT);
  661. if (ret)
  662. return ret;
  663. }
  664. if (intf->type == MEDIA_INTF_T_DVB_DEMUX) {
  665. ret = dvb_create_io_intf_links(adap, intf, DEMUX_TSOUT);
  666. if (ret)
  667. return ret;
  668. }
  669. }
  670. return 0;
  671. }
  672. EXPORT_SYMBOL_GPL(dvb_create_media_graph);
  673. #endif
  674. static int dvbdev_check_free_adapter_num(int num)
  675. {
  676. struct list_head *entry;
  677. list_for_each(entry, &dvb_adapter_list) {
  678. struct dvb_adapter *adap;
  679. adap = list_entry(entry, struct dvb_adapter, list_head);
  680. if (adap->num == num)
  681. return 0;
  682. }
  683. return 1;
  684. }
  685. static int dvbdev_get_free_adapter_num (void)
  686. {
  687. int num = 0;
  688. while (num < DVB_MAX_ADAPTERS) {
  689. if (dvbdev_check_free_adapter_num(num))
  690. return num;
  691. num++;
  692. }
  693. return -ENFILE;
  694. }
  695. int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
  696. struct module *module, struct device *device,
  697. short *adapter_nums)
  698. {
  699. int i, num;
  700. mutex_lock(&dvbdev_register_lock);
  701. for (i = 0; i < DVB_MAX_ADAPTERS; ++i) {
  702. num = adapter_nums[i];
  703. if (num >= 0 && num < DVB_MAX_ADAPTERS) {
  704. /* use the one the driver asked for */
  705. if (dvbdev_check_free_adapter_num(num))
  706. break;
  707. } else {
  708. num = dvbdev_get_free_adapter_num();
  709. break;
  710. }
  711. num = -1;
  712. }
  713. if (num < 0) {
  714. mutex_unlock(&dvbdev_register_lock);
  715. return -ENFILE;
  716. }
  717. memset (adap, 0, sizeof(struct dvb_adapter));
  718. INIT_LIST_HEAD (&adap->device_list);
  719. pr_info("DVB: registering new adapter (%s)\n", name);
  720. adap->num = num;
  721. adap->name = name;
  722. adap->module = module;
  723. adap->device = device;
  724. adap->mfe_shared = 0;
  725. adap->mfe_dvbdev = NULL;
  726. mutex_init (&adap->mfe_lock);
  727. list_add_tail (&adap->list_head, &dvb_adapter_list);
  728. mutex_unlock(&dvbdev_register_lock);
  729. return num;
  730. }
  731. EXPORT_SYMBOL(dvb_register_adapter);
  732. int dvb_unregister_adapter(struct dvb_adapter *adap)
  733. {
  734. mutex_lock(&dvbdev_register_lock);
  735. list_del (&adap->list_head);
  736. mutex_unlock(&dvbdev_register_lock);
  737. return 0;
  738. }
  739. EXPORT_SYMBOL(dvb_unregister_adapter);
  740. /* if the miracle happens and "generic_usercopy()" is included into
  741. the kernel, then this can vanish. please don't make the mistake and
  742. define this as video_usercopy(). this will introduce a dependecy
  743. to the v4l "videodev.o" module, which is unnecessary for some
  744. cards (ie. the budget dvb-cards don't need the v4l module...) */
  745. int dvb_usercopy(struct file *file,
  746. unsigned int cmd, unsigned long arg,
  747. int (*func)(struct file *file,
  748. unsigned int cmd, void *arg))
  749. {
  750. char sbuf[128];
  751. void *mbuf = NULL;
  752. void *parg = NULL;
  753. int err = -EINVAL;
  754. /* Copy arguments into temp kernel buffer */
  755. switch (_IOC_DIR(cmd)) {
  756. case _IOC_NONE:
  757. /*
  758. * For this command, the pointer is actually an integer
  759. * argument.
  760. */
  761. parg = (void *) arg;
  762. break;
  763. case _IOC_READ: /* some v4l ioctls are marked wrong ... */
  764. case _IOC_WRITE:
  765. case (_IOC_WRITE | _IOC_READ):
  766. if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
  767. parg = sbuf;
  768. } else {
  769. /* too big to allocate from stack */
  770. mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
  771. if (NULL == mbuf)
  772. return -ENOMEM;
  773. parg = mbuf;
  774. }
  775. err = -EFAULT;
  776. if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
  777. goto out;
  778. break;
  779. }
  780. /* call driver */
  781. if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
  782. err = -ENOTTY;
  783. if (err < 0)
  784. goto out;
  785. /* Copy results into user buffer */
  786. switch (_IOC_DIR(cmd))
  787. {
  788. case _IOC_READ:
  789. case (_IOC_WRITE | _IOC_READ):
  790. if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
  791. err = -EFAULT;
  792. break;
  793. }
  794. out:
  795. kfree(mbuf);
  796. return err;
  797. }
  798. static int dvb_uevent(struct device *dev, struct kobj_uevent_env *env)
  799. {
  800. struct dvb_device *dvbdev = dev_get_drvdata(dev);
  801. add_uevent_var(env, "DVB_ADAPTER_NUM=%d", dvbdev->adapter->num);
  802. add_uevent_var(env, "DVB_DEVICE_TYPE=%s", dnames[dvbdev->type]);
  803. add_uevent_var(env, "DVB_DEVICE_NUM=%d", dvbdev->id);
  804. return 0;
  805. }
  806. static char *dvb_devnode(struct device *dev, umode_t *mode)
  807. {
  808. struct dvb_device *dvbdev = dev_get_drvdata(dev);
  809. return kasprintf(GFP_KERNEL, "dvb/adapter%d/%s%d",
  810. dvbdev->adapter->num, dnames[dvbdev->type], dvbdev->id);
  811. }
  812. static int __init init_dvbdev(void)
  813. {
  814. int retval;
  815. dev_t dev = MKDEV(DVB_MAJOR, 0);
  816. if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) {
  817. pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR);
  818. return retval;
  819. }
  820. cdev_init(&dvb_device_cdev, &dvb_device_fops);
  821. if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) {
  822. pr_err("dvb-core: unable register character device\n");
  823. goto error;
  824. }
  825. dvb_class = class_create(THIS_MODULE, "dvb");
  826. if (IS_ERR(dvb_class)) {
  827. retval = PTR_ERR(dvb_class);
  828. goto error;
  829. }
  830. dvb_class->dev_uevent = dvb_uevent;
  831. dvb_class->devnode = dvb_devnode;
  832. return 0;
  833. error:
  834. cdev_del(&dvb_device_cdev);
  835. unregister_chrdev_region(dev, MAX_DVB_MINORS);
  836. return retval;
  837. }
  838. static void __exit exit_dvbdev(void)
  839. {
  840. class_destroy(dvb_class);
  841. cdev_del(&dvb_device_cdev);
  842. unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
  843. }
  844. subsys_initcall(init_dvbdev);
  845. module_exit(exit_dvbdev);
  846. MODULE_DESCRIPTION("DVB Core Driver");
  847. MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler");
  848. MODULE_LICENSE("GPL");