lkml.org 
[lkml]   [2012]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [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.

> /* 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 majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html


\
 
 \ /
  Last update: 2012-08-29 04:41    [W:0.740 / U:0.020 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site