From: chao.xie@marvell.com (Chao Xie)
To: linux-arm-kernel@lists.infradead.org
Subject: [V8 PATCH 11/16] usb: phy: mv_usb2_phy: add externel chip support
Date: Wed, 20 Feb 2013 23:07:21 -0500 [thread overview]
Message-ID: <1361419646-9052-12-git-send-email-chao.xie@marvell.com> (raw)
In-Reply-To: <1361419646-9052-1-git-send-email-chao.xie@marvell.com>
For the vbus and idpin detection. It may be completed by some
external chip, for example the pmic chip 88pm860x in driver/mfd
can do it.
Although the usb controller can detect the vbus and id pin, but
it need clock on and PHY enabled to detect the
vbus/idpin. It will increase the power.
Using the external chip to detect vbus/idpin can save the power.
Signed-off-by: Chao Xie <chao.xie@marvell.com>
---
drivers/usb/phy/mv_usb2_phy.c | 49 +++++++++++++++++++
include/linux/platform_data/mv_usb.h | 15 ++----
include/linux/usb/mv_usb2.h | 89 ++++++++++++++++++++++++++++++++++
3 files changed, 143 insertions(+), 10 deletions(-)
diff --git a/drivers/usb/phy/mv_usb2_phy.c b/drivers/usb/phy/mv_usb2_phy.c
index a81e5e4..cbf207c 100644
--- a/drivers/usb/phy/mv_usb2_phy.c
+++ b/drivers/usb/phy/mv_usb2_phy.c
@@ -129,6 +129,53 @@ enum mv_usb2_phy_type {
MMP2_USB,
};
+int mv_usb2_register_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb)
+{
+ int ret;
+
+ if (!phy)
+ return -ENODEV;
+
+ ret = atomic_notifier_chain_register(&phy->extern_chip.head, nb);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+EXPORT_SYMBOL(mv_usb2_register_notifier);
+
+int mv_usb2_unregister_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb)
+{
+ int ret;
+
+ if (!phy)
+ return -ENODEV;
+
+ ret = atomic_notifier_chain_unregister(&phy->extern_chip.head, nb);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+EXPORT_SYMBOL(mv_usb2_unregister_notifier);
+
+int mv_usb2_notify(struct mv_usb2_phy *phy, unsigned long val, void *v)
+{
+ int ret;
+
+ if (!phy)
+ return -ENODEV;
+
+ ret = atomic_notifier_call_chain(&phy->extern_chip.head, val, v);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+EXPORT_SYMBOL(mv_usb2_notify);
+
static unsigned int u2o_get(void __iomem *base, unsigned int offset)
{
return readl(base + offset);
@@ -363,6 +410,8 @@ static int mv_usb2_phy_probe(struct platform_device *pdev)
usb_add_phy_dev(&mv_phy->phy);
+ ATOMIC_INIT_NOTIFIER_HEAD(&mv_phy->extern_chip.head);
+
platform_set_drvdata(pdev, mv_phy);
return 0;
diff --git a/include/linux/platform_data/mv_usb.h b/include/linux/platform_data/mv_usb.h
index fd3d1b4..dc25d60 100644
--- a/include/linux/platform_data/mv_usb.h
+++ b/include/linux/platform_data/mv_usb.h
@@ -28,16 +28,13 @@ enum {
VBUS_HIGH = 1 << 0,
};
-struct mv_usb_addon_irq {
- unsigned int irq;
- int (*poll)(void);
-};
-
+#define MV_USB_HAS_VBUS_DETECTION (1 << 0)
+#define MV_USB_HAS_IDPIN_DETECTION (1 << 1)
struct mv_usb_platform_data {
unsigned int clknum;
char **clkname;
- struct mv_usb_addon_irq *id; /* Only valid for OTG. ID pin change*/
- struct mv_usb_addon_irq *vbus; /* valid for OTG/UDC. VBUS change*/
+
+ unsigned int extern_attr;
/* only valid for HCD. OTG or Host only*/
unsigned int mode;
@@ -45,9 +42,7 @@ struct mv_usb_platform_data {
/* This flag is used for that needs id pin checked by otg */
unsigned int disable_otg_clock_gating:1;
/* Force a_bus_req to be asserted */
- unsigned int otg_force_a_bus_req:1;
-
- int (*set_vbus)(unsigned int vbus);
+ unsigned int otg_force_a_bus_req:1;
};
struct mv_usb_phy_platform_data {
diff --git a/include/linux/usb/mv_usb2.h b/include/linux/usb/mv_usb2.h
index 77250f5..f0bfacb 100644
--- a/include/linux/usb/mv_usb2.h
+++ b/include/linux/usb/mv_usb2.h
@@ -18,6 +18,33 @@
#define MV_USB2_PHY_INDEX 0
#define MV_USB2_OTG_PHY_INDEX 1
+enum {
+ EVENT_VBUS,
+ EVENT_ID,
+};
+
+struct pxa_usb_vbus_ops {
+ int (*get_vbus)(unsigned int *level);
+ int (*set_vbus)(unsigned int level);
+ int (*init)(void);
+};
+
+struct pxa_usb_idpin_ops {
+ int (*get_idpin)(unsigned int *level);
+ int (*init)(void);
+};
+
+struct pxa_usb_extern_ops {
+ struct pxa_usb_vbus_ops vbus;
+ struct pxa_usb_idpin_ops idpin;
+};
+
+struct mv_usb2_extern_chip {
+ unsigned int id;
+ struct pxa_usb_extern_ops ops;
+ struct atomic_notifier_head head;
+};
+
struct mv_usb2_phy {
struct usb_phy phy;
struct platform_device *pdev;
@@ -27,6 +54,68 @@ struct mv_usb2_phy {
void __iomem *base;
struct clk **clks;
unsigned int clks_num;
+ struct mv_usb2_extern_chip extern_chip;
};
+#if defined(CONFIG_MV_USB2_PHY) || defined(CONFIG_MV_USB2_PHY_MODULE)
+#define mv_usb2_has_extern_call(phy, o, f, arg...)( \
+{ \
+ int ret; \
+ ret = (!phy ? 0 : ((phy->extern_chip.ops.o.f) ? \
+ 1 : 0)); \
+ ret; \
+} \
+)
+
+#define mv_usb2_extern_call(phy, o, f, args...)( \
+{ \
+ int ret; \
+ ret = (!phy ? -ENODEV : ((phy->extern_chip.ops.o.f) ? \
+ phy->extern_chip.ops.o.f(args) : -ENOIOCTLCMD));\
+ ret; \
+} \
+)
+
+#define mv_usb2_set_extern_call(phy, o, f, p)( \
+{ \
+ int ret; \
+ ret = !phy ? -ENODEV : ((phy->extern_chip.ops.o.f) ? \
+ -EINVAL : ({phy->extern_chip.ops.o.f = p; 0; })); \
+ ret; \
+} \
+)
+
+extern int mv_usb2_register_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb);
+extern int mv_usb2_unregister_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb);
+extern int mv_usb2_notify(struct mv_usb2_phy *phy, unsigned long val, void *v);
+
+#else
+
+#define mv_usb2_has_extern_call(phy, o, f, arg...)(0)
+
+#define mv_usb2_extern_call(phy, o, f, args...)(0)
+
+#define mv_usb2_set_extern_call(phy, o, f, p)(0)
+
+int mv_usb2_register_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb)
+{
+ return -EINVAL;
+}
+
+int mv_usb2_unregister_notifier(struct mv_usb2_phy *phy,
+ struct notifier_block *nb)
+{
+ return -EINVAL;
+}
+
+int mv_usb2_notify(struct mv_usb2_phy *phy, unsigned long val, void *v)
+{
+ return 0;
+}
+
+#endif
+
#endif
--
1.7.4.1
next prev parent reply other threads:[~2013-02-21 4:07 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-21 4:07 [V8 PATCH 00/16] mv-usb phy enhancement patches Chao Xie
2013-02-21 4:07 ` [V8 PATCH 01/16] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller Chao Xie
2013-03-04 14:21 ` Felipe Balbi
2013-03-05 2:03 ` Chao Xie
2013-03-05 11:04 ` Felipe Balbi
2013-03-05 16:43 ` Alan Stern
2013-03-05 17:20 ` Felipe Balbi
2013-03-06 2:11 ` Chao Xie
2013-03-06 8:10 ` Felipe Balbi
2013-03-06 8:24 ` Chao Xie
2013-03-06 8:53 ` Felipe Balbi
2013-03-06 9:02 ` Chao Xie
2013-03-06 9:26 ` Felipe Balbi
2013-03-06 16:48 ` Russell King - ARM Linux
2013-03-07 0:57 ` Chao Xie
2013-03-06 16:45 ` Russell King - ARM Linux
2013-02-21 4:07 ` [V8 PATCH 02/16] usb: gadget: mv_udc: use PHY driver for udc Chao Xie
2013-03-04 14:24 ` Felipe Balbi
2013-03-05 2:11 ` Chao Xie
2013-02-21 4:07 ` [V8 PATCH 03/16] usb: ehci: ehci-mv: use PHY driver for ehci Chao Xie
2013-02-21 4:07 ` [V8 PATCH 04/16] usb: otg: mv_otg: use PHY driver for otg Chao Xie
2013-02-21 4:07 ` [V8 PATCH 05/16] arm: mmp2: change the defintion of usb devices Chao Xie
2013-02-21 4:07 ` [V8 PATCH 06/16] arm: pxa910: " Chao Xie
2013-02-21 4:07 ` [V8 PATCH 07/16] arm: brownstone: add usb support for the board Chao Xie
2013-02-21 4:07 ` [V8 PATCH 08/16] arm: ttc_dkb: add usb support Chao Xie
2013-02-21 4:07 ` [V8 PATCH 09/16] arm: mmp: remove the usb phy setting Chao Xie
2013-02-21 4:07 ` [V8 PATCH 10/16] arm: mmp: remove usb devices from pxa168 Chao Xie
2013-02-21 4:07 ` Chao Xie [this message]
2013-02-21 4:07 ` [V8 PATCH 12/16] usb: gadget: mv_udc: add extern chip support Chao Xie
2013-02-21 4:07 ` [V8 PATCH 13/16] usb: ehci: ehci-mv: " Chao Xie
2013-02-21 4:07 ` [V8 PATCH 14/16] usb: otg: mv_otg: " Chao Xie
2013-02-21 4:07 ` [V8 PATCH 15/16] arm: mmp: add extern chip support for brownstone Chao Xie
2013-02-21 4:07 ` [V8 PATCH 16/16] arm: mmp: add extern chip support for ttc_dkb Chao Xie
2013-02-21 8:04 ` [V8 PATCH 00/16] mv-usb phy enhancement patches Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1361419646-9052-12-git-send-email-chao.xie@marvell.com \
--to=chao.xie@marvell.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).