aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/radio/radio-si470x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/radio/radio-si470x.c')
-rw-r--r--drivers/media/radio/radio-si470x.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/media/radio/radio-si470x.c b/drivers/media/radio/radio-si470x.c
index 31da21a38f24..274d8464c02e 100644
--- a/drivers/media/radio/radio-si470x.c
+++ b/drivers/media/radio/radio-si470x.c
@@ -104,6 +104,7 @@
104 * - hardware frequency seek support 104 * - hardware frequency seek support
105 * - afc indication 105 * - afc indication
106 * - more safety checks, let si470x_get_freq return errno 106 * - more safety checks, let si470x_get_freq return errno
107 * - vidioc behavior corrected according to v4l2 spec
107 * 108 *
108 * ToDo: 109 * ToDo:
109 * - add firmware download/update support 110 * - add firmware download/update support
@@ -1418,7 +1419,7 @@ static int si470x_vidioc_g_tuner(struct file *file, void *priv,
1418 retval = -EIO; 1419 retval = -EIO;
1419 goto done; 1420 goto done;
1420 } 1421 }
1421 if ((tuner->index != 0) && (tuner->type != V4L2_TUNER_RADIO)) { 1422 if (tuner->index != 0) {
1422 retval = -EINVAL; 1423 retval = -EINVAL;
1423 goto done; 1424 goto done;
1424 } 1425 }
@@ -1427,7 +1428,11 @@ static int si470x_vidioc_g_tuner(struct file *file, void *priv,
1427 if (retval < 0) 1428 if (retval < 0)
1428 goto done; 1429 goto done;
1429 1430
1431 /* driver constants */
1430 strcpy(tuner->name, "FM"); 1432 strcpy(tuner->name, "FM");
1433 tuner->type = V4L2_TUNER_RADIO;
1434 tuner->capability = V4L2_TUNER_CAP_LOW;
1435
1431 /* range limits */ 1436 /* range limits */
1432 switch ((radio->registers[SYSCONFIG2] & SYSCONFIG2_BAND) >> 6) { 1437 switch ((radio->registers[SYSCONFIG2] & SYSCONFIG2_BAND) >> 6) {
1433 /* 0: 87.5 - 108 MHz (USA, Europe, default) */ 1438 /* 0: 87.5 - 108 MHz (USA, Europe, default) */
@@ -1447,7 +1452,6 @@ static int si470x_vidioc_g_tuner(struct file *file, void *priv,
1447 break; 1452 break;
1448 }; 1453 };
1449 tuner->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO; 1454 tuner->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
1450 tuner->capability = V4L2_TUNER_CAP_LOW;
1451 1455
1452 /* Stereo indicator == Stereo (instead of Mono) */ 1456 /* Stereo indicator == Stereo (instead of Mono) */
1453 if ((radio->registers[STATUSRSSI] & STATUSRSSI_ST) == 1) 1457 if ((radio->registers[STATUSRSSI] & STATUSRSSI_ST) == 1)
@@ -1478,17 +1482,15 @@ static int si470x_vidioc_s_tuner(struct file *file, void *priv,
1478 struct v4l2_tuner *tuner) 1482 struct v4l2_tuner *tuner)
1479{ 1483{
1480 struct si470x_device *radio = video_drvdata(file); 1484 struct si470x_device *radio = video_drvdata(file);
1481 int retval = 0; 1485 int retval = -EINVAL;
1482 1486
1483 /* safety checks */ 1487 /* safety checks */
1484 if (radio->disconnected) { 1488 if (radio->disconnected) {
1485 retval = -EIO; 1489 retval = -EIO;
1486 goto done; 1490 goto done;
1487 } 1491 }
1488 if ((tuner->index != 0) && (tuner->type != V4L2_TUNER_RADIO)) { 1492 if (tuner->index != 0)
1489 retval = -EINVAL;
1490 goto done; 1493 goto done;
1491 }
1492 1494
1493 if (tuner->audmode == V4L2_TUNER_MODE_MONO) 1495 if (tuner->audmode == V4L2_TUNER_MODE_MONO)
1494 radio->registers[POWERCFG] |= POWERCFG_MONO; /* force mono */ 1496 radio->registers[POWERCFG] |= POWERCFG_MONO; /* force mono */
@@ -1519,11 +1521,12 @@ static int si470x_vidioc_g_frequency(struct file *file, void *priv,
1519 retval = -EIO; 1521 retval = -EIO;
1520 goto done; 1522 goto done;
1521 } 1523 }
1522 if ((freq->tuner != 0) && (freq->type != V4L2_TUNER_RADIO)) { 1524 if (freq->tuner != 0) {
1523 retval = -EINVAL; 1525 retval = -EINVAL;
1524 goto done; 1526 goto done;
1525 } 1527 }
1526 1528
1529 freq->type = V4L2_TUNER_RADIO;
1527 retval = si470x_get_freq(radio, &freq->frequency); 1530 retval = si470x_get_freq(radio, &freq->frequency);
1528 1531
1529done: 1532done:
@@ -1548,7 +1551,7 @@ static int si470x_vidioc_s_frequency(struct file *file, void *priv,
1548 retval = -EIO; 1551 retval = -EIO;
1549 goto done; 1552 goto done;
1550 } 1553 }
1551 if ((freq->tuner != 0) && (freq->type != V4L2_TUNER_RADIO)) { 1554 if (freq->tuner != 0) {
1552 retval = -EINVAL; 1555 retval = -EINVAL;
1553 goto done; 1556 goto done;
1554 } 1557 }
@@ -1577,7 +1580,7 @@ static int si470x_vidioc_s_hw_freq_seek(struct file *file, void *priv,
1577 retval = -EIO; 1580 retval = -EIO;
1578 goto done; 1581 goto done;
1579 } 1582 }
1580 if ((seek->tuner != 0) && (seek->type != V4L2_TUNER_RADIO)) { 1583 if (seek->tuner != 0) {
1581 retval = -EINVAL; 1584 retval = -EINVAL;
1582 goto done; 1585 goto done;
1583 } 1586 }