| From fb91bde9d3664dd879655f3a1013c0b5728e7a09 Mon Sep 17 00:00:00 2001 |
| From: Frank Schaefer <fschaefer.oss@googlemail.com> |
| Date: Fri, 27 Dec 2013 00:16:13 -0300 |
| Subject: media: em28xx: check if a device has audio earlier" |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Frank Schaefer <fschaefer.oss@googlemail.com> |
| |
| commit fb91bde9d3664dd879655f3a1013c0b5728e7a09 upstream. |
| |
| GIT_AUTHOR_DATE=1409603039 |
| This reverts |
| |
| commit b99f0aadd33fad269c8e62b5bec8b5c012a44a56 |
| Author: Mauro Carvalho Chehab <m.chehab@samsung.com> |
| |
| [media] em28xx: check if a device has audio earlier |
| |
| Better to split chipset detection from the audio setup. So, move the |
| detection code to em28xx_init_dev(). |
| |
| It broke analog audio of the Hauppauge winTV HVR 900 and very likely many other |
| em28xx devices. |
| |
| Background: |
| The local variable has_audio in em28xx_usb_probe() describes if the currently |
| probed _usb_interface_ has an audio endpoint, while dev->audio_mode.has_audio |
| means that the _device_ as a whole provides analog audio. |
| Hence it is wrong to set dev->audio_mode.has_audio = has_audio in em28xx_usb_probe(). |
| As result, audio support is no longer detected and configured on devices which |
| have the audio endpoint on a separate interface, because em28xx_audio_setup() |
| bails out immediately at the beginning. |
| |
| Revert the faulty commit to restore the old audio detection procedure, which checks |
| the chip configuration register to determine if the device has analog audio. |
| |
| Cc: <stable@vger.kernel.org> # 3.14 to 3.16 |
| Reported-by: Oravecz Csaba <oravecz@nytud.mta.hu> |
| Tested-by: Oravecz Csaba <oravecz@nytud.mta.hu> |
| Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/usb/em28xx/em28xx-cards.c | 11 ----------- |
| drivers/media/usb/em28xx/em28xx-core.c | 12 +++++++++++- |
| 2 files changed, 11 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/media/usb/em28xx/em28xx-cards.c |
| +++ b/drivers/media/usb/em28xx/em28xx-cards.c |
| @@ -3098,16 +3098,6 @@ static int em28xx_init_dev(struct em28xx |
| } |
| } |
| |
| - if (dev->chip_id == CHIP_ID_EM2870 || |
| - dev->chip_id == CHIP_ID_EM2874 || |
| - dev->chip_id == CHIP_ID_EM28174 || |
| - dev->chip_id == CHIP_ID_EM28178) { |
| - /* Digital only device - don't load any alsa module */ |
| - dev->audio_mode.has_audio = false; |
| - dev->has_audio_class = false; |
| - dev->has_alsa_audio = false; |
| - } |
| - |
| if (chip_name != default_chip_name) |
| printk(KERN_INFO DRIVER_NAME |
| ": chip ID is %s\n", chip_name); |
| @@ -3377,7 +3367,6 @@ static int em28xx_usb_probe(struct usb_i |
| dev->alt = -1; |
| dev->is_audio_only = has_audio && !(has_video || has_dvb); |
| dev->has_alsa_audio = has_audio; |
| - dev->audio_mode.has_audio = has_audio; |
| dev->has_video = has_video; |
| dev->ifnum = ifnum; |
| |
| --- a/drivers/media/usb/em28xx/em28xx-core.c |
| +++ b/drivers/media/usb/em28xx/em28xx-core.c |
| @@ -506,8 +506,18 @@ int em28xx_audio_setup(struct em28xx *de |
| int vid1, vid2, feat, cfg; |
| u32 vid; |
| |
| - if (!dev->audio_mode.has_audio) |
| + if (dev->chip_id == CHIP_ID_EM2870 || |
| + dev->chip_id == CHIP_ID_EM2874 || |
| + dev->chip_id == CHIP_ID_EM28174 || |
| + dev->chip_id == CHIP_ID_EM28178) { |
| + /* Digital only device - don't load any alsa module */ |
| + dev->audio_mode.has_audio = false; |
| + dev->has_audio_class = false; |
| + dev->has_alsa_audio = false; |
| return 0; |
| + } |
| + |
| + dev->audio_mode.has_audio = true; |
| |
| /* See how this device is configured */ |
| cfg = em28xx_read_reg(dev, EM28XX_R00_CHIPCFG); |