linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: rogerq@ti.com (Roger Quadros)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 04/22] mfd: omap-usb-tll: Clean up clock handling
Date: Wed, 16 Jan 2013 16:43:35 +0200	[thread overview]
Message-ID: <1358347433-329-5-git-send-email-rogerq@ti.com> (raw)
In-Reply-To: <1358347433-329-1-git-send-email-rogerq@ti.com>

Every channel has a functional clock that is similarly named.
It makes sense to use a for loop to manage these clocks as OMAPs
can come with up to 3 channels.

Dynamically allocate and get channel clocks depending on the
number of clocks avaiable on the platform.

Signed-off-by: Roger Quadros <rogerq@ti.com>
---
 drivers/mfd/omap-usb-tll.c |   89 +++++++++++++++++++++++++++----------------
 1 files changed, 56 insertions(+), 33 deletions(-)

diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c
index 53ed10b..8f45322 100644
--- a/drivers/mfd/omap-usb-tll.c
+++ b/drivers/mfd/omap-usb-tll.c
@@ -96,10 +96,9 @@
 #define is_ehci_tll_mode(x)	(x == OMAP_EHCI_PORT_MODE_TLL)
 
 struct usbtll_omap {
-	struct clk				*usbtll_p1_fck;
-	struct clk				*usbtll_p2_fck;
 	int					nch;	/* num. of channels */
 	struct usbhs_omap_platform_data		*pdata;
+	struct clk				**ch_clk;
 	/* secure the register updates */
 	spinlock_t				lock;
 };
@@ -225,26 +224,12 @@ static int usbtll_omap_probe(struct platform_device *pdev)
 
 	tll->pdata = pdata;
 
-	tll->usbtll_p1_fck = clk_get(dev, "usb_tll_hs_usb_ch0_clk");
-	if (IS_ERR(tll->usbtll_p1_fck)) {
-		ret = PTR_ERR(tll->usbtll_p1_fck);
-		dev_err(dev, "usbtll_p1_fck failed error:%d\n", ret);
-		return ret;
-	}
-
-	tll->usbtll_p2_fck = clk_get(dev, "usb_tll_hs_usb_ch1_clk");
-	if (IS_ERR(tll->usbtll_p2_fck)) {
-		ret = PTR_ERR(tll->usbtll_p2_fck);
-		dev_err(dev, "usbtll_p2_fck failed error:%d\n", ret);
-		goto err_p2_fck;
-	}
-
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	base = devm_request_and_ioremap(dev, res);
 	if (!base) {
 		ret = -ENOMEM;
 		dev_err(dev, "Resource request/ioremap failed:%d\n", ret);
-		goto err_res;
+		return ret;
 	}
 
 	platform_set_drvdata(pdev, tll);
@@ -270,6 +255,32 @@ static int usbtll_omap_probe(struct platform_device *pdev)
 		break;
 	}
 
+	spin_unlock_irqrestore(&tll->lock, flags);
+
+	tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk * [tll->nch]),
+						GFP_KERNEL);
+	if (!tll->ch_clk) {
+		ret = -ENOMEM;
+		dev_err(dev, "Couldn't allocate memory for channel clocks\n");
+		goto err_clk_alloc;
+	}
+
+	spin_lock_irqsave(&tll->lock, flags);
+
+	for (i = 0; i < tll->nch; i++) {
+		char clkname[] = "usb_tll_hs_usb_chx_clk";
+		struct clk *fck;
+
+		snprintf(clkname, sizeof(clkname),
+					"usb_tll_hs_usb_ch%d_clk", i);
+		fck = clk_get(dev, clkname);
+
+		if (IS_ERR(fck))
+			dev_dbg(dev, "can't get clock : %s\n", clkname);
+		else
+			tll->ch_clk[i] = fck;
+	}
+
 	if (is_ehci_tll_mode(pdata->port_mode[0]) ||
 	    is_ehci_tll_mode(pdata->port_mode[1]) ||
 	    is_ehci_tll_mode(pdata->port_mode[2]) ||
@@ -321,11 +332,9 @@ static int usbtll_omap_probe(struct platform_device *pdev)
 
 	return 0;
 
-err_res:
-	clk_put(tll->usbtll_p2_fck);
-
-err_p2_fck:
-	clk_put(tll->usbtll_p1_fck);
+err_clk_alloc:
+	pm_runtime_put_sync(dev);
+	pm_runtime_disable(dev);
 
 	return ret;
 }
@@ -339,9 +348,11 @@ err_p2_fck:
 static int usbtll_omap_remove(struct platform_device *pdev)
 {
 	struct usbtll_omap *tll = platform_get_drvdata(pdev);
+	int i;
+
+	for (i = 0; i < tll->nch; i++)
+		clk_put(tll->ch_clk[i]);
 
-	clk_put(tll->usbtll_p2_fck);
-	clk_put(tll->usbtll_p1_fck);
 	pm_runtime_disable(&pdev->dev);
 	return 0;
 }
@@ -351,6 +362,7 @@ static int usbtll_runtime_resume(struct device *dev)
 	struct usbtll_omap			*tll = dev_get_drvdata(dev);
 	struct usbhs_omap_platform_data		*pdata = tll->pdata;
 	unsigned long				flags;
+	int i;
 
 	dev_dbg(dev, "usbtll_runtime_resume\n");
 
@@ -361,11 +373,20 @@ static int usbtll_runtime_resume(struct device *dev)
 
 	spin_lock_irqsave(&tll->lock, flags);
 
