[Meego-kernel] [PATCH 1/3] usb: add support for MHL-USB coexistence
Wu, Hao
hao.wu at intel.com
Mon Dec 6 04:57:51 PST 2010
>From 4599750d1c6fd11672d7f8182bd9443795911e22 Mon Sep 17 00:00:00 2001
From: Hao Wu <hao.wu at intel.com>
Date: Sun, 28 Nov 2010 15:05:03 +0800
Subject: [PATCH] usb: add support for MHL-USB coexistence
MHL (Mobile High-Definition Link) shares the same port with USB OTG
to connect mobile device to HDMI and MHL enabled external devices
such as HDTVs. Communication with USB OTG drivers is a must to
decide who (MHL or USB OTG) takes control of the USB OTG port.
This patch adds members to otg data structure to support MHL.
Signed-off-by: Hao Wu <hao.wu at intel.com>
---
include/linux/usb/otg.h | 72 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 72 insertions(+), 0 deletions(-)
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
index 685943f..070d039 100644
--- a/include/linux/usb/otg.h
+++ b/include/linux/usb/otg.h
@@ -33,6 +33,9 @@ enum usb_otg_state {
OTG_STATE_A_PERIPHERAL,
OTG_STATE_A_WAIT_VFALL,
OTG_STATE_A_VBUS_ERR,
+
+ /* MHL mode */
+ OTG_STATE_MHL,
};
enum usb_xceiv_events {
@@ -73,6 +76,7 @@ struct otg_transceiver {
u8 default_a;
enum usb_otg_state state;
+ struct mutex state_mutex;
struct usb_bus *host;
struct usb_gadget *gadget;
@@ -119,6 +123,17 @@ struct otg_transceiver {
/* detect a charger */
int (*detect_charger)(struct otg_transceiver *otg) __deprecated;
+
+ /* enter/exit MHL mode */
+ int (*enter_mhl_mode)(struct otg_transceiver *otg);
+ int (*exit_mhl_mode)(struct otg_transceiver *otg);
+
+ /* MHL support */
+ struct mutex mhl_mutex;
+ /* call this function with mhl_lock held */
+ int (*mhl_notify)(struct otg_transceiver *otg,
+ int event, void *mhldata);
+ void *mhl_data;
};
@@ -237,6 +252,63 @@ otg_detect_charger(struct otg_transceiver *otg)
return 0;
}
+static inline int
+otg_enter_mhl_mode(struct otg_transceiver *otg)
+{
+ if (otg->enter_mhl_mode)
+ return otg->enter_mhl_mode(otg);
+
+ return -EINVAL;
+}
+
+static inline int
+otg_exit_mhl_mode(struct otg_transceiver *otg)
+{
+ if (otg->exit_mhl_mode)
+ return otg->exit_mhl_mode(otg);
+
+ return -EINVAL;
+}
+
+static inline int
+otg_register_mhl_notify(struct otg_transceiver *otg,
+ int (*mhl_notify)(struct otg_transceiver *, int, void *), void *mhldata)
+{
+ if (mhl_notify == NULL)
+ return -EINVAL;
+
+ mutex_lock(&otg->mhl_mutex);
+ otg->mhl_notify = mhl_notify;
+ otg->mhl_data = mhldata;
+ mutex_unlock(&otg->mhl_mutex);
+
+ return 0;
+}
+
+static inline void
+otg_unregister_mhl_notify(struct otg_transceiver *otg)
+{
+ mutex_lock(&otg->mhl_mutex);
+ if (otg->mhl_notify) {
+ otg->mhl_notify = NULL;
+ otg->mhl_data = NULL;
+ }
+ mutex_unlock(&otg->mhl_mutex);
+}
+
+static inline int
+otg_mhl_notify(struct otg_transceiver *otg, int event)
+{
+ int retval = -EINVAL;
+
+ mutex_lock(&otg->mhl_mutex);
+ if (otg->mhl_notify)
+ retval = otg->mhl_notify(otg, event, otg->mhl_data);
+ mutex_unlock(&otg->mhl_mutex);
+
+ return retval;
+}
+
/* notifiers */
static inline int
otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
--
1.6.0.6
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-usb-add-support-for-MHL-USB-coexistence.patch
Type: application/octet-stream
Size: 3063 bytes
Desc: 0001-usb-add-support-for-MHL-USB-coexistence.patch
URL: <http://lists.meego.com/pipermail/meego-kernel/attachments/20101206/66b095f0/attachment.obj>
More information about the MeeGo-kernel
mailing list