As otg.h is containing lots of phy interface related
stuff, moving all phy interface related stuff to new
file named phy.h
Signed-off-by: Venu Byravarasu <[email protected]>
---
include/linux/usb/otg.h | 211 +--------------------------------------------
include/linux/usb/phy.h | 222 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 223 insertions(+), 210 deletions(-)
create mode 100644 include/linux/usb/phy.h
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 45824be..ccd3511 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -10,6 +10,7 @@
#define __LINUX_USB_OTG_H
#include <linux/notifier.h>
+#include <linux/usb/phy.h>
/* OTG defines lots of enumeration states before device reset */
enum usb_otg_state {
@@ -35,31 +36,6 @@ enum usb_otg_state {
OTG_STATE_A_VBUS_ERR,
};
-enum usb_phy_events {
- USB_EVENT_NONE, /* no events or cable disconnected */
- USB_EVENT_VBUS, /* vbus valid event */
- USB_EVENT_ID, /* id was grounded */
- USB_EVENT_CHARGER, /* usb dedicated charger */
- USB_EVENT_ENUMERATED, /* gadget driver enumerated */
-};
-
-/* associate a type with PHY */
-enum usb_phy_type {
- USB_PHY_TYPE_UNDEFINED,
- USB_PHY_TYPE_USB2,
- USB_PHY_TYPE_USB3,
-};
-
-struct usb_phy;
-
-/* for transceivers connected thru an ULPI interface, the user must
- * provide access ops
- */
-struct usb_phy_io_ops {
- int (*read)(struct usb_phy *x, u32 reg);
- int (*write)(struct usb_phy *x, u32 val, u32 reg);
-};
-
struct usb_otg {
u8 default_a;
@@ -85,134 +61,9 @@ struct usb_otg {
};
-/*
- * the otg driver needs to interact with both device side and host side
- * usb controllers. it decides which controller is active at a given
- * moment, using the transceiver, ID signal, HNP and sometimes static
- * configuration information (including "board isn't wired for otg").
- */
-struct usb_phy {
- struct device *dev;
- const char *label;
- unsigned int flags;
-
- enum usb_phy_type type;
- enum usb_otg_state state;
- enum usb_phy_events last_event;
-
- struct usb_otg *otg;
-
- struct device *io_dev;
- struct usb_phy_io_ops *io_ops;
- void __iomem *io_priv;
-
- /* for notification of usb_phy_events */
- struct atomic_notifier_head notifier;
-
- /* to pass extra port status to the root hub */
- u16 port_status;
- u16 port_change;
-
- /* to support controllers that have multiple transceivers */
- struct list_head head;
-
- /* initialize/shutdown the OTG controller */
- int (*init)(struct usb_phy *x);
- void (*shutdown)(struct usb_phy *x);
-
- /* effective for B devices, ignored for A-peripheral */
- int (*set_power)(struct usb_phy *x,
- unsigned mA);
-
- /* for non-OTG B devices: set transceiver into suspend mode */
- int (*set_suspend)(struct usb_phy *x,
- int suspend);
-
- /* notify phy connect status change */
- int (*notify_connect)(struct usb_phy *x, int port);
- int (*notify_disconnect)(struct usb_phy *x, int port);
-};
-
-
-/* for board-specific init logic */
-extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
-extern void usb_remove_phy(struct usb_phy *);
-
-#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
-/* sometimes transceivers are accessed only through e.g. ULPI */
-extern void usb_nop_xceiv_register(void);
-extern void usb_nop_xceiv_unregister(void);
-#else
-static inline void usb_nop_xceiv_register(void)
-{
-}
-
-static inline void usb_nop_xceiv_unregister(void)
-{
-}
-#endif
-
-/* helpers for direct access thru low-level io interface */
-static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
-{
- if (x->io_ops && x->io_ops->read)
- return x->io_ops->read(x, reg);
-
- return -EINVAL;
-}
-
-static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
-{
- if (x->io_ops && x->io_ops->write)
- return x->io_ops->write(x, val, reg);
-
- return -EINVAL;
-}
-
-static inline int
-usb_phy_init(struct usb_phy *x)
-{
- if (x->init)
- return x->init(x);
-
- return 0;
-}
-
-static inline void
-usb_phy_shutdown(struct usb_phy *x)
-{
- if (x->shutdown)
- x->shutdown(x);
-}
-
-/* for usb host and peripheral controller drivers */
#ifdef CONFIG_USB_OTG_UTILS
-extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
-extern struct usb_phy *devm_usb_get_phy(struct device *dev,
- enum usb_phy_type type);
-extern void usb_put_phy(struct usb_phy *);
-extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
extern const char *otg_state_string(enum usb_otg_state state);
#else
-static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
-{
- return NULL;
-}
-
-static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
- enum usb_phy_type type)
-{
- return NULL;
-}
-
-static inline void usb_put_phy(struct usb_phy *x)
-{
-}
-
-static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
-{
-}
-
static inline const char *otg_state_string(enum usb_otg_state state)
{
return NULL;
@@ -262,42 +113,6 @@ otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
}
static inline int
-usb_phy_set_power(struct usb_phy *x, unsigned mA)
-{
- if (x && x->set_power)
- return x->set_power(x, mA);
- return 0;
-}
-
-/* Context: can sleep */
-static inline int
-usb_phy_set_suspend(struct usb_phy *x, int suspend)
-{
- if (x->set_suspend != NULL)
- return x->set_suspend(x, suspend);
- else
- return 0;
-}
-
-static inline int
-usb_phy_notify_connect(struct usb_phy *x, int port)
-{
- if (x->notify_connect)
- return x->notify_connect(x, port);
- else
- return 0;
-}
-
-static inline int
-usb_phy_notify_disconnect(struct usb_phy *x, int port)
-{
- if (x->notify_disconnect)
- return x->notify_disconnect(x, port);
- else
- return 0;
-}
-
-static inline int
otg_start_srp(struct usb_otg *otg)
{
if (otg && otg->start_srp)
@@ -306,31 +121,7 @@ otg_start_srp(struct usb_otg *otg)
return -ENOTSUPP;
}
-/* notifiers */
-static inline int
-usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
-{
- return atomic_notifier_chain_register(&x->notifier, nb);
-}
-
-static inline void
-usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
-{
- atomic_notifier_chain_unregister(&x->notifier, nb);
-}
-
/* for OTG controller drivers (and maybe other stuff) */
extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
-static inline const char *usb_phy_type_string(enum usb_phy_type type)
-{
- switch (type) {
- case USB_PHY_TYPE_USB2:
- return "USB2 PHY";
- case USB_PHY_TYPE_USB3:
- return "USB3 PHY";
- default:
- return "UNKNOWN PHY TYPE";
- }
-}
#endif /* __LINUX_USB_OTG_H */
diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
new file mode 100644
index 0000000..5a2bcbe
--- /dev/null
+++ b/include/linux/usb/phy.h
@@ -0,0 +1,222 @@
+/* USB OTG (On The Go) defines */
+/*
+ *
+ * These APIs may be used between USB controllers. USB device drivers
+ * (for either host or peripheral roles) don't use these calls; they
+ * continue to use just usb_device and usb_gadget.
+ */
+
+#ifndef __LINUX_USB_PHY_H
+#define __LINUX_USB_PHY_H
+
+#include <linux/notifier.h>
+
+enum usb_phy_events {
+ USB_EVENT_NONE, /* no events or cable disconnected */
+ USB_EVENT_VBUS, /* vbus valid event */
+ USB_EVENT_ID, /* id was grounded */
+ USB_EVENT_CHARGER, /* usb dedicated charger */
+ USB_EVENT_ENUMERATED, /* gadget driver enumerated */
+};
+
+/* associate a type with PHY */
+enum usb_phy_type {
+ USB_PHY_TYPE_UNDEFINED,
+ USB_PHY_TYPE_USB2,
+ USB_PHY_TYPE_USB3,
+};
+
+struct usb_phy;
+struct usb_otg;
+
+/* for transceivers connected thru an ULPI interface, the user must
+ * provide access ops
+ */
+struct usb_phy_io_ops {
+ int (*read)(struct usb_phy *x, u32 reg);
+ int (*write)(struct usb_phy *x, u32 val, u32 reg);
+};
+
+struct usb_phy {
+ struct device *dev;
+ const char *label;
+ unsigned int flags;
+
+ enum usb_phy_type type;
+ enum usb_phy_events last_event;
+
+ struct usb_otg *otg;
+
+ struct device *io_dev;
+ struct usb_phy_io_ops *io_ops;
+ void __iomem *io_priv;
+
+ /* for notification of usb_phy_events */
+ struct atomic_notifier_head notifier;
+
+ /* to pass extra port status to the root hub */
+ u16 port_status;
+ u16 port_change;
+
+ /* to support controllers that have multiple transceivers */
+ struct list_head head;
+
+ /* initialize/shutdown the OTG controller */
+ int (*init)(struct usb_phy *x);
+ void (*shutdown)(struct usb_phy *x);
+
+ /* effective for B devices, ignored for A-peripheral */
+ int (*set_power)(struct usb_phy *x,
+ unsigned mA);
+
+ /* for non-OTG B devices: set transceiver into suspend mode */
+ int (*set_suspend)(struct usb_phy *x,
+ int suspend);
+
+ /* notify phy connect status change */
+ int (*notify_connect)(struct usb_phy *x, int port);
+ int (*notify_disconnect)(struct usb_phy *x, int port);
+};
+
+
+/* for board-specific init logic */
+extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
+extern void usb_remove_phy(struct usb_phy *);
+
+#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
+/* sometimes transceivers are accessed only through e.g. ULPI */
+extern void usb_nop_xceiv_register(void);
+extern void usb_nop_xceiv_unregister(void);
+#else
+static inline void usb_nop_xceiv_register(void)
+{
+}
+
+static inline void usb_nop_xceiv_unregister(void)
+{
+}
+#endif
+
+/* helpers for direct access thru low-level io interface */
+static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
+{
+ if (x->io_ops && x->io_ops->read)
+ return x->io_ops->read(x, reg);
+
+ return -EINVAL;
+}
+
+static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
+{
+ if (x->io_ops && x->io_ops->write)
+ return x->io_ops->write(x, val, reg);
+
+ return -EINVAL;
+}
+
+static inline int
+usb_phy_init(struct usb_phy *x)
+{
+ if (x->init)
+ return x->init(x);
+
+ return 0;
+}
+
+static inline void
+usb_phy_shutdown(struct usb_phy *x)
+{
+ if (x->shutdown)
+ x->shutdown(x);
+}
+
+/* for usb host and peripheral controller drivers */
+#ifdef CONFIG_USB_OTG_UTILS
+extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
+extern struct usb_phy *devm_usb_get_phy(struct device *dev,
+ enum usb_phy_type type);
+extern void usb_put_phy(struct usb_phy *);
+extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
+#else
+static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
+{
+ return NULL;
+}
+
+static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
+ enum usb_phy_type type)
+{
+ return NULL;
+}
+
+static inline void usb_put_phy(struct usb_phy *x)
+{
+}
+
+static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
+{
+}
+
+#endif
+
+static inline int
+usb_phy_set_power(struct usb_phy *x, unsigned mA)
+{
+ if (x && x->set_power)
+ return x->set_power(x, mA);
+ return 0;
+}
+
+/* Context: can sleep */
+static inline int
+usb_phy_set_suspend(struct usb_phy *x, int suspend)
+{
+ if (x->set_suspend != NULL)
+ return x->set_suspend(x, suspend);
+ else
+ return 0;
+}
+
+static inline int
+usb_phy_notify_connect(struct usb_phy *x, int port)
+{
+ if (x->notify_connect)
+ return x->notify_connect(x, port);
+ else
+ return 0;
+}
+
+static inline int
+usb_phy_notify_disconnect(struct usb_phy *x, int port)
+{
+ if (x->notify_disconnect)
+ return x->notify_disconnect(x, port);
+ else
+ return 0;
+}
+
+/* notifiers */
+static inline int
+usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
+{
+ return atomic_notifier_chain_register(&x->notifier, nb);
+}
+
+static inline void
+usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
+{
+ atomic_notifier_chain_unregister(&x->notifier, nb);
+}
+
+static inline const char *usb_phy_type_string(enum usb_phy_type type)
+{
+ switch (type) {
+ case USB_PHY_TYPE_USB2:
+ return "USB2 PHY";
+ case USB_PHY_TYPE_USB3:
+ return "USB3 PHY";
+ default:
+ return "UNKNOWN PHY TYPE";
+ }
+}
+#endif /* __LINUX_USB_PHY_H */
--
1.7.1.1
Hi,
On Tue, Aug 28, 2012 at 05:50:11PM +0530, Venu Byravarasu wrote:
> As otg.h is containing lots of phy interface related
> stuff, moving all phy interface related stuff to new
> file named phy.h
>
> Signed-off-by: Venu Byravarasu <[email protected]>
this should be ok.. I'll apply it once v3.6-rc4 is out unless someone
has something against it :-)
> ---
> include/linux/usb/otg.h | 211 +--------------------------------------------
> include/linux/usb/phy.h | 222 +++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 223 insertions(+), 210 deletions(-)
> create mode 100644 include/linux/usb/phy.h
>
> diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
> index 45824be..ccd3511 100644
> --- a/include/linux/usb/otg.h
> +++ b/include/linux/usb/otg.h
> @@ -10,6 +10,7 @@
> #define __LINUX_USB_OTG_H
>
> #include <linux/notifier.h>
> +#include <linux/usb/phy.h>
>
> /* OTG defines lots of enumeration states before device reset */
> enum usb_otg_state {
> @@ -35,31 +36,6 @@ enum usb_otg_state {
> OTG_STATE_A_VBUS_ERR,
> };
>
> -enum usb_phy_events {
> - USB_EVENT_NONE, /* no events or cable disconnected */
> - USB_EVENT_VBUS, /* vbus valid event */
> - USB_EVENT_ID, /* id was grounded */
> - USB_EVENT_CHARGER, /* usb dedicated charger */
> - USB_EVENT_ENUMERATED, /* gadget driver enumerated */
> -};
> -
> -/* associate a type with PHY */
> -enum usb_phy_type {
> - USB_PHY_TYPE_UNDEFINED,
> - USB_PHY_TYPE_USB2,
> - USB_PHY_TYPE_USB3,
> -};
> -
> -struct usb_phy;
> -
> -/* for transceivers connected thru an ULPI interface, the user must
> - * provide access ops
> - */
> -struct usb_phy_io_ops {
> - int (*read)(struct usb_phy *x, u32 reg);
> - int (*write)(struct usb_phy *x, u32 val, u32 reg);
> -};
> -
> struct usb_otg {
> u8 default_a;
>
> @@ -85,134 +61,9 @@ struct usb_otg {
>
> };
>
> -/*
> - * the otg driver needs to interact with both device side and host side
> - * usb controllers. it decides which controller is active at a given
> - * moment, using the transceiver, ID signal, HNP and sometimes static
> - * configuration information (including "board isn't wired for otg").
> - */
> -struct usb_phy {
> - struct device *dev;
> - const char *label;
> - unsigned int flags;
> -
> - enum usb_phy_type type;
> - enum usb_otg_state state;
> - enum usb_phy_events last_event;
> -
> - struct usb_otg *otg;
> -
> - struct device *io_dev;
> - struct usb_phy_io_ops *io_ops;
> - void __iomem *io_priv;
> -
> - /* for notification of usb_phy_events */
> - struct atomic_notifier_head notifier;
> -
> - /* to pass extra port status to the root hub */
> - u16 port_status;
> - u16 port_change;
> -
> - /* to support controllers that have multiple transceivers */
> - struct list_head head;
> -
> - /* initialize/shutdown the OTG controller */
> - int (*init)(struct usb_phy *x);
> - void (*shutdown)(struct usb_phy *x);
> -
> - /* effective for B devices, ignored for A-peripheral */
> - int (*set_power)(struct usb_phy *x,
> - unsigned mA);
> -
> - /* for non-OTG B devices: set transceiver into suspend mode */
> - int (*set_suspend)(struct usb_phy *x,
> - int suspend);
> -
> - /* notify phy connect status change */
> - int (*notify_connect)(struct usb_phy *x, int port);
> - int (*notify_disconnect)(struct usb_phy *x, int port);
> -};
> -
> -
> -/* for board-specific init logic */
> -extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
> -extern void usb_remove_phy(struct usb_phy *);
> -
> -#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
> -/* sometimes transceivers are accessed only through e.g. ULPI */
> -extern void usb_nop_xceiv_register(void);
> -extern void usb_nop_xceiv_unregister(void);
> -#else
> -static inline void usb_nop_xceiv_register(void)
> -{
> -}
> -
> -static inline void usb_nop_xceiv_unregister(void)
> -{
> -}
> -#endif
> -
> -/* helpers for direct access thru low-level io interface */
> -static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
> -{
> - if (x->io_ops && x->io_ops->read)
> - return x->io_ops->read(x, reg);
> -
> - return -EINVAL;
> -}
> -
> -static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
> -{
> - if (x->io_ops && x->io_ops->write)
> - return x->io_ops->write(x, val, reg);
> -
> - return -EINVAL;
> -}
> -
> -static inline int
> -usb_phy_init(struct usb_phy *x)
> -{
> - if (x->init)
> - return x->init(x);
> -
> - return 0;
> -}
> -
> -static inline void
> -usb_phy_shutdown(struct usb_phy *x)
> -{
> - if (x->shutdown)
> - x->shutdown(x);
> -}
> -
> -/* for usb host and peripheral controller drivers */
> #ifdef CONFIG_USB_OTG_UTILS
> -extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
> -extern struct usb_phy *devm_usb_get_phy(struct device *dev,
> - enum usb_phy_type type);
> -extern void usb_put_phy(struct usb_phy *);
> -extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
> extern const char *otg_state_string(enum usb_otg_state state);
> #else
> -static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
> -{
> - return NULL;
> -}
> -
> -static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
> - enum usb_phy_type type)
> -{
> - return NULL;
> -}
> -
> -static inline void usb_put_phy(struct usb_phy *x)
> -{
> -}
> -
> -static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
> -{
> -}
> -
> static inline const char *otg_state_string(enum usb_otg_state state)
> {
> return NULL;
> @@ -262,42 +113,6 @@ otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
> }
>
> static inline int
> -usb_phy_set_power(struct usb_phy *x, unsigned mA)
> -{
> - if (x && x->set_power)
> - return x->set_power(x, mA);
> - return 0;
> -}
> -
> -/* Context: can sleep */
> -static inline int
> -usb_phy_set_suspend(struct usb_phy *x, int suspend)
> -{
> - if (x->set_suspend != NULL)
> - return x->set_suspend(x, suspend);
> - else
> - return 0;
> -}
> -
> -static inline int
> -usb_phy_notify_connect(struct usb_phy *x, int port)
> -{
> - if (x->notify_connect)
> - return x->notify_connect(x, port);
> - else
> - return 0;
> -}
> -
> -static inline int
> -usb_phy_notify_disconnect(struct usb_phy *x, int port)
> -{
> - if (x->notify_disconnect)
> - return x->notify_disconnect(x, port);
> - else
> - return 0;
> -}
> -
> -static inline int
> otg_start_srp(struct usb_otg *otg)
> {
> if (otg && otg->start_srp)
> @@ -306,31 +121,7 @@ otg_start_srp(struct usb_otg *otg)
> return -ENOTSUPP;
> }
>
> -/* notifiers */
> -static inline int
> -usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
> -{
> - return atomic_notifier_chain_register(&x->notifier, nb);
> -}
> -
> -static inline void
> -usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
> -{
> - atomic_notifier_chain_unregister(&x->notifier, nb);
> -}
> -
> /* for OTG controller drivers (and maybe other stuff) */
> extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
>
> -static inline const char *usb_phy_type_string(enum usb_phy_type type)
> -{
> - switch (type) {
> - case USB_PHY_TYPE_USB2:
> - return "USB2 PHY";
> - case USB_PHY_TYPE_USB3:
> - return "USB3 PHY";
> - default:
> - return "UNKNOWN PHY TYPE";
> - }
> -}
> #endif /* __LINUX_USB_OTG_H */
> diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
> new file mode 100644
> index 0000000..5a2bcbe
> --- /dev/null
> +++ b/include/linux/usb/phy.h
> @@ -0,0 +1,222 @@
> +/* USB OTG (On The Go) defines */
> +/*
> + *
> + * These APIs may be used between USB controllers. USB device drivers
> + * (for either host or peripheral roles) don't use these calls; they
> + * continue to use just usb_device and usb_gadget.
> + */
> +
> +#ifndef __LINUX_USB_PHY_H
> +#define __LINUX_USB_PHY_H
> +
> +#include <linux/notifier.h>
> +
> +enum usb_phy_events {
> + USB_EVENT_NONE, /* no events or cable disconnected */
> + USB_EVENT_VBUS, /* vbus valid event */
> + USB_EVENT_ID, /* id was grounded */
> + USB_EVENT_CHARGER, /* usb dedicated charger */
> + USB_EVENT_ENUMERATED, /* gadget driver enumerated */
> +};
> +
> +/* associate a type with PHY */
> +enum usb_phy_type {
> + USB_PHY_TYPE_UNDEFINED,
> + USB_PHY_TYPE_USB2,
> + USB_PHY_TYPE_USB3,
> +};
> +
> +struct usb_phy;
> +struct usb_otg;
> +
> +/* for transceivers connected thru an ULPI interface, the user must
> + * provide access ops
> + */
> +struct usb_phy_io_ops {
> + int (*read)(struct usb_phy *x, u32 reg);
> + int (*write)(struct usb_phy *x, u32 val, u32 reg);
> +};
> +
> +struct usb_phy {
> + struct device *dev;
> + const char *label;
> + unsigned int flags;
> +
> + enum usb_phy_type type;
> + enum usb_phy_events last_event;
> +
> + struct usb_otg *otg;
> +
> + struct device *io_dev;
> + struct usb_phy_io_ops *io_ops;
> + void __iomem *io_priv;
> +
> + /* for notification of usb_phy_events */
> + struct atomic_notifier_head notifier;
> +
> + /* to pass extra port status to the root hub */
> + u16 port_status;
> + u16 port_change;
> +
> + /* to support controllers that have multiple transceivers */
> + struct list_head head;
> +
> + /* initialize/shutdown the OTG controller */
> + int (*init)(struct usb_phy *x);
> + void (*shutdown)(struct usb_phy *x);
> +
> + /* effective for B devices, ignored for A-peripheral */
> + int (*set_power)(struct usb_phy *x,
> + unsigned mA);
> +
> + /* for non-OTG B devices: set transceiver into suspend mode */
> + int (*set_suspend)(struct usb_phy *x,
> + int suspend);
> +
> + /* notify phy connect status change */
> + int (*notify_connect)(struct usb_phy *x, int port);
> + int (*notify_disconnect)(struct usb_phy *x, int port);
> +};
> +
> +
> +/* for board-specific init logic */
> +extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
> +extern void usb_remove_phy(struct usb_phy *);
> +
> +#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
> +/* sometimes transceivers are accessed only through e.g. ULPI */
> +extern void usb_nop_xceiv_register(void);
> +extern void usb_nop_xceiv_unregister(void);
> +#else
> +static inline void usb_nop_xceiv_register(void)
> +{
> +}
> +
> +static inline void usb_nop_xceiv_unregister(void)
> +{
> +}
> +#endif
> +
> +/* helpers for direct access thru low-level io interface */
> +static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
> +{
> + if (x->io_ops && x->io_ops->read)
> + return x->io_ops->read(x, reg);
> +
> + return -EINVAL;
> +}
> +
> +static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
> +{
> + if (x->io_ops && x->io_ops->write)
> + return x->io_ops->write(x, val, reg);
> +
> + return -EINVAL;
> +}
> +
> +static inline int
> +usb_phy_init(struct usb_phy *x)
> +{
> + if (x->init)
> + return x->init(x);
> +
> + return 0;
> +}
> +
> +static inline void
> +usb_phy_shutdown(struct usb_phy *x)
> +{
> + if (x->shutdown)
> + x->shutdown(x);
> +}
> +
> +/* for usb host and peripheral controller drivers */
> +#ifdef CONFIG_USB_OTG_UTILS
> +extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
> +extern struct usb_phy *devm_usb_get_phy(struct device *dev,
> + enum usb_phy_type type);
> +extern void usb_put_phy(struct usb_phy *);
> +extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
> +#else
> +static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
> +{
> + return NULL;
> +}
> +
> +static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
> + enum usb_phy_type type)
> +{
> + return NULL;
> +}
> +
> +static inline void usb_put_phy(struct usb_phy *x)
> +{
> +}
> +
> +static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
> +{
> +}
> +
> +#endif
> +
> +static inline int
> +usb_phy_set_power(struct usb_phy *x, unsigned mA)
> +{
> + if (x && x->set_power)
> + return x->set_power(x, mA);
> + return 0;
> +}
> +
> +/* Context: can sleep */
> +static inline int
> +usb_phy_set_suspend(struct usb_phy *x, int suspend)
> +{
> + if (x->set_suspend != NULL)
> + return x->set_suspend(x, suspend);
> + else
> + return 0;
> +}
> +
> +static inline int
> +usb_phy_notify_connect(struct usb_phy *x, int port)
> +{
> + if (x->notify_connect)
> + return x->notify_connect(x, port);
> + else
> + return 0;
> +}
> +
> +static inline int
> +usb_phy_notify_disconnect(struct usb_phy *x, int port)
> +{
> + if (x->notify_disconnect)
> + return x->notify_disconnect(x, port);
> + else
> + return 0;
> +}
> +
> +/* notifiers */
> +static inline int
> +usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
> +{
> + return atomic_notifier_chain_register(&x->notifier, nb);
> +}
> +
> +static inline void
> +usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
> +{
> + atomic_notifier_chain_unregister(&x->notifier, nb);
> +}
> +
> +static inline const char *usb_phy_type_string(enum usb_phy_type type)
> +{
> + switch (type) {
> + case USB_PHY_TYPE_USB2:
> + return "USB2 PHY";
> + case USB_PHY_TYPE_USB3:
> + return "USB3 PHY";
> + default:
> + return "UNKNOWN PHY TYPE";
> + }
> +}
> +#endif /* __LINUX_USB_PHY_H */
> --
> 1.7.1.1
>
--
balbi
>
> #include <linux/notifier.h>
> +#include <linux/usb/phy.h>
>
one small thing: <linux/notifier.h> is only needed at phy.h.
> /* OTG defines lots of enumeration states before device reset */
> enum usb_otg_state {
> @@ -35,31 +36,6 @@ enum usb_otg_state {
> OTG_STATE_A_VBUS_ERR,
> };
>
> -enum usb_phy_events {
> - USB_EVENT_NONE, /* no events or cable disconnected */
> - USB_EVENT_VBUS, /* vbus valid event */
> - USB_EVENT_ID, /* id was grounded */
> - USB_EVENT_CHARGER, /* usb dedicated charger */
> - USB_EVENT_ENUMERATED, /* gadget driver enumerated */
> -};
> -
> -/* associate a type with PHY */
> -enum usb_phy_type {
> - USB_PHY_TYPE_UNDEFINED,
> - USB_PHY_TYPE_USB2,
> - USB_PHY_TYPE_USB3,
> -};
> -
> -struct usb_phy;
> -
> -/* for transceivers connected thru an ULPI interface, the user must
> - * provide access ops
> - */
> -struct usb_phy_io_ops {
> - int (*read)(struct usb_phy *x, u32 reg);
> - int (*write)(struct usb_phy *x, u32 val, u32 reg);
> -};
> -
> struct usb_otg {
> u8 default_a;
>
> @@ -85,134 +61,9 @@ struct usb_otg {
>
> };
>
> -/*
> - * the otg driver needs to interact with both device side and host side
> - * usb controllers. it decides which controller is active at a given
> - * moment, using the transceiver, ID signal, HNP and sometimes static
> - * configuration information (including "board isn't wired for otg").
> - */
> -struct usb_phy {
> - struct device *dev;
> - const char *label;
> - unsigned int flags;
> -
> - enum usb_phy_type type;
> - enum usb_otg_state state;
> - enum usb_phy_events last_event;
> -
> - struct usb_otg *otg;
> -
> - struct device *io_dev;
> - struct usb_phy_io_ops *io_ops;
> - void __iomem *io_priv;
> -
> - /* for notification of usb_phy_events */
> - struct atomic_notifier_head notifier;
> -
> - /* to pass extra port status to the root hub */
> - u16 port_status;
> - u16 port_change;
> -
> - /* to support controllers that have multiple transceivers */
> - struct list_head head;
> -
> - /* initialize/shutdown the OTG controller */
> - int (*init)(struct usb_phy *x);
> - void (*shutdown)(struct usb_phy *x);
> -
> - /* effective for B devices, ignored for A-peripheral */
> - int (*set_power)(struct usb_phy *x,
> - unsigned mA);
> -
> - /* for non-OTG B devices: set transceiver into suspend mode */
> - int (*set_suspend)(struct usb_phy *x,
> - int suspend);
> -
> - /* notify phy connect status change */
> - int (*notify_connect)(struct usb_phy *x, int port);
> - int (*notify_disconnect)(struct usb_phy *x, int port);
> -};
> -
> -
> -/* for board-specific init logic */
> -extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
> -extern void usb_remove_phy(struct usb_phy *);
> -
> -#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
> -/* sometimes transceivers are accessed only through e.g. ULPI */
> -extern void usb_nop_xceiv_register(void);
> -extern void usb_nop_xceiv_unregister(void);
> -#else
> -static inline void usb_nop_xceiv_register(void)
> -{
> -}
> -
> -static inline void usb_nop_xceiv_unregister(void)
> -{
> -}
> -#endif
> -
> -/* helpers for direct access thru low-level io interface */
> -static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
> -{
> - if (x->io_ops && x->io_ops->read)
> - return x->io_ops->read(x, reg);
> -
> - return -EINVAL;
> -}
> -
> -static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
> -{
> - if (x->io_ops && x->io_ops->write)
> - return x->io_ops->write(x, val, reg);
> -
> - return -EINVAL;
> -}
> -
> -static inline int
> -usb_phy_init(struct usb_phy *x)
> -{
> - if (x->init)
> - return x->init(x);
> -
> - return 0;
> -}
> -
> -static inline void
> -usb_phy_shutdown(struct usb_phy *x)
> -{
> - if (x->shutdown)
> - x->shutdown(x);
> -}
> -
> -/* for usb host and peripheral controller drivers */
> #ifdef CONFIG_USB_OTG_UTILS
> -extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
> -extern struct usb_phy *devm_usb_get_phy(struct device *dev,
> - enum usb_phy_type type);
> -extern void usb_put_phy(struct usb_phy *);
> -extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
> extern const char *otg_state_string(enum usb_otg_state state);
> #else
> -static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
> -{
> - return NULL;
> -}
> -
> -static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
> - enum usb_phy_type type)
> -{
> - return NULL;
> -}
> -
> -static inline void usb_put_phy(struct usb_phy *x)
> -{
> -}
> -
> -static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
> -{
> -}
> -
> static inline const char *otg_state_string(enum usb_otg_state state)
> {
> return NULL;
> @@ -262,42 +113,6 @@ otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
> }
>
> static inline int
> -usb_phy_set_power(struct usb_phy *x, unsigned mA)
> -{
> - if (x && x->set_power)
> - return x->set_power(x, mA);
> - return 0;
> -}
> -
> -/* Context: can sleep */
> -static inline int
> -usb_phy_set_suspend(struct usb_phy *x, int suspend)
> -{
> - if (x->set_suspend != NULL)
> - return x->set_suspend(x, suspend);
> - else
> - return 0;
> -}
> -
> -static inline int
> -usb_phy_notify_connect(struct usb_phy *x, int port)
> -{
> - if (x->notify_connect)
> - return x->notify_connect(x, port);
> - else
> - return 0;
> -}
> -
> -static inline int
> -usb_phy_notify_disconnect(struct usb_phy *x, int port)
> -{
> - if (x->notify_disconnect)
> - return x->notify_disconnect(x, port);
> - else
> - return 0;
> -}
> -
> -static inline int
> otg_start_srp(struct usb_otg *otg)
> {
> if (otg && otg->start_srp)
> @@ -306,31 +121,7 @@ otg_start_srp(struct usb_otg *otg)
> return -ENOTSUPP;
> }
>
> -/* notifiers */
> -static inline int
> -usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
> -{
> - return atomic_notifier_chain_register(&x->notifier, nb);
> -}
> -
> -static inline void
> -usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
> -{
> - atomic_notifier_chain_unregister(&x->notifier, nb);
> -}
> -
> /* for OTG controller drivers (and maybe other stuff) */
> extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
>
> -static inline const char *usb_phy_type_string(enum usb_phy_type type)
> -{
> - switch (type) {
> - case USB_PHY_TYPE_USB2:
> - return "USB2 PHY";
> - case USB_PHY_TYPE_USB3:
> - return "USB3 PHY";
> - default:
> - return "UNKNOWN PHY TYPE";
> - }
> -}
> #endif /* __LINUX_USB_OTG_H */
> diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
> new file mode 100644
> index 0000000..5a2bcbe
> --- /dev/null
> +++ b/include/linux/usb/phy.h
> @@ -0,0 +1,222 @@
> +/* USB OTG (On The Go) defines */
> +/*
> + *
> + * These APIs may be used between USB controllers. USB device drivers
> + * (for either host or peripheral roles) don't use these calls; they
> + * continue to use just usb_device and usb_gadget.
> + */
> +
> +#ifndef __LINUX_USB_PHY_H
> +#define __LINUX_USB_PHY_H
> +
> +#include <linux/notifier.h>
> +
> +enum usb_phy_events {
> + USB_EVENT_NONE, /* no events or cable disconnected */
> + USB_EVENT_VBUS, /* vbus valid event */
> + USB_EVENT_ID, /* id was grounded */
> + USB_EVENT_CHARGER, /* usb dedicated charger */
> + USB_EVENT_ENUMERATED, /* gadget driver enumerated */
> +};
> +
> +/* associate a type with PHY */
> +enum usb_phy_type {
> + USB_PHY_TYPE_UNDEFINED,
> + USB_PHY_TYPE_USB2,
> + USB_PHY_TYPE_USB3,
> +};
> +
> +struct usb_phy;
> +struct usb_otg;
> +
> +/* for transceivers connected thru an ULPI interface, the user must
> + * provide access ops
> + */
> +struct usb_phy_io_ops {
> + int (*read)(struct usb_phy *x, u32 reg);
> + int (*write)(struct usb_phy *x, u32 val, u32 reg);
> +};
> +
> +struct usb_phy {
> + struct device *dev;
> + const char *label;
> + unsigned int flags;
> +
> + enum usb_phy_type type;
> + enum usb_phy_events last_event;
> +
> + struct usb_otg *otg;
> +
> + struct device *io_dev;
> + struct usb_phy_io_ops *io_ops;
> + void __iomem *io_priv;
> +
> + /* for notification of usb_phy_events */
> + struct atomic_notifier_head notifier;
> +
> + /* to pass extra port status to the root hub */
> + u16 port_status;
> + u16 port_change;
> +
> + /* to support controllers that have multiple transceivers */
> + struct list_head head;
> +
> + /* initialize/shutdown the OTG controller */
> + int (*init)(struct usb_phy *x);
> + void (*shutdown)(struct usb_phy *x);
> +
> + /* effective for B devices, ignored for A-peripheral */
> + int (*set_power)(struct usb_phy *x,
> + unsigned mA);
> +
> + /* for non-OTG B devices: set transceiver into suspend mode */
> + int (*set_suspend)(struct usb_phy *x,
> + int suspend);
> +
> + /* notify phy connect status change */
> + int (*notify_connect)(struct usb_phy *x, int port);
> + int (*notify_disconnect)(struct usb_phy *x, int port);
> +};
> +
> +
> +/* for board-specific init logic */
> +extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
> +extern void usb_remove_phy(struct usb_phy *);
> +
> +#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
> +/* sometimes transceivers are accessed only through e.g. ULPI */
> +extern void usb_nop_xceiv_register(void);
> +extern void usb_nop_xceiv_unregister(void);
> +#else
> +static inline void usb_nop_xceiv_register(void)
> +{
> +}
> +
> +static inline void usb_nop_xceiv_unregister(void)
> +{
> +}
> +#endif
> +
> +/* helpers for direct access thru low-level io interface */
> +static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
> +{
> + if (x->io_ops && x->io_ops->read)
> + return x->io_ops->read(x, reg);
> +
> + return -EINVAL;
> +}
> +
> +static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
> +{
> + if (x->io_ops && x->io_ops->write)
> + return x->io_ops->write(x, val, reg);
> +
> + return -EINVAL;
> +}
> +
> +static inline int
> +usb_phy_init(struct usb_phy *x)
> +{
> + if (x->init)
> + return x->init(x);
> +
> + return 0;
> +}
> +
> +static inline void
> +usb_phy_shutdown(struct usb_phy *x)
> +{
> + if (x->shutdown)
> + x->shutdown(x);
> +}
> +
> +/* for usb host and peripheral controller drivers */
> +#ifdef CONFIG_USB_OTG_UTILS
> +extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
> +extern struct usb_phy *devm_usb_get_phy(struct device *dev,
> + enum usb_phy_type type);
> +extern void usb_put_phy(struct usb_phy *);
> +extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
> +#else
> +static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
> +{
> + return NULL;
> +}
> +
> +static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
> + enum usb_phy_type type)
> +{
> + return NULL;
> +}
> +
> +static inline void usb_put_phy(struct usb_phy *x)
> +{
> +}
> +
> +static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
> +{
> +}
> +
> +#endif
> +
> +static inline int
> +usb_phy_set_power(struct usb_phy *x, unsigned mA)
> +{
> + if (x && x->set_power)
> + return x->set_power(x, mA);
> + return 0;
> +}
> +
> +/* Context: can sleep */
> +static inline int
> +usb_phy_set_suspend(struct usb_phy *x, int suspend)
> +{
> + if (x->set_suspend != NULL)
> + return x->set_suspend(x, suspend);
> + else
> + return 0;
> +}
> +
> +static inline int
> +usb_phy_notify_connect(struct usb_phy *x, int port)
> +{
> + if (x->notify_connect)
> + return x->notify_connect(x, port);
> + else
> + return 0;
> +}
> +
> +static inline int
> +usb_phy_notify_disconnect(struct usb_phy *x, int port)
> +{
> + if (x->notify_disconnect)
> + return x->notify_disconnect(x, port);
> + else
> + return 0;
> +}
> +
> +/* notifiers */
> +static inline int
> +usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
> +{
> + return atomic_notifier_chain_register(&x->notifier, nb);
> +}
> +
> +static inline void
> +usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
> +{
> + atomic_notifier_chain_unregister(&x->notifier, nb);
> +}
> +
> +static inline const char *usb_phy_type_string(enum usb_phy_type type)
> +{
> + switch (type) {
> + case USB_PHY_TYPE_USB2:
> + return "USB2 PHY";
> + case USB_PHY_TYPE_USB3:
> + return "USB3 PHY";
> + default:
> + return "UNKNOWN PHY TYPE";
> + }
> +}
> +#endif /* __LINUX_USB_PHY_H */
> --
> 1.7.1.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> -----Original Message-----
> From: Peter Chen [mailto:[email protected]]
> Sent: Wednesday, August 29, 2012 7:30 AM
> To: Venu Byravarasu
> Cc: [email protected]; [email protected]; linux-
> [email protected]; [email protected]
> Subject: Re: [PATCH] usb: otg: Move phy interface to separate file.
>
> >
> > #include <linux/notifier.h>
> > +#include <linux/usb/phy.h>
> >
> one small thing: <linux/notifier.h> is only needed at phy.h.
Thanks Peter, for your comment.
Will send an updated patch.
>
> > /* OTG defines lots of enumeration states before device reset */
> > enum usb_otg_state {
> > @@ -35,31 +36,6 @@ enum usb_otg_state {
> > OTG_STATE_A_VBUS_ERR,
> > };
> >
> > -enum usb_phy_events {
> > - USB_EVENT_NONE, /* no events or cable disconnected */
> > - USB_EVENT_VBUS, /* vbus valid event */
> > - USB_EVENT_ID, /* id was grounded */
> > - USB_EVENT_CHARGER, /* usb dedicated charger */
> > - USB_EVENT_ENUMERATED, /* gadget driver enumerated */
> > -};
> > -
> > -/* associate a type with PHY */
> > -enum usb_phy_type {
> > - USB_PHY_TYPE_UNDEFINED,
> > - USB_PHY_TYPE_USB2,
> > - USB_PHY_TYPE_USB3,
> > -};
> > -
> > -struct usb_phy;
> > -
> > -/* for transceivers connected thru an ULPI interface, the user must
> > - * provide access ops
> > - */
> > -struct usb_phy_io_ops {
> > - int (*read)(struct usb_phy *x, u32 reg);
> > - int (*write)(struct usb_phy *x, u32 val, u32 reg);
> > -};
> > -
> > struct usb_otg {
> > u8 default_a;
> >
> > @@ -85,134 +61,9 @@ struct usb_otg {
> >
> > };
> >
> > -/*
> > - * the otg driver needs to interact with both device side and host side
> > - * usb controllers. it decides which controller is active at a given
> > - * moment, using the transceiver, ID signal, HNP and sometimes static
> > - * configuration information (including "board isn't wired for otg").
> > - */
> > -struct usb_phy {
> > - struct device *dev;
> > - const char *label;
> > - unsigned int flags;
> > -
> > - enum usb_phy_type type;
> > - enum usb_otg_state state;
> > - enum usb_phy_events last_event;
> > -
> > - struct usb_otg *otg;
> > -
> > - struct device *io_dev;
> > - struct usb_phy_io_ops *io_ops;
> > - void __iomem *io_priv;
> > -
> > - /* for notification of usb_phy_events */
> > - struct atomic_notifier_head notifier;
> > -
> > - /* to pass extra port status to the root hub */
> > - u16 port_status;
> > - u16 port_change;
> > -
> > - /* to support controllers that have multiple transceivers */
> > - struct list_head head;
> > -
> > - /* initialize/shutdown the OTG controller */
> > - int (*init)(struct usb_phy *x);
> > - void (*shutdown)(struct usb_phy *x);
> > -
> > - /* effective for B devices, ignored for A-peripheral */
> > - int (*set_power)(struct usb_phy *x,
> > - unsigned mA);
> > -
> > - /* for non-OTG B devices: set transceiver into suspend mode */
> > - int (*set_suspend)(struct usb_phy *x,
> > - int suspend);
> > -
> > - /* notify phy connect status change */
> > - int (*notify_connect)(struct usb_phy *x, int port);
> > - int (*notify_disconnect)(struct usb_phy *x, int port);
> > -};
> > -
> > -
> > -/* for board-specific init logic */
> > -extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
> > -extern void usb_remove_phy(struct usb_phy *);
> > -
> > -#if defined(CONFIG_NOP_USB_XCEIV) ||
> (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
> > -/* sometimes transceivers are accessed only through e.g. ULPI */
> > -extern void usb_nop_xceiv_register(void);
> > -extern void usb_nop_xceiv_unregister(void);
> > -#else
> > -static inline void usb_nop_xceiv_register(void)
> > -{
> > -}
> > -
> > -static inline void usb_nop_xceiv_unregister(void)
> > -{
> > -}
> > -#endif
> > -
> > -/* helpers for direct access thru low-level io interface */
> > -static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
> > -{
> > - if (x->io_ops && x->io_ops->read)
> > - return x->io_ops->read(x, reg);
> > -
> > - return -EINVAL;
> > -}
> > -
> > -static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
> > -{
> > - if (x->io_ops && x->io_ops->write)
> > - return x->io_ops->write(x, val, reg);
> > -
> > - return -EINVAL;
> > -}
> > -
> > -static inline int
> > -usb_phy_init(struct usb_phy *x)
> > -{
> > - if (x->init)
> > - return x->init(x);
> > -
> > - return 0;
> > -}
> > -
> > -static inline void
> > -usb_phy_shutdown(struct usb_phy *x)
> > -{
> > - if (x->shutdown)
> > - x->shutdown(x);
> > -}
> > -
> > -/* for usb host and peripheral controller drivers */
> > #ifdef CONFIG_USB_OTG_UTILS
> > -extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
> > -extern struct usb_phy *devm_usb_get_phy(struct device *dev,
> > - enum usb_phy_type type);
> > -extern void usb_put_phy(struct usb_phy *);
> > -extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
> > extern const char *otg_state_string(enum usb_otg_state state);
> > #else
> > -static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
> > -{
> > - return NULL;
> > -}
> > -
> > -static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
> > - enum usb_phy_type type)
> > -{
> > - return NULL;
> > -}
> > -
> > -static inline void usb_put_phy(struct usb_phy *x)
> > -{
> > -}
> > -
> > -static inline void devm_usb_put_phy(struct device *dev, struct usb_phy
> *x)
> > -{
> > -}
> > -
> > static inline const char *otg_state_string(enum usb_otg_state state)
> > {
> > return NULL;
> > @@ -262,42 +113,6 @@ otg_set_peripheral(struct usb_otg *otg, struct
> usb_gadget *periph)
> > }
> >
> > static inline int
> > -usb_phy_set_power(struct usb_phy *x, unsigned mA)
> > -{
> > - if (x && x->set_power)
> > - return x->set_power(x, mA);
> > - return 0;
> > -}
> > -
> > -/* Context: can sleep */
> > -static inline int
> > -usb_phy_set_suspend(struct usb_phy *x, int suspend)
> > -{
> > - if (x->set_suspend != NULL)
> > - return x->set_suspend(x, suspend);
> > - else
> > - return 0;
> > -}
> > -
> > -static inline int
> > -usb_phy_notify_connect(struct usb_phy *x, int port)
> > -{
> > - if (x->notify_connect)
> > - return x->notify_connect(x, port);
> > - else
> > - return 0;
> > -}
> > -
> > -static inline int
> > -usb_phy_notify_disconnect(struct usb_phy *x, int port)
> > -{
> > - if (x->notify_disconnect)
> > - return x->notify_disconnect(x, port);
> > - else
> > - return 0;
> > -}
> > -
> > -static inline int
> > otg_start_srp(struct usb_otg *otg)
> > {
> > if (otg && otg->start_srp)
> > @@ -306,31 +121,7 @@ otg_start_srp(struct usb_otg *otg)
> > return -ENOTSUPP;
> > }
> >
> > -/* notifiers */
> > -static inline int
> > -usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
> > -{
> > - return atomic_notifier_chain_register(&x->notifier, nb);
> > -}
> > -
> > -static inline void
> > -usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
> > -{
> > - atomic_notifier_chain_unregister(&x->notifier, nb);
> > -}
> > -
> > /* for OTG controller drivers (and maybe other stuff) */
> > extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
> >
> > -static inline const char *usb_phy_type_string(enum usb_phy_type type)
> > -{
> > - switch (type) {
> > - case USB_PHY_TYPE_USB2:
> > - return "USB2 PHY";
> > - case USB_PHY_TYPE_USB3:
> > - return "USB3 PHY";
> > - default:
> > - return "UNKNOWN PHY TYPE";
> > - }
> > -}
> > #endif /* __LINUX_USB_OTG_H */
> > diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
> > new file mode 100644
> > index 0000000..5a2bcbe
> > --- /dev/null
> > +++ b/include/linux/usb/phy.h
> > @@ -0,0 +1,222 @@
> > +/* USB OTG (On The Go) defines */
> > +/*
> > + *
> > + * These APIs may be used between USB controllers. USB device drivers
> > + * (for either host or peripheral roles) don't use these calls; they
> > + * continue to use just usb_device and usb_gadget.
> > + */
> > +
> > +#ifndef __LINUX_USB_PHY_H
> > +#define __LINUX_USB_PHY_H
> > +
> > +#include <linux/notifier.h>
> > +
> > +enum usb_phy_events {
> > + USB_EVENT_NONE, /* no events or cable disconnected */
> > + USB_EVENT_VBUS, /* vbus valid event */
> > + USB_EVENT_ID, /* id was grounded */
> > + USB_EVENT_CHARGER, /* usb dedicated charger */
> > + USB_EVENT_ENUMERATED, /* gadget driver enumerated */
> > +};
> > +
> > +/* associate a type with PHY */
> > +enum usb_phy_type {
> > + USB_PHY_TYPE_UNDEFINED,
> > + USB_PHY_TYPE_USB2,
> > + USB_PHY_TYPE_USB3,
> > +};
> > +
> > +struct usb_phy;
> > +struct usb_otg;
> > +
> > +/* for transceivers connected thru an ULPI interface, the user must
> > + * provide access ops
> > + */
> > +struct usb_phy_io_ops {
> > + int (*read)(struct usb_phy *x, u32 reg);
> > + int (*write)(struct usb_phy *x, u32 val, u32 reg);
> > +};
> > +
> > +struct usb_phy {
> > + struct device *dev;
> > + const char *label;
> > + unsigned int flags;
> > +
> > + enum usb_phy_type type;
> > + enum usb_phy_events last_event;
> > +
> > + struct usb_otg *otg;
> > +
> > + struct device *io_dev;
> > + struct usb_phy_io_ops *io_ops;
> > + void __iomem *io_priv;
> > +
> > + /* for notification of usb_phy_events */
> > + struct atomic_notifier_head notifier;
> > +
> > + /* to pass extra port status to the root hub */
> > + u16 port_status;
> > + u16 port_change;
> > +
> > + /* to support controllers that have multiple transceivers */
> > + struct list_head head;
> > +
> > + /* initialize/shutdown the OTG controller */
> > + int (*init)(struct usb_phy *x);
> > + void (*shutdown)(struct usb_phy *x);
> > +
> > + /* effective for B devices, ignored for A-peripheral */
> > + int (*set_power)(struct usb_phy *x,
> > + unsigned mA);
> > +
> > + /* for non-OTG B devices: set transceiver into suspend mode */
> > + int (*set_suspend)(struct usb_phy *x,
> > + int suspend);
> > +
> > + /* notify phy connect status change */
> > + int (*notify_connect)(struct usb_phy *x, int port);
> > + int (*notify_disconnect)(struct usb_phy *x, int port);
> > +};
> > +
> > +
> > +/* for board-specific init logic */
> > +extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
> > +extern void usb_remove_phy(struct usb_phy *);
> > +
> > +#if defined(CONFIG_NOP_USB_XCEIV) ||
> (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
> > +/* sometimes transceivers are accessed only through e.g. ULPI */
> > +extern void usb_nop_xceiv_register(void);
> > +extern void usb_nop_xceiv_unregister(void);
> > +#else
> > +static inline void usb_nop_xceiv_register(void)
> > +{
> > +}
> > +
> > +static inline void usb_nop_xceiv_unregister(void)
> > +{
> > +}
> > +#endif
> > +
> > +/* helpers for direct access thru low-level io interface */
> > +static inline int usb_phy_io_read(struct usb_phy *x, u32 reg)
> > +{
> > + if (x->io_ops && x->io_ops->read)
> > + return x->io_ops->read(x, reg);
> > +
> > + return -EINVAL;
> > +}
> > +
> > +static inline int usb_phy_io_write(struct usb_phy *x, u32 val, u32 reg)
> > +{
> > + if (x->io_ops && x->io_ops->write)
> > + return x->io_ops->write(x, val, reg);
> > +
> > + return -EINVAL;
> > +}
> > +
> > +static inline int
> > +usb_phy_init(struct usb_phy *x)
> > +{
> > + if (x->init)
> > + return x->init(x);
> > +
> > + return 0;
> > +}
> > +
> > +static inline void
> > +usb_phy_shutdown(struct usb_phy *x)
> > +{
> > + if (x->shutdown)
> > + x->shutdown(x);
> > +}
> > +
> > +/* for usb host and peripheral controller drivers */
> > +#ifdef CONFIG_USB_OTG_UTILS
> > +extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
> > +extern struct usb_phy *devm_usb_get_phy(struct device *dev,
> > + enum usb_phy_type type);
> > +extern void usb_put_phy(struct usb_phy *);
> > +extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
> > +#else
> > +static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
> > +{
> > + return NULL;
> > +}
> > +
> > +static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
> > + enum usb_phy_type type)
> > +{
> > + return NULL;
> > +}
> > +
> > +static inline void usb_put_phy(struct usb_phy *x)
> > +{
> > +}
> > +
> > +static inline void devm_usb_put_phy(struct device *dev, struct usb_phy
> *x)
> > +{
> > +}
> > +
> > +#endif
> > +
> > +static inline int
> > +usb_phy_set_power(struct usb_phy *x, unsigned mA)
> > +{
> > + if (x && x->set_power)
> > + return x->set_power(x, mA);
> > + return 0;
> > +}
> > +
> > +/* Context: can sleep */
> > +static inline int
> > +usb_phy_set_suspend(struct usb_phy *x, int suspend)
> > +{
> > + if (x->set_suspend != NULL)
> > + return x->set_suspend(x, suspend);
> > + else
> > + return 0;
> > +}
> > +
> > +static inline int
> > +usb_phy_notify_connect(struct usb_phy *x, int port)
> > +{
> > + if (x->notify_connect)
> > + return x->notify_connect(x, port);
> > + else
> > + return 0;
> > +}
> > +
> > +static inline int
> > +usb_phy_notify_disconnect(struct usb_phy *x, int port)
> > +{
> > + if (x->notify_disconnect)
> > + return x->notify_disconnect(x, port);
> > + else
> > + return 0;
> > +}
> > +
> > +/* notifiers */
> > +static inline int
> > +usb_register_notifier(struct usb_phy *x, struct notifier_block *nb)
> > +{
> > + return atomic_notifier_chain_register(&x->notifier, nb);
> > +}
> > +
> > +static inline void
> > +usb_unregister_notifier(struct usb_phy *x, struct notifier_block *nb)
> > +{
> > + atomic_notifier_chain_unregister(&x->notifier, nb);
> > +}
> > +
> > +static inline const char *usb_phy_type_string(enum usb_phy_type type)
> > +{
> > + switch (type) {
> > + case USB_PHY_TYPE_USB2:
> > + return "USB2 PHY";
> > + case USB_PHY_TYPE_USB3:
> > + return "USB3 PHY";
> > + default:
> > + return "UNKNOWN PHY TYPE";
> > + }
> > +}
> > +#endif /* __LINUX_USB_PHY_H */
> > --
> > 1.7.1.1
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> > the body of a message to [email protected]
> > More majordomo info at http://vger.kernel.org/majordomo-info.html