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

Commit b1930da0 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Felipe Balbi
Browse files

usb: renesas_usbhs: add usbhsh_is_running()



It is possible to judge whether renesas_usbhs driver is running,
by checking attch irq mask.
This patch adds usbhsh_is_running() to check it.

Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 31e00fd1
Loading
Loading
Loading
Loading
+32 −0
Original line number Original line Diff line number Diff line
@@ -190,6 +190,21 @@ static void usbhsh_ureq_free(struct usbhsh_hpriv *hpriv,
	kfree(ureq);
	kfree(ureq);
}
}


/*
 *		status
 */
static int usbhsh_is_running(struct usbhsh_hpriv *hpriv)
{
	/*
	 * we can decide some device is attached or not
	 * by checking mod.irq_attch
	 * see
	 *	usbhsh_irq_attch()
	 *	usbhsh_irq_dtch()
	 */
	return (hpriv->mod.irq_attch == NULL);
}

/*
/*
 *		pipe control
 *		pipe control
 */
 */
@@ -900,6 +915,11 @@ static int usbhsh_urb_enqueue(struct usb_hcd *hcd,


	dev_dbg(dev, "%s (%s)\n", __func__, is_dir_in ? "in" : "out");
	dev_dbg(dev, "%s (%s)\n", __func__, is_dir_in ? "in" : "out");


	if (!usbhsh_is_running(hpriv)) {
		ret = -EIO;
		goto usbhsh_urb_enqueue_error_not_linked;
	}

	ret = usb_hcd_link_urb_to_ep(hcd, urb);
	ret = usb_hcd_link_urb_to_ep(hcd, urb);
	if (ret)
	if (ret)
		goto usbhsh_urb_enqueue_error_not_linked;
		goto usbhsh_urb_enqueue_error_not_linked;
@@ -1249,6 +1269,12 @@ static int usbhsh_irq_attch(struct usbhs_priv *priv,
	 * attch interrupt might happen infinitely on some device
	 * attch interrupt might happen infinitely on some device
	 * (on self power USB hub ?)
	 * (on self power USB hub ?)
	 * disable it here.
	 * disable it here.
	 *
	 * usbhsh_is_running() becomes effective
	 * according to this process.
	 * see
	 *	usbhsh_is_running()
	 *	usbhsh_urb_enqueue()
	 */
	 */
	hpriv->mod.irq_attch = NULL;
	hpriv->mod.irq_attch = NULL;
	usbhs_irq_callback_update(priv, &hpriv->mod);
	usbhs_irq_callback_update(priv, &hpriv->mod);
@@ -1269,6 +1295,12 @@ static int usbhsh_irq_dtch(struct usbhs_priv *priv,


	/*
	/*
	 * enable attch interrupt again
	 * enable attch interrupt again
	 *
	 * usbhsh_is_running() becomes invalid
	 * according to this process.
	 * see
	 *	usbhsh_is_running()
	 *	usbhsh_urb_enqueue()
	 */
	 */
	hpriv->mod.irq_attch = usbhsh_irq_attch;
	hpriv->mod.irq_attch = usbhsh_irq_attch;
	usbhs_irq_callback_update(priv, &hpriv->mod);
	usbhs_irq_callback_update(priv, &hpriv->mod);