linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: horms@verge.net.au (Simon Horman)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 05/11] ARM: shmobile: r8a7779: add USB common phy initializer
Date: Fri, 31 Aug 2012 10:28:16 +0900	[thread overview]
Message-ID: <1346376502-12114-6-git-send-email-horms@verge.net.au> (raw)
In-Reply-To: <1346376502-12114-1-git-send-email-horms@verge.net.au>

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds common USB phy ports initializer for r8a7779.

The note is that each USB IP have own MSTP clock bit,
and common USB phy port doesn't have MSTP clock,
but this USB phy needs USB clock.
Each USB driver / platform should keep USB MSTP clock somehow.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
 arch/arm/mach-shmobile/include/mach/common.h |  1 +
 arch/arm/mach-shmobile/setup-r8a7779.c       | 93 ++++++++++++++++++++++++++++
 2 files changed, 94 insertions(+)

diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h
index 45e61da..00b2eb5 100644
--- a/arch/arm/mach-shmobile/include/mach/common.h
+++ b/arch/arm/mach-shmobile/include/mach/common.h
@@ -78,6 +78,7 @@ extern void r8a7779_clock_init(void);
 extern void r8a7779_pinmux_init(void);
 extern void r8a7779_pm_init(void);
 extern void r8a7740_meram_workaround(void);
+extern int r8a7779_usb_phy_init(u32 usbpctrl0);
 
 extern unsigned int r8a7779_get_core_count(void);
 extern int r8a7779_platform_cpu_kill(unsigned int cpu);
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c
index e98e46f..17fdd1f 100644
--- a/arch/arm/mach-shmobile/setup-r8a7779.c
+++ b/arch/arm/mach-shmobile/setup-r8a7779.c
@@ -25,6 +25,7 @@
 #include <linux/delay.h>
 #include <linux/input.h>
 #include <linux/io.h>
+#include <linux/pm_runtime.h>
 #include <linux/serial_sci.h>
 #include <linux/sh_intc.h>
 #include <linux/sh_timer.h>
