aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2014-12-16 08:09:20 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-02-03 13:15:43 -0500
commit63bdab5d31b987c5ccb81c3c6662016d07cbb5b7 (patch)
treee1811210e14b938fc0e0a9234da0726c419a573f
parent725b7f30463ab54b453a7113e7fb7148cfe636a2 (diff)
[media] rtl2832_sdr: convert to platform driver
That SDR driver module was abusing DVB frontend SEC (satellite equipment controller) device and due to that it was also using legacy DVB binding. Platform bus is pseudo-bus provided by kernel driver model and it fits cases like that, where any other busses are not suitable. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/dvb-frontends/rtl2832_sdr.c355
-rw-r--r--drivers/media/dvb-frontends/rtl2832_sdr.h42
2 files changed, 156 insertions, 241 deletions
diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.c b/drivers/media/dvb-frontends/rtl2832_sdr.c
index 3af869c5497d..6c5b2944ecb2 100644
--- a/drivers/media/dvb-frontends/rtl2832_sdr.c
+++ b/drivers/media/dvb-frontends/rtl2832_sdr.c
@@ -32,6 +32,7 @@
32#include <media/v4l2-event.h> 32#include <media/v4l2-event.h>
33#include <media/videobuf2-vmalloc.h> 33#include <media/videobuf2-vmalloc.h>
34 34
35#include <linux/platform_device.h>
35#include <linux/jiffies.h> 36#include <linux/jiffies.h>
36#include <linux/math64.h> 37#include <linux/math64.h>
37 38
@@ -112,7 +113,7 @@ struct rtl2832_sdr_dev {
112#define URB_BUF (1 << 2) 113#define URB_BUF (1 << 2)
113 unsigned long flags; 114 unsigned long flags;
114 115
115 const struct rtl2832_config *cfg; 116 struct platform_device *pdev;
116 struct dvb_frontend *fe; 117 struct dvb_frontend *fe;
117 struct dvb_usb_device *d; 118 struct dvb_usb_device *d;
118 struct i2c_adapter *i2c; 119 struct i2c_adapter *i2c;
@@ -160,110 +161,29 @@ struct rtl2832_sdr_dev {
160 unsigned long jiffies_next; 161 unsigned long jiffies_next;
161}; 162};
162 163
163/* write multiple hardware registers */
164static int rtl2832_sdr_wr(struct rtl2832_sdr_dev *dev, u8 reg, const u8 *val,
165 int len)
166{
167 int ret;
168#define MAX_WR_LEN 24
169#define MAX_WR_XFER_LEN (MAX_WR_LEN + 1)
170 u8 buf[MAX_WR_XFER_LEN];
171 struct i2c_msg msg[1] = {
172 {
173 .addr = dev->cfg->i2c_addr,
174 .flags = 0,
175 .len = 1 + len,
176 .buf = buf,
177 }
178 };
179
180 if (WARN_ON(len > MAX_WR_LEN))
181 return -EINVAL;
182
183 buf[0] = reg;
184 memcpy(&buf[1], val, len);
185
186 ret = i2c_transfer(dev->i2c, msg, 1);
187 if (ret == 1) {
188 ret = 0;
189 } else {
190 dev_err(&dev->i2c->dev,
191 "%s: I2C wr failed=%d reg=%02x len=%d\n",
192 KBUILD_MODNAME, ret, reg, len);
193 ret = -EREMOTEIO;
194 }
195 return ret;
196}
197
198/* read multiple hardware registers */
199static int rtl2832_sdr_rd(struct rtl2832_sdr_dev *dev, u8 reg, u8 *val, int len)
200{
201 int ret;
202 struct i2c_msg msg[2] = {
203 {
204 .addr = dev->cfg->i2c_addr,
205 .flags = 0,
206 .len = 1,
207 .buf = &reg,
208 }, {
209 .addr = dev->cfg->i2c_addr,
210 .flags = I2C_M_RD,
211 .len = len,
212 .buf = val,
213 }
214 };
215
216 ret = i2c_transfer(dev->i2c, msg, 2);
217 if (ret == 2) {
218 ret = 0;
219 } else {
220 dev_err(&dev->i2c->dev,
221 "%s: I2C rd failed=%d reg=%02x len=%d\n",
222 KBUILD_MODNAME, ret, reg, len);
223 ret = -EREMOTEIO;
224 }
225 return ret;
226}
227
228/* write multiple registers */ 164/* write multiple registers */
229static int rtl2832_sdr_wr_regs(struct rtl2832_sdr_dev *dev, u16 reg, 165static int rtl2832_sdr_wr_regs(struct rtl2832_sdr_dev *dev, u16 reg,
230 const u8 *val, int len) 166 const u8 *val, int len)
231{ 167{
232 int ret; 168 struct platform_device *pdev = dev->pdev;
233 u8 reg2 = (reg >> 0) & 0xff; 169 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
234 u8 bank = (reg >> 8) & 0xff; 170 struct i2c_client *client = pdata->i2c_client;
235
236 /* switch bank if needed */
237 if (bank != dev->bank) {
238 ret = rtl2832_sdr_wr(dev, 0x00, &bank, 1);
239 if (ret)
240 return ret;
241 171
242 dev->bank = bank; 172 return pdata->bulk_write(client, reg, val, len);
243 }
244
245 return rtl2832_sdr_wr(dev, reg2, val, len);
246} 173}
247 174
175#if 0
248/* read multiple registers */ 176/* read multiple registers */
249static int rtl2832_sdr_rd_regs(struct rtl2832_sdr_dev *dev, u16 reg, u8 *val, 177static int rtl2832_sdr_rd_regs(struct rtl2832_sdr_dev *dev, u16 reg, u8 *val,
250 int len) 178 int len)
251{ 179{
252 int ret; 180 struct platform_device *pdev = dev->pdev;
253 u8 reg2 = (reg >> 0) & 0xff; 181 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
254 u8 bank = (reg >> 8) & 0xff; 182 struct i2c_client *client = pdata->i2c_client;
255
256 /* switch bank if needed */
257 if (bank != dev->bank) {
258 ret = rtl2832_sdr_wr(dev, 0x00, &bank, 1);
259 if (ret)
260 return ret;
261 183
262 dev->bank = bank; 184 return pdata->bulk_read(client, reg, val, len);
263 }
264
265 return rtl2832_sdr_rd(dev, reg2, val, len);
266} 185}
186#endif
267 187
268/* write single register */ 188/* write single register */
269static int rtl2832_sdr_wr_reg(struct rtl2832_sdr_dev *dev, u16 reg, u8 val) 189static int rtl2832_sdr_wr_reg(struct rtl2832_sdr_dev *dev, u16 reg, u8 val)
@@ -271,59 +191,16 @@ static int rtl2832_sdr_wr_reg(struct rtl2832_sdr_dev *dev, u16 reg, u8 val)
271 return rtl2832_sdr_wr_regs(dev, reg, &val, 1); 191 return rtl2832_sdr_wr_regs(dev, reg, &val, 1);
272} 192}
273 193
274#if 0
275/* read single register */
276static int rtl2832_sdr_rd_reg(struct rtl2832_sdr_dev *dev, u16 reg, u8 *val)
277{
278 return rtl2832_sdr_rd_regs(dev, reg, val, 1);
279}
280#endif
281
282/* write single register with mask */ 194/* write single register with mask */
283static int rtl2832_sdr_wr_reg_mask(struct rtl2832_sdr_dev *dev, u16 reg, 195static int rtl2832_sdr_wr_reg_mask(struct rtl2832_sdr_dev *dev, u16 reg,
284 u8 val, u8 mask) 196 u8 val, u8 mask)
285{ 197{
286 int ret; 198 struct platform_device *pdev = dev->pdev;
287 u8 tmp; 199 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
288 200 struct i2c_client *client = pdata->i2c_client;
289 /* no need for read if whole reg is written */
290 if (mask != 0xff) {
291 ret = rtl2832_sdr_rd_regs(dev, reg, &tmp, 1);
292 if (ret)
293 return ret;
294
295 val &= mask;
296 tmp &= ~mask;
297 val |= tmp;
298 }
299
300 return rtl2832_sdr_wr_regs(dev, reg, &val, 1);
301}
302
303#if 0
304/* read single register with mask */
305static int rtl2832_sdr_rd_reg_mask(struct rtl2832_sdr_dev *dev, u16 reg,
306 u8 *val, u8 mask)
307{
308 int ret, i;
309 u8 tmp;
310
311 ret = rtl2832_sdr_rd_regs(dev, reg, &tmp, 1);
312 if (ret)
313 return ret;
314
315 tmp &= mask;
316
317 /* find position of the first bit */
318 for (i = 0; i < 8; i++) {
319 if ((mask >> i) & 0x01)
320 break;
321 }
322 *val = tmp >> i;
323 201
324 return 0; 202 return pdata->update_bits(client, reg, mask, val);
325} 203}
326#endif
327 204
328/* Private functions */ 205/* Private functions */
329static struct rtl2832_sdr_frame_buf *rtl2832_sdr_get_next_fill_buf( 206static struct rtl2832_sdr_frame_buf *rtl2832_sdr_get_next_fill_buf(
@@ -584,28 +461,6 @@ static void rtl2832_sdr_cleanup_queued_bufs(struct rtl2832_sdr_dev *dev)
584 spin_unlock_irqrestore(&dev->queued_bufs_lock, flags); 461 spin_unlock_irqrestore(&dev->queued_bufs_lock, flags);
585} 462}
586 463
587/* The user yanked out the cable... */
588static void rtl2832_sdr_release_sec(struct dvb_frontend *fe)
589{
590 struct rtl2832_sdr_dev *dev = fe->sec_priv;
591
592 dev_dbg(&dev->udev->dev, "\n");
593
594 mutex_lock(&dev->vb_queue_lock);
595 mutex_lock(&dev->v4l2_lock);
596 /* No need to keep the urbs around after disconnection */
597 dev->udev = NULL;
598
599 v4l2_device_disconnect(&dev->v4l2_dev);
600 video_unregister_device(&dev->vdev);
601 mutex_unlock(&dev->v4l2_lock);
602 mutex_unlock(&dev->vb_queue_lock);
603
604 v4l2_device_put(&dev->v4l2_dev);
605
606 fe->sec_priv = NULL;
607}
608
609static int rtl2832_sdr_querycap(struct file *file, void *fh, 464static int rtl2832_sdr_querycap(struct file *file, void *fh,
610 struct v4l2_capability *cap) 465 struct v4l2_capability *cap)
611{ 466{
@@ -672,6 +527,8 @@ static void rtl2832_sdr_buf_queue(struct vb2_buffer *vb)
672 527
673static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev) 528static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev)
674{ 529{
530 struct platform_device *pdev = dev->pdev;
531 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
675 struct dvb_frontend *fe = dev->fe; 532 struct dvb_frontend *fe = dev->fe;
676 int ret; 533 int ret;
677 unsigned int f_sr, f_if; 534 unsigned int f_sr, f_if;
@@ -707,9 +564,9 @@ static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev)
707 goto err; 564 goto err;
708 565
709 /* program IF */ 566 /* program IF */
710 u64tmp = f_if % dev->cfg->xtal; 567 u64tmp = f_if % pdata->clk;
711 u64tmp *= 0x400000; 568 u64tmp *= 0x400000;
712 u64tmp = div_u64(u64tmp, dev->cfg->xtal); 569 u64tmp = div_u64(u64tmp, pdata->clk);
713 u64tmp = -u64tmp; 570 u64tmp = -u64tmp;
714 u32tmp = u64tmp & 0x3fffff; 571 u32tmp = u64tmp & 0x3fffff;
715 572
@@ -746,7 +603,7 @@ static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev)
746 goto err; 603 goto err;
747 604
748 /* program sampling rate (resampling down) */ 605 /* program sampling rate (resampling down) */
749 u32tmp = div_u64(dev->cfg->xtal * 0x400000ULL, f_sr * 4U); 606 u32tmp = div_u64(pdata->clk * 0x400000ULL, f_sr * 4U);
750 u32tmp <<= 2; 607 u32tmp <<= 2;
751 buf[0] = (u32tmp >> 24) & 0xff; 608 buf[0] = (u32tmp >> 24) & 0xff;
752 buf[1] = (u32tmp >> 16) & 0xff; 609 buf[1] = (u32tmp >> 16) & 0xff;
@@ -787,8 +644,8 @@ static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev)
787 goto err; 644 goto err;
788 645
789 /* used RF tuner based settings */ 646 /* used RF tuner based settings */
790 switch (dev->cfg->tuner) { 647 switch (pdata->tuner) {
791 case RTL2832_TUNER_E4000: 648 case RTL2832_SDR_TUNER_E4000:
792 ret = rtl2832_sdr_wr_regs(dev, 0x112, "\x5a", 1); 649 ret = rtl2832_sdr_wr_regs(dev, 0x112, "\x5a", 1);
793 ret = rtl2832_sdr_wr_regs(dev, 0x102, "\x40", 1); 650 ret = rtl2832_sdr_wr_regs(dev, 0x102, "\x40", 1);
794 ret = rtl2832_sdr_wr_regs(dev, 0x103, "\x5a", 1); 651 ret = rtl2832_sdr_wr_regs(dev, 0x103, "\x5a", 1);
@@ -824,8 +681,8 @@ static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev)
824 ret = rtl2832_sdr_wr_regs(dev, 0x00d, "\x85", 1); 681 ret = rtl2832_sdr_wr_regs(dev, 0x00d, "\x85", 1);
825 ret = rtl2832_sdr_wr_regs(dev, 0x013, "\x02", 1); 682 ret = rtl2832_sdr_wr_regs(dev, 0x013, "\x02", 1);
826 break; 683 break;
827 case RTL2832_TUNER_FC0012: 684 case RTL2832_SDR_TUNER_FC0012:
828 case RTL2832_TUNER_FC0013: 685 case RTL2832_SDR_TUNER_FC0013:
829 ret = rtl2832_sdr_wr_regs(dev, 0x112, "\x5a", 1); 686 ret = rtl2832_sdr_wr_regs(dev, 0x112, "\x5a", 1);
830 ret = rtl2832_sdr_wr_regs(dev, 0x102, "\x40", 1); 687 ret = rtl2832_sdr_wr_regs(dev, 0x102, "\x40", 1);
831 ret = rtl2832_sdr_wr_regs(dev, 0x103, "\x5a", 1); 688 ret = rtl2832_sdr_wr_regs(dev, 0x103, "\x5a", 1);
@@ -856,7 +713,8 @@ static int rtl2832_sdr_set_adc(struct rtl2832_sdr_dev *dev)
856 ret = rtl2832_sdr_wr_regs(dev, 0x1e6, "\x02", 1); 713 ret = rtl2832_sdr_wr_regs(dev, 0x1e6, "\x02", 1);
857 ret = rtl2832_sdr_wr_regs(dev, 0x1d7, "\x09", 1); 714 ret = rtl2832_sdr_wr_regs(dev, 0x1d7, "\x09", 1);
858 break; 715 break;
859 case RTL2832_TUNER_R820T: 716 case RTL2832_SDR_TUNER_R820T:
717 case RTL2832_SDR_TUNER_R828D:
860 ret = rtl2832_sdr_wr_regs(dev, 0x112, "\x5a", 1); 718 ret = rtl2832_sdr_wr_regs(dev, 0x112, "\x5a", 1);
861 ret = rtl2832_sdr_wr_regs(dev, 0x102, "\x40", 1); 719 ret = rtl2832_sdr_wr_regs(dev, 0x102, "\x40", 1);
862 ret = rtl2832_sdr_wr_regs(dev, 0x115, "\x01", 1); 720 ret = rtl2832_sdr_wr_regs(dev, 0x115, "\x01", 1);
@@ -1401,34 +1259,46 @@ static void rtl2832_sdr_video_release(struct v4l2_device *v)
1401{ 1259{
1402 struct rtl2832_sdr_dev *dev = 1260 struct rtl2832_sdr_dev *dev =
1403 container_of(v, struct rtl2832_sdr_dev, v4l2_dev); 1261 container_of(v, struct rtl2832_sdr_dev, v4l2_dev);
1262 struct platform_device *pdev = dev->pdev;
1263
1264 dev_dbg(&pdev->dev, "\n");
1404 1265
1405 v4l2_ctrl_handler_free(&dev->hdl); 1266 v4l2_ctrl_handler_free(&dev->hdl);
1406 v4l2_device_unregister(&dev->v4l2_dev); 1267 v4l2_device_unregister(&dev->v4l2_dev);
1407 kfree(dev); 1268 kfree(dev);
1408} 1269}
1409 1270
1410struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe, 1271/* Platform driver interface */
1411 struct i2c_adapter *i2c, const struct rtl2832_config *cfg, 1272static int rtl2832_sdr_probe(struct platform_device *pdev)
1412 struct v4l2_subdev *sd)
1413{ 1273{
1414 int ret;
1415 struct rtl2832_sdr_dev *dev; 1274 struct rtl2832_sdr_dev *dev;
1275 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
1416 const struct v4l2_ctrl_ops *ops = &rtl2832_sdr_ctrl_ops; 1276 const struct v4l2_ctrl_ops *ops = &rtl2832_sdr_ctrl_ops;
1417 struct dvb_usb_device *d = i2c_get_adapdata(i2c); 1277 struct v4l2_subdev *subdev;
1278 int ret;
1418 1279
1419 dev = kzalloc(sizeof(struct rtl2832_sdr_dev), GFP_KERNEL); 1280 dev_dbg(&pdev->dev, "\n");
1281
1282 if (!pdata) {
1283 dev_err(&pdev->dev, "Cannot proceed without platform data\n");
1284 ret = -EINVAL;
1285 goto err;
1286 }
1287 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1420 if (dev == NULL) { 1288 if (dev == NULL) {
1421 dev_err(&d->udev->dev, 1289 dev_err(&pdev->dev,
1422 "Could not allocate memory for rtl2832_sdr_dev\n"); 1290 "Could not allocate memory for rtl2832_sdr_dev\n");
1423 return NULL; 1291 ret = -ENOMEM;
1292 goto err;
1424 } 1293 }
1425 1294
1426 /* setup the state */ 1295 /* setup the state */
1427 dev->fe = fe; 1296 subdev = pdata->v4l2_subdev;
1428 dev->d = d; 1297 dev->pdev = pdev;
1429 dev->udev = d->udev; 1298 dev->fe = pdata->dvb_frontend;
1430 dev->i2c = i2c; 1299 dev->d = pdata->dvb_usb_device;
1431 dev->cfg = cfg; 1300 dev->udev = pdata->dvb_usb_device->udev;
1301 dev->i2c = pdata->i2c_client->adapter;
1432 dev->f_adc = bands_adc[0].rangelow; 1302 dev->f_adc = bands_adc[0].rangelow;
1433 dev->f_tuner = bands_fm[0].rangelow; 1303 dev->f_tuner = bands_fm[0].rangelow;
1434 dev->pixelformat = formats[0].pixelformat; 1304 dev->pixelformat = formats[0].pixelformat;
@@ -1452,50 +1322,49 @@ struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
1452 dev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; 1322 dev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1453 ret = vb2_queue_init(&dev->vb_queue); 1323 ret = vb2_queue_init(&dev->vb_queue);
1454 if (ret) { 1324 if (ret) {
1455 dev_err(&dev->udev->dev, "Could not initialize vb2 queue\n"); 1325 dev_err(&pdev->dev, "Could not initialize vb2 queue\n");
1456 goto err_free_mem; 1326 goto err_kfree;
1457 } 1327 }
1458 1328
1459 /* Register controls */ 1329 /* Register controls */
1460 switch (dev->cfg->tuner) { 1330 switch (pdata->tuner) {
1461 case RTL2832_TUNER_E4000: 1331 case RTL2832_SDR_TUNER_E4000:
1462 v4l2_ctrl_handler_init(&dev->hdl, 9); 1332 v4l2_ctrl_handler_init(&dev->hdl, 9);
1463 if (sd) 1333 if (subdev)
1464 v4l2_ctrl_add_handler(&dev->hdl, sd->ctrl_handler, NULL); 1334 v4l2_ctrl_add_handler(&dev->hdl, subdev->ctrl_handler, NULL);
1465 break; 1335 break;
1466 case RTL2832_TUNER_R820T: 1336 case RTL2832_SDR_TUNER_R820T:
1337 case RTL2832_SDR_TUNER_R828D:
1467 v4l2_ctrl_handler_init(&dev->hdl, 2); 1338 v4l2_ctrl_handler_init(&dev->hdl, 2);
1468 dev->bandwidth_auto = v4l2_ctrl_new_std(&dev->hdl, ops, 1339 dev->bandwidth_auto = v4l2_ctrl_new_std(&dev->hdl, ops,
1469 V4L2_CID_RF_TUNER_BANDWIDTH_AUTO, 1340 V4L2_CID_RF_TUNER_BANDWIDTH_AUTO,
1470 0, 1, 1, 1); 1341 0, 1, 1, 1);
1471 dev->bandwidth = v4l2_ctrl_new_std(&dev->hdl, ops, 1342 dev->bandwidth = v4l2_ctrl_new_std(&dev->hdl, ops,
1472 V4L2_CID_RF_TUNER_BANDWIDTH, 1343 V4L2_CID_RF_TUNER_BANDWIDTH,
1473 0, 8000000, 100000, 0); 1344 0, 8000000, 100000, 0);
1474 v4l2_ctrl_auto_cluster(2, &dev->bandwidth_auto, 0, false); 1345 v4l2_ctrl_auto_cluster(2, &dev->bandwidth_auto, 0, false);
1475 break; 1346 break;
1476 case RTL2832_TUNER_FC0012: 1347 case RTL2832_SDR_TUNER_FC0012:
1477 case RTL2832_TUNER_FC0013: 1348 case RTL2832_SDR_TUNER_FC0013:
1478 v4l2_ctrl_handler_init(&dev->hdl, 2); 1349 v4l2_ctrl_handler_init(&dev->hdl, 2);
1479 dev->bandwidth_auto = v4l2_ctrl_new_std(&dev->hdl, ops, 1350 dev->bandwidth_auto = v4l2_ctrl_new_std(&dev->hdl, ops,
1480 V4L2_CID_RF_TUNER_BANDWIDTH_AUTO, 1351 V4L2_CID_RF_TUNER_BANDWIDTH_AUTO,
1481 0, 1, 1, 1); 1352 0, 1, 1, 1);
1482 dev->bandwidth = v4l2_ctrl_new_std(&dev->hdl, ops, 1353 dev->bandwidth = v4l2_ctrl_new_std(&dev->hdl, ops,
1483 V4L2_CID_RF_TUNER_BANDWIDTH, 1354 V4L2_CID_RF_TUNER_BANDWIDTH,
1484 6000000, 8000000, 1000000, 1355 6000000, 8000000, 1000000,
1485 6000000); 1356 6000000);
1486 v4l2_ctrl_auto_cluster(2, &dev->bandwidth_auto, 0, false); 1357 v4l2_ctrl_auto_cluster(2, &dev->bandwidth_auto, 0, false);
1487 break; 1358 break;
1488 default: 1359 default:
1489 v4l2_ctrl_handler_init(&dev->hdl, 0); 1360 v4l2_ctrl_handler_init(&dev->hdl, 0);
1490 dev_notice(&dev->udev->dev, "%s: Unsupported tuner\n", 1361 dev_err(&pdev->dev, "Unsupported tuner\n");
1491 KBUILD_MODNAME); 1362 goto err_v4l2_ctrl_handler_free;
1492 goto err_free_controls;
1493 } 1363 }
1494
1495 if (dev->hdl.error) { 1364 if (dev->hdl.error) {
1496 ret = dev->hdl.error; 1365 ret = dev->hdl.error;
1497 dev_err(&dev->udev->dev, "Could not initialize controls\n"); 1366 dev_err(&pdev->dev, "Could not initialize controls\n");
1498 goto err_free_controls; 1367 goto err_v4l2_ctrl_handler_free;
1499 } 1368 }
1500 1369
1501 /* Init video_device structure */ 1370 /* Init video_device structure */
@@ -1508,9 +1377,8 @@ struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
1508 dev->v4l2_dev.release = rtl2832_sdr_video_release; 1377 dev->v4l2_dev.release = rtl2832_sdr_video_release;
1509 ret = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev); 1378 ret = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev);
1510 if (ret) { 1379 if (ret) {
1511 dev_err(&dev->udev->dev, 1380 dev_err(&pdev->dev, "Failed to register v4l2-device %d\n", ret);
1512 "Failed to register v4l2-device (%d)\n", ret); 1381 goto err_v4l2_ctrl_handler_free;
1513 goto err_free_controls;
1514 } 1382 }
1515 1383
1516 dev->v4l2_dev.ctrl_handler = &dev->hdl; 1384 dev->v4l2_dev.ctrl_handler = &dev->hdl;
@@ -1520,33 +1388,56 @@ struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
1520 1388
1521 ret = video_register_device(&dev->vdev, VFL_TYPE_SDR, -1); 1389 ret = video_register_device(&dev->vdev, VFL_TYPE_SDR, -1);
1522 if (ret) { 1390 if (ret) {
1523 dev_err(&dev->udev->dev, 1391 dev_err(&pdev->dev, "Failed to register as video device %d\n",
1524 "Failed to register as video device (%d)\n", 1392 ret);
1525 ret); 1393 goto err_v4l2_device_unregister;
1526 goto err_unregister_v4l2_dev;
1527 } 1394 }
1528 dev_info(&dev->udev->dev, "Registered as %s\n", 1395 dev_info(&pdev->dev, "Registered as %s\n",
1529 video_device_node_name(&dev->vdev)); 1396 video_device_node_name(&dev->vdev));
1530 1397 dev_info(&pdev->dev, "Realtek RTL2832 SDR attached\n");
1531 fe->sec_priv = dev; 1398 dev_notice(&pdev->dev,
1532 fe->ops.release_sec = rtl2832_sdr_release_sec; 1399 "SDR API is still slightly experimental and functionality changes may follow\n");
1533 1400 platform_set_drvdata(pdev, dev);
1534 dev_info(&dev->i2c->dev, "%s: Realtek RTL2832 SDR attached\n", 1401 return 0;
1535 KBUILD_MODNAME); 1402err_v4l2_device_unregister:
1536 dev_notice(&dev->udev->dev,
1537 "%s: SDR API is still slightly experimental and functionality changes may follow\n",
1538 KBUILD_MODNAME);
1539 return fe;
1540
1541err_unregister_v4l2_dev:
1542 v4l2_device_unregister(&dev->v4l2_dev); 1403 v4l2_device_unregister(&dev->v4l2_dev);
1543err_free_controls: 1404err_v4l2_ctrl_handler_free:
1544 v4l2_ctrl_handler_free(&dev->hdl); 1405 v4l2_ctrl_handler_free(&dev->hdl);
1545err_free_mem: 1406err_kfree:
1546 kfree(dev); 1407 kfree(dev);
1547 return NULL; 1408err:
1409 return ret;
1548} 1410}
1549EXPORT_SYMBOL(rtl2832_sdr_attach); 1411
1412static int rtl2832_sdr_remove(struct platform_device *pdev)
1413{
1414 struct rtl2832_sdr_dev *dev = platform_get_drvdata(pdev);
1415
1416 dev_dbg(&pdev->dev, "\n");
1417
1418 mutex_lock(&dev->vb_queue_lock);
1419 mutex_lock(&dev->v4l2_lock);
1420 /* No need to keep the urbs around after disconnection */
1421 dev->udev = NULL;
1422 v4l2_device_disconnect(&dev->v4l2_dev);
1423 video_unregister_device(&dev->vdev);
1424 mutex_unlock(&dev->v4l2_lock);
1425 mutex_unlock(&dev->vb_queue_lock);
1426
1427 v4l2_device_put(&dev->v4l2_dev);
1428
1429 return 0;
1430}
1431
1432static struct platform_driver rtl2832_sdr_driver = {
1433 .driver = {
1434 .name = "rtl2832_sdr",
1435 .owner = THIS_MODULE,
1436 },
1437 .probe = rtl2832_sdr_probe,
1438 .remove = rtl2832_sdr_remove,
1439};
1440module_platform_driver(rtl2832_sdr_driver);
1550 1441
1551MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 1442MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1552MODULE_DESCRIPTION("Realtek RTL2832 SDR driver"); 1443MODULE_DESCRIPTION("Realtek RTL2832 SDR driver");
diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.h b/drivers/media/dvb-frontends/rtl2832_sdr.h
index b865fadf184f..5efe609abd20 100644
--- a/drivers/media/dvb-frontends/rtl2832_sdr.h
+++ b/drivers/media/dvb-frontends/rtl2832_sdr.h
@@ -32,23 +32,47 @@
32#define RTL2832_SDR_H 32#define RTL2832_SDR_H
33 33
34#include <linux/kconfig.h> 34#include <linux/kconfig.h>
35#include <linux/i2c.h>
35#include <media/v4l2-subdev.h> 36#include <media/v4l2-subdev.h>
36 37#include "dvb_frontend.h"
37/* for config struct */
38#include "rtl2832.h" 38#include "rtl2832.h"
39 39
40#if IS_ENABLED(CONFIG_DVB_RTL2832_SDR) 40struct rtl2832_sdr_platform_data {
41extern struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe, 41 /*
42 struct i2c_adapter *i2c, const struct rtl2832_config *cfg, 42 * Clock frequency.
43 struct v4l2_subdev *sd); 43 * Hz
44#else 44 * 4000000, 16000000, 25000000, 28800000
45 */
46 u32 clk;
47
48 /*
49 * Tuner.
50 * XXX: This list must be kept sync with dvb_usb_rtl28xxu USB IF driver.
51 */
52#define RTL2832_SDR_TUNER_TUA9001 0x24
53#define RTL2832_SDR_TUNER_FC0012 0x26
54#define RTL2832_SDR_TUNER_E4000 0x27
55#define RTL2832_SDR_TUNER_FC0013 0x29
56#define RTL2832_SDR_TUNER_R820T 0x2a
57#define RTL2832_SDR_TUNER_R828D 0x2b
58 u8 tuner;
59
60 struct i2c_client *i2c_client;
61 int (*bulk_read)(struct i2c_client *, unsigned int, void *, size_t);
62 int (*bulk_write)(struct i2c_client *, unsigned int, const void *, size_t);
63 int (*update_bits)(struct i2c_client *, unsigned int, unsigned int, unsigned int);
64 struct dvb_frontend *dvb_frontend;
65 struct v4l2_subdev *v4l2_subdev;
66 struct dvb_usb_device *dvb_usb_device;
67};
68
69
45static inline struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe, 70static inline struct dvb_frontend *rtl2832_sdr_attach(struct dvb_frontend *fe,
46 struct i2c_adapter *i2c, const struct rtl2832_config *cfg, 71 struct i2c_adapter *i2c, const struct rtl2832_config *cfg,
47 struct v4l2_subdev *sd) 72 struct v4l2_subdev *sd)
48{ 73{
49 dev_warn(&i2c->dev, "%s: driver disabled by Kconfig\n", __func__); 74 dev_warn(&i2c->dev, "%s: driver disabled!\n", __func__);
50 return NULL; 75 return NULL;
51} 76}
52#endif
53 77
54#endif /* RTL2832_SDR_H */ 78#endif /* RTL2832_SDR_H */