From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vivek Gautam Subject: [PATCH 2/2] usb; dwc3: of-simple: Add support to get resets for the device Date: Wed, 22 Feb 2017 10:54:08 +0530 Message-ID: <1487741048-24659-2-git-send-email-vivek.gautam@codeaurora.org> References: <1487741048-24659-1-git-send-email-vivek.gautam@codeaurora.org> Return-path: In-Reply-To: <1487741048-24659-1-git-send-email-vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> Sender: linux-usb-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: balbi-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org, linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Vivek Gautam List-Id: linux-arm-msm@vger.kernel.org Add support to get a list of resets available for the device. These resets must be kept de-asserted until the device is in use. Cc: Felipe Balbi Signed-off-by: Vivek Gautam --- Based on torvald's master branch. drivers/usb/dwc3/dwc3-of-simple.c | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index fe414e7a9c78..025de7342d28 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c @@ -29,13 +29,52 @@ #include #include #include +#include struct dwc3_of_simple { struct device *dev; struct clk **clks; int num_clocks; + struct reset_control **resets; + int num_resets; }; +static int dwc3_of_simple_reset_init(struct dwc3_of_simple *simple, int count) +{ + struct device *dev = simple->dev; + int i; + + simple->num_resets = count; + + if (!count) + return 0; + + simple->resets = devm_kcalloc(dev, simple->num_resets, + sizeof(struct reset_control *), GFP_KERNEL); + if (!simple->resets) + return -ENOMEM; + + for (i = 0; i < simple->num_resets; i++) { + struct reset_control *reset; + int ret; + + reset = devm_reset_control_get_by_index(dev, i); + if (IS_ERR(reset)) + return PTR_ERR(reset); + + simple->resets[i] = reset; + + ret = reset_control_deassert(reset); + if (ret) { + while (--i >= 0) + reset_control_assert(reset); + return ret; + } + } + + return 0; +} + static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count) { struct device *dev = simple->dev; @@ -100,6 +139,10 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) if (ret) return ret; + ret = dwc3_of_simple_reset_init(simple, of_reset_control_get_count(np)); + if (ret) + return ret; + ret = of_platform_populate(np, NULL, NULL, dev); if (ret) { for (i = 0; i < simple->num_clocks; i++) { @@ -107,6 +150,9 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) clk_put(simple->clks[i]); } + for (i = 0; i < simple->num_resets; i++) + reset_control_assert(simple->resets[i]); + return ret; } @@ -128,6 +174,9 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) clk_put(simple->clks[i]); } + for (i = 0; i < simple->num_resets; i++) + reset_control_assert(simple->resets[i]); + of_platform_depopulate(dev); pm_runtime_put_sync(dev); -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html