aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorSteven Toth <stoth@linuxtv.org>2008-10-11 10:05:50 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-10-17 16:23:10 -0400
commit363c35fc448943c3d6121332d28bcda2d2fbf87c (patch)
tree739864d237b7fa60bef51bc510fe55c888b606ca /drivers/media/dvb
parent548da7625c825eccc31b4b3865ae5389c3660486 (diff)
V4L/DVB (9222): S2API: Add Multiple-frontend on a single adapter support.
A detailed description from the original patches 2 years ago: "The WinTV-HVR3000 has a single transport bus which is shared between a DVB-T and DVB-S modulator. These patches build on the bus acquisition cx88 work from a few weeks ago to add support for this. So to applications the HVR3000 looks like this: /dev/dvb/adapter0/fe0 (cx24123 DVB-S demod) /dev/dvb/adapter0/fe1 (cx22702 DVB-T demod) Additional boards continue as before, eg: /dev/dvb/adapter1/fe0 (lgdt3302 ATSC demod) The basic change is removing the single instance of the videobuf_dvb in cx8802_dev and saa7134_dev(?) and replacing it with a list and some supporting functions. *NOTE* This branch was taken before v4l-dvb was closed for 2.6.19 so two or three current cx88 patches appear to be reversed by this tree, this will be cleaned up in the near future. The patches missing change the mutex handing to core->lock, fix an enumeration problem." It should be recognised that a number of people have been maintaining this patchset. Significant levels of Kudos to everyone one involved, including but not limited to: Darron Broad Fabio M. Di Nitto Carlo Scarfoglio Hans Werner Without the work of these people, and countless others, my two year old patches would of died on the Mercurial linuxtv.org vine a long time ago. TODO: Revise these patches a little further so that the need for demux1 and dvr0 is optional, not mandatory on the HVR3000. HISTORY (darron): This is the last update to MFE prepared by Hans which is based upon the `scratchpad' diff created by Carlo. All MFE work prior to that point must be attributed to Fabio who ported and maintained Steve's original patch up to that time. Signed-off-by: Steven Toth <stoth@linuxtv.org> Signed-off-by: Darron Broad <darron@kewl.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.c24
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.h1
2 files changed, 14 insertions, 11 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
index 72ce7935f253..26671757c70b 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -212,8 +212,9 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
212 212
213static void dvb_frontend_init(struct dvb_frontend *fe) 213static void dvb_frontend_init(struct dvb_frontend *fe)
214{ 214{
215 dprintk ("DVB: initialising frontend %i (%s)...\n", 215 dprintk ("DVB: initialising adapter %i frontend %i (%s)...\n",
216 fe->dvb->num, 216 fe->dvb->num,
217 fe->id,
217 fe->ops.info.name); 218 fe->ops.info.name);
218 219
219 if (fe->ops.init) 220 if (fe->ops.init)
@@ -686,7 +687,7 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
686 mb(); 687 mb();
687 688
688 fe_thread = kthread_run(dvb_frontend_thread, fe, 689 fe_thread = kthread_run(dvb_frontend_thread, fe,
689 "kdvb-fe-%i", fe->dvb->num); 690 "kdvb-ad-%i-fe-%i", fe->dvb->num,fe->id);
690 if (IS_ERR(fe_thread)) { 691 if (IS_ERR(fe_thread)) {
691 ret = PTR_ERR(fe_thread); 692 ret = PTR_ERR(fe_thread);
692 printk("dvb_frontend_start: failed to start kthread (%d)\n", ret); 693 printk("dvb_frontend_start: failed to start kthread (%d)\n", ret);
@@ -710,8 +711,8 @@ static void dvb_frontend_get_frequeny_limits(struct dvb_frontend *fe,
710 *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max); 711 *freq_max = min(fe->ops.info.frequency_max, fe->ops.tuner_ops.info.frequency_max);
711 712
712 if (*freq_min == 0 || *freq_max == 0) 713 if (*freq_min == 0 || *freq_max == 0)
713 printk(KERN_WARNING "DVB: frontend %u frequency limits undefined - fix the driver\n", 714 printk(KERN_WARNING "DVB: adapter %i frontend %u frequency limits undefined - fix the driver\n",
714 fe->dvb->num); 715 fe->dvb->num,fe->id);
715} 716}
716 717
717static int dvb_frontend_check_parameters(struct dvb_frontend *fe, 718static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
@@ -724,8 +725,8 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
724 dvb_frontend_get_frequeny_limits(fe, &freq_min, &freq_max); 725 dvb_frontend_get_frequeny_limits(fe, &freq_min, &freq_max);
725 if ((freq_min && parms->frequency < freq_min) || 726 if ((freq_min && parms->frequency < freq_min) ||
726 (freq_max && parms->frequency > freq_max)) { 727 (freq_max && parms->frequency > freq_max)) {
727 printk(KERN_WARNING "DVB: frontend %u frequency %u out of range (%u..%u)\n", 728 printk(KERN_WARNING "DVB: adapter %i frontend %i frequency %u out of range (%u..%u)\n",
728 fe->dvb->num, parms->frequency, freq_min, freq_max); 729 fe->dvb->num, fe->id, parms->frequency, freq_min, freq_max);
729 return -EINVAL; 730 return -EINVAL;
730 } 731 }
731 732
@@ -735,8 +736,8 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
735 parms->u.qpsk.symbol_rate < fe->ops.info.symbol_rate_min) || 736 parms->u.qpsk.symbol_rate < fe->ops.info.symbol_rate_min) ||
736 (fe->ops.info.symbol_rate_max && 737 (fe->ops.info.symbol_rate_max &&
737 parms->u.qpsk.symbol_rate > fe->ops.info.symbol_rate_max)) { 738 parms->u.qpsk.symbol_rate > fe->ops.info.symbol_rate_max)) {
738 printk(KERN_WARNING "DVB: frontend %u symbol rate %u out of range (%u..%u)\n", 739 printk(KERN_WARNING "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
739 fe->dvb->num, parms->u.qpsk.symbol_rate, 740 fe->dvb->num, fe->id, parms->u.qpsk.symbol_rate,
740 fe->ops.info.symbol_rate_min, fe->ops.info.symbol_rate_max); 741 fe->ops.info.symbol_rate_min, fe->ops.info.symbol_rate_max);
741 return -EINVAL; 742 return -EINVAL;
742 } 743 }
@@ -746,8 +747,8 @@ static int dvb_frontend_check_parameters(struct dvb_frontend *fe,
746 parms->u.qam.symbol_rate < fe->ops.info.symbol_rate_min) || 747 parms->u.qam.symbol_rate < fe->ops.info.symbol_rate_min) ||
747 (fe->ops.info.symbol_rate_max && 748 (fe->ops.info.symbol_rate_max &&
748 parms->u.qam.symbol_rate > fe->ops.info.symbol_rate_max)) { 749 parms->u.qam.symbol_rate > fe->ops.info.symbol_rate_max)) {
749 printk(KERN_WARNING "DVB: frontend %u symbol rate %u out of range (%u..%u)\n", 750 printk(KERN_WARNING "DVB: adapter %i frontend %i symbol rate %u out of range (%u..%u)\n",
750 fe->dvb->num, parms->u.qam.symbol_rate, 751 fe->dvb->num, fe->id, parms->u.qam.symbol_rate,
751 fe->ops.info.symbol_rate_min, fe->ops.info.symbol_rate_max); 752 fe->ops.info.symbol_rate_min, fe->ops.info.symbol_rate_max);
752 return -EINVAL; 753 return -EINVAL;
753 } 754 }
@@ -1807,8 +1808,9 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
1807 fe->dvb = dvb; 1808 fe->dvb = dvb;
1808 fepriv->inversion = INVERSION_OFF; 1809 fepriv->inversion = INVERSION_OFF;
1809 1810
1810 printk ("DVB: registering frontend %i (%s)...\n", 1811 printk ("DVB: registering adapter %i frontend %i (%s)...\n",
1811 fe->dvb->num, 1812 fe->dvb->num,
1813 fe->id,
1812 fe->ops.info.name); 1814 fe->ops.info.name);
1813 1815
1814 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template, 1816 dvb_register_device (fe->dvb, &fepriv->dvbdev, &dvbdev_template,
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
index 3055301ff3ca..db4a63b0a32e 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h
@@ -222,6 +222,7 @@ struct dvb_frontend {
222 struct dtv_frontend_properties dtv_property_cache; 222 struct dtv_frontend_properties dtv_property_cache;
223#define DVB_FRONTEND_COMPONENT_TUNER 0 223#define DVB_FRONTEND_COMPONENT_TUNER 0
224 int (*callback)(void *adapter_priv, int component, int cmd, int arg); 224 int (*callback)(void *adapter_priv, int component, int cmd, int arg);
225 int id;
225}; 226};
226 227
227extern int dvb_register_frontend(struct dvb_adapter *dvb, 228extern int dvb_register_frontend(struct dvb_adapter *dvb,