linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: chao.xie@marvell.com (Chao Xie)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCh V10 01/12] usb: phy: protect phy init and shutdown for mutiple deivces
Date: Mon, 13 May 2013 01:51:32 -0400	[thread overview]
Message-ID: <1368424303-10629-2-git-send-email-chao.xie@marvell.com> (raw)
In-Reply-To: <1368424303-10629-1-git-send-email-chao.xie@marvell.com>

Some USB devices will share same phy, so make the ->init
and ->shutdown to be protected.
Only first device will initialize the phy, and only last device
can shutdown phy.

Signed-off-by: Chao Xie <chao.xie@marvell.com>
---
 drivers/usb/phy/phy.c   |    6 ++++++
 include/linux/usb/phy.h |   22 ++++++++++++++++++----
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c
index a9984c7..97dd396 100644
--- a/drivers/usb/phy/phy.c
+++ b/drivers/usb/phy/phy.c
@@ -329,6 +329,9 @@ int usb_add_phy(struct usb_phy *x, enum usb_phy_type type)
 		return -EINVAL;
 	}
 
+	mutex_init(&x->phy_mutex);
+	x->refcount = 0;
+
 	spin_lock_irqsave(&phy_lock, flags);
 
 	list_for_each_entry(phy, &phy_list, head) {
@@ -367,6 +370,9 @@ int usb_add_phy_dev(struct usb_phy *x)
 		return -EINVAL;
 	}
 
+	mutex_init(&x->phy_mutex);
+	x->refcount = 0;
+
 	spin_lock_irqsave(&phy_lock, flags);
 	list_for_each_entry(phy_bind, &phy_bind_list, list)
 		if (!(strcmp(phy_bind->phy_dev_name, dev_name(x->dev))))
diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
index 6b5978f..b645520 100644
--- a/include/linux/usb/phy.h
+++ b/include/linux/usb/phy.h
@@ -87,6 +87,14 @@ struct usb_phy {
 	/* to support controllers that have multiple transceivers */
 	struct list_head	head;
 
+	/*
+	 * PHY may be shared by multiple devices.
+	 * Being protected by phy_mutex and refcount, PHY is initialized
+	 * or shut down only once.
+	 */
+	struct mutex		phy_mutex;
+	unsigned int		refcount;
+
 	/* initialize/shutdown the OTG controller */
 	int	(*init)(struct usb_phy *x);
 	void	(*shutdown)(struct usb_phy *x);
@@ -150,17 +158,23 @@ static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
 static inline int
 usb_phy_init(struct usb_phy *x)
 {
-	if (x->init)
-		return x->init(x);
+	int ret = 0;
 
-	return 0;
+	mutex_lock(&x->phy_mutex);
+	if (x->refcount++ == 0 && x->init)
+		ret = x->init(x);
+	mutex_unlock(&x->phy_mutex);
+
+	return ret;
 }
 
 static inline void
 usb_phy_shutdown(struct usb_phy *x)
 {
-	if (x->shutdown)
+	mutex_lock(&x->phy_mutex);
+	if (--x->refcount == 0 && x->shutdown)
 		x->shutdown(x);
+	mutex_unlock(&x->phy_mutex);
 }
 
 static inline int
-- 
1.7.4.1

  reply	other threads:[~2013-05-13  5:51 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-13  5:51 [V9 PATCH 00/12] mv-usb phy driver Chao Xie
2013-05-13  5:51 ` Chao Xie [this message]
2013-05-13  5:51 ` [PATCh V10 02/12] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller Chao Xie
2013-05-13  5:51 ` [PATCh V10 03/12] usb: gadget: mv_udc: use PHY driver for udc Chao Xie
2013-05-13  5:51 ` [PATCh V10 04/12] usb: ehci: ehci-mv: use PHY driver for ehci Chao Xie
2013-05-13 14:13   ` Alan Stern
2013-05-28 16:24     ` Felipe Balbi
2013-05-29  3:58       ` Chao Xie
2013-05-29 17:37         ` Felipe Balbi
2013-05-30 11:45           ` Roger Quadros
2013-05-30 14:23             ` Alan Stern
2013-06-13  2:45               ` Chao Xie
2013-06-13 15:08                 ` Alan Stern
2013-06-14  1:31                   ` Chao Xie
2013-06-14  1:55                     ` Chao Xie
2013-06-15  2:24                       ` Alan Stern
2013-06-14  9:07                   ` Roger Quadros
2013-06-14 20:01                     ` Alan Stern
2013-06-17  6:12                       ` Chao Xie
2013-06-17 14:01                         ` Alan Stern
2013-06-17  8:17                       ` Roger Quadros
2013-05-13  5:51 ` [PATCh V10 05/12] usb: phy: phy-mv-usb: use USB2 PHY driver for otg Chao Xie
2013-05-13  5:51 ` [PATCh V10 06/12] usb: mv_u3d: usb phy drivers for phy operation Chao Xie
2013-05-13  5:51 ` [PATCh V10 07/12] arm: mmp2: change the defintion of usb devices Chao Xie
2013-05-13  5:51 ` [PATCh V10 08/12] arm: pxa910: " Chao Xie
2013-05-13  5:51 ` [PATCh V10 09/12] arm: ttc_dkb: modify usb support Chao Xie
2013-05-13  5:51 ` [PATCh V10 10/12] arm: mmp: remove unused usb devices Chao Xie
2013-05-13  5:51 ` [PATCh V10 11/12] arm: brownstone: add usb support for the board Chao Xie
2013-05-13  5:51 ` [PATCh V10 12/12] usb: mv_usb: remove the phy callbacks in pdata Chao Xie

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=1368424303-10629-2-git-send-email-chao.xie@marvell.com \
    --to=chao.xie@marvell.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).