diff options
author | Steven Toth <stoth@hauppauge.com> | 2007-03-11 19:44:05 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-10-09 21:07:56 -0400 |
commit | d19770e5178a4bc49641711246360c25781d20a4 (patch) | |
tree | a8984db06c4344b00718e958c12ee403eb339278 /drivers/media/video/cx23885/cx23885-dvb.c | |
parent | 275511a0aca8483c03df1c6e3a33a27cee334709 (diff) |
V4L/DVB (6150): Add CX23885/CX23887 PCIe bridge driver
This is a new framework to support boards based on the CX23885/7 PCIe
bridge. The framework supports digital (no analog yet)
Signed-off-by: Steven Toth <stoth@hauppauge.com>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/cx23885/cx23885-dvb.c')
-rw-r--r-- | drivers/media/video/cx23885/cx23885-dvb.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c new file mode 100644 index 000000000000..4ff85f75f9f7 --- /dev/null +++ b/drivers/media/video/cx23885/cx23885-dvb.c | |||
@@ -0,0 +1,199 @@ | |||
1 | /* | ||
2 | * Driver for the Conexant CX23885 PCIe bridge | ||
3 | * | ||
4 | * Copyright (c) 2006 Steven Toth <stoth@hauppauge.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/module.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/device.h> | ||
25 | #include <linux/fs.h> | ||
26 | #include <linux/kthread.h> | ||
27 | #include <linux/file.h> | ||
28 | #include <linux/suspend.h> | ||
29 | |||
30 | #include "cx23885.h" | ||
31 | #include "dvb-pll.h" | ||
32 | #include <media/v4l2-common.h> | ||
33 | |||
34 | #include "s5h1409.h" | ||
35 | #include "mt2131.h" | ||
36 | |||
37 | static unsigned int debug = 2; | ||
38 | |||
39 | #define dprintk(level,fmt, arg...) if (debug >= level) \ | ||
40 | printk(KERN_DEBUG "%s: " fmt, dev->name, ## arg) | ||
41 | |||
42 | /* ------------------------------------------------------------------ */ | ||
43 | |||
44 | static int dvb_buf_setup(struct videobuf_queue *q, | ||
45 | unsigned int *count, unsigned int *size) | ||
46 | { | ||
47 | struct cx23885_tsport *port = q->priv_data; | ||
48 | |||
49 | port->ts_packet_size = 188 * 4; | ||
50 | port->ts_packet_count = 32; | ||
51 | |||
52 | *size = port->ts_packet_size * port->ts_packet_count; | ||
53 | *count = 32; | ||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | static int dvb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, | ||
58 | enum v4l2_field field) | ||
59 | { | ||
60 | struct cx23885_tsport *port = q->priv_data; | ||
61 | return cx23885_buf_prepare(q, port, (struct cx23885_buffer*)vb,field); | ||
62 | } | ||
63 | |||
64 | static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) | ||
65 | { | ||
66 | struct cx23885_tsport *port = q->priv_data; | ||
67 | cx23885_buf_queue(port, (struct cx23885_buffer*)vb); | ||
68 | } | ||
69 | |||
70 | static void dvb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb) | ||
71 | { | ||
72 | cx23885_free_buffer(q, (struct cx23885_buffer*)vb); | ||
73 | } | ||
74 | |||
75 | static struct videobuf_queue_ops dvb_qops = { | ||
76 | .buf_setup = dvb_buf_setup, | ||
77 | .buf_prepare = dvb_buf_prepare, | ||
78 | .buf_queue = dvb_buf_queue, | ||
79 | .buf_release = dvb_buf_release, | ||
80 | }; | ||
81 | |||
82 | static struct s5h1409_config hauppauge_hvr1800lp_config = { | ||
83 | .demod_address = 0x32 >> 1, | ||
84 | .output_mode = S5H1409_SERIAL_OUTPUT, | ||
85 | .gpio = S5H1409_GPIO_OFF, | ||
86 | .if_freq = 44000, | ||
87 | .inversion = S5H1409_INVERSION_OFF | ||
88 | }; | ||
89 | |||
90 | static struct s5h1409_config hauppauge_hvr1800_config = { | ||
91 | .demod_address = 0x32 >> 1, | ||
92 | .output_mode = S5H1409_SERIAL_OUTPUT, | ||
93 | .gpio = S5H1409_GPIO_ON, | ||
94 | .if_freq = 44000, | ||
95 | .inversion = S5H1409_INVERSION_OFF | ||
96 | }; | ||
97 | |||
98 | |||
99 | static struct mt2131_config hauppauge_hvr1800lp_rev2_tunerconfig = { | ||
100 | 0x61 | ||
101 | }; | ||
102 | |||
103 | static struct mt2131_config hauppauge_hvr1800_tunerconfig = { | ||
104 | 0x61 | ||
105 | }; | ||
106 | |||
107 | static int dvb_register(struct cx23885_tsport *port) | ||
108 | { | ||
109 | struct cx23885_dev *dev = port->dev; | ||
110 | |||
111 | /* init struct videobuf_dvb */ | ||
112 | port->dvb.name = dev->name; | ||
113 | |||
114 | /* init frontend */ | ||
115 | switch (dev->board) { | ||
116 | case CX23885_BOARD_HAUPPAUGE_HVR1800lp: | ||
117 | port->dvb.frontend = dvb_attach(s5h1409_attach, | ||
118 | &hauppauge_hvr1800lp_config, | ||
119 | &dev->i2c_bus[0].i2c_adap); | ||
120 | if (port->dvb.frontend != NULL) { | ||
121 | dvb_attach(mt2131_attach, | ||
122 | port->dvb.frontend, | ||
123 | &dev->i2c_bus[0].i2c_adap, | ||
124 | &hauppauge_hvr1800lp_rev2_tunerconfig, | ||
125 | 0); | ||
126 | } | ||
127 | break; | ||
128 | case CX23885_BOARD_HAUPPAUGE_HVR1800: | ||
129 | port->dvb.frontend = dvb_attach(s5h1409_attach, | ||
130 | &hauppauge_hvr1800_config, | ||
131 | &dev->i2c_bus[0].i2c_adap); | ||
132 | if (port->dvb.frontend != NULL) { | ||
133 | dvb_attach(mt2131_attach, | ||
134 | port->dvb.frontend, | ||
135 | &dev->i2c_bus[0].i2c_adap, | ||
136 | &hauppauge_hvr1800_tunerconfig, | ||
137 | 0); | ||
138 | } | ||
139 | break; | ||
140 | default: | ||
141 | printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n", | ||
142 | dev->name); | ||
143 | break; | ||
144 | } | ||
145 | if (NULL == port->dvb.frontend) { | ||
146 | printk("%s: frontend initialization failed\n", dev->name); | ||
147 | return -1; | ||
148 | } | ||
149 | |||
150 | /* Put the analog decoder in standby to keep it quiet */ | ||
151 | cx23885_call_i2c_clients (&dev->i2c_bus[0], TUNER_SET_STANDBY, NULL); | ||
152 | |||
153 | /* register everything */ | ||
154 | return videobuf_dvb_register(&port->dvb, THIS_MODULE, port, &dev->pci->dev); | ||
155 | } | ||
156 | |||
157 | int cx23885_dvb_register(struct cx23885_tsport *port) | ||
158 | { | ||
159 | struct cx23885_dev *dev = port->dev; | ||
160 | int err; | ||
161 | |||
162 | dprintk( 1, "%s\n", __FUNCTION__); | ||
163 | dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n", | ||
164 | dev->board, | ||
165 | dev->name, | ||
166 | dev->pci_bus, | ||
167 | dev->pci_slot); | ||
168 | |||
169 | err = -ENODEV; | ||
170 | if (!(cx23885_boards[dev->board].portc & CX23885_MPEG_DVB)) | ||
171 | goto fail_core; | ||
172 | |||
173 | /* dvb stuff */ | ||
174 | printk("%s: cx23885 based dvb card\n", dev->name); | ||
175 | videobuf_queue_init( | ||
176 | &port->dvb.dvbq, | ||
177 | &dvb_qops, | ||
178 | dev->pci, | ||
179 | &port->slock, | ||
180 | V4L2_BUF_TYPE_VIDEO_CAPTURE, | ||
181 | V4L2_FIELD_TOP, | ||
182 | sizeof(struct cx23885_buffer), | ||
183 | port); | ||
184 | err = dvb_register(port); | ||
185 | if (err != 0) | ||
186 | printk("%s() dvb_register failed err = %d\n", __FUNCTION__, err); | ||
187 | |||
188 | fail_core: | ||
189 | return err; | ||
190 | } | ||
191 | |||
192 | int cx23885_dvb_unregister(struct cx23885_tsport *port) | ||
193 | { | ||
194 | /* dvb */ | ||
195 | if(port->dvb.frontend) | ||
196 | videobuf_dvb_unregister(&port->dvb); | ||
197 | |||
198 | return 0; | ||
199 | } | ||