diff options
| -rw-r--r-- | drivers/media/video/hdpvr/hdpvr-core.c | 18 | ||||
| -rw-r--r-- | drivers/media/video/hdpvr/hdpvr-video.c | 43 | ||||
| -rw-r--r-- | drivers/media/video/hdpvr/hdpvr.h | 1 |
3 files changed, 47 insertions, 15 deletions
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c index 441dacf642bb..687282d87491 100644 --- a/drivers/media/video/hdpvr/hdpvr-core.c +++ b/drivers/media/video/hdpvr/hdpvr-core.c | |||
| @@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev) | |||
| 154 | } | 154 | } |
| 155 | #endif | 155 | #endif |
| 156 | 156 | ||
| 157 | dev->fw_ver = dev->usbc_buf[1]; | ||
| 158 | |||
| 157 | v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n", | 159 | v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n", |
| 158 | dev->usbc_buf[1], &dev->usbc_buf[2]); | 160 | dev->fw_ver, &dev->usbc_buf[2]); |
| 161 | |||
| 162 | if (dev->fw_ver > 0x15) { | ||
| 163 | dev->options.brightness = 0x80; | ||
| 164 | dev->options.contrast = 0x40; | ||
| 165 | dev->options.hue = 0xf; | ||
| 166 | dev->options.saturation = 0x40; | ||
| 167 | dev->options.sharpness = 0x80; | ||
| 168 | } | ||
| 159 | 169 | ||
| 160 | switch (dev->usbc_buf[1]) { | 170 | switch (dev->fw_ver) { |
| 161 | case HDPVR_FIRMWARE_VERSION: | 171 | case HDPVR_FIRMWARE_VERSION: |
| 162 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; | 172 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; |
| 163 | break; | 173 | break; |
| @@ -169,7 +179,7 @@ static int device_authorization(struct hdpvr_device *dev) | |||
| 169 | default: | 179 | default: |
| 170 | v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might" | 180 | v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might" |
| 171 | " not work.\n"); | 181 | " not work.\n"); |
| 172 | if (dev->usbc_buf[1] >= HDPVR_FIRMWARE_VERSION_AC3) | 182 | if (dev->fw_ver >= HDPVR_FIRMWARE_VERSION_AC3) |
| 173 | dev->flags |= HDPVR_FLAG_AC3_CAP; | 183 | dev->flags |= HDPVR_FLAG_AC3_CAP; |
| 174 | else | 184 | else |
| 175 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; | 185 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; |
| @@ -270,6 +280,8 @@ static const struct hdpvr_options hdpvr_default_options = { | |||
| 270 | .bitrate_mode = HDPVR_CONSTANT, | 280 | .bitrate_mode = HDPVR_CONSTANT, |
| 271 | .gop_mode = HDPVR_SIMPLE_IDR_GOP, | 281 | .gop_mode = HDPVR_SIMPLE_IDR_GOP, |
| 272 | .audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC, | 282 | .audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC, |
| 283 | /* original picture controls for firmware version <= 0x15 */ | ||
| 284 | /* updated in device_authorization() for newer firmware */ | ||
| 273 | .brightness = 0x86, | 285 | .brightness = 0x86, |
| 274 | .contrast = 0x80, | 286 | .contrast = 0x80, |
| 275 | .hue = 0x80, | 287 | .hue = 0x80, |
diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c index 41fd57b6ccfb..11ffe9cc1780 100644 --- a/drivers/media/video/hdpvr/hdpvr-video.c +++ b/drivers/media/video/hdpvr/hdpvr-video.c | |||
| @@ -723,21 +723,39 @@ static const s32 supported_v4l2_ctrls[] = { | |||
| 723 | }; | 723 | }; |
| 724 | 724 | ||
| 725 | static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc, | 725 | static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc, |
| 726 | int ac3) | 726 | int ac3, int fw_ver) |
| 727 | { | 727 | { |
| 728 | int err; | 728 | int err; |
| 729 | 729 | ||
| 730 | if (fw_ver > 0x15) { | ||
| 731 | switch (qc->id) { | ||
| 732 | case V4L2_CID_BRIGHTNESS: | ||
| 733 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 734 | case V4L2_CID_CONTRAST: | ||
| 735 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40); | ||
| 736 | case V4L2_CID_SATURATION: | ||
| 737 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40); | ||
| 738 | case V4L2_CID_HUE: | ||
| 739 | return v4l2_ctrl_query_fill(qc, 0x0, 0x1e, 1, 0xf); | ||
| 740 | case V4L2_CID_SHARPNESS: | ||
| 741 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 742 | } | ||
| 743 | } else { | ||
| 744 | switch (qc->id) { | ||
| 745 | case V4L2_CID_BRIGHTNESS: | ||
| 746 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86); | ||
| 747 | case V4L2_CID_CONTRAST: | ||
| 748 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 749 | case V4L2_CID_SATURATION: | ||
| 750 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 751 | case V4L2_CID_HUE: | ||
| 752 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 753 | case V4L2_CID_SHARPNESS: | ||
| 754 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 755 | } | ||
| 756 | } | ||
| 757 | |||
| 730 | switch (qc->id) { | 758 | switch (qc->id) { |
| 731 | case V4L2_CID_BRIGHTNESS: | ||
| 732 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86); | ||
| 733 | case V4L2_CID_CONTRAST: | ||
| 734 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 735 | case V4L2_CID_SATURATION: | ||
| 736 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 737 | case V4L2_CID_HUE: | ||
| 738 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 739 | case V4L2_CID_SHARPNESS: | ||
| 740 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 741 | case V4L2_CID_MPEG_AUDIO_ENCODING: | 759 | case V4L2_CID_MPEG_AUDIO_ENCODING: |
| 742 | return v4l2_ctrl_query_fill( | 760 | return v4l2_ctrl_query_fill( |
| 743 | qc, V4L2_MPEG_AUDIO_ENCODING_AAC, | 761 | qc, V4L2_MPEG_AUDIO_ENCODING_AAC, |
| @@ -795,7 +813,8 @@ static int vidioc_queryctrl(struct file *file, void *private_data, | |||
| 795 | 813 | ||
| 796 | if (qc->id == supported_v4l2_ctrls[i]) | 814 | if (qc->id == supported_v4l2_ctrls[i]) |
| 797 | return fill_queryctrl(&dev->options, qc, | 815 | return fill_queryctrl(&dev->options, qc, |
| 798 | dev->flags & HDPVR_FLAG_AC3_CAP); | 816 | dev->flags & HDPVR_FLAG_AC3_CAP, |
| 817 | dev->fw_ver); | ||
| 799 | 818 | ||
| 800 | if (qc->id < supported_v4l2_ctrls[i]) | 819 | if (qc->id < supported_v4l2_ctrls[i]) |
| 801 | break; | 820 | break; |
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h index d6439db1d18b..fea3c6926997 100644 --- a/drivers/media/video/hdpvr/hdpvr.h +++ b/drivers/media/video/hdpvr/hdpvr.h | |||
| @@ -113,6 +113,7 @@ struct hdpvr_device { | |||
| 113 | /* usb control transfer buffer and lock */ | 113 | /* usb control transfer buffer and lock */ |
| 114 | struct mutex usbc_mutex; | 114 | struct mutex usbc_mutex; |
| 115 | u8 *usbc_buf; | 115 | u8 *usbc_buf; |
| 116 | u8 fw_ver; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev) | 119 | static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev) |
