From: paul@pwsan.com (Paul Walmsley)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv2 09/12] ARM: OMAP2+: usb_host_fs: add custom setup_preprogram for usb_host_fs (fsusb)
Date: Sun, 10 Jun 2012 18:46:20 -0600 [thread overview]
Message-ID: <20120611004617.20034.21714.stgit@dusk> (raw)
In-Reply-To: <20120611004502.20034.8840.stgit@dusk>
Add a custom setup_preprogram function for the usb_host_fs/fsusb IP
block, and connect it to the OMAP4 FSUSB block.
This is the first of two fixes required to get rid of the boot
warning:
omap_hwmod: usb_host_fs: _wait_target_disable failed
and to allow the module to idle.
It may be necessary to use this reset method for OMAP2xxx SoCs as
well; this is left for a future patch.
Based on a patch originally written by Tero Kristo <t-kristo@ti.com>.
This second version of this patch moves the control functions to
include/linux/platform_data/aess.h at Tony's request:
http://www.spinics.net/lists/arm-kernel/msg178329.html
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Beno?t Cousson <b-cousson@ti.com>
Cc: Felipe Balbi <balbi@ti.com>
Cc: Tero Kristo <t-kristo@ti.com>
---
arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 2 +
include/linux/platform_data/fsusb.h | 105 ++++++++++++++++++++++++++++
2 files changed, 107 insertions(+)
create mode 100644 include/linux/platform_data/fsusb.h
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index 037424f..b8b28be 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -21,6 +21,7 @@
#include <linux/io.h>
#include <linux/platform_data/aess.h>
+#include <linux/platform_data/fsusb.h>
#include <plat/omap_hwmod.h>
#include <plat/cpu.h>
@@ -3314,6 +3315,7 @@ static struct omap_hwmod_class_sysconfig omap44xx_usb_host_fs_sysc = {
static struct omap_hwmod_class omap44xx_usb_host_fs_hwmod_class = {
.name = "usb_host_fs",
.sysc = &omap44xx_usb_host_fs_sysc,
+ .setup_preprogram = hwmod_fsusb_preprogram,
};
/* usb_host_fs */
diff --git a/include/linux/platform_data/fsusb.h b/include/linux/platform_data/fsusb.h
new file mode 100644
index 0000000..d1e08e0
--- /dev/null
+++ b/include/linux/platform_data/fsusb.h
@@ -0,0 +1,105 @@
+/*
+ * FSUSB IP block integration
+ *
+ * Copyright (C) 2012 Texas Instruments, Inc.
+ * Paul Walmsley
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+#ifndef __LINUX_PLATFORM_DATA_FSUSB_H__
+#define __LINUX_PLATFORM_DATA_FSUSB_H__
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+
+#include <plat/omap_hwmod.h>
+
+ /*
+ * MAX_MODULE_SOFTRESET_TIME: maximum time in microseconds to wait for
+ * an IP block to finish an OCP SOFTRESET.
+ */
+#define MAX_MODULE_SOFTRESET_TIME 10000
+
+ /*
+ * MAX_FSUSB_HCR_TIME: maximum time in microseconds to wait for the
+ * FSUSB block to complete its Host Controller Reset. This 30 ?s
+ * timeout comes from ohci-hcd.c:ohci_run().
+ */
+#define MAX_FSUSB_HCR_TIME 30
+
+/* HCCOMMANDSTATUS: the register offset of the HCCOMMANDSTATUS register */
+#define HCCOMMANDSTATUS 0x0008
+
+/* HCCOMMANDSTATUS_HCR: the bitmask of the host controller reset flag */
+#define HCCOMMANDSTATUS_HCR_MASK (1 << 0)
+
+/**
+ * fsusb_reset_host_controller - execute an OHCI host controller reset
+ * @name: string that uniquely identifies this on-chip instance of the IP block
+ * @base: base virtual address of the FSUSB IP block
+ *
+ * Run a Host Controller reset on the FSUSB IP block. At the
+ * conclusion of this reset, the controller will be in UsbSuspend
+ * mode. This differs from the OCP softreset, which leaves the
+ * controller in the UsbReset mode. (The FSUSB must be in UsbSuspend
+ * mode to indicate idle to the OMAP PRCM.) Returns 0 upon success
+ * or -EBUSY if the reset timed out.
+ */
+static int fsusb_reset_host_controller(const char *name, void __iomem *base)
+{
+ int i;
+
+ writel(HCCOMMANDSTATUS_HCR_MASK, base + HCCOMMANDSTATUS);
+
+ for (i = 0; i < MAX_FSUSB_HCR_TIME; i++) {
+ if (!(readl(base + HCCOMMANDSTATUS) & HCCOMMANDSTATUS_HCR_MASK))
+ break;
+ udelay(1);
+ }
+
+ if (i == MAX_FSUSB_HCR_TIME) {
+ pr_warn("%s: %s: host controller reset failed (waited %d usec)\n",
+ __func__, name, MAX_FSUSB_HCR_TIME);
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/**
+ * hwmod_fsusb_preprogram - place the FSUSB into UsbSuspend state
+ * @oh: struct omap_hwmod *
+ *
+ * Run a Host Controller Reset on the FSUSB. This will place the host
+ * controller into UsbSuspend state, which will cause the FSUSB
+ * indicate that it is idle to the OMAP PRCM. This is intended to run
+ * _after_ the OCP softreset, which can be handled via the standard
+ * function. Passes along the return value of
+ * fsusb_reset_host_controller().
+ */
+static int __maybe_unused hwmod_fsusb_preprogram(struct omap_hwmod *oh)
+{
+ void __iomem *va;
+
+ va = omap_hwmod_get_mpu_rt_va(oh);
+ if (!va)
+ return -EINVAL;
+
+ fsusb_reset_host_controller(oh->name, va);
+
+ return 0;
+}
+
+#endif /* __LINUX_PLATFORM_DATA_FSUSB_H__ */
next prev parent reply other threads:[~2012-06-11 0:46 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-11 0:45 [PATCHv2 00/12] ARM: OMAP: core/hwmod: first set of fixes for 3.5-rc Paul Walmsley
2012-06-11 0:45 ` [PATCHv2 01/12] ARM: OMAP: PM: Lock clocks list while generating summary Paul Walmsley
2012-06-11 0:45 ` [PATCHv2 02/12] ARM: OMAP2+: hwmod code/data: fix 32K sync timer Paul Walmsley
2012-06-14 16:47 ` Cousson, Benoit
2012-06-14 18:04 ` Paul Walmsley
2012-06-14 20:13 ` Cousson, Benoit
2012-06-15 0:18 ` Paul Walmsley
2012-06-15 13:28 ` Cousson, Benoit
2012-07-04 12:48 ` Paul Walmsley
2012-07-04 12:53 ` Paul Walmsley
2012-07-04 14:27 ` Kevin Hilman
2012-07-04 14:53 ` Paul Walmsley
2012-07-04 16:14 ` Benoit Cousson
2012-07-04 16:41 ` Tero Kristo
2012-07-04 16:43 ` Benoit Cousson
2012-07-04 19:02 ` Paul Walmsley
2012-07-04 16:57 ` Benoit Cousson
2012-07-04 18:59 ` Paul Walmsley
2012-07-05 22:06 ` Kevin Hilman
2012-07-04 16:01 ` Benoit Cousson
2012-07-04 19:05 ` Paul Walmsley
2012-06-11 0:46 ` [PATCHv2 03/12] ARM: OMAP4+: hwmod: fix issue causing IPs not going back to Smart-Standby Paul Walmsley
2012-06-11 0:46 ` [PATCHv2 04/12] ARM: OMAP4: hwmod data: fix 32k sync timer idle modes Paul Walmsley
2012-06-11 9:31 ` Cousson, Benoit
2012-06-13 17:22 ` Paul Walmsley
2012-06-11 0:46 ` [PATCHv2 05/12] ARM: OMAP2+: hwmod: add setup_preprogram hook Paul Walmsley
2012-06-11 0:46 ` [PATCHv2 06/12] ARM: OMAP2+: hwmod: add flag to prevent hwmod code from touching IP block during init Paul Walmsley
2012-06-11 0:46 ` [PATCHv2 07/12] ARM: OMAP4+: AESS: enable internal auto-gating during initial setup Paul Walmsley
2012-06-11 6:29 ` Tony Lindgren
2012-06-14 9:49 ` Paul Walmsley
2012-06-14 9:59 ` Tony Lindgren
2012-06-11 0:46 ` [PATCHv2 08/12] ARM: OMAP4: hwmod data: add SL2IF hardreset line Paul Walmsley
2012-06-14 12:55 ` Cousson, Benoit
2012-06-14 17:09 ` Paul Walmsley
2012-06-14 21:07 ` Cousson, Benoit
2012-06-14 23:02 ` Paul Walmsley
2012-06-15 9:11 ` Cousson, Benoit
2012-06-11 0:46 ` Paul Walmsley [this message]
2012-06-11 6:34 ` [PATCHv2 09/12] ARM: OMAP2+: usb_host_fs: add custom setup_preprogram for usb_host_fs (fsusb) Tony Lindgren
2012-06-11 7:13 ` Felipe Balbi
2012-06-11 7:41 ` Tony Lindgren
2012-06-11 7:48 ` Felipe Balbi
2012-06-11 8:03 ` Tony Lindgren
2012-06-11 9:12 ` Felipe Balbi
2012-06-11 0:46 ` [PATCHv2 10/12] ARM: OMAP2+: CM: increase the module disable timeout Paul Walmsley
2012-06-11 0:46 ` [PATCHv2 11/12] ARM: OMAP4: clock data: add clockdomains for clocks used as main clocks Paul Walmsley
2012-06-11 16:28 ` Cousson, Benoit
2012-06-11 16:59 ` Paul Walmsley
2012-06-11 20:15 ` Cousson, Benoit
2012-06-11 0:46 ` [PATCHv2 12/12] ARM: OMAP4: hwmod data: do not enable or reset the McPDM during kernel init Paul Walmsley
2012-06-11 9:54 ` Cousson, Benoit
2012-10-30 4:05 ` Paul Walmsley
2012-10-30 7:41 ` Péter Ujfalusi
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=20120611004617.20034.21714.stgit@dusk \
--to=paul@pwsan.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).