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

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

usb: gadget: renesas_usbhs: add suspend/resume support

parent 4bb99b7c
Loading
Loading
Loading
Loading
+64 −5
Original line number Original line Diff line number Diff line
@@ -203,13 +203,10 @@ static void usbhsc_power_ctrl(struct usbhs_priv *priv, int enable)
}
}


/*
/*
 *		notify hotplug
 *		hotplug
 */
 */
static void usbhsc_notify_hotplug(struct work_struct *work)
static void usbhsc_hotplug(struct usbhs_priv *priv)
{
{
	struct usbhs_priv *priv = container_of(work,
					       struct usbhs_priv,
					       notify_hotplug_work.work);
	struct platform_device *pdev = usbhs_priv_to_pdev(priv);
	struct platform_device *pdev = usbhs_priv_to_pdev(priv);
	struct usbhs_mod *mod = usbhs_mod_get_current(priv);
	struct usbhs_mod *mod = usbhs_mod_get_current(priv);
	int id;
	int id;
@@ -257,6 +254,17 @@ static void usbhsc_notify_hotplug(struct work_struct *work)
	}
	}
}
}


/*
 *		notify hotplug
 */
static void usbhsc_notify_hotplug(struct work_struct *work)
{
	struct usbhs_priv *priv = container_of(work,
					       struct usbhs_priv,
					       notify_hotplug_work.work);
	usbhsc_hotplug(priv);
}

int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev)
int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev)
{
{
	struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev);
	struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev);
@@ -443,9 +451,60 @@ static int __devexit usbhs_remove(struct platform_device *pdev)
	return 0;
	return 0;
}
}


static int usbhsc_suspend(struct device *dev)
{
	struct usbhs_priv *priv = dev_get_drvdata(dev);
	struct usbhs_mod *mod = usbhs_mod_get_current(priv);

	if (mod) {
		usbhs_mod_call(priv, stop, priv);
		usbhs_mod_change(priv, -1);
	}

	if (mod || !usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
		usbhsc_power_ctrl(priv, 0);

	return 0;
}

static int usbhsc_resume(struct device *dev)
{
	struct usbhs_priv *priv = dev_get_drvdata(dev);
	struct platform_device *pdev = usbhs_priv_to_pdev(priv);

	usbhs_platform_call(priv, phy_reset, pdev);

	if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
		usbhsc_power_ctrl(priv, 1);

	usbhsc_hotplug(priv);

	return 0;
}

static int usbhsc_runtime_nop(struct device *dev)
{
	/* Runtime PM callback shared between ->runtime_suspend()
	 * and ->runtime_resume(). Simply returns success.
	 *
	 * This driver re-initializes all registers after
	 * pm_runtime_get_sync() anyway so there is no need
	 * to save and restore registers here.
	 */
	return 0;
}

static const struct dev_pm_ops usbhsc_pm_ops = {
	.suspend		= usbhsc_suspend,
	.resume			= usbhsc_resume,
	.runtime_suspend	= usbhsc_runtime_nop,
	.runtime_resume		= usbhsc_runtime_nop,
};

static struct platform_driver renesas_usbhs_driver = {
static struct platform_driver renesas_usbhs_driver = {
	.driver		= {
	.driver		= {
		.name	= "renesas_usbhs",
		.name	= "renesas_usbhs",
		.pm	= &usbhsc_pm_ops,
	},
	},
	.probe		= usbhs_probe,
	.probe		= usbhs_probe,
	.remove		= __devexit_p(usbhs_remove),
	.remove		= __devexit_p(usbhs_remove),