-	if (is_ehci_tll_mode(pdata->port_mode[0]))
-		clk_enable(tll->usbtll_p1_fck);
+	for (i = 0; i < tll->nch; i++) {
+		if (is_ehci_tll_mode(pdata->port_mode[i])) {
+			int r;
+
+			if (!tll->ch_clk[i])
+				continue;
 
-	if (is_ehci_tll_mode(pdata->port_mode[1]))
-		clk_enable(tll->usbtll_p2_fck);
+			r = clk_enable(tll->ch_clk[i]);
+			if (r) {
+				dev_err(dev,
+				 "Error enabling ch %d clock: %d\n", i, r);
+			}
+		}
+	}
 
 	spin_unlock_irqrestore(&tll->lock, flags);
 
@@ -377,6 +398,7 @@ static int usbtll_runtime_suspend(struct device *dev)
 	struct usbtll_omap			*tll = dev_get_drvdata(dev);
 	struct usbhs_omap_platform_data		*pdata = tll->pdata;
 	unsigned long				flags;
+	int i;
 
 	dev_dbg(dev, "usbtll_runtime_suspend\n");
 
@@ -387,11 +409,12 @@ static int usbtll_runtime_suspend(struct device *dev)
 
 	spin_lock_irqsave(&tll->lock, flags);
 
-	if (is_ehci_tll_mode(pdata->port_mode[0]))
-		clk_disable(tll->usbtll_p1_fck);
-
-	if (is_ehci_tll_mode(pdata->port_mode[1]))
-		clk_disable(tll->usbtll_p2_fck);
+	for (i = 0; i < tll->nch; i++) {
+		if (is_ehci_tll_mode(pdata->port_mode[i])) {
+			if (tll->ch_clk[i])
+				clk_disable(tll->ch_clk[i]);
+		}
+	}
 
 	spin_unlock_irqrestore(&tll->lock, flags);
 
-- 
1.7.4.1

  parent reply	other threads:[~2013-01-16 14:43 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-16 14:43 [PATCH v6 00/22] OMAP USB Host cleanup Roger Quadros
2013-01-16 14:43 ` [PATCH v6 01/22] mfd: omap-usb-host: Consolidate OMAP USB-HS platform data Roger Quadros
2013-01-16 14:43 ` [PATCH v6 02/22] mfd: omap-usb-tll: Fix channel count detection Roger Quadros
2013-01-16 14:43 ` [PATCH v6 03/22] mfd: omap-usb-tll: Use devm_kzalloc/ioremap and clean up error path Roger Quadros
2013-01-16 19:37   ` Sergei Shtylyov
2013-01-17  9:12     ` Roger Quadros
2013-01-17 10:32       ` Roger Quadros
2013-01-16 14:43 ` Roger Quadros [this message]
2013-01-16 14:55   ` [PATCH v6 04/22] mfd: omap-usb-tll: Clean up clock handling Russell King - ARM Linux
2013-01-16 15:05     ` Roger Quadros
2013-01-16 14:43 ` [PATCH v6 05/22] mfd: omap-usb-tll: introduce and use mode_needs_tll() Roger Quadros
2013-01-16 14:43 ` [PATCH v6 06/22] mfd: omap-usb-tll: Check for missing platform data in probe Roger Quadros
2013-01-16 14:43 ` [PATCH v6 07/22] mfd: omap-usb-tll: Fix error message Roger Quadros
2013-01-16 14:43 ` [PATCH v6 08/22] mfd: omap-usb-tll: serialize access to TLL device Roger Quadros
2013-01-16 14:43 ` [PATCH v6 09/22] mfd: omap-usb-tll: Add OMAP5 revision and HSIC support Roger Quadros
2013-01-16 14:43 ` [PATCH v6 10/22] mfd: omap_usb_host: Avoid missing platform data checks in suspend/resume Roger Quadros
2013-01-16 14:43 ` [PATCH v6 11/22] mfd: omap-usb-host: Use devm_kzalloc() and devm_request_and_ioremap() Roger Quadros
2013-01-16 19:34   ` Sergei Shtylyov
2013-01-16 14:43 ` [PATCH v6 12/22] mfd: omap-usb-host: know about number of ports from revision register Roger Quadros
2013-01-16 14:43 ` [PATCH v6 13/22] mfd: omap-usb-host: override number of ports from platform data Roger Quadros
2013-01-16 14:43 ` [PATCH v6 14/22] mfd: omap-usb-host: cleanup clock management code Roger Quadros
2013-01-16 14:43 ` [PATCH v6 15/22] mfd: omap-usb-host: Manage HSIC clocks for HSIC mode Roger Quadros
2013-01-16 14:43 ` [PATCH v6 16/22] mfd: omap-usb-host: Get rid of unnecessary spinlock Roger Quadros
2013-01-16 14:43 ` [PATCH v6 17/22] mfd: omap-usb-host: clean up omap_usbhs_init() Roger Quadros
2013-01-16 14:43 ` [PATCH v6 18/22] USB: ehci-omap: Don't free gpios that we didn't request Roger Quadros
2013-01-16 14:43 ` [PATCH v6 19/22] ARM: OMAP3: clock data: get rid of unused USB host clock aliases and dummies Roger Quadros
2013-01-16 14:43 ` [PATCH v6 20/22] ARM: OMAP4: clock data: get rid of unused USB host clock aliases Roger Quadros
2013-01-16 14:43 ` [PATCH v6 21/22] mfd: omap-usb-host: Don't spam console on clk_set_parent failure Roger Quadros
2013-01-16 14:43 ` [PATCH v6 22/22] mdf: omap-usb-host: get rid of build warning Roger Quadros

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1358347433-329-5-git-send-email-rogerq@ti.com \
    --to=rogerq@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).