usb: chipidea: move otg related things to otg file
Move otg related things to otg file. Tested-by: Marek Vasut <marex@denx.de> Signed-off-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
c344b51800
commit
cbec6bd55a
@@ -24,12 +24,65 @@
|
||||
#include "otg.h"
|
||||
|
||||
/**
|
||||
* ci_hdrc_otg_init - initialize otgsc bits
|
||||
* ci_otg_role - pick role based on ID pin state
|
||||
* @ci: the controller
|
||||
*/
|
||||
enum ci_role ci_otg_role(struct ci_hdrc *ci)
|
||||
{
|
||||
u32 sts = hw_read(ci, OP_OTGSC, ~0);
|
||||
enum ci_role role = sts & OTGSC_ID
|
||||
? CI_ROLE_GADGET
|
||||
: CI_ROLE_HOST;
|
||||
|
||||
return role;
|
||||
}
|
||||
|
||||
/**
|
||||
* ci_role_work - perform role changing based on ID pin
|
||||
* @work: work struct
|
||||
*/
|
||||
static void ci_role_work(struct work_struct *work)
|
||||
{
|
||||
struct ci_hdrc *ci = container_of(work, struct ci_hdrc, work);
|
||||
enum ci_role role = ci_otg_role(ci);
|
||||
|
||||
if (role != ci->role) {
|
||||
dev_dbg(ci->dev, "switching from %s to %s\n",
|
||||
ci_role(ci)->name, ci->roles[role]->name);
|
||||
|
||||
ci_role_stop(ci);
|
||||
ci_role_start(ci, role);
|
||||
}
|
||||
|
||||
enable_irq(ci->irq);
|
||||
}
|
||||
|
||||
/**
|
||||
* ci_hdrc_otg_init - initialize otg struct
|
||||
* ci: the controller
|
||||
*/
|
||||
int ci_hdrc_otg_init(struct ci_hdrc *ci)
|
||||
{
|
||||
ci_enable_otg_interrupt(ci, OTGSC_IDIE);
|
||||
INIT_WORK(&ci->work, ci_role_work);
|
||||
ci->wq = create_singlethread_workqueue("ci_otg");
|
||||
if (!ci->wq) {
|
||||
dev_err(ci->dev, "can't create workqueue\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ci_hdrc_otg_destroy - destroy otg struct
|
||||
* ci: the controller
|
||||
*/
|
||||
void ci_hdrc_otg_destroy(struct ci_hdrc *ci)
|
||||
{
|
||||
if (ci->wq) {
|
||||
flush_workqueue(ci->wq);
|
||||
destroy_workqueue(ci->wq);
|
||||
}
|
||||
ci_disable_otg_interrupt(ci, OTGSC_INT_EN_BITS);
|
||||
ci_clear_otg_interrupt(ci, OTGSC_INT_STATUS_BITS);
|
||||
}
|
||||
|
Reference in New Issue
Block a user