@@ -243,6 +244,98 @@ static struct platform_device *r8a7779_early_devices[] __initdata = {
 static struct platform_device *r8a7779_late_devices[] __initdata = {
 };
 
+/* USBH common register */
+#define USBPCTRL0	0x0800
+#define USBPCTRL1	0x0804
+#define USBST		0x0808
+#define USBEH0		0x080C
+#define USBOH0		0x081C
+#define USBCTL0		0x0858
+#define EIIBC1		0x0094
+#define EIIBC2		0x009C
+
+#ifdef CONFIG_ARCH_SUPPORTS_BIG_ENDIAN
+# define xHCI_ENDIAN "BIG"
+# define xHCI_NO_SWAP 0x00000003
+#else
+# define xHCI_ENDIAN "LITTLE"
+# define xHCI_NO_SWAP 0x00000000
+#endif
+
+/*
+ * USB initial/install operation.
+ *
+ * This function setup USB phy.
+ * The used value and setting order came from
+ * [USB :: Initial setting] on datasheet.
+ */
+int __init r8a7779_usb_phy_init(u32 usbpctrl0)
+{
+	void __iomem *reg0, *reg1;
+	int i;
+	u32 val;
+
+	reg0 = ioremap_nocache(0xffe70000, 0x900);
+	reg1 = ioremap_nocache(0xfff70000, 0x900);
+
+	/*----------------------------------------*
+	 * USB phy start-up
+	 *----------------------------------------*/
+
+	/* (1) USB-PHY standby release */
+	iowrite32(0x00000001, (reg0 + USBPCTRL1));
+
+	/* (2) start USB-PHY internal PLL */
+	iowrite32(0x00000003, (reg0 + USBPCTRL1));
+
+	/* (3) USB module status check */
+	for (i = 0; i < 1024; i++) {
+		udelay(10);
+		val = ioread32(reg0 + USBST);
+		if (0xc0000000 == val)
+			goto usb_module_is_working;
+	}
+	pr_err("USB module not ready\n");
+	return -EIO;
+
+usb_module_is_working:
+	/* (4) USB-PHY reset clear */
+	iowrite32(0x00000007, (reg0 + USBPCTRL1));
+
+	/* set platform specific port settings */
+	iowrite32(usbpctrl0, (reg0 + USBPCTRL0));
+
+	/*----------------------------------------*
+	 * EHCI IP Internal Buffer Setting
+	 *----------------------------------------*/
+
+	/* (1) EHCI IP internal buffer setting */
+	iowrite32(0x00ff0040, (reg0 + EIIBC1));
+	iowrite32(0x00ff0040, (reg1 + EIIBC1));
+
+	/* (2) EHCI IP internal buffer enable */
+	iowrite32(0x00000001, (reg0 + EIIBC2));
+	iowrite32(0x00000001, (reg1 + EIIBC2));
+
+	/*----------------------------------------*
+	 * Bus alignment settings
+	 *----------------------------------------*/
+
+	/* (1) EHCI bus alignment */
+	iowrite32(xHCI_NO_SWAP, (reg0 + USBEH0));
+
+	/* (1) OHCI bus alignment */
+	iowrite32(xHCI_NO_SWAP, (reg0 + USBOH0));
+
+	pr_info("USB xHCI alignment was initialized as %s endian no swap\n",
+		xHCI_ENDIAN);
+
+	iounmap(reg0);
+	iounmap(reg1);
+
+	return 0;
+}
+
 void __init r8a7779_add_standard_devices(void)
 {
 #ifdef CONFIG_CACHE_L2X0
-- 
1.7.10.2.484.gcd07cc5

  parent reply	other threads:[~2012-08-31  1:28 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-31  1:28 [GIT PULL v2] Renesas ARM-based SoC: Marzen and r8a7779 for 3.7 Simon Horman
2012-08-31  1:28 ` [PATCH 01/11] r8a7779: add SDHI clock support Simon Horman
2012-08-31  1:28 ` [PATCH 02/11] marzen: add SDHI0 support Simon Horman
2012-08-31  1:28 ` [PATCH 03/11] ARM: mach-shmobile: marzen: defconfig update Simon Horman
2012-08-31  1:28 ` [PATCH 04/11] ARM: shmobile: r8a7779: PFC rename PENCx -> USB_PENCx Simon Horman
2012-08-31  1:28 ` Simon Horman [this message]
2012-09-03 21:38   ` [PATCH 05/11] ARM: shmobile: r8a7779: add USB common phy initializer Arnd Bergmann
2012-09-04  0:21     ` Kuninori Morimoto
2012-09-04  0:34       ` Simon Horman
2012-09-04  4:50         ` [PATCH] ARM: shmobile: r8a7779: remove USB " Kuninori Morimoto
2012-09-05  1:20           ` Simon Horman
2012-09-05  1:23             ` Simon Horman
2012-09-05  2:00               ` Kuninori Morimoto
2012-09-05  8:13                 ` Simon Horman
2012-09-12  5:16                   ` Simon Horman
2012-09-12  5:31                     ` Kuninori Morimoto
2012-09-12  6:30                       ` Felipe Balbi
2012-09-12  7:16                         ` Kuninori Morimoto
2012-09-12  7:19                           ` Simon Horman
2012-08-31  1:28 ` [PATCH 06/11] ARM: shmobile: r8a7779: add USB EHCI clock support Simon Horman
2012-08-31  1:28 ` [PATCH 07/11] ARM: shmobile: r8a7779: add USB OHCI " Simon Horman
2012-08-31  1:28 ` [PATCH 08/11] ARM: shmobile: marzen: add USB EHCI driver support Simon Horman
2012-08-31  1:28 ` [PATCH 09/11] ARM: shmobile: marzen: fixup regulator id for smsc911x Simon Horman
2012-08-31  1:28 ` [PATCH 10/11] ARM: shmobile: marzen: enable thermal sensor Simon Horman
2012-08-31  1:28 ` [PATCH 11/11] ARM: shmobile: marzen: add USB OHCI driver support Simon Horman
2012-08-31  6:24 ` [GIT PULL v2] Renesas ARM-based SoC: Marzen and r8a7779 for 3.7 Simon Horman

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=1346376502-12114-6-git-send-email-horms@verge.net.au \
    --to=horms@verge.net.au \
    --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).