diff options
author | Erik Gilling <konkers@android.com> | 2011-08-09 14:18:21 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:38:59 -0800 |
commit | cc2a67dbcfca983943606a0c57db2853ff5cf616 (patch) | |
tree | d0fc8be1b30cc58ec08f60fdc1e8bba1205b0885 | |
parent | 1a7647f77e16b1e21cd0076d36f81ff22f9be67c (diff) |
usb: otg: add proxy_wait handler to otg_id
Some otg_id handlers can detect what's connected but can't detect a change.
This allows that handler to pass off the waiting for ID change to a proxy.
Change-Id: Ib38b750c3da4bffc35e37b620ecee37c5d64d31f
Signed-off-by: Erik Gilling <konkers@android.com>
-rw-r--r-- | drivers/usb/otg/otg_id.c | 12 | ||||
-rw-r--r-- | include/linux/usb/otg_id.h | 6 |
2 files changed, 16 insertions, 2 deletions
diff --git a/drivers/usb/otg/otg_id.c b/drivers/usb/otg/otg_id.c index 2398b1a951d4..ce22b4621308 100644 --- a/drivers/usb/otg/otg_id.c +++ b/drivers/usb/otg/otg_id.c @@ -44,16 +44,24 @@ static void __otg_id_notify(void) { int ret; struct otg_id_notifier_block *otg_id_nb; - + bool proxy_wait = false; if (plist_head_empty(&otg_id_plist)) return; plist_for_each_entry(otg_id_nb, &otg_id_plist, p) { - ret = otg_id_nb->detect(otg_id_nb); + if (proxy_wait) { + if (otg_id_nb->proxy_wait) + ret = otg_id_nb->proxy_wait(otg_id_nb); + } else { + ret = otg_id_nb->detect(otg_id_nb); + } if (ret == OTG_ID_HANDLED) { otg_id_active = otg_id_nb; return; } + if (ret == OTG_ID_PROXY_WAIT) + proxy_wait = true; + } WARN(1, "otg id event not handled"); diff --git a/include/linux/usb/otg_id.h b/include/linux/usb/otg_id.h index b686ab067957..46a44637c117 100644 --- a/include/linux/usb/otg_id.h +++ b/include/linux/usb/otg_id.h @@ -28,6 +28,10 @@ * get called first. * @detect: Called during otg_id_notify. Return OTG_ID_HANDLED if the USB cable * has been identified + * @proxy_wait: Called during otg_id_notify if a previous handler returns + * OTG_ID_PROXY_WAIT. This should wait on ID change then call otg_id_notify. + * This is used when a handler knows what's connected but can't detect + * the change itself. * @cancel: Called after detect has returned OTG_ID_HANDLED to ask it to * release detection resources to allow a new identification to occur. */ @@ -35,10 +39,12 @@ struct otg_id_notifier_block { int priority; int (*detect)(struct otg_id_notifier_block *otg_id_nb); + int (*proxy_wait)(struct otg_id_notifier_block *otg_id_nb); void (*cancel)(struct otg_id_notifier_block *otg_id_nb); struct plist_node p; }; +#define OTG_ID_PROXY_WAIT 2 #define OTG_ID_HANDLED 1 #define OTG_ID_UNHANDLED 0 |