Skip to contentSkip to conversation

Support for Fujitsu MB86S7X SoCs

PATCH New Vincent Yang 4 participants 15 messages Feb 6, 2015 – Mar 3, 2015

Subsystems (6)
lore
Share & tools
lore
#0 lore raw

v6 cover Support for Fujitsu MB86S7X SoCs

Hello,

Fujitsu have a series of SoC already shipping based around
variations of 2xCA7+2xCA15 big.LITTLE architecture, and we would like to upstream the basic support in this series.

MB86S70 is a big.LITTLE platform with 2xCA7+2xCA15 and an additional
CM3 as the master. MB86S73 is a simple 2xCA7 and an additional CM3 master.

The DT includes references to sdhci patches which are being sent to
the mmc list at the same time.

We welcome any comments or questions.

Changes since v5:
* Pass u32* instead of u32 value to/from mailbox api.
* devm_ioremap_resource() instead of devm_ioremap()
* Decrease verbosity of probe success print.

Changes since v4:
* Convert ARM MHU driver to be an AMBA driver

Changes since v3:
* Identify platform, by checking presence of DT node "fujitsu,mb86s70-scb-1.0" before populating cpu clocks and MCPM support.
* Disable clock upon gpio module remove
* Lower init level of gpio driver from subsys_initcall to module_init
* Use managed device resource allocation in MHU driver

Changes since v2:
* Minor cleanup of MCPM as suggested by Nicolas Pitre.

Changes since v1:
* Thanks to Arnd, modified clock driver to populate clocks only when some user need them. Node name changed from "fujitsu,mb86s70-clk" to "fujitsu,mb86s70-crg11" . Controller+Domain+Port of a clock are now three cells specified by the user node.
* aliases moved into board DTS files
* Voltage supply moved as per-board DT node.
* Removed default overly verbose loglevel=8
* Specify -march=armv7-a flag for mcpm.c and smc.S that contain ARMv7 specific code.
* Removed wrongly put outer_flush_all(), now using standard v7_exit_coherency_flush() instead of platform specific macro.
* Simplified GPIO offset calculations in gpio-mb86s70.c driver. And added .remove() for the driver
* ARM MHU driver provided a .remove() to enable module unloading.
* A few other misc cleanups suggested in v1 submission.

Thanks.

Jassi Brar (7):
ARM: Add platform support for Fujitsu MB86S7X SoCs
mailbox: arm_mhu: add driver for ARM MHU controller
ARM: MB86S7X: Add MCPM support
clk: Add clock driver for mb86s7x
dt: mb86s7x: add dt files for MB86S7x evbs
of: add Fujitsu vendor prefix
ARM: MB86S7x: Add configs

 Documentation/devicetree/bindings/arm/mb86s7x.txt  |   8 +
 .../bindings/clock/fujitsu,mb86s70-crg11.txt       |  26 +
 .../devicetree/bindings/mailbox/arm-mhu.txt        |  35 ++
 .../devicetree/bindings/soc/mb86s7x/scb_mhu.txt    |  35 ++
 .../devicetree/bindings/vendor-prefixes.txt        |   1 +
 MAINTAINERS                                        |   7 +
 arch/arm/Kconfig                                   |   2 +
 arch/arm/Makefile                                  |   1 +
 arch/arm/boot/dts/Makefile                         |   1 +
 arch/arm/boot/dts/mb86s70.dtsi                     |  91 ++++
 arch/arm/boot/dts/mb86s70eb.dts                    |  57 +++
 arch/arm/boot/dts/mb86s73.dtsi                     |  63 +++
 arch/arm/boot/dts/mb86s73eb.dts                    |  44 ++
 arch/arm/boot/dts/mb86s7x.dtsi                     | 142 ++++++
 arch/arm/configs/fujitsu_defconfig                 | 232 +++++++++
 arch/arm/configs/multi_v7_defconfig                |   5 +
 arch/arm/mach-mb86s7x/Kconfig                      |  19 +
 arch/arm/mach-mb86s7x/Makefile                     |   3 +
 arch/arm/mach-mb86s7x/board.c                      |  23 +
 arch/arm/mach-mb86s7x/mcpm.c                       | 318 ++++++++++++
 arch/arm/mach-mb86s7x/smc.S                        |  27 ++
 drivers/clk/Makefile                               |   1 +
 drivers/clk/clk-mb86s7x.c                          | 386 +++++++++++++++
 drivers/mailbox/Kconfig                            |   7 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/arm_mhu.c                          | 196 ++++++++
 drivers/soc/Makefile                               |   1 +
 drivers/soc/mb86s7x/Makefile                       |   4 +
 drivers/soc/mb86s7x/scb_mhu.c                      | 531 +++++++++++++++++++++
 include/soc/mb86s7x/scb_mhu.h                      | 105 ++++
 30 files changed, 2373 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/arm/mb86s7x.txt
 create mode 100644 Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt
 create mode 100644 Documentation/devicetree/bindings/mailbox/arm-mhu.txt
 create mode 100644 Documentation/devicetree/bindings/soc/mb86s7x/scb_mhu.txt
 create mode 100644 arch/arm/boot/dts/mb86s70.dtsi
 create mode 100644 arch/arm/boot/dts/mb86s70eb.dts
 create mode 100644 arch/arm/boot/dts/mb86s73.dtsi
 create mode 100644 arch/arm/boot/dts/mb86s73eb.dts
 create mode 100644 arch/arm/boot/dts/mb86s7x.dtsi
 create mode 100644 arch/arm/configs/fujitsu_defconfig
 create mode 100644 arch/arm/mach-mb86s7x/Kconfig
 create mode 100644 arch/arm/mach-mb86s7x/Makefile
 create mode 100644 arch/arm/mach-mb86s7x/board.c
 create mode 100644 arch/arm/mach-mb86s7x/mcpm.c
 create mode 100644 arch/arm/mach-mb86s7x/smc.S
 create mode 100644 drivers/clk/clk-mb86s7x.c
 create mode 100644 drivers/mailbox/arm_mhu.c
 create mode 100644 drivers/soc/mb86s7x/Makefile
 create mode 100644 drivers/soc/mb86s7x/scb_mhu.c
 create mode 100644 include/soc/mb86s7x/scb_mhu.h
Signature · 1 line
1.9.0
#1 lore raw

PATCH v6 1/7 ARM: Add platform support for Fujitsu MB86S7X SoCs

From: Jassi Brar <[email protected]>

The MB86S7X is a bigLITTLE configuration of 2xCA7 & 2xCA15 under Linux. And the remote master firmware (called SCB) running on CM3. Linux asks for things to be done over Mailbox API, to SCB which controls most of the important things. variations S70 & S73 are supported.

---
 Documentation/devicetree/bindings/arm/mb86s7x.txt  |   8 +
 .../devicetree/bindings/soc/mb86s7x/scb_mhu.txt    |  35 ++
 MAINTAINERS                                        |   7 +
 arch/arm/Kconfig                                   |   2 +
 arch/arm/Makefile                                  |   1 +
 arch/arm/mach-mb86s7x/Kconfig                      |  19 +
 arch/arm/mach-mb86s7x/Makefile                     |   1 +
 arch/arm/mach-mb86s7x/board.c                      |  23 +
 drivers/soc/Makefile                               |   1 +
 drivers/soc/mb86s7x/Makefile                       |   4 +
 drivers/soc/mb86s7x/scb_mhu.c                      | 517 +++++++++++++++++++++
 include/soc/mb86s7x/scb_mhu.h                      |  97 ++++
 12 files changed, 715 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/arm/mb86s7x.txt
 create mode 100644 Documentation/devicetree/bindings/soc/mb86s7x/scb_mhu.txt
 create mode 100644 arch/arm/mach-mb86s7x/Kconfig
 create mode 100644 arch/arm/mach-mb86s7x/Makefile
 create mode 100644 arch/arm/mach-mb86s7x/board.c
 create mode 100644 drivers/soc/mb86s7x/Makefile
 create mode 100644 drivers/soc/mb86s7x/scb_mhu.c
 create mode 100644 include/soc/mb86s7x/scb_mhu.h
