From bec599e5a0a78583bed8f79a744542d5220e9061 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 27 May 2013 16:01:59 +0200 Subject: [PATCH] usb: Add devicetree helpers Add helpers to get the dr_mode and the phy_mode. Signed-off-by: Sascha Hauer --- drivers/usb/core/Makefile | 1 + drivers/usb/core/of.c | 91 +++++++++++++++++++++++++++++++++++++++ include/usb/usb.h | 21 +++++++++ 3 files changed, 113 insertions(+) create mode 100644 drivers/usb/core/of.c diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile index d49c68dba..368fb5680 100644 --- a/drivers/usb/core/Makefile +++ b/drivers/usb/core/Makefile @@ -1,2 +1,3 @@ obj-y += usb.o +obj-$(CONFIG_OFDEVICE) += of.o diff --git a/drivers/usb/core/of.c b/drivers/usb/core/of.c new file mode 100644 index 000000000..222b7600c --- /dev/null +++ b/drivers/usb/core/of.c @@ -0,0 +1,91 @@ +/* + * usb devicetree helper functions + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include + +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_dr_mode + */ +enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np, + const char *propname) +{ + const char *dr_mode; + int err, i; + + if (!propname) + propname = "barebox,dr_mode"; + + err = of_property_read_string(np, propname, &dr_mode); + if (err < 0) + return USB_DR_MODE_UNKNOWN; + + for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++) + if (!strcmp(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_UNKNOWN] = "", + [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_usb_get_phy_mode - Get phy mode for given device_node + * @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, + const char *propname) +{ + const char *phy_type; + int err, i; + + if (!propname) + propname = "barebox,phy_type"; + + err = of_property_read_string(np, propname, &phy_type); + if (err < 0) + return USBPHY_INTERFACE_MODE_UNKNOWN; + + for (i = 0; i < ARRAY_SIZE(usbphy_modes); i++) + if (!strcmp(phy_type, usbphy_modes[i])) + return i; + + return USBPHY_INTERFACE_MODE_UNKNOWN; +} +EXPORT_SYMBOL_GPL(of_usb_get_phy_mode); diff --git a/include/usb/usb.h b/include/usb/usb.h index b2700127f..da0090e03 100644 --- a/include/usb/usb.h +++ b/include/usb/usb.h @@ -519,4 +519,25 @@ struct usb_device_id { #endif /* DOXYGEN_SHOULD_SKIP_THIS */ +enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np, + const char *propname); + +enum usb_dr_mode { + USB_DR_MODE_UNKNOWN, + USB_DR_MODE_HOST, + USB_DR_MODE_PERIPHERAL, + USB_DR_MODE_OTG, +}; + +enum usb_phy_interface of_usb_get_phy_mode(struct device_node *np, + const char *propname); + +enum usb_phy_interface { + USBPHY_INTERFACE_MODE_UNKNOWN, + USBPHY_INTERFACE_MODE_UTMI, + USBPHY_INTERFACE_MODE_UTMIW, + USBPHY_INTERFACE_MODE_ULPI, + USBPHY_INTERFACE_MODE_SERIAL, + USBPHY_INTERFACE_MODE_HSIC, +}; #endif /*_USB_H_ */