Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ca56f09 authored by Tarun Gupta's avatar Tarun Gupta
Browse files

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: default avatarVijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: default avatarTarun Gupta <tarung@codeaurora.org>
parent 5b086fd8
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -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);

	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)
			if (ret) {
				audio->in_ep->desc = NULL;
				ERROR(cdev, "config_ep fail ep %s, result %d\n",
						audio->in_ep->name, ret);
				return ret;

	usb_ep_enable(audio->in_ep);
			}
			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");
	if (audio->audio_ep_enabled) {
		usb_ep_disable(audio->in_ep);
		audio->audio_ep_enabled = false;
	}
}

/*-------------------------------------------------------------------------*/