@@ -16,6 +16,7 @@
#include <linux/usb/gadget.h>
#include <linux/usb/otg-fsm.h>
#include <linux/usb/otg.h>
+#include <linux/usb/role.h>
#include <linux/ulpi/interface.h>
/******************************************************************************
@@ -102,12 +103,6 @@ struct ci_hw_ep {
struct td_node *pending_td;
};
-enum ci_role {
- CI_ROLE_HOST = 0,
- CI_ROLE_GADGET,
- CI_ROLE_END,
-};
-
enum ci_revision {
CI_REVISION_1X = 10, /* Revision 1.x */
CI_REVISION_20 = 20, /* Revision 2.0 */
@@ -208,8 +203,8 @@ struct ci_hdrc {
spinlock_t lock;
struct hw_bank hw_bank;
int irq;
- struct ci_role_driver *roles[CI_ROLE_END];
- enum ci_role role;
+ struct ci_role_driver *roles[USB_ROLE_DEVICE + 1];
+ enum usb_role role;
bool is_otg;
struct usb_otg otg;
struct otg_fsm fsm;
@@ -258,15 +253,16 @@ struct ci_hdrc {
static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci)
{
- BUG_ON(ci->role >= CI_ROLE_END || !ci->roles[ci->role]);
+ WARN_ON((ci->role != USB_ROLE_HOST && ci->role != USB_ROLE_DEVICE) ||
+ !ci->roles[ci->role]);
return ci->roles[ci->role];
}
-static inline int ci_role_start(struct ci_hdrc *ci, enum ci_role role)
+static inline int ci_role_start(struct ci_hdrc *ci, enum usb_role role)
{
int ret;
- if (role >= CI_ROLE_END)
+ if (role != USB_ROLE_HOST && role != USB_ROLE_DEVICE)
return -EINVAL;
if (!ci->roles[role])
@@ -280,12 +276,12 @@ static inline int ci_role_start(struct ci_hdrc *ci, enum ci_role role)
static inline void ci_role_stop(struct ci_hdrc *ci)
{
- enum ci_role role = ci->role;
+ enum usb_role role = ci->role;
- if (role == CI_ROLE_END)
+ if (role == USB_ROLE_NONE)
return;
- ci->role = CI_ROLE_END;
+ ci->role = USB_ROLE_NONE;
ci->roles[role]->stop(ci);
}
@@ -416,8 +412,8 @@ static inline bool ci_otg_is_fsm_mode(struct ci_hdrc *ci)
#ifdef CONFIG_USB_OTG_FSM
struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps;
- return ci->is_otg && ci->roles[CI_ROLE_HOST] &&
- ci->roles[CI_ROLE_GADGET] && (otg_caps->srp_support ||
+ return ci->is_otg && ci->roles[USB_ROLE_HOST] &&
+ ci->roles[USB_ROLE_DEVICE] && (otg_caps->srp_support ||
otg_caps->hnp_support || otg_caps->adp_support);
#else
return false;
@@ -581,7 +581,7 @@ static irqreturn_t ci_irq(int irq, void *data)
}
/* Handle device/host interrupt */
- if (ci->role != CI_ROLE_END)
+ if (ci->role != USB_ROLE_NONE)
ret = ci_role(ci)->irq(ci);
return ret;
@@ -835,7 +835,7 @@ static inline void ci_role_destroy(struct ci_hdrc *ci)
{
ci_hdrc_gadget_destroy(ci);
ci_hdrc_host_destroy(ci);
- if (ci->is_otg && ci->roles[CI_ROLE_GADGET])
+ if (ci->is_otg && ci->roles[USB_ROLE_DEVICE])
ci_hdrc_otg_destroy(ci);
}
@@ -860,7 +860,7 @@ static ssize_t role_show(struct device *dev, struct device_attribute *attr,
{
struct ci_hdrc *ci = dev_get_drvdata(dev);
- if (ci->role != CI_ROLE_END)
+ if (ci->role != USB_ROLE_NONE)
return sprintf(buf, "%s\n", ci_role(ci)->name);
return 0;
@@ -870,27 +870,27 @@ static ssize_t role_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t n)
{
struct ci_hdrc *ci = dev_get_drvdata(dev);
- enum ci_role role;
+ enum usb_role role;
int ret;
- if (!(ci->roles[CI_ROLE_HOST] && ci->roles[CI_ROLE_GADGET])) {
+ if (!(ci->roles[USB_ROLE_HOST] && ci->roles[USB_ROLE_DEVICE])) {
dev_warn(dev, "Current configuration is not dual-role, quit\n");
return -EPERM;
}
- for (role = CI_ROLE_HOST; role < CI_ROLE_END; role++)
+ for (role = USB_ROLE_DEVICE; role > USB_ROLE_NONE; role--)
if (!strncmp(buf, ci->roles[role]->name,
strlen(ci->roles[role]->name)))
break;
- if (role == CI_ROLE_END || role == ci->role)
+ if (role == USB_ROLE_NONE || role == ci->role)
return -EINVAL;
pm_runtime_get_sync(dev);
disable_irq(ci->irq);
ci_role_stop(ci);
ret = ci_role_start(ci, role);
- if (!ret && ci->role == CI_ROLE_GADGET)
+ if (!ret && ci->role == USB_ROLE_DEVICE)
ci_handle_vbus_change(ci);
enable_irq(ci->irq);
pm_runtime_put_sync(dev);
@@ -1037,13 +1037,13 @@ static int ci_hdrc_probe(struct platform_device *pdev)
}
}
- if (!ci->roles[CI_ROLE_HOST] && !ci->roles[CI_ROLE_GADGET]) {
+ if (!ci->roles[USB_ROLE_HOST] && !ci->roles[USB_ROLE_DEVICE]) {
dev_err(dev, "no supported roles\n");
ret = -ENODEV;
goto deinit_gadget;
}
- if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) {
+ if (ci->is_otg && ci->roles[USB_ROLE_DEVICE]) {
ret = ci_hdrc_otg_init(ci);
if (ret) {
dev_err(dev, "init otg fails, ret = %d\n", ret);
@@ -1051,7 +1051,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
}
}
- if (ci->roles[CI_ROLE_HOST] && ci->roles[CI_ROLE_GADGET]) {
+ if (ci->roles[USB_ROLE_HOST] && ci->roles[USB_ROLE_DEVICE]) {
if (ci->is_otg) {
ci->role = ci_otg_role(ci);
/* Enable ID change irq */
@@ -1062,17 +1062,17 @@ static int ci_hdrc_probe(struct platform_device *pdev)
* role switch, the defalt role is gadget, and the
* user can switch it through debugfs.
*/
- ci->role = CI_ROLE_GADGET;
+ ci->role = USB_ROLE_DEVICE;
}
} else {
- ci->role = ci->roles[CI_ROLE_HOST]
- ? CI_ROLE_HOST
- : CI_ROLE_GADGET;
+ ci->role = ci->roles[USB_ROLE_HOST]
+ ? USB_ROLE_HOST
+ : USB_ROLE_DEVICE;
}
if (!ci_otg_is_fsm_mode(ci)) {
/* only update vbus status for peripheral */
- if (ci->role == CI_ROLE_GADGET)
+ if (ci->role == USB_ROLE_DEVICE)
ci_handle_vbus_change(ci);
ret = ci_role_start(ci, ci->role);
@@ -1115,7 +1115,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
remove_debug:
dbg_remove_files(ci);
stop:
- if (ci->is_otg && ci->roles[CI_ROLE_GADGET])
+ if (ci->is_otg && ci->roles[USB_ROLE_DEVICE])
ci_hdrc_otg_destroy(ci);
deinit_gadget:
ci_hdrc_gadget_destroy(ci);
@@ -124,7 +124,7 @@ static int ci_qheads_show(struct seq_file *s, void *data)
unsigned long flags;
unsigned i, j;
- if (ci->role != CI_ROLE_GADGET) {
+ if (ci->role != USB_ROLE_DEVICE) {
seq_printf(s, "not in gadget mode\n");
return 0;
}
@@ -158,7 +158,7 @@ static int ci_requests_show(struct seq_file *s, void *data)
struct td_node *node, *tmpnode;
unsigned i, j, qsize = sizeof(struct ci_hw_td)/sizeof(u32);
- if (ci->role != CI_ROLE_GADGET) {
+ if (ci->role != USB_ROLE_DEVICE) {
seq_printf(s, "not in gadget mode\n");
return 0;
}
@@ -251,7 +251,7 @@ static int ci_role_show(struct seq_file *s, void *data)
{
struct ci_hdrc *ci = s->private;
- if (ci->role != CI_ROLE_END)
+ if (ci->role != USB_ROLE_NONE)
seq_printf(s, "%s\n", ci_role(ci)->name);
return 0;
@@ -262,20 +262,20 @@ static ssize_t ci_role_write(struct file *file, const char __user *ubuf,
{
struct seq_file *s = file->private_data;
struct ci_hdrc *ci = s->private;
- enum ci_role role;
+ enum usb_role role;
char buf[8];
int ret;
if (copy_from_user(buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
return -EFAULT;
- for (role = CI_ROLE_HOST; role < CI_ROLE_END; role++)
+ for (role = USB_ROLE_DEVICE; role > USB_ROLE_NONE; role--)
if (ci->roles[role] &&
!strncmp(buf, ci->roles[role]->name,
strlen(ci->roles[role]->name)))
break;
- if (role == CI_ROLE_END || role == ci->role)
+ if (role == USB_ROLE_NONE || role == ci->role)
return -EINVAL;
pm_runtime_get_sync(ci->dev);
@@ -198,7 +198,7 @@ static void host_stop(struct ci_hdrc *ci)
ci->platdata->notify_event(ci,
CI_HDRC_CONTROLLER_STOPPED_EVENT);
usb_remove_hcd(hcd);
- ci->role = CI_ROLE_END;
+ ci->role = USB_ROLE_NONE;
synchronize_irq(ci->irq);
usb_put_hcd(hcd);
if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci) &&
@@ -216,7 +216,7 @@ static void host_stop(struct ci_hdrc *ci)
void ci_hdrc_host_destroy(struct ci_hdrc *ci)
{
- if (ci->role == CI_ROLE_HOST && ci->hcd)
+ if (ci->role == USB_ROLE_HOST && ci->hcd)
host_stop(ci);
}
@@ -362,7 +362,7 @@ int ci_hdrc_host_init(struct ci_hdrc *ci)
rdrv->stop = host_stop;
rdrv->irq = host_irq;
rdrv->name = "host";
- ci->roles[CI_ROLE_HOST] = rdrv;
+ ci->roles[USB_ROLE_HOST] = rdrv;
return 0;
}
@@ -117,11 +117,11 @@ void hw_write_otgsc(struct ci_hdrc *ci, u32 mask, u32 data)
* ci_otg_role - pick role based on ID pin state
* @ci: the controller
*/
-enum ci_role ci_otg_role(struct ci_hdrc *ci)
+enum usb_role ci_otg_role(struct ci_hdrc *ci)
{
- enum ci_role role = hw_read_otgsc(ci, OTGSC_ID)
- ? CI_ROLE_GADGET
- : CI_ROLE_HOST;
+ enum usb_role role = hw_read_otgsc(ci, OTGSC_ID)
+ ? USB_ROLE_DEVICE
+ : USB_ROLE_HOST;
return role;
}
@@ -164,7 +164,7 @@ static int hw_wait_vbus_lower_bsv(struct ci_hdrc *ci)
static void ci_handle_id_switch(struct ci_hdrc *ci)
{
- enum ci_role role = ci_otg_role(ci);
+ enum usb_role role = ci_otg_role(ci);
if (role != ci->role) {
dev_dbg(ci->dev, "switching from %s to %s\n",
@@ -172,7 +172,7 @@ static void ci_handle_id_switch(struct ci_hdrc *ci)
ci_role_stop(ci);
- if (role == CI_ROLE_GADGET &&
+ if (role == USB_ROLE_DEVICE &&
IS_ERR(ci->platdata->vbus_extcon.edev))
/*
* Wait vbus lower than OTGSC_BSV before connecting
@@ -185,7 +185,7 @@ static void ci_handle_id_switch(struct ci_hdrc *ci)
ci_role_start(ci, role);
/* vbus change may have already occurred */
- if (role == CI_ROLE_GADGET)
+ if (role == USB_ROLE_DEVICE)
ci_handle_vbus_change(ci);
}
}
@@ -12,7 +12,7 @@ u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask);
void hw_write_otgsc(struct ci_hdrc *ci, u32 mask, u32 data);
int ci_hdrc_otg_init(struct ci_hdrc *ci);
void ci_hdrc_otg_destroy(struct ci_hdrc *ci);
-enum ci_role ci_otg_role(struct ci_hdrc *ci);
+enum usb_role ci_otg_role(struct ci_hdrc *ci);
void ci_handle_vbus_change(struct ci_hdrc *ci);
static inline void ci_otg_queue_work(struct ci_hdrc *ci)
{
@@ -547,10 +547,10 @@ static int ci_otg_start_host(struct otg_fsm *fsm, int on)
if (on) {
ci_role_stop(ci);
- ci_role_start(ci, CI_ROLE_HOST);
+ ci_role_start(ci, USB_ROLE_HOST);
} else {
ci_role_stop(ci);
- ci_role_start(ci, CI_ROLE_GADGET);
+ ci_role_start(ci, USB_ROLE_DEVICE);
}
return 0;
}
@@ -1606,7 +1606,7 @@ static int ci_udc_pullup(struct usb_gadget *_gadget, int is_on)
* Data+ pullup controlled by OTG state machine in OTG fsm mode;
* and don't touch Data+ in host mode for dual role config.
*/
- if (ci_otg_is_fsm_mode(ci) || ci->role == CI_ROLE_HOST)
+ if (ci_otg_is_fsm_mode(ci) || ci->role == USB_ROLE_DEVICE)
return 0;
pm_runtime_get_sync(&ci->gadget.dev);
@@ -1973,7 +1973,7 @@ static int udc_start(struct ci_hdrc *ci)
*/
void ci_hdrc_gadget_destroy(struct ci_hdrc *ci)
{
- if (!ci->roles[CI_ROLE_GADGET])
+ if (!ci->roles[USB_ROLE_DEVICE])
return;
usb_del_gadget_udc(&ci->gadget);
@@ -2039,7 +2039,7 @@ int ci_hdrc_gadget_init(struct ci_hdrc *ci)
ret = udc_start(ci);
if (!ret)
- ci->roles[CI_ROLE_GADGET] = rdrv;
+ ci->roles[USB_ROLE_DEVICE] = rdrv;
return ret;
}