From: xiechao.mail@gmail.com (Chao Xie)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 19/29] usb: phy: mv_usb2_phy: add externel chip support
Date: Wed, 21 Nov 2012 21:05:00 -0500 [thread overview]
Message-ID: <1353549910-988-19-git-send-email-xiechao.mail@gmail.com> (raw)
In-Reply-To: <1353549910-988-1-git-send-email-xiechao.mail@gmail.com>
From: Chao Xie <chao.xie@marvell.com>
For the vbus and idpin detection. It may be completed by some
external chip.
The controller need clock on and PHY enabled to detect the
vbus/idpin. It will increase the power. So using the external
chip to detect the vbus and idpin can save the power.
Signed-off-by: Chao Xie <xiechao.mail@gmail.com>
---
drivers/usb/phy/mv_usb2_phy.c | 54 +++++++++++++++++++++++++++++
include/linux/platform_data/mv_usb.h | 15 +++-----
include/linux/usb/mv_usb2.h | 62 ++++++++++++++++++++++++++++++++++
3 files changed, 121 insertions(+), 10 deletions(-)
diff --git a/drivers/usb/phy/mv_usb2_phy.c b/drivers/usb/phy/mv_usb2_phy.c
index ed82bf3..0f81dca 100644
--- a/drivers/usb/phy/mv_usb2_phy.c
+++ b/drivers/usb/phy/mv_usb2_phy.c
@@ -136,6 +136,53 @@ struct mv_usb2_phy *mv_usb2_get_phy(void)
}
EXPORT_SYMBOL(mv_usb2_get_phy);
+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_relaxed(base + offset);
@@ -414,6 +461,13 @@ static int __devinit usb_phy_probe(struct platform_device *pdev)
mv_phy->init = usb_phy_init;
mv_phy->shutdown = usb_phy_shutdown;
+ mv_phy->extern_chip.head = devm_kzalloc(&pdev->dev,
+ sizeof(*mv_phy->extern_chip.head),
+ GFP_KERNEL);
+ if (mv_phy->extern_chip.head == NULL)
+ return -ENOMEM;
+ ATOMIC_INIT_NOTIFIER_HEAD(mv_phy->extern_chip.head);
+
platform_set_drvdata(pdev, mv_phy);
the_phy = mv_phy;
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 5d3d7bd..3e34b94 100644
--- a/include/linux/usb/mv_usb2.h
+++ b/include/linux/usb/mv_usb2.h
@@ -17,6 +17,33 @@
#include <linux/clk.h>
+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 platform_device *pdev;
struct mutex phy_lock;
@@ -26,10 +53,45 @@ struct mv_usb2_phy {
struct clk **clks;
unsigned int clks_num;
+ struct mv_usb2_extern_chip extern_chip;
+
int (*init)(struct mv_usb2_phy *mv_phy);
void (*shutdown)(struct mv_usb2_phy *mv_phy);
};
struct mv_usb2_phy *mv_usb2_get_phy(void);
+#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);
+
#endif
--
1.7.4.1
next prev parent reply other threads:[~2012-11-22 2:05 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-22 2:04 [PATCH 01/29] usb: gadget: mv_udc: use udc_start and udc_stop functions Chao Xie
2012-11-22 2:04 ` [PATCH 02/29] usb: gadget: mv_udc: use devm_xxx for probe Chao Xie
2012-11-22 2:04 ` [PATCH 03/29] usb: gadget: mv_udc: fix the clk APIs Chao Xie
2012-11-22 2:04 ` [PATCH 04/29] usb: otg: mv_otg: use devm_xxx for probe Chao Xie
2012-11-22 2:04 ` [PATCH 05/29] usb: otg: mv_otg: fix the clk APIs Chao Xie
2012-11-22 2:04 ` [PATCH 06/29] usb: host: ehci-mv: fix " Chao Xie
2012-11-23 16:06 ` Alan Stern
2012-11-22 2:04 ` [PATCH 07/29] usb: host: ehci-mv: remove unused variable Chao Xie
2012-11-22 2:04 ` [PATCH 08/29] usb: gadget: mv_udc: fix the value of tranceiver Chao Xie
2012-11-22 2:04 ` [PATCH 09/29] usb: phy: mv_usb2: add PHY driver for marvell usb2 controller Chao Xie
2012-11-22 2:04 ` [PATCH 10/29] usb: gadget: mv_udc: use PHY driver for udc Chao Xie
2012-11-22 2:04 ` [PATCH 11/29] usb: ehci: ehci-mv: use PHY driver for ehci Chao Xie
2012-11-22 2:04 ` [PATCH 12/29] usb: otg: mv_otg: use PHY driver for otg Chao Xie
2012-11-22 2:04 ` [PATCH 13/29] arm: mmp2: change the defintion of usb devices Chao Xie
2012-11-22 2:04 ` [PATCH 14/29] arm: pxa910: " Chao Xie
2012-11-22 2:04 ` [PATCH 15/29] arm: brownstone: add usb support for the board Chao Xie
2012-11-22 2:04 ` [PATCH 16/29] arm: ttc_dkb: add usb support Chao Xie
2012-11-22 2:04 ` [PATCH 17/29] arm: mmp: remove the usb phy setting Chao Xie
2012-11-22 2:04 ` [PATCH 18/29] arm: mmp: remove usb devices from pxa168 Chao Xie
2012-11-22 2:05 ` Chao Xie [this message]
2012-11-22 2:05 ` [PATCH 20/29] usb: gadget: mv_udc: add extern chip support Chao Xie
2012-11-22 2:05 ` [PATCH 21/29] usb: ehci: ehci-mv: " Chao Xie
2012-11-22 2:05 ` [PATCH 22/29] usb: otg: mv_otg: " Chao Xie
2012-11-22 2:05 ` [PATCH 23/29] arm: mmp: add extern chip support for brownstone Chao Xie
2012-11-22 2:05 ` [PATCH 24/29] arm: mmp: add extern chip support for ttc_dkb Chao Xie
2012-11-22 2:05 ` [PATCH 25/29] usb: gadget: mv_udc: add device tree support Chao Xie
2012-11-22 2:05 ` [PATCH 26/29] usb: otg: mv_otg: " Chao Xie
2012-11-22 2:05 ` [PATCH 27/29] usb: ehci: ehci-mv: " Chao Xie
2012-11-22 2:05 ` [PATCH 28/29] arm: mmp: devicetree: add usb support for mmp2 Chao Xie
2012-11-22 2:05 ` [PATCH 29/29] arm: mmp: devicetree: add usb support for pxa910_dkb Chao Xie
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=1353549910-988-19-git-send-email-xiechao.mail@gmail.com \
--to=xiechao.mail@gmail.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).