On Thursday 31 January 2013 01:13 PM, Sascha Hauer wrote:
On Thu, Jan 31, 2013 at 11:44:21AM +0530, kishon wrote:
Hi,
On Wednesday 30 January 2013 08:59 PM, Sascha Hauer wrote:
From: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>
This adds two little devicetree helper functions for determining the
dr_mode (host, peripheral, otg) and phy_type (utmi, ulpi,...) from
the devicetree.
Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>
Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>
---
drivers/usb/usb-common.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++
include/linux/usb/of.h | 27 ++++++++++++++++++
include/linux/usb/otg.h | 7 +++++
include/linux/usb/phy.h | 9 ++++++
4 files changed, 112 insertions(+)
create mode 100644 include/linux/usb/of.h
diff --git a/drivers/usb/usb-common.c b/drivers/usb/usb-common.c
index d29503e..1c0292c 100644
--- a/drivers/usb/usb-common.c
+++ b/drivers/usb/usb-common.c
@@ -14,6 +14,9 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/usb/ch9.h>
+#include <linux/of.h>
+#include <linux/usb/of.h>
+#include <linux/usb/otg.h>
const char *usb_speed_string(enum usb_device_speed speed)
{
@@ -32,4 +35,70 @@ const char *usb_speed_string(enum usb_device_speed speed)
}
EXPORT_SYMBOL_GPL(usb_speed_string);
+#ifdef CONFIG_OF
+static const char *usb_dr_modes[] = {
+ [USB_DR_MODE_UNKNOWN] = "",
+ [USB_DR_MODE_HOST] = "host",
+ [USB_DR_MODE_PERIPHERAL] = "peripheral",
+ [USB_DR_MODE_OTG] = "otg",
+};
+
+/**
+ * of_usb_get_dr_mode - Get dual role mode for given device_node
+ * @np: Pointer to the given device_node
+ *
+ * The function gets phy interface string from property 'dr_mode',
+ * and returns the correspondig enum usb_phy_dr_mode
+ */
+enum usb_phy_dr_mode of_usb_get_dr_mode(struct device_node *np)
+{
+ const char *dr_mode;
+ int err, i;
+
+ err = of_property_read_string(np, "dr_mode", &dr_mode);
+ if (err < 0)
+ return USB_DR_MODE_UNKNOWN;
+
+ for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++)
+ if (!strcasecmp(dr_mode, usb_dr_modes[i]))
+ return i;
+
+ return USB_DR_MODE_UNKNOWN;
+}
+EXPORT_SYMBOL_GPL(of_usb_get_dr_mode);
+
+static const char *usbphy_modes[] = {
+ [USBPHY_INTERFACE_MODE_NA] = "",
+ [USBPHY_INTERFACE_MODE_UTMI] = "utmi",
+ [USBPHY_INTERFACE_MODE_UTMIW] = "utmi_wide",
+ [USBPHY_INTERFACE_MODE_ULPI] = "ulpi",
+ [USBPHY_INTERFACE_MODE_SERIAL] = "serial",
+ [USBPHY_INTERFACE_MODE_HSIC] = "hsic",
+};
+
+/**
+ * of_get_usbphy_mode - Get phy mode for given device_node
%s/of_get_usbphy_mode/of_usb_get_phy_mode
+ * @np: Pointer to the given device_node
+ *
+ * The function gets phy interface string from property 'phy_type',
+ * and returns the correspondig enum usb_phy_interface
+ */
+enum usb_phy_interface of_usb_get_phy_mode(struct device_node *np)
+{
You agreed to move this function inside usb/phy.. no?
Yes, I did, but as mentioned in the introduction mail, the chipidea
driver has to determine the phy type even when phy support (aka
CONFIG_USB_OTG_UTILS) is disabled, so I can't put it in phy/phy.c.
I could add a phy/of.c though. Would that be better?
Yes. I think that would be better.
Thanks
Kishon
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html