diff options
author | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-12-29 08:52:23 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2016-01-11 09:19:25 -0500 |
commit | 0230d60e4661d9ced6fb0b9a30f182ebdafbba7a (patch) | |
tree | 7d9d8e71ba103473fe276b1c49040bfb72230f44 | |
parent | 0820eb5c5510b0a5c25a17c8be5e40156ace4991 (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.c | 2 | ||||
-rw-r--r-- | drivers/media/dvb-core/dvbdev.c | 49 | ||||
-rw-r--r-- | drivers/media/dvb-core/dvbdev.h | 20 | ||||
-rw-r--r-- | drivers/media/usb/au0828/au0828-dvb.c | 2 | ||||
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-dvb.c | 2 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/dvb_usb_core.c | 2 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb/dvb-usb-dvb.c | 2 |
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 | ||
562 | int dvb_create_media_graph(struct dvb_adapter *adap) | 569 | int 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 | */ |
79 | struct dvb_adapter { | 82 | struct 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, | |||
214 | void dvb_unregister_device(struct dvb_device *dvbdev); | 219 | void 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 | |||
218 | static inline void dvb_register_media_controller(struct dvb_adapter *adap, | 232 | static 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 |
225 | static inline int dvb_create_media_graph(struct dvb_adapter *adap) | 239 | static inline |
240 | int 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 | ||