diff options
| author | Tarun Gupta <tarung@codeaurora.org> | 2015-07-24 12:44:02 +0530 |
|---|---|---|
| committer | Tarun Gupta <tarung@codeaurora.org> | 2015-07-24 12:44:02 +0530 |
| commit | 7ca56f09d1a53d2d0a960a8ac34d7e36742fad8e (patch) | |
| tree | 38984b8a5e864e823227d837d14804936539cb94 /drivers/usb/gadget/function/f_audio_source.c | |
| parent | 5b086fd8e3bf7c7a55ebc097c7f4e6738dd316be (diff) | |
USB: f_audio_source: Enable audio endpoint for alternate setting one
audio_source driver is having two interfaces and also audio streaming
interface supports alternate settings. Only alternate setting one has
endpoint. But other two interfaces have no endpoints. Hence endpoint is
required to enable for only alternate setting one. But currently driver
is enabling endpoint whenever set_alt callback is called. Due to this,
enable endpoint will be called multiple times which causes exception.
Fix this by enabling endpoint only for alternate setting one.
Change-Id: Ib5910bf663f250250e8355bbdd746116e890f6d0
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: Tarun Gupta <tarung@codeaurora.org>
Diffstat (limited to 'drivers/usb/gadget/function/f_audio_source.c')
| -rw-r--r-- | drivers/usb/gadget/function/f_audio_source.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/drivers/usb/gadget/function/f_audio_source.c b/drivers/usb/gadget/function/f_audio_source.c index 8b83d11e7fb..47eccd06c0a 100644 --- a/drivers/usb/gadget/function/f_audio_source.c +++ b/drivers/usb/gadget/function/f_audio_source.c @@ -270,6 +270,7 @@ struct audio_dev { /* number of frames sent since start_time */ s64 frames_sent; struct audio_source_config *config; + bool audio_ep_enabled; }; static inline struct audio_dev *func_to_audio(struct usb_function *f) @@ -590,11 +591,27 @@ static int audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt) pr_debug("audio_set_alt intf %d, alt %d\n", intf, alt); - ret = config_ep_by_speed(cdev->gadget, f, audio->in_ep); - if (ret) - return ret; - - usb_ep_enable(audio->in_ep); + if (intf == as_interface_alt_1_desc.bInterfaceNumber) { + if (alt && !audio->audio_ep_enabled) { + ret = config_ep_by_speed(cdev->gadget, f, audio->in_ep); + if (ret) { + audio->in_ep->desc = NULL; + ERROR(cdev, "config_ep fail ep %s, result %d\n", + audio->in_ep->name, ret); + return ret; + } + ret = usb_ep_enable(audio->in_ep); + if (ret) { + ERROR(cdev, "failedto enable ep%s, result %d\n", + audio->in_ep->name, ret); + return ret; + } + audio->audio_ep_enabled = true; + } else if (!alt && audio->audio_ep_enabled) { + usb_ep_disable(audio->in_ep); + audio->audio_ep_enabled = false; + } + } return 0; } @@ -603,7 +620,10 @@ static void audio_disable(struct usb_function *f) struct audio_dev *audio = func_to_audio(f); pr_debug("audio_disable\n"); - usb_ep_disable(audio->in_ep); + if (audio->audio_ep_enabled) { + usb_ep_disable(audio->in_ep); + audio->audio_ep_enabled = false; + } } /*-------------------------------------------------------------------------*/ |
