CHROMIUM: usb: gadget: audio_source: add .free_func callback
authorMark Kuo <mkuo@nvidia.com>
Mon, 11 Jan 2016 09:49:16 +0000 (17:49 +0800)
committerAmit Pundir <amit.pundir@linaro.org>
Thu, 7 Apr 2016 11:20:00 +0000 (16:50 +0530)
When userspace unbinds gadget functions through configfs, the
.free_func() callback is always invoked. (in config_usb_cfg_unlink())
Implement it as a no-op to avoid the following crash:

[ 68.125679] configfs-gadget gadget: unbind function 'accessory'/ffffffc0720bf000
[ 68.133202] configfs-gadget gadget: unbind function 'audio_source'/ffffffc0012ca3c0
[ 68.142668] tegra-xudc 700d0000.usb-device: ep 0 disabled
[ 68.148186] Bad mode in Synchronous Abort handler detected, code 0x86000006
[ 68.155144] CPU: 2 PID: 1 Comm: init Tainted: G    U W 3.18.0-09419-g87296c3-dirty #561
[ 68.163743] Hardware name: Google Tegra210 Smaug Rev 1,3+ (DT)
[ 68.169566] task: ffffffc0bc8d0000 ti: ffffffc0bc8bc000 task.ti: ffffffc0bc8bc000
[ 68.177039] PC is at 0x0
[ 68.179577] LR is at usb_put_function+0x14/0x1c
....

BUG=chrome-os-partner:49140
TEST="setprop sys.usb.config accessory,audio_source" on A44 and then
switch back to default: "setprop sys.usb.config mtp,adb", no crash will
be seen.

Change-Id: I5b6141964aab861e86e3afb139ded02d4d122dab
Signed-off-by: Mark Kuo <mkuo@nvidia.com>
Reviewed-on: https://chromium-review.googlesource.com/321013
Commit-Ready: Andrew Bresticker <abrestic@chromium.org>
Tested-by: Andrew Bresticker <abrestic@chromium.org>
Reviewed-by: Andrew Bresticker <abrestic@chromium.org>
drivers/usb/gadget/function/f_audio_source.c

index 39645be93502f5b2fa464581853b0cb586e00ca8..bcd817439dbf92efdc24885629a16a3de07bd261 100644 (file)
@@ -583,6 +583,11 @@ static void audio_disable(struct usb_function *f)
        usb_ep_disable(audio->in_ep);
 }
 
+static void audio_free_func(struct usb_function *f)
+{
+       /* no-op */
+}
+
 /*-------------------------------------------------------------------------*/
 
 static void audio_build_desc(struct audio_dev *audio)
@@ -827,6 +832,7 @@ static struct audio_dev _audio_dev = {
                .set_alt = audio_set_alt,
                .setup = audio_setup,
                .disable = audio_disable,
+               .free_func = audio_free_func,
        },
        .lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock),
        .idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs),