From: Kishon Vijay Abraham I <kishon@ti.com>
To: <devicetree-discuss@lists.ozlabs.org>,
<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-omap@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-usb@vger.kernel.org>, <linux-sh@vger.kernel.org>,
<linuxppc-dev@lists.ozlabs.org>, <balbi@ti.com>
Cc: linux@arm.linux.org.uk, b-cousson@ti.com, tony@atomide.com,
gregkh@linuxfoundation.org, rob.herring@calxeda.com,
kishon@ti.com, cbou@mail.ru, alexander.shishkin@linux.intel.com,
horms@verge.net.au, stern@rowland.harvard.edu,
haojian.zhuang@gmail.com, rob@landley.net, eric.y.miao@gmail.com,
Marc Kleine-Budde <mkl@pengutronix.de>,
dwmw2@infradead.org
Subject: [RFC PATCH 5/6] usb: otg: add device tree support to otg library
Date: Wed, 16 Jan 2013 20:31:01 +0530 [thread overview]
Message-ID: <1358348462-27693-6-git-send-email-kishon@ti.com> (raw)
In-Reply-To: <1358348462-27693-1-git-send-email-kishon@ti.com>
Added an API devm_usb_get_phy_by_phandle(), to get usb phy by passing a
device node phandle value. This function will return a pointer to
the phy on success, -EPROBE_DEFER if there is a device_node for the phandle,
but the phy has not been added, or a ERR_PTR() otherwise.
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/usb/otg/otg.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++
include/linux/usb/phy.h | 8 +++++
2 files changed, 85 insertions(+)
diff --git a/drivers/usb/otg/otg.c b/drivers/usb/otg/otg.c
index dbf2043..e9799bb 100644
--- a/drivers/usb/otg/otg.c
+++ b/drivers/usb/otg/otg.c
@@ -13,7 +13,9 @@
#include <linux/export.h>
#include <linux/err.h>
#include <linux/device.h>
+#include <linux/module.h>
#include <linux/slab.h>
+#include <linux/of.h>
#include <linux/usb/otg.h>
@@ -34,6 +36,20 @@ static struct usb_phy *__usb_find_phy(struct device *dev, u8 index)
return ERR_PTR(-ENODEV);
}
+static struct usb_phy *__of_usb_find_phy(struct device_node *node)
+{
+ struct usb_phy *phy;
+
+ list_for_each_entry(phy, &phy_list, head) {
+ if (node != phy->dev->of_node)
+ continue;
+
+ return phy;
+ }
+
+ return ERR_PTR(-ENODEV);
+}
+
static void devm_usb_phy_release(struct device *dev, void *res)
{
struct usb_phy *phy = *(struct usb_phy **)res;
@@ -109,6 +125,67 @@ err0:
}
EXPORT_SYMBOL(usb_get_phy);
+ /**
+ * devm_usb_get_phy_by_phandle - find the USB PHY by phandle
+ * @dev - device that requests this phy
+ * @phandle - name of the property holding the phy phandle value
+ * @index - the index of the phy
+ *
+ * Returns the phy driver associated with the given phandle value,
+ * after getting a refcount to it, -ENODEV if there is no such phy or
+ * -EPROBE_DEFER if there is a phandle to the phy, but the device is
+ * not yet loaded. While at that, it also associates the device with
+ * the phy using devres. On driver detach, release function is invoked
+ * on the devres data, then, devres data is freed.
+ *
+ * For use by USB host and peripheral drivers.
+ */
+struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
+ const char *phandle, u8 index)
+{
+ struct usb_phy *phy = NULL, **ptr;
+ unsigned long flags;
+ struct device_node *node;
+
+ if (!dev->of_node) {
+ dev_dbg(dev, "device does not have a device node entry\n");
+ return ERR_PTR(-EINVAL);
+ }
+
+ node = of_parse_phandle(dev->of_node, phandle, index);
+ if (!node) {
+ dev_dbg(dev, "failed to get %s phandle in %s node\n", phandle,
+ dev->of_node->full_name);
+ return ERR_PTR(-ENODEV);
+ }
+
+ ptr = devres_alloc(devm_usb_phy_release, sizeof(*ptr), GFP_KERNEL);
+ if (!ptr) {
+ dev_dbg(dev, "failed to allocate memory for devres\n");
+ return ERR_PTR(-ENOMEM);
+ }
+
+ spin_lock_irqsave(&phy_lock, flags);
+
+ phy = __of_usb_find_phy(node);
+ if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) {
+ phy = ERR_PTR(-EPROBE_DEFER);
+ devres_free(ptr);
+ goto err0;
+ }
+
+ *ptr = phy;
+ devres_add(dev, ptr);
+
+ get_device(phy->dev);
+
+err0:
+ spin_unlock_irqrestore(&phy_lock, flags);
+
+ return phy;
+}
+EXPORT_SYMBOL(devm_usb_get_phy_by_phandle);
+
/**
* devm_usb_put_phy - release the USB PHY
* @dev - device that wants to release this phy
diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
index d133c8b..5836b6d 100644
--- a/include/linux/usb/phy.h
+++ b/include/linux/usb/phy.h
@@ -163,6 +163,8 @@ usb_phy_shutdown(struct usb_phy *x)
#ifdef CONFIG_USB_OTG_UTILS
extern struct usb_phy *usb_get_phy(struct device *dev, u8 index);
extern struct usb_phy *devm_usb_get_phy(struct device *dev, u8 index);
+extern struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
+ const char *phandle, u8 index);
extern void usb_put_phy(struct usb_phy *);
extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
extern struct usb_phy_bind *usb_bind_phy(const char *dev_name, u8 index,
@@ -178,6 +180,12 @@ static inline struct usb_phy *devm_usb_get_phy(struct device *dev, u8 index)
return NULL;
}
+static inline struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
+ const char *phandle, u8 index)
+{
+ return NULL;
+}
+
static inline void usb_put_phy(struct usb_phy *x)
{
}
--
1.7.9.5
next prev parent reply other threads:[~2013-01-16 15:01 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-16 15:00 [RFC PATCH 0/6] USB: Add multiple PHYs of same type Kishon Vijay Abraham I
2013-01-16 15:00 ` [RFC PATCH 1/6] usb: otg: Add an API to bind the USB controller and PHY Kishon Vijay Abraham I
2013-01-17 9:37 ` Roger Quadros
2013-01-17 11:14 ` kishon
2013-01-18 11:48 ` Felipe Balbi
2013-01-16 15:00 ` [RFC PATCH 2/6] ARM: OMAP: USB: Add phy binding information Kishon Vijay Abraham I
2013-01-17 9:39 ` Roger Quadros
2013-01-17 11:03 ` kishon
2013-01-17 12:11 ` Vivek Gautam
2013-01-17 12:31 ` kishon
2013-01-17 13:11 ` Vivek Gautam
2013-01-16 15:00 ` [RFC PATCH 3/6] usb: otg: utils: change the phy lib to support multiple PHYs of same type Kishon Vijay Abraham I
2013-01-17 0:31 ` Simon Horman
2013-01-17 16:07 ` Roger Quadros
2013-01-18 5:28 ` kishon
2013-01-16 15:01 ` [RFC PATCH 4/6] ARM: dts: OMAP: Add phandle to bind PHY with USB controller Kishon Vijay Abraham I
2013-01-16 15:01 ` Kishon Vijay Abraham I [this message]
2013-01-21 13:21 ` [RFC PATCH 5/6] usb: otg: add device tree support to otg library Roger Quadros
2013-01-21 13:34 ` kishon
2013-01-21 14:23 ` Roger Quadros
2013-01-16 15:01 ` [RFC PATCH 6/6] USB: MUSB: OMAP: get PHY by phandle for dt boot Kishon Vijay Abraham I
2013-01-21 13:18 ` Roger Quadros
2013-01-21 13:41 ` kishon
2013-01-21 14:24 ` Roger Quadros
2013-01-18 11:48 ` [RFC PATCH 0/6] USB: Add multiple PHYs of same type Felipe Balbi
2013-01-18 11:54 ` kishon
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=1358348462-27693-6-git-send-email-kishon@ti.com \
--to=kishon@ti.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=b-cousson@ti.com \
--cc=balbi@ti.com \
--cc=cbou@mail.ru \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=dwmw2@infradead.org \
--cc=eric.y.miao@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=haojian.zhuang@gmail.com \
--cc=horms@verge.net.au \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mkl@pengutronix.de \
--cc=rob.herring@calxeda.com \
--cc=rob@landley.net \
--cc=stern@rowland.harvard.edu \
--cc=tony@atomide.com \
/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).