aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/tvaudio.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
index e8ab28532d94..faa9e3dd782f 100644
--- a/drivers/media/video/tvaudio.c
+++ b/drivers/media/video/tvaudio.c
@@ -1511,6 +1511,8 @@ static int tvaudio_g_ctrl(struct v4l2_subdev *sd,
1511 1511
1512 switch (ctrl->id) { 1512 switch (ctrl->id) {
1513 case V4L2_CID_AUDIO_MUTE: 1513 case V4L2_CID_AUDIO_MUTE:
1514 if (!(desc->flags & CHIP_HAS_INPUTSEL))
1515 break;
1514 ctrl->value=chip->muted; 1516 ctrl->value=chip->muted;
1515 return 0; 1517 return 0;
1516 case V4L2_CID_AUDIO_VOLUME: 1518 case V4L2_CID_AUDIO_VOLUME:
@@ -1552,6 +1554,9 @@ static int tvaudio_s_ctrl(struct v4l2_subdev *sd,
1552 1554
1553 switch (ctrl->id) { 1555 switch (ctrl->id) {
1554 case V4L2_CID_AUDIO_MUTE: 1556 case V4L2_CID_AUDIO_MUTE:
1557 if (!(desc->flags & CHIP_HAS_INPUTSEL))
1558 break;
1559
1555 if (ctrl->value < 0 || ctrl->value >= 2) 1560 if (ctrl->value < 0 || ctrl->value >= 2)
1556 return -ERANGE; 1561 return -ERANGE;
1557 chip->muted = ctrl->value; 1562 chip->muted = ctrl->value;
@@ -1636,7 +1641,9 @@ static int tvaudio_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
1636 1641
1637 switch (qc->id) { 1642 switch (qc->id) {
1638 case V4L2_CID_AUDIO_MUTE: 1643 case V4L2_CID_AUDIO_MUTE:
1639 return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0); 1644 if (desc->flags & CHIP_HAS_INPUTSEL)
1645 return v4l2_ctrl_query_fill(qc, 0, 1, 1, 0);
1646 break;
1640 case V4L2_CID_AUDIO_VOLUME: 1647 case V4L2_CID_AUDIO_VOLUME:
1641 if (desc->flags & CHIP_HAS_VOLUME) 1648 if (desc->flags & CHIP_HAS_VOLUME)
1642 return v4l2_ctrl_query_fill(qc, 0, 65535, 65535 / 100, 58880); 1649 return v4l2_ctrl_query_fill(qc, 0, 65535, 65535 / 100, 58880);
@@ -1661,7 +1668,9 @@ static int tvaudio_s_routing(struct v4l2_subdev *sd, const struct v4l2_routing *
1661 struct CHIPSTATE *chip = to_state(sd); 1668 struct CHIPSTATE *chip = to_state(sd);
1662 struct CHIPDESC *desc = chip->desc; 1669 struct CHIPDESC *desc = chip->desc;
1663 1670
1664 if (!(desc->flags & CHIP_HAS_INPUTSEL) || rt->input >= 4) 1671 if (!(desc->flags & CHIP_HAS_INPUTSEL))
1672 return 0;
1673 if (rt->input >= 4)
1665 return -EINVAL; 1674 return -EINVAL;
1666 /* There are four inputs: tuner, radio, extern and intern. */ 1675 /* There are four inputs: tuner, radio, extern and intern. */
1667 chip->input = rt->input; 1676 chip->input = rt->input;
@@ -1678,8 +1687,11 @@ static int tvaudio_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1678 struct CHIPDESC *desc = chip->desc; 1687 struct CHIPDESC *desc = chip->desc;
1679 int mode = 0; 1688 int mode = 0;
1680 1689
1690 if (!desc->setmode)
1691 return 0;
1681 if (chip->radio) 1692 if (chip->radio)
1682 return 0; 1693 return 0;
1694
1683 switch (vt->audmode) { 1695 switch (vt->audmode) {
1684 case V4L2_TUNER_MODE_MONO: 1696 case V4L2_TUNER_MODE_MONO:
1685 case V4L2_TUNER_MODE_STEREO: 1697 case V4L2_TUNER_MODE_STEREO:
@@ -1695,7 +1707,7 @@ static int tvaudio_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1695 } 1707 }
1696 chip->audmode = vt->audmode; 1708 chip->audmode = vt->audmode;
1697 1709
1698 if (desc->setmode && mode) { 1710 if (mode) {
1699 chip->watch_stereo = 0; 1711 chip->watch_stereo = 0;
1700 /* del_timer(&chip->wt); */ 1712 /* del_timer(&chip->wt); */
1701 chip->mode = mode; 1713 chip->mode = mode;
@@ -1710,15 +1722,17 @@ static int tvaudio_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
1710 struct CHIPDESC *desc = chip->desc; 1722 struct CHIPDESC *desc = chip->desc;
1711 int mode = V4L2_TUNER_MODE_MONO; 1723 int mode = V4L2_TUNER_MODE_MONO;
1712 1724
1725 if (!desc->getmode)
1726 return 0;
1713 if (chip->radio) 1727 if (chip->radio)
1714 return 0; 1728 return 0;
1729
1715 vt->audmode = chip->audmode; 1730 vt->audmode = chip->audmode;
1716 vt->rxsubchans = 0; 1731 vt->rxsubchans = 0;
1717 vt->capability = V4L2_TUNER_CAP_STEREO | 1732 vt->capability = V4L2_TUNER_CAP_STEREO |
1718 V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2; 1733 V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
1719 1734
1720 if (desc->getmode) 1735 mode = desc->getmode(chip);
1721 mode = desc->getmode(chip);
1722 1736
1723 if (mode & V4L2_TUNER_MODE_MONO) 1737 if (mode & V4L2_TUNER_MODE_MONO)
1724 vt->rxsubchans |= V4L2_TUNER_SUB_MONO; 1738 vt->rxsubchans |= V4L2_TUNER_SUB_MONO;