Documentation/devicetree/bindings/arm/mb86s7x.txt new file +8 -0
new file mode 100644
index 0000000..fbaad20
@@ -0,0 +1,8 @@
+Fujitsu MB86S7X Device Tree Bindings
+
+Fujitsu has a few closely related platforms that are basically different
+configurations of each others. Like MB86S7{0,1,2,3}.
+
+The EVB boards with S70/S73 have the following property:
+Required root node property:
+	compatible: must contain "fujitsu,mb86s70-evb" or "fujitsu,mb86s73-evb"
Documentation/devicetree/bindings/soc/mb86s7x/scb_mhu.txt new file +35 -0
new file mode 100644
index 0000000..f466a05
@@ -0,0 +1,35 @@
+Fujitsu SCB (Mailbox's Remote Firmware) bindings
+------------------------------------------------
+
+The firmware (running of a remote Cortex-M3 master) on Fujitsu's MB86S7X
+platforms is named SCB. The SCB owns most of core h/w IPs like Clock,
+CPUFreq/DVFS, CPUIdle/SMP, Thermal, a recovery block device and even an
+I2C controller. Linux has to map all of these functionalities on to
+the Mailbox API and get things done by the remote master.
+ Let the current state of SCB firmware be versioned 1.0.
+
+Required properties :
+- compatible : Shall contain "fujitsu,mb86s70-scb-1.0"
+- reg : Point to SharedMemory used for Mailbox protocol.
+- mboxes : phandle to the mailbox controller:channel node.
+
+The consumer specifies the desired clock pointing to its phandle.
+
+Example:
+
+	mhu: mhu0 at 2b1f0000 {
+		#mbox-cells = <1>;
+		compatible = "arm,mhu";
+		reg = <0 0x2b1f0000 0x1000>;
+		interrupts = <0 36 4>, /* LP Non-Sec */
+			     <0 35 4>, /* HP Non-Sec */
+			     <0 37 4>; /* Secure */
+		clocks = <&clk 0 2 1>;
+		clock-names = "apb_pclk";
+	};
+
+	mhu_client: scb at 2e000000 {
+		compatible = "fujitsu,mb86s70-scb-1.0";
+		reg = <0 0x2e000000 0x4000>; /* SHM for IPC */
+		mboxes = <&mhu 1>;
+	};
MAINTAINERS +7 -0
index aaa039d..1436e34 100644
@@ -1111,6 +1111,13 @@ M:	Lennert Buytenhek <[email protected]>
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 S:	Maintained
 
+ARM/MB86S7X SOC SUPPORT
+M:	Vincent Yang <[email protected]>
+M:	Tetsuya Nuriya <[email protected]>
+L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
+S:	Supported
+F:	arch/arm/mach-mb86s7x/
+
 ARM/TEXAS INSTRUMENT KEYSTONE ARCHITECTURE
 M:	Santosh Shilimkar <[email protected]>
 L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
arch/arm/Kconfig +2 -0
index 97d07ed..3c80a9b 100644
@@ -884,6 +884,8 @@ source "arch/arm/mach-keystone/Kconfig"
 
 source "arch/arm/mach-ks8695/Kconfig"
 
+source "arch/arm/mach-mb86s7x/Kconfig"
+
 source "arch/arm/mach-meson/Kconfig"
 
 source "arch/arm/mach-msm/Kconfig"
arch/arm/Makefile +1 -0
index c1785ee..c65aff2 100644
@@ -167,6 +167,7 @@ machine-$(CONFIG_ARCH_IXP4XX)		+= ixp4xx
 machine-$(CONFIG_ARCH_KEYSTONE)		+= keystone
 machine-$(CONFIG_ARCH_KS8695)		+= ks8695
 machine-$(CONFIG_ARCH_LPC32XX)		+= lpc32xx
+machine-$(CONFIG_ARCH_MB86S7X)		+= mb86s7x
 machine-$(CONFIG_ARCH_MESON)		+= meson
 machine-$(CONFIG_ARCH_MMP)		+= mmp
 machine-$(CONFIG_ARCH_MOXART)		+= moxart
arch/arm/mach-mb86s7x/Kconfig new file +19 -0
new file mode 100644
index 0000000..f58b104
@@ -0,0 +1,19 @@
+config ARCH_MB86S7X
+	bool "Fujitsu MB86S7x platforms" if ARCH_MULTI_V7
+	select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
+	select ARCH_HAS_CPUFREQ
+	select ARCH_HAS_OPP
+	select ARCH_REQUIRE_GPIOLIB
+	select ARM_AMBA
+	select ARM_CCI
+	select ARM_GIC
+	select ARM_TIMER_SP804
+	select BIG_LITTLE
+	select HAVE_ARM_ARCH_TIMER
+	select MAILBOX
+	select PINCTRL
+	select PINCTRL_MB86S7X
+	select PM_OPP
+	select ZONE_DMA if ARM_LPAE
+	help
+	  Support for Fujitsu MB86S7x based platforms
arch/arm/mach-mb86s7x/Makefile new file +1 -0
new file mode 100644
index 0000000..97640b6
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_MB86S7X)	+= board.o
arch/arm/mach-mb86s7x/board.c new file +23 -0
new file mode 100644
index 0000000..222b63f
@@ -0,0 +1,23 @@
+/*
+ * Support for the Fujitsu's MB86S7x based devices.
+ *
+ * Copyright (C) 2015 Linaro, LTD
+ *
+ * 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 of the License.
+ *
+ */
+
+#include <linux/of.h>
+#include <asm/mach/arch.h>
+
+static const char *mb86s7x_dt_match[] __initconst = {
+	"fujitsu,mb86s70-evb",
+	"fujitsu,mb86s73-evb",
+	NULL,
+};
+
+DT_MACHINE_START(MB86S7X_DT, "Fujitsu MB86S7X-based board")
+	.dt_compat	= mb86s7x_dt_match,
+MACHINE_END
drivers/soc/Makefile +1 -0
index 063113d..fb64bf2 100644
@@ -2,6 +2,7 @@
 # Makefile for the Linux Kernel SOC specific device drivers.
 #
 
+obj-$(CONFIG_ARCH_MB86S7X)	+= mb86s7x/
 obj-$(CONFIG_ARCH_QCOM)		+= qcom/
 obj-$(CONFIG_ARCH_TEGRA)	+= tegra/
 obj-$(CONFIG_SOC_TI)		+= ti/
drivers/soc/mb86s7x/Makefile new file +4 -0
new file mode 100644
index 0000000..f6b96cf
@@ -0,0 +1,4 @@
+#
+# Fujitsu's MB86S7X drivers
+#
+obj-$(CONFIG_ARCH_MB86S7X)	+= scb_mhu.o
drivers/soc/mb86s7x/scb_mhu.c new file +517 -0

517 lines not on this page · raw message

include/soc/mb86s7x/scb_mhu.h new file +97 -0

97 lines not on this page · raw message

Signature · 1 line
1.9.0
#2 lore raw

PATCH v6 2/7 mailbox: arm_mhu: add driver for ARM MHU controller

In reply to Vincent Yang

From: Jassi Brar <[email protected]>

Add driver for the ARM Primecell Message-Handling-Unit(MHU) controller.

---
 .../devicetree/bindings/mailbox/arm-mhu.txt        |  35 ++++
 drivers/mailbox/Kconfig                            |   7 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/arm_mhu.c                          | 196 +++++++++++++++++++++
 4 files changed, 240 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/arm-mhu.txt
 create mode 100644 drivers/mailbox/arm_mhu.c
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +35 -0
new file mode 100644
index 0000000..986a205
@@ -0,0 +1,35 @@
+ARM MHU Mailbox Driver
+======================
+
+The ARM's Message-Handling-Unit (MHU) is a mailbox controller that has
+3 independent channels/links to communicate with remote processor(s).
+ MHU links are hardwired on a platform. A link raises interrupt for any
+received data. However, there is no specified way of knowing if the sent
+data has been read by the remote. This driver assumes the sender polls
+STAT register and the remote clears it after having read the data.
+
+Mailbox Device Node:
+====================
+
+Required properties:
+--------------------
+- compatible:		Shall be "arm,mhu" & "arm,primecell"
+- reg:			Contains the mailbox register address range (base
+			address and length)
+- #mbox-cells		Shall be 1
+- interrupts:		Contains the interrupt information corresponding to
+			each of the 3 links of MHU.
+
+Example:
+--------
+
+	mhu: mailbox at 2b1f0000 {
+		#mbox-cells = <1>;
+		compatible = "arm,mhu", "arm,primecell";
+		reg = <0 0x2b1f0000 0x1000>;
+		interrupts = <0 36 4>,
+			     <0 35 4>,
+			     <0 37 4>;
+		clocks = <&clock 0 2 1>;
+		clock-names = "apb_pclk";
+	};
drivers/mailbox/Kconfig +7 -0
index c04fed9..9238440 100644
@@ -6,6 +6,13 @@ menuconfig MAILBOX
 	  signals. Say Y if your platform supports hardware mailboxes.
 
 if MAILBOX
+
+config ARM_MHU
+	tristate "ARM MHU Mailbox"
+	depends on ARM
+	help
+	  Say Y here if you want to build the ARM MHU controller driver
+
 config PL320_MBOX
 	bool "ARM PL320 Mailbox"
 	depends on ARM_AMBA
drivers/mailbox/Makefile +2 -0
index dd412c2..c83791d 100644
@@ -2,6 +2,8 @@
 
 obj-$(CONFIG_MAILBOX)		+= mailbox.o
 
+obj-$(CONFIG_ARM_MHU)	+= arm_mhu.o
+
 obj-$(CONFIG_PL320_MBOX)	+= pl320-ipc.o
 
 obj-$(CONFIG_OMAP2PLUS_MBOX)	+= omap-mailbox.o
drivers/mailbox/arm_mhu.c new file +196 -0

196 lines not on this page · raw message

Signature · 1 line
1.9.0
#3 lore raw

PATCH v6 2/7 mailbox: arm_mhu: add driver for ARM MHU controller

Quoted 23 lines · Vincent Yang

From: Jassi Brar <[email protected]>

Add driver for the ARM Primecell Message-Handling-Unit(MHU) controller.

---
  .../devicetree/bindings/mailbox/arm-mhu.txt        |  35 ++++
  drivers/mailbox/Kconfig                            |   7 +
  drivers/mailbox/Makefile                           |   2 +
  drivers/mailbox/arm_mhu.c                          | 196 +++++++++++++++++++++
  4 files changed, 240 insertions(+)

create mode 100644 Documentation/devicetree/bindings/mailbox/arm-mhu.txt create mode 100644 drivers/mailbox/arm_mhu.c

Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +0 -0
new file mode 100644
index 0000000..986a205

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 7

Quoted 7 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +7 -0
@@ -0,0 +1,35 @@
+ARM MHU Mailbox Driver
+======================
+
+The ARM's Message-Handling-Unit (MHU) is a mailbox controller that has
+3 independent channels/links to communicate with remote processor(s).
+ MHU links are hardwired on a platform. A link raises interrupt for any
+received data. However, there is no specified way of knowing if the sent

IIUC the IP as such doesn't have this restriction, it's just the way currently integrated in the SoCs. So we need to provide a way for future expansion.

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 10

Quoted 3 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +3 -0
+data has been read by the remote. This driver assumes the sender polls
+STAT register and the remote clears it after having read the data.
+

I would rather drop any specifics about what driver does. Bindings should try to confine to the underlying hardware only if possible.

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 19

