aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-12-29 08:52:23 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-01-11 09:19:25 -0500
commit0230d60e4661d9ced6fb0b9a30f182ebdafbba7a (patch)
tree7d9d8e71ba103473fe276b1c49040bfb72230f44
parent0820eb5c5510b0a5c25a17c8be5e40156ace4991 (diff)
[media] dvbdev: Add RF connector if needed
Several pure digital TV devices have a frontend with the tuner integrated on it. Add the RF connector when dvb_create_media_graph() is called on such devices. Tested with siano and dvb_usb_mxl111sf drivers. Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/common/siano/smsdvb-main.c2
-rw-r--r--drivers/media/dvb-core/dvbdev.c49
-rw-r--r--drivers/media/dvb-core/dvbdev.h20
-rw-r--r--drivers/media/usb/au0828/au0828-dvb.c2
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-dvb.c2
-rw-r--r--drivers/media/usb/dvb-usb-v2/dvb_usb_core.c2
-rw-r--r--drivers/media/usb/dvb-usb/dvb-usb-dvb.c2
7 files changed, 70 insertions, 9 deletions
diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c
index 8a1ea2192439..d31f468830cf 100644
--- a/drivers/media/common/siano/smsdvb-main.c
+++ b/drivers/media/common/siano/smsdvb-main.c
@@ -1184,7 +1184,7 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
1184 if (smsdvb_debugfs_create(client) < 0) 1184 if (smsdvb_debugfs_create(client) < 0)
1185 pr_info("failed to create debugfs node\n"); 1185 pr_info("failed to create debugfs node\n");
1186 1186
1187 rc = dvb_create_media_graph(&client->adapter); 1187 rc = dvb_create_media_graph(&client->adapter, true);
1188 if (rc < 0) { 1188 if (rc < 0) {
1189 pr_err("dvb_create_media_graph failed %d\n", rc); 1189 pr_err("dvb_create_media_graph failed %d\n", rc);
1190 goto client_error; 1190 goto client_error;
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 860dd7d06b60..28e340583ede 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -213,6 +213,13 @@ static void dvb_media_device_free(struct dvb_device *dvbdev)
213 media_devnode_remove(dvbdev->intf_devnode); 213 media_devnode_remove(dvbdev->intf_devnode);
214 dvbdev->intf_devnode = NULL; 214 dvbdev->intf_devnode = NULL;
215 } 215 }
216
217 if (dvbdev->adapter->conn) {
218 media_device_unregister_entity(dvbdev->adapter->conn);
219 dvbdev->adapter->conn = NULL;
220 kfree(dvbdev->adapter->conn_pads);
221 dvbdev->adapter->conn_pads = NULL;
222 }
216#endif 223#endif
217} 224}
218 225
@@ -559,16 +566,18 @@ static int dvb_create_io_intf_links(struct dvb_adapter *adap,
559 return 0; 566 return 0;
560} 567}
561 568
562int dvb_create_media_graph(struct dvb_adapter *adap) 569int dvb_create_media_graph(struct dvb_adapter *adap,
570 bool create_rf_connector)
563{ 571{
564 struct media_device *mdev = adap->mdev; 572 struct media_device *mdev = adap->mdev;
565 struct media_entity *entity, *tuner = NULL, *demod = NULL; 573 struct media_entity *entity, *tuner = NULL, *demod = NULL, *conn;
566 struct media_entity *demux = NULL, *ca = NULL; 574 struct media_entity *demux = NULL, *ca = NULL;
567 struct media_link *link; 575 struct media_link *link;
568 struct media_interface *intf; 576 struct media_interface *intf;
569 unsigned demux_pad = 0; 577 unsigned demux_pad = 0;
570 unsigned dvr_pad = 0; 578 unsigned dvr_pad = 0;
571 int ret; 579 int ret;
580 static const char *connector_name = "Television";
572 581
573 if (!mdev) 582 if (!mdev)
574 return 0; 583 return 0;
@@ -590,6 +599,42 @@ int dvb_create_media_graph(struct dvb_adapter *adap)
590 } 599 }
591 } 600 }
592 601
602 if (create_rf_connector) {
603 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
604 if (!conn)
605 return -ENOMEM;
606 adap->conn = conn;
607
608 adap->conn_pads = kcalloc(1, sizeof(*adap->conn_pads),
609 GFP_KERNEL);
610 if (!adap->conn_pads)
611 return -ENOMEM;
612
613 conn->flags = MEDIA_ENT_FL_CONNECTOR;
614 conn->function = MEDIA_ENT_F_CONN_RF;
615 conn->name = connector_name;
616 adap->conn_pads->flags = MEDIA_PAD_FL_SOURCE;
617
618 ret = media_entity_pads_init(conn, 1, adap->conn_pads);
619 if (ret)
620 return ret;
621
622 ret = media_device_register_entity(mdev, conn);
623 if (ret)
624 return ret;
625
626 if (!tuner)
627 ret = media_create_pad_link(conn, 0,
628 demod, 0,
629 MEDIA_LNK_FL_ENABLED);
630 else
631 ret = media_create_pad_link(conn, 0,
632 tuner, TUNER_PAD_RF_INPUT,
633 MEDIA_LNK_FL_ENABLED);
634 if (ret)
635 return ret;
636 }
637
593 if (tuner && demod) { 638 if (tuner && demod) {
594 ret = media_create_pad_link(tuner, TUNER_PAD_IF_OUTPUT, 639 ret = media_create_pad_link(tuner, TUNER_PAD_IF_OUTPUT,
595 demod, 0, MEDIA_LNK_FL_ENABLED); 640 demod, 0, MEDIA_LNK_FL_ENABLED);
diff --git a/drivers/media/dvb-core/dvbdev.h b/drivers/media/dvb-core/dvbdev.h
index abee18a402e1..b622d6a3b95e 100644
--- a/drivers/media/dvb-core/dvbdev.h
+++ b/drivers/media/dvb-core/dvbdev.h
@@ -75,6 +75,9 @@ struct dvb_frontend;
75 * used. 75 * used.
76 * @mdev: pointer to struct media_device, used when the media 76 * @mdev: pointer to struct media_device, used when the media
77 * controller is used. 77 * controller is used.
78 * @conn: RF connector. Used only if the device has no separate
79 * tuner.
80 * @conn_pads: pointer to struct media_pad associated with @conn;
78 */ 81 */
79struct dvb_adapter { 82struct dvb_adapter {
80 int num; 83 int num;
@@ -94,6 +97,8 @@ struct dvb_adapter {
94 97
95#if defined(CONFIG_MEDIA_CONTROLLER_DVB) 98#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
96 struct media_device *mdev; 99 struct media_device *mdev;
100 struct media_entity *conn;
101 struct media_pad *conn_pads;
97#endif 102#endif
98}; 103};
99 104
@@ -214,7 +219,16 @@ int dvb_register_device(struct dvb_adapter *adap,
214void dvb_unregister_device(struct dvb_device *dvbdev); 219void dvb_unregister_device(struct dvb_device *dvbdev);
215 220
216#ifdef CONFIG_MEDIA_CONTROLLER_DVB 221#ifdef CONFIG_MEDIA_CONTROLLER_DVB
217__must_check int dvb_create_media_graph(struct dvb_adapter *adap); 222/**
223 * dvb_create_media_graph - Creates media graph for the Digital TV part of the
224 * device.
225 *
226 * @adap: pointer to struct dvb_adapter
227 * @create_rf_connector: if true, it creates the RF connector too
228 */
229__must_check int dvb_create_media_graph(struct dvb_adapter *adap,
230 bool create_rf_connector);
231
218static inline void dvb_register_media_controller(struct dvb_adapter *adap, 232static inline void dvb_register_media_controller(struct dvb_adapter *adap,
219 struct media_device *mdev) 233 struct media_device *mdev)
220{ 234{
@@ -222,7 +236,9 @@ static inline void dvb_register_media_controller(struct dvb_adapter *adap,
222} 236}
223 237
224#else 238#else
225static inline int dvb_create_media_graph(struct dvb_adapter *adap) 239static inline
240int dvb_create_media_graph(struct dvb_adapter *adap,
241 bool create_rf_connector)
226{ 242{
227 return 0; 243 return 0;
228}; 244};
diff --git a/drivers/media/usb/au0828/au0828-dvb.c b/drivers/media/usb/au0828/au0828-dvb.c
index cd542b49a6c2..94363a3ba400 100644
--- a/drivers/media/usb/au0828/au0828-dvb.c
+++ b/drivers/media/usb/au0828/au0828-dvb.c
@@ -486,7 +486,7 @@ static int dvb_register(struct au0828_dev *dev)
486 dvb->start_count = 0; 486 dvb->start_count = 0;
487 dvb->stop_count = 0; 487 dvb->stop_count = 0;
488 488
489 result = dvb_create_media_graph(&dvb->adapter); 489 result = dvb_create_media_graph(&dvb->adapter, false);
490 if (result < 0) 490 if (result < 0)
491 goto fail_create_graph; 491 goto fail_create_graph;
492 492
diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c
index b7552d20ebdb..b8d5b2be9293 100644
--- a/drivers/media/usb/cx231xx/cx231xx-dvb.c
+++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c
@@ -551,7 +551,7 @@ static int register_dvb(struct cx231xx_dvb *dvb,
551 551
552 /* register network adapter */ 552 /* register network adapter */
553 dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx); 553 dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
554 result = dvb_create_media_graph(&dvb->adapter); 554 result = dvb_create_media_graph(&dvb->adapter, false);
555 if (result < 0) 555 if (result < 0)
556 goto fail_create_graph; 556 goto fail_create_graph;
557 557
diff --git a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
index 0fa2c45917b0..e8491f73c0d9 100644
--- a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
+++ b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
@@ -706,7 +706,7 @@ static int dvb_usbv2_adapter_frontend_init(struct dvb_usb_adapter *adap)
706 } 706 }
707 } 707 }
708 708
709 ret = dvb_create_media_graph(&adap->dvb_adap); 709 ret = dvb_create_media_graph(&adap->dvb_adap, true);
710 if (ret < 0) 710 if (ret < 0)
711 goto err_dvb_unregister_frontend; 711 goto err_dvb_unregister_frontend;
712 712
diff --git a/drivers/media/usb/dvb-usb/dvb-usb-dvb.c b/drivers/media/usb/dvb-usb/dvb-usb-dvb.c
index 241463ef631e..9ddfcab268be 100644
--- a/drivers/media/usb/dvb-usb/dvb-usb-dvb.c
+++ b/drivers/media/usb/dvb-usb/dvb-usb-dvb.c
@@ -330,7 +330,7 @@ int dvb_usb_adapter_frontend_init(struct dvb_usb_adapter *adap)
330 if (ret) 330 if (ret)
331 return ret; 331 return ret;
332 332
333 ret = dvb_create_media_graph(&adap->dvb_adap); 333 ret = dvb_create_media_graph(&adap->dvb_adap, true);
334 if (ret) 334 if (ret)
335 return ret; 335 return ret;
336 336