linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
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

  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).