Quoted 9 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +9 -0
+Mailbox Device Node:
+====================
+
+Required properties:
+--------------------
+- compatible:		Shall be "arm,mhu" & "arm,primecell"
+- reg:			Contains the mailbox register address range (base
+			address and length)
+- #mbox-cells		Shall be 1

Need to explain what that one cell must represent.

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 22

Quoted 3 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +3 -0
+- interrupts:		Contains the interrupt information corresponding to
+			each of the 3 links of MHU.
+

How do we handle if the middle link has no interrupt ?
Also please that the last channel is secure only and must not be used in non-secure execution.

Quoted 18 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +13 -0
+Example:
+--------
+
+	mhu: mailbox at 2b1f0000 {
+		#mbox-cells = <1>;
+		compatible = "arm,mhu", "arm,primecell";
+		reg = <0 0x2b1f0000 0x1000>;
+		interrupts = <0 36 4>,
+			     <0 35 4>,
+			     <0 37 4>;
+		clocks = <&clock 0 2 1>;
+		clock-names = "apb_pclk";
+	};
drivers/mailbox/Kconfig +0 -0
index c04fed9..9238440 100644

drivers/mailbox/Kconfig menuconfig MAILBOX · line 15

Quoted 10 lines
drivers/mailbox/Kconfig +7 -0
@@ -6,6 +6,13 @@ menuconfig MAILBOX
  	  signals. Say Y if your platform supports hardware mailboxes.
 
  if MAILBOX
+
+config ARM_MHU
+	tristate "ARM MHU Mailbox"
+	depends on ARM
+	help
+	  Say Y here if you want to build the ARM MHU controller driver
+

May be a brief one/2-liners on what IP does might be useful ?

Quoted 51 lines
drivers/mailbox/Kconfig +0 -0
  config PL320_MBOX
  	bool "ARM PL320 Mailbox"
  	depends on ARM_AMBA
drivers/mailbox/Makefile +2 -0
index dd412c2..c83791d 100644
@@ -2,6 +2,8 @@
 
  obj-$(CONFIG_MAILBOX)		+= mailbox.o
 
+obj-$(CONFIG_ARM_MHU)	+= arm_mhu.o
+
  obj-$(CONFIG_PL320_MBOX)	+= pl320-ipc.o
 
  obj-$(CONFIG_OMAP2PLUS_MBOX)	+= omap-mailbox.o
drivers/mailbox/arm_mhu.c new file +29 -0
new file mode 100644
index 0000000..d6fd1cd
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2013-2015 Fujitsu Semiconductor Ltd.
+ * Copyright (C) 2015 Linaro Ltd.
+ * Author: Jassi Brar <[email protected]>
+ *
+ * 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 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+#include <linux/mutex.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/amba/bus.h>
+#include <linux/mailbox_controller.h>
+
+#define INTR_STAT_OFS	0x0
+#define INTR_SET_OFS	0x8
+#define INTR_CLR_OFS	0x10

drivers/mailbox/arm_mhu.c line 39

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+
+struct mhu_link {
+	unsigned irq;
+	void __iomem *tx_reg;
+	void __iomem *rx_reg;
+};
+
+struct arm_mhu {
+	void __iomem *base;
+	struct mhu_link mlink[3];

Replace "3" with some macro throughout the file.

Quoted 17 lines
drivers/mailbox/arm_mhu.c new file +17 -0
+	struct mbox_chan chan[3];
+	struct mbox_controller mbox;
+};
+
+static irqreturn_t mhu_rx_interrupt(int irq, void *p)
+{
+	struct mbox_chan *chan = p;
+	struct mhu_link *mlink = chan->con_priv;
+	u32 val;
+
+	val = readl_relaxed(mlink->rx_reg + INTR_STAT_OFS);
+	if (!val)
+		return IRQ_NONE;
+
+	mbox_chan_received_data(chan, (void *)&val);
+
+	writel_relaxed(val, mlink->rx_reg + INTR_CLR_OFS);

drivers/mailbox/arm_mhu.c line 66

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+
+	return IRQ_HANDLED;
+}
+
+static bool mhu_last_tx_done(struct mbox_chan *chan)
+{
+	struct mhu_link *mlink = chan->con_priv;
+	u32 val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);
+
+	return (val == 0);

[Nit] How about just

	return readl_relaxed(mlink->tx_reg + INTR_STAT_OFS) == 0;

drivers/mailbox/arm_mhu.c line 78

Quoted 12 lines
drivers/mailbox/arm_mhu.c new file +12 -0
+}
+
+static int mhu_send_data(struct mbox_chan *chan, void *data)
+{
+	struct mhu_link *mlink = chan->con_priv;
+	u32 *arg = data;
+
+	if (!mhu_last_tx_done(chan)) {
+		dev_err(chan->mbox->dev, "Last TX(%d) pending!\n", mlink->irq);
+		return -EBUSY;
+	}
+

Why do you need the above check when the core handles that already ?

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+	writel_relaxed(*arg, mlink->tx_reg + INTR_SET_OFS);
+
+	return 0;
+}
+
+static int mhu_startup(struct mbox_chan *chan)
+{
+	struct mhu_link *mlink = chan->con_priv;
+	u32 val;
+	int ret;

drivers/mailbox/arm_mhu.c line 98

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+
+	val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);
+	writel_relaxed(val, mlink->tx_reg + INTR_CLR_OFS);
+
+	ret = request_irq(mlink->irq, mhu_rx_interrupt, 0, "mhu_link", chan);
+	if (ret) {
+		dev_err(chan->mbox->dev,
+			"Unable to aquire IRQ %d\n", mlink->irq);
+		return ret;
+	}

This proved costly(in terms of time) on Juno board in my testing, requesting and setting up irq for every small packets you need to send. I would prefer it to be moved to probe.

