linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: f.fainelli@gmail.com (Florian Fainelli)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 5/7] ARM: BCM63xx: Add Broadcom BCM63xx PMB controller helpers
Date: Fri, 17 Apr 2015 15:33:50 -0700	[thread overview]
Message-ID: <1429310032-19402-6-git-send-email-f.fainelli@gmail.com> (raw)
In-Reply-To: <1429310032-19402-1-git-send-email-f.fainelli@gmail.com>

This patch adds both common register definitions and helper functions
used to issue read/write commands to the Broadcom BCM63xx PMB controller
which is used to power on and release from reset internal on-chip
peripherals such as the integrated Ethernet switch, AHCI, USB, as well
as the secondary CPU core.

This is going to be utilized by the BCM63138 SMP code, as well as by the
BCM63138 reset controller later.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 include/linux/bcm63xx_pmb.h | 76 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)
 create mode 100644 include/linux/bcm63xx_pmb.h

diff --git a/include/linux/bcm63xx_pmb.h b/include/linux/bcm63xx_pmb.h
new file mode 100644
index 000000000000..2a2ea1bfb6cf
--- /dev/null
+++ b/include/linux/bcm63xx_pmb.h
@@ -0,0 +1,76 @@
+#ifndef __BCM63XX_PMB_H
+#define __BCM63XX_PMB_H
+
+#include <linux/io.h>
+#include <linux/types.h>
+#include <linux/delay.h>
+
+/* PMB Master controller register */
+#define PMB_CTRL		0x00
+#define  PMC_PMBM_START		(1 << 31)
+#define  PMC_PMBM_TIMEOUT	(1 << 30)
+#define  PMC_PMBM_SLAVE_ERR	(1 << 29)
+#define  PMC_PMBM_BUSY		(1 << 28)
+#define  PMC_PMBM_READ		(0 << 20)
+#define  PMC_PMBM_WRITE		(1 << 20)
+#define PMB_WR_DATA		0x04
+#define PMB_TIMEOUT		0x08
+#define PMB_RD_DATA		0x0C
+
+#define PMB_BUS_ID_SHIFT	8
+
+/* Perform the low-level PMB master operation, shared between reads and
+ * writes, caller must hold the spinlock
+ */
+static inline int __bpcm_do_op(void __iomem *master, unsigned int addr,
+			       u32 off, u32 op)
+{
+	unsigned int timeout = 1000;
+	u32 cmd;
+
+	cmd = (PMC_PMBM_START | op | (addr & 0xff) << 12 | off);
+	__raw_writel(cmd, master + PMB_CTRL);
+	do {
+		cmd = __raw_readl(master + PMB_CTRL);
+		if (!(cmd & PMC_PMBM_START))
+			return 0;
+
+		if (cmd & PMC_PMBM_SLAVE_ERR)
+			return -EIO;
+
+		if (cmd & PMC_PMBM_TIMEOUT)
+			return -ETIMEDOUT;
+
+		udelay(1);
+	} while (timeout-- > 0);
+
+	return -ETIMEDOUT;
+}
+
+static inline int bpcm_rd(void __iomem *master, unsigned int addr,
+			  u32 off, u32 *val)
+{
+	int ret = 0;
+
+	ret = __bpcm_do_op(master, addr, off >> 2, PMC_PMBM_READ);
+	*val = __raw_readl(master + PMB_RD_DATA);
+
+	return ret;
+}
+
+static inline int bpcm_wr(void __iomem *master, unsigned int addr,
+			  u32 off, u32 val)
+{
+	int ret = 0;
+
+	__raw_writel(val, master + PMB_WR_DATA);
+	/* Ensure that writes to the PMB_WR_DATA registers are taken
+	 * into account before attempting to start the PMB transaction
+	 */
+	mb();
+	ret = __bpcm_do_op(master, addr, off >> 2, PMC_PMBM_WRITE);
+
+	return ret;
+}
+
+#endif /* __BCM63XX_PMB_H */
-- 
2.1.0

  parent reply	other threads:[~2015-04-17 22:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-17 22:33 [PATCH 0/7] ARM: BCM63xx: SMP support Florian Fainelli
2015-04-17 22:33 ` [PATCH 1/7] Documentation: DT: Add Broadcom BCM63138 PMB binding Florian Fainelli
2015-04-18 19:41   ` Florian Fainelli
2015-04-17 22:33 ` [PATCH 2/7] ARM: dts: BCM63xx: Add PMB busses nodes Florian Fainelli
2015-04-17 22:33 ` [PATCH 3/7] Documentation: DT: Document SMP DT nodes and properties for BCM63138 Florian Fainelli
2015-04-17 22:33 ` [PATCH 4/7] ARM: dts: BCM63xx: Add SMP nodes and required properties Florian Fainelli
2015-04-17 22:33 ` Florian Fainelli [this message]
2015-04-17 22:33 ` [PATCH 6/7] ARM: BCM63xx: Add secondary CPU PMB initialization sequence Florian Fainelli
2015-04-17 22:33 ` [PATCH 7/7] ARM: BCM63xx: Add SMP support for BCM63138 Florian Fainelli
2015-04-17 23:22   ` Russell King - ARM Linux

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=1429310032-19402-6-git-send-email-f.fainelli@gmail.com \
    --to=f.fainelli@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).