Quoted 25 lines
drivers/mailbox/arm_mhu.c new file +25 -0
+
+	return 0;
+}
+
+static void mhu_shutdown(struct mbox_chan *chan)
+{
+	struct mhu_link *mlink = chan->con_priv;
+
+	free_irq(mlink->irq, chan);
+}
+
+static struct mbox_chan_ops mhu_ops = {
+	.send_data = mhu_send_data,
+	.startup = mhu_startup,
+	.shutdown = mhu_shutdown,
+	.last_tx_done = mhu_last_tx_done,
+};
+
+static int mhu_probe(struct amba_device *adev, const struct amba_id *id)
+{
+	int i, err;
+	struct arm_mhu *mhu;
+	struct device *dev = &adev->dev;
+	int mhu_reg[3] = {0x0, 0x20, 0x200};
+

drivers/mailbox/arm_mhu.c line 133

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+	err = amba_request_regions(adev, NULL);
+	if (err)
+		return err;
+
+	/* Allocate memory for device */
+	mhu = devm_kzalloc(dev, sizeof(*mhu), GFP_KERNEL);
+	if (!mhu)
+		return -ENOMEM;
+
+	mhu->base = devm_ioremap_resource(dev, &adev->res);

This will either explode or warn as you have already requested the regions. Have you run this code after converting to amba bus device ?

drivers/mailbox/arm_mhu.c line 143

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+	if (IS_ERR(mhu->base)) {
+		dev_err(dev, "ioremap failed\n");
+		return PTR_ERR(mhu->base);
+	}
+
+	for (i = 0; i < 3; i++) {
+		mhu->chan[i].con_priv = &mhu->mlink[i];
+		mhu->mlink[i].irq = adev->irq[i];
+		mhu->mlink[i].rx_reg = mhu->base + mhu_reg[i];
+		mhu->mlink[i].tx_reg = mhu->mlink[i].rx_reg + 0x100;

Again a macro for 0x100 ?

drivers/mailbox/arm_mhu.c line 152

Quoted 9 lines
drivers/mailbox/arm_mhu.c new file +9 -0
+	}
+
+	mhu->mbox.dev = dev;
+	mhu->mbox.chans = &mhu->chan[0];
+	mhu->mbox.num_chans = 3;
+	mhu->mbox.ops = &mhu_ops;
+	mhu->mbox.txdone_irq = false;
+	mhu->mbox.txdone_poll = true;
+	mhu->mbox.txpoll_period = 10;

10ms seems to high, but if that's a derived value then I am fine. On Juno, typically we get response within a millisecond, so we need not get blocked on Tx even after getting Rx for 10ms. I prefer it to be set to 1 ms.

Quoted 15 lines
drivers/mailbox/arm_mhu.c new file +15 -0
+
+	amba_set_drvdata(adev, mhu);
+
+	err = mbox_controller_register(&mhu->mbox);
+	if (err) {
+		dev_err(dev, "Failed to register mailboxes %d\n", err);
+		return err;
+	}
+
+	dev_info(dev, "ARM MHU Mailbox registered\n");
+	return 0;
+}
+
+static int mhu_remove(struct amba_device *adev)
+{

drivers/mailbox/arm_mhu.c line 177

Quoted 10 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+	struct arm_mhu *mhu = amba_get_drvdata(adev);
+
+	mbox_controller_unregister(&mhu->mbox);
+
+	return 0;
+}
+
+static struct amba_id mhu_ids[] = {
+	{
+		.id	= 0x1bb098,

This is the problem. This IP has PID(0x98 0xB0 0x1B 0x00 0x04) it's 5 bytes[1] . Even I had thought of AMBA initially, it doesn't fit as is, may need changes to the amba core to consider this.

Regards,
Sudeep

[1] http://infocenter.arm.com/help/topic/com.arm.doc.ddi0515b/CHDCHJEH.html

#4 lore raw

PATCH v6 2/7 mailbox: arm_mhu: add driver for ARM MHU controller

Quoted 15 lines · Sudeep Holla

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 7

Quoted 9 lines

+++ b/Documentation/devicetree/bindings/mailbox/arm-mhu.txt

Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +7 -0
@@ -0,0 +1,35 @@
+ARM MHU Mailbox Driver
+======================
+
+The ARM's Message-Handling-Unit (MHU) is a mailbox controller that has
+3 independent channels/links to communicate with remote processor(s).
+ MHU links are hardwired on a platform. A link raises interrupt for any
+received data. However, there is no specified way of knowing if the sent

IIUC the IP as such doesn't have this restriction, it's just the way currently integrated in the SoCs. So we need to provide a way for future expansion.

Quoted 6 lines

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 9

Quoted 2 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +2 -0
+data has been read by the remote. This driver assumes the sender polls
+STAT register and the remote clears it after having read the data.

I would rather drop any specifics about what driver does. Bindings should try to confine to the underlying hardware only if possible.

The behavior of local controller and remote firmware clubbed together is what mailbox drivers have to deal with.

For example, if the remote f/w doesn't clear the STAT register after
reading it, this driver won't have a way to know if the last tx has been done or not, i.e, mhu_last_tx_done() won't work. And that behavior is not decided by Linux/driver, so is in a way a h/w feature. Does your remote f/w not clear the STAT?

Quoted 12 lines

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 19

Quoted 9 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +9 -0
+Mailbox Device Node:
+====================
+
+Required properties:
+--------------------
+- compatible:          Shall be "arm,mhu" & "arm,primecell"
+- reg:                 Contains the mailbox register address range (base
+                       address and length)
+- #mbox-cells          Shall be 1

Need to explain what that one cell must represent.

Quoted 6 lines
Quoted 3 lines
(quoted diff) +1 -0
+- interrupts:          Contains the interrupt information corresponding

to
+ each of the 3 links of MHU.

How do we handle if the middle link has no interrupt ?

The MHU chapter in my SoC manual suggests the specification requires an RX-IRQ per channel. Does your platform omit the irq?

Quoted 3 lines

Also please that the last channel is secure only and must not be used in non-secure execution.

I am aware and it is perfectly possible to not touch the secure channel from NS mode.

Quoted 10 lines

drivers/mailbox/Kconfig menuconfig MAILBOX · line 15

Quoted 6 lines
drivers/mailbox/Kconfig +6 -0
+config ARM_MHU
+       tristate "ARM MHU Mailbox"
+       depends on ARM
+       help
+         Say Y here if you want to build the ARM MHU controller driver
+

May be a brief one/2-liners on what IP does might be useful ?

OK.

Quoted 8 lines

drivers/mailbox/arm_mhu.c line 39

Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+
+struct arm_mhu {
+       void __iomem *base;
+       struct mhu_link mlink[3];

Replace "3" with some macro throughout the file.

Good point.

Quoted 10 lines

drivers/mailbox/arm_mhu.c line 66

Quoted 7 lines
drivers/mailbox/arm_mhu.c new file +7 -0
+
+static bool mhu_last_tx_done(struct mbox_chan *chan)
+{
+       struct mhu_link *mlink = chan->con_priv;
+       u32 val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);
+
+       return (val == 0);

[Nit] How about just

Quoted 2 lines
        return readl_relaxed(mlink->tx_reg + INTR_STAT_OFS) == 0;

I think (val == 0) is less cluttered.

Quoted 4 lines
Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+static int mhu_send_data(struct mbox_chan *chan, void *data)
+{
+       struct mhu_link *mlink = chan->con_priv;
+       u32 *arg = data;
Quoted 9 lines

Review

Quoted 6 lines
drivers/mailbox/arm_mhu.c new file +3 -0
+
+       if (!mhu_last_tx_done(chan)) {
+               dev_err(chan->mbox->dev, "Last TX(%d) pending!\n",

mlink->irq);

(quoted diff) +2 -0
+               return -EBUSY;
+       }

Why do you need the above check when the core handles that already ?

Our bootloader also uses mhu so we could have failed/pending bits in STAT when Linux first tries to use it. However since then the driver clears the STAT register upon startup, so this could probably be dropped. Will do.

Quoted 12 lines
Quoted 12 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+static int mhu_startup(struct mbox_chan *chan)
+{
+       struct mhu_link *mlink = chan->con_priv;
+       u32 val;
+       int ret;
+
+       val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);
+       writel_relaxed(val, mlink->tx_reg + INTR_CLR_OFS);
+
+       ret = request_irq(mlink->irq, mhu_rx_interrupt, 0, "mhu_link",

chan);
+ if (ret) {

Quoted 9 lines

drivers/mailbox/arm_mhu.c line 98

Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+               dev_err(chan->mbox->dev,
+                       "Unable to aquire IRQ %d\n", mlink->irq);
+               return ret;
+       }

This proved costly(in terms of time) on Juno board in my testing, requesting and setting up irq for every small packets you need to send. I would prefer it to be moved to probe.

If your usage of mailbox is so frequent that request-release of irq proves expensive, maybe you could fix your client to hold onto the channel for the lifetime. I don't see why your scpi_protocol.c shouldn't do that, even if request_irq was in probe.

Quoted 12 lines
Quoted 12 lines
drivers/mailbox/arm_mhu.c new file +12 -0
+static int mhu_probe(struct amba_device *adev, const struct amba_id *id)
+{
+       int i, err;
+       struct arm_mhu *mhu;
+       struct device *dev = &adev->dev;
+       int mhu_reg[3] = {0x0, 0x20, 0x200};
+
+       err = amba_request_regions(adev, NULL);
+       if (err)
+               return err;
+
+       /* Allocate memory for device */
Quoted 9 lines

drivers/mailbox/arm_mhu.c line 133

Quoted 5 lines
drivers/mailbox/arm_mhu.c new file +5 -0
+       mhu = devm_kzalloc(dev, sizeof(*mhu), GFP_KERNEL);
+       if (!mhu)
+               return -ENOMEM;
+
+       mhu->base = devm_ioremap_resource(dev, &adev->res);

This will either explode or warn as you have already requested the regions. Have you run this code after converting to amba bus device ?

Hmm... this was supposed to be tested before sending out the patchset, but probably overlooked because we have shim api for before mailbox driver is probed. Yeah we need to drop the amba_request_regions. Thanks.

Quoted 9 lines

drivers/mailbox/arm_mhu.c line 143

Quoted 5 lines
drivers/mailbox/arm_mhu.c new file +5 -0
+       for (i = 0; i < 3; i++) {
+               mhu->chan[i].con_priv = &mhu->mlink[i];
+               mhu->mlink[i].irq = adev->irq[i];
+               mhu->mlink[i].rx_reg = mhu->base + mhu_reg[i];
+               mhu->mlink[i].tx_reg = mhu->mlink[i].rx_reg + 0x100;

Again a macro for 0x100 ?

Sure :)

Quoted 9 lines

drivers/mailbox/arm_mhu.c line 152

Quoted 8 lines
drivers/mailbox/arm_mhu.c new file +8 -0
+
+       mhu->mbox.dev = dev;
+       mhu->mbox.chans = &mhu->chan[0];
+       mhu->mbox.num_chans = 3;
+       mhu->mbox.ops = &mhu_ops;
+       mhu->mbox.txdone_irq = false;
+       mhu->mbox.txdone_poll = true;
+       mhu->mbox.txpoll_period = 10;
Quoted 5 lines

10ms seems to high, but if that's a derived value then I am fine. On Juno, typically we get response within a millisecond, so we need not get blocked on Tx even after getting Rx for 10ms. I prefer it to be set to 1 ms.

Similar on my platform. However 1 isn't much meaning in milliseconds because mod_timer works in jiffiy which is usually atleast 5ms. If we are polling we can't anyway expect latency critical stuff, so 10ms seems like a safe bet.

Quoted 10 lines

drivers/mailbox/arm_mhu.c line 177

Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+
+static struct amba_id mhu_ids[] = {
+       {
+               .id     = 0x1bb098,

This is the problem. This IP has PID(0x98 0xB0 0x1B 0x00 0x04) it's 5 bytes[1] . Even I had thought of AMBA initially, it doesn't fit as is, may need changes to the amba core to consider this.

How is that a problem? AMBA chooses to compare 32bits of PID for the class. The PID4 might change across versions of MHU, which we could figure out in the mhu driver in future.

-Jassi

#5 lore raw

PATCH v6 2/7 mailbox: arm_mhu: add driver for ARM MHU controller

Quoted 23 lines · Jassi Brar
Quoted 15 lines · Sudeep Holla

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 7

Quoted 9 lines

+++ b/Documentation/devicetree/bindings/mailbox/arm-mhu.txt

Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +7 -0
@@ -0,0 +1,35 @@
+ARM MHU Mailbox Driver
+======================
+
+The ARM's Message-Handling-Unit (MHU) is a mailbox controller that has
+3 independent channels/links to communicate with remote processor(s).
+ MHU links are hardwired on a platform. A link raises interrupt for any
+received data. However, there is no specified way of knowing if the sent

IIUC the IP as such doesn't have this restriction, it's just the way currently integrated in the SoCs. So we need to provide a way for future expansion.

Quoted 6 lines

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 9

Quoted 2 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +2 -0
+data has been read by the remote. This driver assumes the sender polls
+STAT register and the remote clears it after having read the data.

I would rather drop any specifics about what driver does. Bindings should try to confine to the underlying hardware only if possible.

Quoted 7 lines

The behavior of local controller and remote firmware clubbed together is what mailbox drivers have to deal with.

For example, if the remote f/w doesn't clear the STAT register after
reading it, this driver won't have a way to know if the last tx has been done or not, i.e, mhu_last_tx_done() won't work. And that behavior is not decided by Linux/driver, so is in a way a h/w feature.

OK then mention it as the firmware. Don't tell anything about what the driver assumes, that's Linux/driver specific.

Quoted 2 lines

Does your remote f/w not clear the STAT?

It does.

Quoted 12 lines
Quoted 12 lines

Documentation/devicetree/bindings/mailbox/arm-mhu.txt line 19

Quoted 9 lines
Documentation/devicetree/bindings/mailbox/arm-mhu.txt new file +9 -0
+Mailbox Device Node:
+====================
+
+Required properties:
+--------------------
+- compatible:          Shall be "arm,mhu" & "arm,primecell"
+- reg:                 Contains the mailbox register address range (base
+                       address and length)
+- #mbox-cells          Shall be 1

Need to explain what that one cell must represent.

Quoted 9 lines
Quoted 6 lines
Quoted 3 lines
(quoted diff) +1 -0
+- interrupts:          Contains the interrupt information corresponding

to
+ each of the 3 links of MHU.

How do we handle if the middle link has no interrupt ?

The MHU chapter in my SoC manual suggests the specification requires an RX-IRQ per channel. Does your platform omit the irq?

What if there's a platform with broken irq, it just can skip that in DT if we use named interrupts in the binding.

Quoted 6 lines
Quoted 3 lines

Also please that the last channel is secure only and must not be used in non-secure execution.

I am aware and it is perfectly possible to not touch the secure channel from NS mode.

Sorry my statement was not clear, I wanted to ask you to add that info to the binding.

[...]

Quoted 12 lines
Quoted 10 lines

drivers/mailbox/arm_mhu.c line 66

Quoted 7 lines
drivers/mailbox/arm_mhu.c new file +7 -0
+
+static bool mhu_last_tx_done(struct mbox_chan *chan)
+{
+       struct mhu_link *mlink = chan->con_priv;
+       u32 val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);
+
+       return (val == 0);

[Nit] How about just

Quoted 2 lines
         return readl_relaxed(mlink->tx_reg + INTR_STAT_OFS) == 0;
Quoted 2 lines

I think (val == 0) is less cluttered.

OK

Quoted 13 lines
Quoted 4 lines
Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+static int mhu_send_data(struct mbox_chan *chan, void *data)
+{
+       struct mhu_link *mlink = chan->con_priv;
+       u32 *arg = data;
Quoted 9 lines

Review

Quoted 6 lines
drivers/mailbox/arm_mhu.c new file +3 -0
+
+       if (!mhu_last_tx_done(chan)) {
+               dev_err(chan->mbox->dev, "Last TX(%d) pending!\n",

mlink->irq);

(quoted diff) +2 -0
+               return -EBUSY;
+       }

Why do you need the above check when the core handles that already ?

Quoted 5 lines

Our bootloader also uses mhu so we could have failed/pending bits in STAT when Linux first tries to use it. However since then the driver clears the STAT register upon startup, so this could probably be dropped. Will do.

Exactly, it can and you have already handled it in the probe, and it must be that way. Else you are confusing the state machine in the mailbox core and working it around in your driver, which is wrong.

Quoted 21 lines
Quoted 12 lines
Quoted 12 lines
drivers/mailbox/arm_mhu.c new file +10 -0
+static int mhu_startup(struct mbox_chan *chan)
+{
+       struct mhu_link *mlink = chan->con_priv;
+       u32 val;
+       int ret;
+
+       val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);
+       writel_relaxed(val, mlink->tx_reg + INTR_CLR_OFS);
+
+       ret = request_irq(mlink->irq, mhu_rx_interrupt, 0, "mhu_link",

chan);
+ if (ret) {

Quoted 9 lines

drivers/mailbox/arm_mhu.c line 98

Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+               dev_err(chan->mbox->dev,
+                       "Unable to aquire IRQ %d\n", mlink->irq);
+               return ret;
+       }

This proved costly(in terms of time) on Juno board in my testing, requesting and setting up irq for every small packets you need to send. I would prefer it to be moved to probe.

Quoted 5 lines

If your usage of mailbox is so frequent that request-release of irq proves expensive, maybe you could fix your client to hold onto the channel for the lifetime. I don't see why your scpi_protocol.c shouldn't do that, even if request_irq was in probe.

Agreed, and that's how it's done. But I was thinking of cases where there are multiple clients transferring small data.

[...]

Quoted 15 lines
Quoted 10 lines

drivers/mailbox/arm_mhu.c line 152

Quoted 9 lines
drivers/mailbox/arm_mhu.c new file +8 -0
+
+       mhu->mbox.dev = dev;
+       mhu->mbox.chans = &mhu->chan[0];
+       mhu->mbox.num_chans = 3;
+       mhu->mbox.ops = &mhu_ops;
+       mhu->mbox.txdone_irq = false;
+       mhu->mbox.txdone_poll = true;
+       mhu->mbox.txpoll_period = 10;
Quoted 5 lines

10ms seems to high, but if that's a derived value then I am fine. On Juno, typically we get response within a millisecond, so we need not get blocked on Tx even after getting Rx for 10ms. I prefer it to be set to 1 ms.

Quoted 5 lines

Similar on my platform. However 1 isn't much meaning in milliseconds because mod_timer works in jiffiy which is usually atleast 5ms. If we are polling we can't anyway expect latency critical stuff, so 10ms seems like a safe bet.

Here you are assuming the fact about HZ value in the driver. Leave that to timer subsystem for the conversion(msecs_to_jiffies takes care of rounding) and put values based on what hardware expects IMO.

Quoted 10 lines
Quoted 10 lines

drivers/mailbox/arm_mhu.c line 177

Quoted 4 lines
drivers/mailbox/arm_mhu.c new file +4 -0
+
+static struct amba_id mhu_ids[] = {
+       {
+               .id     = 0x1bb098,

This is the problem. This IP has PID(0x98 0xB0 0x1B 0x00 0x04) it's 5 bytes[1] . Even I had thought of AMBA initially, it doesn't fit as is, may need changes to the amba core to consider this.

Quoted 4 lines

How is that a problem? AMBA chooses to compare 32bits of PID for the class. The PID4 might change across versions of MHU, which we could figure out in the mhu driver in future.

No that's wrong IMO. You mask is incorrect as it doesn't include PID4 which in this case contains
[3:0] DES_2 JEP106 continuation code that identifies the designer. Set to 0x4 for ARM.

IMO it's not a proper comparison/match as you are not including part of ID that identifies the designer.

Regards,
Sudeep

#6 lore raw

PATCH v6 3/7 ARM: MB86S7X: Add MCPM support

In reply to Vincent Yang

From: Jassi Brar <[email protected]>

The remote firmware(SCB) owns the SMP control. This MCPM driver gets CPU/CLUSTER power up/down done by SCB over mailbox.

---
 arch/arm/mach-mb86s7x/Makefile |   4 +-
 arch/arm/mach-mb86s7x/mcpm.c   | 318 +++++++++++++++++++++++++++++++++++++++++
 arch/arm/mach-mb86s7x/smc.S    |  27 ++++
 drivers/soc/mb86s7x/scb_mhu.c  |  14 ++
 include/soc/mb86s7x/scb_mhu.h  |   8 ++
 5 files changed, 370 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/mach-mb86s7x/mcpm.c
 create mode 100644 arch/arm/mach-mb86s7x/smc.S
arch/arm/mach-mb86s7x/Makefile +3 -1
index 97640b6..00e843c 100644
@@ -1 +1,3 @@
-obj-$(CONFIG_ARCH_MB86S7X)	+= board.o
+obj-$(CONFIG_ARCH_MB86S7X)	+= board.o mcpm.o smc.o
+CFLAGS_smc.o			+= -march=armv7-a
+CFLAGS_mcpm.o			+= -march=armv7-a
arch/arm/mach-mb86s7x/mcpm.c new file +318 -0

318 lines not on this page · raw message

arch/arm/mach-mb86s7x/smc.S new file +27 -0
new file mode 100644
index 0000000..3ffe4f7
@@ -0,0 +1,27 @@
+/*
+ * SMC command interface to set secondary entry point
+ * Copyright: (C) 2013-2015 Fujitsu Semiconductor Limited
+ * Copyright: (C) 2015 Linaro Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/linkage.h>
+
+.arch_extension sec
+
+/* void mb86s7x_cpu_entry(unsigned long secondary_entry); */
+ENTRY(mb86s7x_cpu_entry)
+	stmfd   sp!, {r1-r11, lr}
+	mov r1, r0
+	ldr r0, =1
+	mrc p15, 0, r3, c1, c0, 0
+	mov r4, r3
+	and r3, #0xbfffffff
+	mcr p15, 0, r3, c1, c0, 0
+	smc #0
+	mcr p15, 0, r4, c1, c0, 0
+	ldmfd   sp!, {r1-r11, pc}
+ENDPROC(mb86s7x_cpu_entry)
drivers/soc/mb86s7x/scb_mhu.c +14 -0
index c1d66f4..7141287 100644
@@ -89,6 +89,20 @@ static struct mhu_xfer {
 	struct list_head node;
 } *ax; /* stages of xfer */
 
+#define WFI_COLOR_OFFSET	0x3f00
+
+void mb86s7x_set_wficolor(unsigned clstr, unsigned cpu, unsigned clr)
+{
+	u8 val;
+
+	val = readb_relaxed(mb86s7x_shm_base
+			    + WFI_COLOR_OFFSET + clstr * 2 + cpu);
+	val &= ~AT_WFI_COLOR_MASK;
+	val |= clr;
+	writeb_relaxed(val, mb86s7x_shm_base
+		       + WFI_COLOR_OFFSET + clstr * 2 + cpu);
+}
+
 static int mhu_alloc_xfers(int n, struct list_head *list)
 {
 	struct mhu_xfer *x = kcalloc(n, sizeof(struct mhu_xfer), GFP_ATOMIC);
include/soc/mb86s7x/scb_mhu.h +8 -0
index 42a1baa..8ee75f2 100644
@@ -87,6 +87,14 @@ enum {
 #define CMD_POWERDOMAIN_SET_REP		ENC_REP(CMD_POWERDOMAIN_SET_REQ)
 #define CMD_STG_BLOCK_ERASE_REP		ENC_REP(CMD_STG_BLOCK_ERASE_REQ)
 
+#define AT_WFI_DO_NOTHING	0x0
+#define AT_WFI_DO_SUSPEND	0x1
+#define AT_WFI_DO_POWEROFF	0x2
+#define AT_WFI_COLOR_MASK	0x3
+
+void mb86s7x_set_wficolor(unsigned clstr, unsigned cpu, unsigned clr);
+void mb86s7x_cpu_entry(unsigned long secondary_entry);
+
 /* Helper functions to talk to remote */
 int mb86s7x_send_packet(u32 code, void *buf, int len);
 
Signature · 1 line
1.9.0
#7 lore raw

PATCH v6 4/7 clk: Add clock driver for mb86s7x

In reply to Vincent Yang

From: Jassi Brar <[email protected]>

The CRG11 clock controller is managed by remote f/w.
This driver simply maps Linux CLK ops onto mailbox api.

---
 .../bindings/clock/fujitsu,mb86s70-crg11.txt       |  26 ++
 drivers/clk/Makefile                               |   1 +
 drivers/clk/clk-mb86s7x.c                          | 386 +++++++++++++++++++++
 3 files changed, 413 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt
 create mode 100644 drivers/clk/clk-mb86s7x.c
Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt new file +26 -0
new file mode 100644
index 0000000..3323962
@@ -0,0 +1,26 @@
+Fujitsu CRG11 clock driver bindings
+-----------------------------------
+
+Required properties :
+- compatible : Shall contain "fujitsu,mb86s70-crg11"
+- #clock-cells : Shall be 3 {cntrlr domain port}
+
+The consumer specifies the desired clock pointing to its phandle.
+
+Example:
+
+	clock: crg11 {
+		compatible = "fujitsu,mb86s70-crg11";
+		#clock-cells = <3>;
+	};
+
+	mhu: mhu0 at 2b1f0000 {
+		#mbox-cells = <1>;
+		compatible = "arm,mhu";
+		reg = <0 0x2B1F0000 0x1000>;
+		interrupts = <0 36 4>, /* LP Non-Sec */
+			     <0 35 4>, /* HP Non-Sec */
+			     <0 37 4>; /* Secure */
+		clocks = <&clock 0 2 1>; /* Cntrlr:0 Domain:2 Port:1 */
+		clock-names = "clk";
+	};
drivers/clk/Makefile +1 -0
index d5fba5b..19d73a1 100644
@@ -26,6 +26,7 @@ obj-$(CONFIG_MACH_LOONGSON1)		+= clk-ls1x.o
 obj-$(CONFIG_COMMON_CLK_MAX_GEN)	+= clk-max-gen.o
 obj-$(CONFIG_COMMON_CLK_MAX77686)	+= clk-max77686.o
 obj-$(CONFIG_COMMON_CLK_MAX77802)	+= clk-max77802.o
+obj-$(CONFIG_ARCH_MB86S7X)		+= clk-mb86s7x.o
 obj-$(CONFIG_ARCH_MOXART)		+= clk-moxart.o
 obj-$(CONFIG_ARCH_NOMADIK)		+= clk-nomadik.o
 obj-$(CONFIG_ARCH_NSPIRE)		+= clk-nspire.o
drivers/clk/clk-mb86s7x.c new file +386 -0

386 lines not on this page · raw message

Signature · 1 line
1.9.0
#8 lore raw

PATCH v6 4/7 clk: Add clock driver for mb86s7x

Quoting Vincent Yang (2015-02-05 18:10:49)

Quoted 18 lines
drivers/clk/clk-mb86s7x.c new file +18 -0
+static struct clk *crg11_get(struct of_phandle_args *clkspec, void *data)
+{
+       struct mb86s70_crg11 *crg11 = data;
+       struct clk_init_data init;
+       u32 cntrlr, domain, port;
+       struct crg_clk *crgclk;
+       struct clk *clk;
+       char clkp[20];
+
+       if (clkspec->args_count != 3)
+               return ERR_PTR(-EINVAL);
+
+       cntrlr = clkspec->args[0];
+       domain = clkspec->args[1];
+       port = clkspec->args[2];
+
+       if (port > 7)
+               snprintf(clkp, 20, "UngatedCLK%d_%X", cntrlr, domain);

drivers/clk/clk-mb86s7x.c line 209

Quoted 10 lines
drivers/clk/clk-mb86s7x.c new file +10 -0
+       else
+               snprintf(clkp, 20, "CLK%d_%X_%d", cntrlr, domain, port);
+
+       mutex_lock(&crg11->lock);
+
+       clk = __clk_lookup(clkp);
+       if (clk) {
+               mutex_unlock(&crg11->lock);
+               return clk;
+       }

What is the above code doing? It looks like you are checking to see if you are trying to register a clock that is already registered. Why do you need this?

Quoted 41 lines
drivers/clk/clk-mb86s7x.c new file +41 -0
+
+       crgclk = kzalloc(sizeof(*crgclk), GFP_KERNEL);
+       if (!crgclk) {
+               mutex_unlock(&crg11->lock);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       init.name = clkp;
+       init.num_parents = 0;
+       init.ops = &crg_port_ops;
+       init.flags = CLK_IS_ROOT;
+       crgclk->hw.init = &init;
+       crgclk->cntrlr = cntrlr;
+       crgclk->domain = domain;
+       crgclk->port = port;
+       clk = clk_register(NULL, &crgclk->hw);
+       if (IS_ERR(clk))
+               pr_err("%s:%d Error!\n", __func__, __LINE__);
+       else
+               pr_debug("Registered %s\n", clkp);
+
+       clk_register_clkdev(clk, clkp, NULL);
+       mutex_unlock(&crg11->lock);
+       return clk;
+}
+
+static void __init crg_port_init(struct device_node *node)
+{
+       struct mb86s70_crg11 *crg11;
+
+       crg11 = kzalloc(sizeof(*crg11), GFP_KERNEL);
+       if (!crg11)
+               return;
+
+       mutex_init(&crg11->lock);
+
+       of_clk_add_provider(node, crg11_get, crg11);
+}
+CLK_OF_DECLARE(crg11_gate, "fujitsu,mb86s70-crg11", crg_port_init);
+
+struct cl_clk {

drivers/clk/clk-mb86s7x.c line 260

Quoted 10 lines
drivers/clk/clk-mb86s7x.c new file +10 -0
+       struct clk_hw hw;
+       int cluster;
+};
+
+struct mb86s7x_cpu_freq {
+       u32 payload_size;
+       u32 cluster_class;
+       u32 cluster_id;
+       u32 cpu_id;
+       u64 freqency;

s/freqency/frequency/

Quoted 24 lines
drivers/clk/clk-mb86s7x.c new file +24 -0
+};
+
+static void mhu_cluster_rate(struct clk_hw *hw, unsigned long *rate, int get)
+{
+       struct cl_clk *clc = to_clc_clk(hw);
+       struct mb86s7x_cpu_freq cmd;
+       int code, ret;
+
+       cmd.payload_size = sizeof(cmd);
+       cmd.cluster_class = 0;
+       cmd.cluster_id = clc->cluster;
+       cmd.cpu_id = 0;
+       cmd.freqency = *rate;
+
+       if (get)
+               code = CMD_CPU_CLOCK_RATE_GET_REQ;
+       else
+               code = CMD_CPU_CLOCK_RATE_SET_REQ;
+
+       pr_debug("%s:%d CMD Cl_Class-%u CL_ID-%u CPU_ID-%u Freq-%llu}\n",
+                __func__, __LINE__, cmd.cluster_class,
+                cmd.cluster_id, cmd.cpu_id, cmd.freqency);
+
+       ret = mb86s7x_send_packet(code, &cmd, sizeof(cmd));

drivers/clk/clk-mb86s7x.c line 294

Quoted 10 lines
drivers/clk/clk-mb86s7x.c new file +10 -0
+       if (ret < 0) {
+               pr_err("%s:%d failed!\n", __func__, __LINE__);
+               return;
+       }
+
+       pr_debug("%s:%d REP Cl_Class-%u CL_ID-%u CPU_ID-%u Freq-%llu}\n",
+                __func__, __LINE__, cmd.cluster_class,
+                cmd.cluster_id, cmd.cpu_id, cmd.freqency);
+
+       *rate = cmd.freqency;

Also why is this frequency u64 when all of the uses of it are unsigned long?

Regards,
Mike

#9 lore raw

PATCH v6 4/7 clk: Add clock driver for mb86s7x

Quoted 26 lines · Mike Turquette

Quoting Vincent Yang (2015-02-05 18:10:49)

Quoted 24 lines
drivers/clk/clk-mb86s7x.c new file +24 -0
+static struct clk *crg11_get(struct of_phandle_args *clkspec, void *data)
+{
+       struct mb86s70_crg11 *crg11 = data;
+       struct clk_init_data init;
+       u32 cntrlr, domain, port;
+       struct crg_clk *crgclk;
+       struct clk *clk;
+       char clkp[20];
+
+       if (clkspec->args_count != 3)
+               return ERR_PTR(-EINVAL);
+
+       cntrlr = clkspec->args[0];
+       domain = clkspec->args[1];
+       port = clkspec->args[2];
+
+       if (port > 7)
+               snprintf(clkp, 20, "UngatedCLK%d_%X", cntrlr, domain);
+       else
+               snprintf(clkp, 20, "CLK%d_%X_%d", cntrlr, domain, port);
+
+       mutex_lock(&crg11->lock);
+
+       clk = __clk_lookup(clkp);
Quoted 9 lines

drivers/clk/clk-mb86s7x.c line 209

Quoted 4 lines
drivers/clk/clk-mb86s7x.c new file +4 -0
+       if (clk) {
+               mutex_unlock(&crg11->lock);
+               return clk;
+       }

What is the above code doing? It looks like you are checking to see if you are trying to register a clock that is already registered. Why do you need this?

The clocks are populated runtime as clients need them. If two clients need a clock the second shouldn't populate a copy. Please see the bindings specified in this patch.

Quoted 45 lines
Quoted 45 lines
drivers/clk/clk-mb86s7x.c new file +45 -0
+
+       crgclk = kzalloc(sizeof(*crgclk), GFP_KERNEL);
+       if (!crgclk) {
+               mutex_unlock(&crg11->lock);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       init.name = clkp;
+       init.num_parents = 0;
+       init.ops = &crg_port_ops;
+       init.flags = CLK_IS_ROOT;
+       crgclk->hw.init = &init;
+       crgclk->cntrlr = cntrlr;
+       crgclk->domain = domain;
+       crgclk->port = port;
+       clk = clk_register(NULL, &crgclk->hw);
+       if (IS_ERR(clk))
+               pr_err("%s:%d Error!\n", __func__, __LINE__);
+       else
+               pr_debug("Registered %s\n", clkp);
+
+       clk_register_clkdev(clk, clkp, NULL);
+       mutex_unlock(&crg11->lock);
+       return clk;
+}
+
+static void __init crg_port_init(struct device_node *node)
+{
+       struct mb86s70_crg11 *crg11;
+
+       crg11 = kzalloc(sizeof(*crg11), GFP_KERNEL);
+       if (!crg11)
+               return;
+
+       mutex_init(&crg11->lock);
+
+       of_clk_add_provider(node, crg11_get, crg11);
+}
+CLK_OF_DECLARE(crg11_gate, "fujitsu,mb86s70-crg11", crg_port_init);
+
+struct cl_clk {
+       struct clk_hw hw;
+       int cluster;
+};
+
Quoted 9 lines

drivers/clk/clk-mb86s7x.c line 260

Quoted 6 lines
drivers/clk/clk-mb86s7x.c new file +6 -0
+struct mb86s7x_cpu_freq {
+       u32 payload_size;
+       u32 cluster_class;
+       u32 cluster_id;
+       u32 cpu_id;
+       u64 freqency;

s/freqency/frequency/

:)

Quoted 29 lines
Quoted 29 lines
drivers/clk/clk-mb86s7x.c new file +29 -0
+};
+
+static void mhu_cluster_rate(struct clk_hw *hw, unsigned long *rate, int get)
+{
+       struct cl_clk *clc = to_clc_clk(hw);
+       struct mb86s7x_cpu_freq cmd;
+       int code, ret;
+
+       cmd.payload_size = sizeof(cmd);
+       cmd.cluster_class = 0;
+       cmd.cluster_id = clc->cluster;
+       cmd.cpu_id = 0;
+       cmd.freqency = *rate;
+
+       if (get)
+               code = CMD_CPU_CLOCK_RATE_GET_REQ;
+       else
+               code = CMD_CPU_CLOCK_RATE_SET_REQ;
+
+       pr_debug("%s:%d CMD Cl_Class-%u CL_ID-%u CPU_ID-%u Freq-%llu}\n",
+                __func__, __LINE__, cmd.cluster_class,
+                cmd.cluster_id, cmd.cpu_id, cmd.freqency);
+
+       ret = mb86s7x_send_packet(code, &cmd, sizeof(cmd));
+       if (ret < 0) {
+               pr_err("%s:%d failed!\n", __func__, __LINE__);
+               return;
+       }
+
Quoted 9 lines

drivers/clk/clk-mb86s7x.c line 294

Quoted 5 lines
drivers/clk/clk-mb86s7x.c new file +5 -0
+       pr_debug("%s:%d REP Cl_Class-%u CL_ID-%u CPU_ID-%u Freq-%llu}\n",
+                __func__, __LINE__, cmd.cluster_class,
+                cmd.cluster_id, cmd.cpu_id, cmd.freqency);
+
+       *rate = cmd.freqency;

Also why is this frequency u64 when all of the uses of it are unsigned long?

The firmware of remote has chosen to report frequency as a u64.

Thanks
Jassi

#10 lore raw

PATCH v6 4/7 clk: Add clock driver for mb86s7x

In reply to Vincent Yang

Quoting Vincent Yang (2015-02-05 18:10:49)

Quoted 37 lines

From: Jassi Brar <[email protected]>

The CRG11 clock controller is managed by remote f/w.
This driver simply maps Linux CLK ops onto mailbox api.

---
 .../bindings/clock/fujitsu,mb86s70-crg11.txt       |  26 ++
 drivers/clk/Makefile                               |   1 +
 drivers/clk/clk-mb86s7x.c                          | 386 +++++++++++++++++++++
 3 files changed, 413 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt
 create mode 100644 drivers/clk/clk-mb86s7x.c
Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt new file +14 -0
new file mode 100644
index 0000000..3323962
@@ -0,0 +1,26 @@
+Fujitsu CRG11 clock driver bindings
+-----------------------------------
+
+Required properties :
+- compatible : Shall contain "fujitsu,mb86s70-crg11"
+- #clock-cells : Shall be 3 {cntrlr domain port}
+
+The consumer specifies the desired clock pointing to its phandle.
+
+Example:
+
+       clock: crg11 {
+               compatible = "fujitsu,mb86s70-crg11";
+               #clock-cells = <3>;

Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt line 24

Quoted 10 lines
Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt new file +10 -0
+       };
+
+       mhu: mhu0 at 2b1f0000 {
+               #mbox-cells = <1>;
+               compatible = "arm,mhu";
+               reg = <0 0x2B1F0000 0x1000>;
+               interrupts = <0 36 4>, /* LP Non-Sec */
+                            <0 35 4>, /* HP Non-Sec */
+                            <0 37 4>; /* Secure */
+               clocks = <&clock 0 2 1>; /* Cntrlr:0 Domain:2 Port:1 */

Some preprocessor definitions would be better than hardcoding the values for Cntrlr, Domain and Port. The DT include chroot should help you here. Doing so will help you maintain this stuff into the future :-)

Regards,
Mike

#11 lore raw

PATCH v6 4/7 clk: Add clock driver for mb86s7x

Quoted 44 lines · Mike Turquette

Quoting Vincent Yang (2015-02-05 18:10:49)

Quoted 43 lines

From: Jassi Brar <[email protected]>

The CRG11 clock controller is managed by remote f/w.
This driver simply maps Linux CLK ops onto mailbox api.

---
 .../bindings/clock/fujitsu,mb86s70-crg11.txt       |  26 ++
 drivers/clk/Makefile                               |   1 +
 drivers/clk/clk-mb86s7x.c                          | 386 +++++++++++++++++++++
 3 files changed, 413 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt
 create mode 100644 drivers/clk/clk-mb86s7x.c
Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt new file +20 -0
new file mode 100644
index 0000000..3323962
@@ -0,0 +1,26 @@
+Fujitsu CRG11 clock driver bindings
+-----------------------------------
+
+Required properties :
+- compatible : Shall contain "fujitsu,mb86s70-crg11"
+- #clock-cells : Shall be 3 {cntrlr domain port}
+
+The consumer specifies the desired clock pointing to its phandle.
+
+Example:
+
+       clock: crg11 {
+               compatible = "fujitsu,mb86s70-crg11";
+               #clock-cells = <3>;
+       };
+
+       mhu: mhu0 at 2b1f0000 {
+               #mbox-cells = <1>;
+               compatible = "arm,mhu";
+               reg = <0 0x2B1F0000 0x1000>;
Quoted 9 lines

Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt line 24

Quoted 4 lines
Documentation/devicetree/bindings/clock/fujitsu,mb86s70-crg11.txt new file +4 -0
+               interrupts = <0 36 4>, /* LP Non-Sec */
+                            <0 35 4>, /* HP Non-Sec */
+                            <0 37 4>; /* Secure */
+               clocks = <&clock 0 2 1>; /* Cntrlr:0 Domain:2 Port:1 */

Some preprocessor definitions would be better than hardcoding the values for Cntrlr, Domain and Port. The DT include chroot should help you here. Doing so will help you maintain this stuff into the future :-)

What macros do you have in mind? I was actually made to get rid of macros in earlier version, but the implementation was different then. I hope

     #clock-cells : Shall be 3 {cntrlr domain port}

in the binding should be telling enough.

Thanks
jassi

#12 lore raw

PATCH v6 5/7 dt: mb86s7x: add dt files for MB86S7x evbs

In reply to Vincent Yang

From: Jassi Brar <[email protected]>

Add dt files for MB86S7x evb.

---
 arch/arm/boot/dts/Makefile      |   1 +
 arch/arm/boot/dts/mb86s70.dtsi  |  91 +++++++++++++++++++++++++
 arch/arm/boot/dts/mb86s70eb.dts |  57 ++++++++++++++++
 arch/arm/boot/dts/mb86s73.dtsi  |  63 ++++++++++++++++++
 arch/arm/boot/dts/mb86s73eb.dts |  44 +++++++++++++
 arch/arm/boot/dts/mb86s7x.dtsi  | 142 ++++++++++++++++++++++++++++++++++++++++
 6 files changed, 398 insertions(+)
 create mode 100644 arch/arm/boot/dts/mb86s70.dtsi
 create mode 100644 arch/arm/boot/dts/mb86s70eb.dts
 create mode 100644 arch/arm/boot/dts/mb86s73.dtsi
 create mode 100644 arch/arm/boot/dts/mb86s73eb.dts
 create mode 100644 arch/arm/boot/dts/mb86s7x.dtsi
arch/arm/boot/dts/Makefile +1 -0
index 91bd5bd..43b091b 100644
@@ -176,6 +176,7 @@ dtb-$(CONFIG_MACH_KIRKWOOD) += kirkwood-b3.dtb \
 	kirkwood-ts419-6282.dtb
 dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb
 dtb-$(CONFIG_ARCH_MARCO) += marco-evb.dtb
+dtb-$(CONFIG_ARCH_MB86S7X) += mb86s70eb.dtb mb86s73eb.dtb
 dtb-$(CONFIG_MACH_MESON6) += meson6-atv1200.dtb
 dtb-$(CONFIG_ARCH_MMP) += pxa168-aspenite.dtb \
 	pxa910-dkb.dtb \
arch/arm/boot/dts/mb86s70.dtsi new file +91 -0

91 lines not on this page · raw message

arch/arm/boot/dts/mb86s70eb.dts new file +57 -0

57 lines not on this page · raw message

arch/arm/boot/dts/mb86s73.dtsi new file +63 -0

63 lines not on this page · raw message

arch/arm/boot/dts/mb86s73eb.dts new file +44 -0

44 lines not on this page · raw message

arch/arm/boot/dts/mb86s7x.dtsi new file +142 -0

142 lines not on this page · raw message

Signature · 1 line
1.9.0
#13 lore raw

PATCH v6 6/7 of: add Fujitsu vendor prefix

In reply to Vincent Yang

From: Jassi Brar <[email protected]>

Add 'fujitsu' as the vendor prefix for Fujitsu Semiconductor Ltd.

---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/vendor-prefixes.txt +1 -0
index d443279..e0ac020 100644
@@ -59,6 +59,7 @@ everest	Everest Semiconductor Co. Ltd.
 excito	Excito
 fcs	Fairchild Semiconductor
 fsl	Freescale Semiconductor
+fujitsu Fujitsu Semiconductor Ltd.
 GEFanuc	GE Fanuc Intelligent Platforms Embedded Systems, Inc.
 gef	GE Fanuc Intelligent Platforms Embedded Systems, Inc.
 geniatech	Geniatech, Inc.
Signature · 1 line
1.9.0
#14 lore raw

PATCH v6 7/7 ARM: MB86S7x: Add configs

In reply to Vincent Yang

From: Jassi Brar <[email protected]>

Fujitsu's ARCH_MB86S7X is multi_v7 compatible, so add options to multi_v7_defconfig. Also add a new defconfig for MB86S7X for those who want the kernel built specifically for ARCH_MB86S7X.

---
 arch/arm/configs/fujitsu_defconfig  | 232 ++++++++++++++++++++++++++++++++++++
 arch/arm/configs/multi_v7_defconfig |   5 +
 2 files changed, 237 insertions(+)
 create mode 100644 arch/arm/configs/fujitsu_defconfig
arch/arm/configs/fujitsu_defconfig new file +232 -0
new file mode 100644
index 0000000..2d922e4
@@ -0,0 +1,232 @@
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_DEFAULT_HOSTNAME="MB86S7x"
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_NAMESPACES=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_EXPERT=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLAB=y
+CONFIG_PROFILING=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_ARCH_MB86S7X=y
+CONFIG_ARM_LPAE=y
+CONFIG_ARM_ERRATA_754322=y
+CONFIG_ARM_ERRATA_754327=y
+CONFIG_ARM_ERRATA_764369=y
+CONFIG_ARM_ERRATA_775420=y
+CONFIG_ARM_ERRATA_798181=y
+CONFIG_PCI=y
+CONFIG_SMP=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_SMT=y
+CONFIG_VMSPLIT_2G=y
+CONFIG_PREEMPT=y
+CONFIG_THUMB2_KERNEL=y
+CONFIG_HIGHMEM=y
+CONFIG_CMA=y
+CONFIG_CMA_AREAS=8
+# CONFIG_ATAGS is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="mem=2048M console=ttyS0,115200 root=/dev/mmcblk1p1 rootfstype=ext4 rootwait rw"
+CONFIG_KEXEC=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+CONFIG_CPUFREQ_DT=m
+CONFIG_CPU_IDLE=y
+CONFIG_VFP=y
+CONFIG_NEON=y
+CONFIG_PM_WAKELOCKS=y
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_DEBUG=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_IPV6 is not set
+# CONFIG_WIRELESS is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=192
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_PLATRAM=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTD_SPI_NOR=y
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=2
+CONFIG_BLK_DEV_RAM_SIZE=1024
+CONFIG_BLK_DEV_SD=m
+CONFIG_ATA=m
+# CONFIG_ATA_VERBOSE_ERROR is not set
+# CONFIG_SATA_PMP is not set
+CONFIG_SATA_AHCI_PLATFORM=m
+# CONFIG_ATA_SFF is not set
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+# CONFIG_NET_CADENCE is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+# CONFIG_NET_VENDOR_CIRRUS is not set
+# CONFIG_NET_VENDOR_FARADAY is not set
+# CONFIG_NET_VENDOR_INTEL is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+# CONFIG_NET_VENDOR_MICROCHIP is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SMSC is not set
+# CONFIG_NET_VENDOR_STMICRO is not set
+# CONFIG_NET_VENDOR_WIZNET is not set
+CONFIG_PHYLIB=y
+# CONFIG_WLAN is not set
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=800
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=m
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO_POLLED=y
+# CONFIG_MOUSE_PS2 is not set
+CONFIG_MOUSE_GPIO=m
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_EGALAX=m
+CONFIG_TOUCHSCREEN_ILI210X=m
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_LEGACY_PTY_COUNT=16
+# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_8250=y
+# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_DW=y
+CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_CHARDEV=m
+# CONFIG_I2C_HELPER_AUTO is not set
+CONFIG_SPI=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_MB86S7X=y
+CONFIG_GPIO_MCP23S08=m
+# CONFIG_HWMON is not set
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_GPIO=y
+# CONFIG_VGA_ARB is not set
+CONFIG_DRM=y
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_TILEBLITTING=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_DYNAMIC_MINORS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_SPI is not set
+CONFIG_SND_SOC=m
+CONFIG_HID=m
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+CONFIG_USB=m
+CONFIG_USB_OTG=y
+CONFIG_USB_XHCI_HCD=m
+CONFIG_USB_EHCI_HCD=m
+CONFIG_USB_EHCI_HCD_PLATFORM=m
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_OHCI_HCD_PCI is not set
+CONFIG_USB_OHCI_HCD_PLATFORM=m
+CONFIG_USB_ACM=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_DWC3=m
+CONFIG_USB_DWC3_HOST=y
+CONFIG_USB_DWC3_DEBUG=y
+CONFIG_USB_GADGET=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_MMC=y
+CONFIG_MMC_CLKGATE=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_F_SDH30=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=m
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+CONFIG_LEDS_TRIGGER_TRANSIENT=m
+CONFIG_DMADEVICES=y
+CONFIG_STAGING=y
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ASHMEM=y
+CONFIG_ANDROID_LOGGER=m
+CONFIG_ANDROID_LOW_MEMORY_KILLER=y
+CONFIG_ION=y
+CONFIG_ARM_MHU=y
+CONFIG_ARM_SMMU=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_VFAT_FS=m
+CONFIG_TMPFS=y
+CONFIG_JFFS2_FS=m
+CONFIG_CRAMFS=y
+CONFIG_ROMFS_FS=y
+CONFIG_ROMFS_BACKED_BY_BOTH=y
+# CONFIG_NETWORK_FILESYSTEMS is not set
+CONFIG_NLS_CODEPAGE_437=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_FS=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_RCU_CPU_STALL_VERBOSE is not set
+# CONFIG_FTRACE is not set
+CONFIG_DEBUG_USER=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_HW is not set
+CONFIG_FONTS=y
+CONFIG_FONT_SUN8x16=y
arch/arm/configs/multi_v7_defconfig +5 -0
index bc393b7..102e457 100644
@@ -49,6 +49,7 @@ CONFIG_SOC_AM43XX=y
 CONFIG_SOC_DRA7XX=y
 CONFIG_ARCH_QCOM=y
 CONFIG_ARCH_MEDIATEK=y
+CONFIG_ARCH_MB86S7X=y
 CONFIG_ARCH_MSM8X60=y
 CONFIG_ARCH_MSM8960=y
 CONFIG_ARCH_MSM8974=y
@@ -259,6 +260,7 @@ CONFIG_GPIO_TWL4030=y
 CONFIG_GPIO_PALMAS=y
 CONFIG_GPIO_TPS6586X=y
 CONFIG_GPIO_TPS65910=y
+CONFIG_GPIO_MB86S7X=y
 CONFIG_BATTERY_SBS=y
 CONFIG_CHARGER_TPS65090=y
 CONFIG_POWER_RESET_AS3722=y
@@ -370,6 +372,7 @@ CONFIG_MMC_SDHCI_SPEAR=y
 CONFIG_MMC_SDHCI_S3C=y
 CONFIG_MMC_SDHCI_S3C_DMA=y
 CONFIG_MMC_SDHCI_BCM_KONA=y
+CONFIG_MMC_SDHCI_F_SDH30=y
 CONFIG_MMC_SDHCI_ST=y
 CONFIG_MMC_OMAP=y
 CONFIG_MMC_OMAP_HS=y
@@ -457,6 +460,8 @@ CONFIG_TI_PIPE3=y
 CONFIG_PHY_MIPHY365X=y
 CONFIG_PHY_STIH41X_USB=y
 CONFIG_PHY_SUN4I_USB=y
+CONFIG_MAILBOX=y
+CONFIG_ARM_MHU=y
 CONFIG_EXT4_FS=y
 CONFIG_AUTOFS4_FS=y
 CONFIG_MSDOS_FS=y
Signature · 1 line
1.9.0