All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/2] Add iop driver for Sunplus SP7021
@ 2021-12-24  8:35 Tony Huang
  2021-12-24  8:35 ` [PATCH v5 1/2] dt-binding: misc: Add iop yaml file " Tony Huang
  2021-12-24  8:35 ` [PATCH v5 2/2] misc: Add iop driver " Tony Huang
  0 siblings, 2 replies; 8+ messages in thread
From: Tony Huang @ 2021-12-24  8:35 UTC (permalink / raw)
  To: robh+dt, devicetree, linux-kernel, derek.kiernan, dragan.cvetic,
	arnd, gregkh
  Cc: tony.huang, wells.lu, Tony Huang

Add iop driver for Sunplus SP7021 SOC

This is a patch series for iop driver for Sunplus SP7021 SOC.

Sunplus SP7021 is an ARM Cortex A7 (4 cores) based SoC. It integrates
many peripherals (ex: UART, I2C, SPI, SDIO, eMMC, USB, SD card and
etc.) into a single chip. It is designed for industrial control.

Refer to:
https://sunplus-tibbo.atlassian.net/wiki/spaces/doc/overview
https://tibbo.com/store/plus1.html

Tony Huang (2):
  dt-binding: misc: Add iop yaml file for Sunplus SP7021
  misc: Add iop driver for Sunplus SP7021

 Documentation/ABI/testing/sysfs-platform-soc@B     |  18 +
 .../devicetree/bindings/misc/sunplus-iop.yaml      |  72 +++
 MAINTAINERS                                        |   7 +
 drivers/misc/Kconfig                               |  12 +
 drivers/misc/Makefile                              |   1 +
 drivers/misc/sunplus_iop.c                         | 481 +++++++++++++++++++++
 6 files changed, 591 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-platform-soc@B
 create mode 100644 Documentation/devicetree/bindings/misc/sunplus-iop.yaml
 create mode 100644 drivers/misc/sunplus_iop.c

-- 
2.7.4


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v5 1/2] dt-binding: misc: Add iop yaml file for Sunplus SP7021
  2021-12-24  8:35 [PATCH v5 0/2] Add iop driver for Sunplus SP7021 Tony Huang
@ 2021-12-24  8:35 ` Tony Huang
  2021-12-27 16:43   ` Rob Herring
  2021-12-24  8:35 ` [PATCH v5 2/2] misc: Add iop driver " Tony Huang
  1 sibling, 1 reply; 8+ messages in thread
From: Tony Huang @ 2021-12-24  8:35 UTC (permalink / raw)
  To: robh+dt, devicetree, linux-kernel, derek.kiernan, dragan.cvetic,
	arnd, gregkh
  Cc: tony.huang, wells.lu, Tony Huang

Add iop yaml file for Sunplus SP7021

Signed-off-by: Tony Huang <tonyhuang.sunplus@gmail.com>
---
Changes in v5:
-Add iop-wakeup pin for 8051 to wake up the Linux kernel in shutdown mode.

 .../devicetree/bindings/misc/sunplus-iop.yaml      | 72 ++++++++++++++++++++++
 MAINTAINERS                                        |  5 ++
 2 files changed, 77 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/misc/sunplus-iop.yaml

diff --git a/Documentation/devicetree/bindings/misc/sunplus-iop.yaml b/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
new file mode 100644
index 0000000..fad0f50
--- /dev/null
+++ b/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright (C) Sunplus Ltd. Co. 2021
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/misc/sunplus-iop.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Sunplus IOP(8051) controller
+
+maintainers:
+  - Tony Huang <tonyhuang.sunplus@gmail.com>
+
+description: |
+  Processor for I/O control, RTC wake-up procedure management,
+  and cooperation with CPU&PMC in power management.
+
+properties:
+  compatible:
+    enum:
+      - sunplus,sp7021-iop
+
+  reg:
+    items:
+      - description: IOP registers regions
+      - description: PMC registers regions
+      - description: MOON0 registers regions
+
+  reg-names:
+    items:
+      - const: iop
+      - const: iop_pmc
+      - const: moon0
+
+  interrupts:
+    items:
+      - description: IOP_INT0. IOP to system Interrupt 0.
+                     Sent by IOP to system RISC.
+      - description: IOP_INT1. IOP to System Interrupt 1.
+                     Sent by IOP to system RISC.
+
+  memory-region:
+    maxItems: 1
+
+  iop-wakeup:
+    description: Notify 8051 to wake up the Linux kernel.
+
+required:
+  - compatible
+  - reg
+  - reg-names
+  - interrupts
+  - memory-region
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/gpio/gpio.h>
+    iop: iop@9c000400 {
+        compatible = "sunplus,sp7021-iop";
+        reg = <0x9c000400 0x80>, <0x9c003100 0x80>, <0x9c000000 0x80>;
+        reg-names = "iop", "iop_pmc", "moon0";
+        interrupt-parent = <&intc>;
+        interrupts = <41 IRQ_TYPE_LEVEL_HIGH>, <42 IRQ_TYPE_LEVEL_HIGH>;
+        memory-region = <&iop_reserve>;
+        pinctrl-names = "default";
+        pinctrl-0 = <&iop_pins>;
+        iop-wakeup = <&pctl 1 GPIO_ACTIVE_HIGH>;
+    };
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index 3b79fd4..071b5e6 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17945,6 +17945,11 @@ L:	netdev@vger.kernel.org
 S:	Maintained
 F:	drivers/net/ethernet/dlink/sundance.c
 
+SUNPLUS IOP DRIVER
+M:	Tony Huang <tonyhuang.sunplus@gmail.com>
+S:	Maintained
+F:	Documentation/devicetree/bindings/misc/sunplu-iop.yaml
+
 SUPERH
 M:	Yoshinori Sato <ysato@users.sourceforge.jp>
 M:	Rich Felker <dalias@libc.org>
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v5 2/2] misc: Add iop driver for Sunplus SP7021
  2021-12-24  8:35 [PATCH v5 0/2] Add iop driver for Sunplus SP7021 Tony Huang
  2021-12-24  8:35 ` [PATCH v5 1/2] dt-binding: misc: Add iop yaml file " Tony Huang
@ 2021-12-24  8:35 ` Tony Huang
  2021-12-24  9:30   ` Greg KH
  2021-12-26 11:29     ` kernel test robot
  1 sibling, 2 replies; 8+ messages in thread
From: Tony Huang @ 2021-12-24  8:35 UTC (permalink / raw)
  To: robh+dt, devicetree, linux-kernel, derek.kiernan, dragan.cvetic,
	arnd, gregkh
  Cc: tony.huang, wells.lu, Tony Huang

IOP (IO Processor) embedded inside SP7021 which is used as
Processor for I/O control, RTC wake-up and cooperation with
CPU & PMC in power management purpose.
The IOP core is DQ8051, so also named IOP8051,
it supports dedicated JTAG debug pins which share with SP7021.
In standby mode operation, the power spec reach 400uA.

Signed-off-by: Tony Huang <tonyhuang.sunplus@gmail.com>
---
Changes in v5:
 - Modify sysfs read/write function.
 - Added gpio pin for 8051 wake up linux kernel. 

 Documentation/ABI/testing/sysfs-platform-soc@B |  18 +
 MAINTAINERS                                    |   2 +
 drivers/misc/Kconfig                           |  12 +
 drivers/misc/Makefile                          |   1 +
 drivers/misc/sunplus_iop.c                     | 481 +++++++++++++++++++++++++
 5 files changed, 514 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-platform-soc@B
 create mode 100644 drivers/misc/sunplus_iop.c

diff --git a/Documentation/ABI/testing/sysfs-platform-soc@B b/Documentation/ABI/testing/sysfs-platform-soc@B
new file mode 100644
index 0000000..b0c54b5
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-platform-soc@B
@@ -0,0 +1,18 @@
+What:		/sys/devices/platform/soc@B/9c000400.iop/sp_iop_mailbox
+Date:		December 2021
+KernelVersion:	5.15
+Contact:	Tony Huang <tonyhuang.sunplus@gmail.com>
+Description:
+		Show 8051 mailbox data.
+
+What:		/sys/devices/platform/soc@B/9c000400.iop/sp_iop_mode
+Date:		December 2021
+KernelVersion:	5.15
+Contact:	Tony Huang <tonyhuang.sunplus@gmail.com>
+Description:
+		Operation mode of IOP is switched to standby mode by writing
+		"1" to sysfs.
+		Operation mode of IOP is switched to normal mode by writing
+		"0" to sysfs.
+
+
diff --git a/MAINTAINERS b/MAINTAINERS
index 071b5e6..614b7ff 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17948,7 +17948,9 @@ F:	drivers/net/ethernet/dlink/sundance.c
 SUNPLUS IOP DRIVER
 M:	Tony Huang <tonyhuang.sunplus@gmail.com>
 S:	Maintained
+F:	Documentation/ABI/testing/sysfs-platform-soc@B
 F:	Documentation/devicetree/bindings/misc/sunplu-iop.yaml
+F:	drivers/misc/sunplus_iop.c
 
 SUPERH
 M:	Yoshinori Sato <ysato@users.sourceforge.jp>
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 0f5a49f..f19533b 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -470,6 +470,18 @@ config HISI_HIKEY_USB
 	  switching between the dual-role USB-C port and the USB-A host ports
 	  using only one USB controller.
 
+config SUNPLUS_IOP
+	tristate "Sunplus IOP support"
+	default ARCH_SUNPLUS
+	help
+	  Sunplus I/O processor (8051) driver.
+	  Processor for I/O control, RTC wake-up proceduce management,
+	  and cooperation with CPU&PMC in power management.
+	  Need Install DQ8051, The DQ8051 bin file generated by keil C.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called ad525x_dpot.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index a086197..eafeab6 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -52,6 +52,7 @@ obj-$(CONFIG_DW_XDATA_PCIE)	+= dw-xdata-pcie.o
 obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL)		+= ocxl/
 obj-$(CONFIG_BCM_VK)		+= bcm-vk/
+obj-$(CONFIG_SUNPLUS_IOP)	+= sunplus_iop.o
 obj-y				+= cardreader/
 obj-$(CONFIG_PVPANIC)   	+= pvpanic/
 obj-$(CONFIG_HABANA_AI)		+= habanalabs/
diff --git a/drivers/misc/sunplus_iop.c b/drivers/misc/sunplus_iop.c
new file mode 100644
index 0000000..53501c0
--- /dev/null
+++ b/drivers/misc/sunplus_iop.c
@@ -0,0 +1,481 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * The IOP driver for Sunplus SP7021
+ *
+ * Copyright (C) 2021 Sunplus Technology Inc.
+ *
+ * All Rights Reserved.
+ */
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/firmware.h>
+#include <linux/iopoll.h>
+#include <linux/module.h>
+#include <linux/miscdevice.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+#include <linux/of_gpio.h>
+
+enum IOP_Status_e {
+	IOP_SUCCESS,                /* successful */
+	IOP_ERR_IOP_BUSY,           /* IOP is busy */
+};
+
+struct regs_moon0 {
+	u32 stamp;         /* 00 */
+	u32 clken[10];     /* 01~10 */
+	u32 gclken[10];    /* 11~20 */
+	u32 reset[10];     /* 21~30 */
+	u32 sfg_cfg_mode;  /* 31 */
+};
+
+struct regs_iop {
+	u32 iop_control;/* 00 */
+	u32 iop_reg1;/* 01 */
+	u32 iop_bp;/* 02 */
+	u32 iop_regsel;/* 03 */
+	u32 iop_regout;/* 04 */
+	u32 iop_reg5;/* 05 */
+	u32 iop_resume_pcl;/* 06 */
+	u32 iop_resume_pch;/* 07 */
+	u32 iop_data0;/* 08 */
+	u32 iop_data1;/* 09 */
+	u32 iop_data2;/* 10 */
+	u32 iop_data3;/* 11 */
+	u32 iop_data4;/* 12 */
+	u32 iop_data5;/* 13 */
+	u32 iop_data6;/* 14 */
+	u32 iop_data7;/* 15 */
+	u32 iop_data8;/* 16 */
+	u32 iop_data9;/* 17 */
+	u32 iop_data10;/* 18 */
+	u32 iop_data11;/* 19 */
+	u32 iop_base_adr_l;/* 20 */
+	u32 iop_base_adr_h;/* 21 */
+	u32 memory_bridge_control;/* 22 */
+	u32 iop_regmap_adr_l;/* 23 */
+	u32 iop_regmap_adr_h;/* 24 */
+	u32 iop_direct_adr;/* 25*/
+	u32 reserved[6];/* 26~31 */
+};
+
+struct regs_iop_pmc {
+	u32 PMC_TIMER;/* 00 */
+	u32 PMC_CTRL;/* 01 */
+	u32 XTAL27M_PASSWORD_I;/* 02 */
+	u32 XTAL27M_PASSWORD_II;/* 03 */
+	u32 XTAL32K_PASSWORD_I;/* 04 */
+	u32 XTAL32K_PASSWORD_II;/* 05 */
+	u32 CLK27M_PASSWORD_I;/* 06 */
+	u32 CLK27M_PASSWORD_II;/* 07 */
+	u32 PMC_TIMER2;/* 08 */
+	u32 reserved[23];/* 9~31 */
+};
+
+#define NORMAL_CODE_MAX_SIZE 0X1000
+#define STANDBY_CODE_MAX_SIZE 0x4000
+struct sp_iop {
+	struct miscdevice dev;			// iop device
+	struct mutex write_lock;
+	void __iomem *iop_regs;
+	void __iomem *pmc_regs;
+	void __iomem *moon0_regs;
+	int irq;
+	int gpio_wakeup;
+	unsigned char iop_normal_code[NORMAL_CODE_MAX_SIZE];
+	unsigned char iop_standby_code[STANDBY_CODE_MAX_SIZE];
+	resource_size_t iop_mem_start;
+	resource_size_t iop_mem_size;
+	bool mode;
+};
+
+static void sp_iop_normal_mode(struct sp_iop *iop)
+{
+	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
+	struct regs_moon0 *p_moon0_reg = (struct regs_moon0 *)iop->moon0_regs;
+	void __iomem *iop_kernel_base;
+	unsigned int reg;
+
+	iop_kernel_base = ioremap(iop->iop_mem_start, NORMAL_CODE_MAX_SIZE);
+	memset(iop_kernel_base, 0, NORMAL_CODE_MAX_SIZE);
+	memcpy(iop_kernel_base, iop->iop_normal_code, NORMAL_CODE_MAX_SIZE);
+
+	writel(0x00100010, &p_moon0_reg->clken[0]);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg |= 0x01;
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg &= ~(0x8000);
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg |= 0x0200;//disable watchdog event reset IOP
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = (iop->iop_mem_start & 0xFFFF);
+	writel(reg, &p_iop_reg->iop_base_adr_l);
+	reg	= (iop->iop_mem_start >> 16);
+	writel(reg, &p_iop_reg->iop_base_adr_h);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg &= ~(0x01);
+	writel(reg, &p_iop_reg->iop_control);
+	iop->mode = 0;
+}
+
+static void sp_iop_standby_mode(struct sp_iop *iop)
+{
+	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
+	struct regs_moon0 *p_moon0_reg = (struct regs_moon0 *)iop->moon0_regs;
+	void __iomem *iop_kernel_base;
+	unsigned long reg;
+
+	iop_kernel_base = ioremap(iop->iop_mem_start, STANDBY_CODE_MAX_SIZE);
+	memset(iop_kernel_base, 0, STANDBY_CODE_MAX_SIZE);
+	memcpy(iop_kernel_base, iop->iop_standby_code, STANDBY_CODE_MAX_SIZE);
+
+	writel(0x00100010, &p_moon0_reg->clken[0]);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg |= 0x01;
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg &= ~(0x8000);
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg |= 0x0200;//disable watchdog event reset IOP
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = (iop->iop_mem_start & 0xFFFF);
+	writel(reg, &p_iop_reg->iop_base_adr_l);
+	reg = (iop->iop_mem_start >> 16);
+	writel(reg, &p_iop_reg->iop_base_adr_h);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg &= ~(0x01);
+	writel(reg, &p_iop_reg->iop_control);
+	iop->mode = 1;
+}
+
+#define IOP_READY	0x4
+#define RISC_READY	0x8
+#define WAKEUP_PIN	0xFE02
+#define S1	0x5331
+#define S3	0x5333
+static int sp_iop_s3mode(struct device *dev, struct sp_iop *iop)
+{
+	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
+	struct regs_moon0 *p_moon0_reg = (struct regs_moon0 *)iop->moon0_regs;
+	struct regs_iop_pmc *p_iop_pmc_reg = (struct regs_iop_pmc *)iop->pmc_regs;
+	unsigned int reg;
+	int ret, value;
+
+	writel(0x00100010, &p_moon0_reg->clken[0]);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg &= ~(0x8000);
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg |= 0x1;
+	writel(reg, &p_iop_reg->iop_control);
+
+	//PMC set
+	writel(0x00010001, &p_iop_pmc_reg->PMC_TIMER);
+	reg = readl(&p_iop_pmc_reg->PMC_CTRL);
+	reg |= 0x23;// disable system reset PMC, enalbe power down 27M, enable gating 27M
+	writel(reg, &p_iop_pmc_reg->PMC_CTRL);
+
+	writel(0x55aa00ff, &p_iop_pmc_reg->XTAL27M_PASSWORD_I);
+	writel(0x00ff55aa, &p_iop_pmc_reg->XTAL27M_PASSWORD_II);
+	writel(0xaa00ff55, &p_iop_pmc_reg->XTAL32K_PASSWORD_I);
+	writel(0xff55aa00, &p_iop_pmc_reg->XTAL32K_PASSWORD_II);
+	writel(0xaaff0055, &p_iop_pmc_reg->CLK27M_PASSWORD_I);
+	writel(0x5500aaff, &p_iop_pmc_reg->CLK27M_PASSWORD_II);
+	writel(0x01000100, &p_iop_pmc_reg->PMC_TIMER2);
+
+	//IOP Hardware IP reset
+	reg = readl(&p_moon0_reg->reset[0]);
+	reg |= 0x10;
+	writel(reg, (&p_moon0_reg->reset[0]));
+	reg &= ~(0x10);
+	writel(reg, (&p_moon0_reg->reset[0]));
+
+	writel(0x00ff0085, (iop->moon0_regs + 32 * 4 * 1 + 4 * 1));
+
+	reg = readl(iop->moon0_regs + 32 * 4 * 1 + 4 * 2);
+	reg |= 0x08000800;
+	writel(reg, (iop->moon0_regs + 32 * 4 * 1 + 4 * 2));
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg |= 0x0200;//disable watchdog event reset IOP
+	writel(reg, &p_iop_reg->iop_control);
+
+	reg = (iop->iop_mem_start & 0xFFFF);
+	writel(reg, &p_iop_reg->iop_base_adr_l);
+	reg = (iop->iop_mem_start >> 16);
+	writel(reg, &p_iop_reg->iop_base_adr_h);
+
+	reg = readl(&p_iop_reg->iop_control);
+	reg &= ~(0x01);
+	writel(reg, &p_iop_reg->iop_control);
+
+	writel(WAKEUP_PIN, &p_iop_reg->iop_data0);
+	writel(iop->gpio_wakeup, &p_iop_reg->iop_data1);
+
+	ret = readl_poll_timeout(&p_iop_reg->iop_data2, value,
+				 (value & IOP_READY) == IOP_READY, 1000, 10000);
+	if (ret) {
+		dev_err(dev, "timed out\n");
+		return ret;
+	}
+
+	writel(RISC_READY, &p_iop_reg->iop_data2);
+	writel(0x00, &p_iop_reg->iop_data5);
+	writel(0x60, &p_iop_reg->iop_data6);
+
+	ret = readl_poll_timeout(&p_iop_reg->iop_data7, value,
+				 value == 0xaaaa, 1000, 10000);
+	if (ret) {
+		dev_err(dev, "timed out\n");
+		return ret;
+	}
+
+	writel(0xdd, &p_iop_reg->iop_data1);//8051 bin file call Ultra low function.
+	mdelay(10);
+	return 0;
+}
+
+static int sp_iop_s1mode(struct device *dev, struct sp_iop *iop)
+{
+	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
+	int ret, value;
+
+	ret = readl_poll_timeout(&p_iop_reg->iop_data2, value,
+				 (value & IOP_READY) == IOP_READY, 1000, 10000);
+	if (ret) {
+		dev_err(dev, "timed out\n");
+		return ret;
+	}
+
+	writel(RISC_READY, &p_iop_reg->iop_data2);
+	writel(0x00, &p_iop_reg->iop_data5);
+	writel(0x60, &p_iop_reg->iop_data6);
+
+	ret = readl_poll_timeout(&p_iop_reg->iop_data7, value,
+				 value == 0xaaaa, 1000, 10000);
+	if (ret) {
+		dev_err(dev, "timed out\n");
+		return ret;
+	}
+
+	writel(0xee, &p_iop_reg->iop_data1);//8051 bin file call S1_mode function.
+	mdelay(10);
+	return 0;
+}
+
+static ssize_t sp_iop_mailbox_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct sp_iop *iop = dev_get_drvdata(dev);
+	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
+	unsigned int MB0, MB1, MB2;
+
+	MB0 = readl(&p_iop_reg->iop_data0);
+	MB1 = readl(&p_iop_reg->iop_data1);
+	MB2 = readl(&p_iop_reg->iop_data2);
+	return sprintf(buf, "MB0:0x%x MB1:0x%x MB2:0x%x\n", MB0, MB1, MB2);
+}
+
+static ssize_t sp_iop_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct sp_iop *iop = dev_get_drvdata(dev);
+
+	if (iop->mode == 0)
+		return sprintf(buf, "normal code\n");
+	else
+		return sprintf(buf, "standby code\n");
+}
+
+static ssize_t sp_iop_mode_store(struct device *dev, struct device_attribute *attr,
+				 const char *buf, size_t count)
+{
+	struct sp_iop *iop = dev_get_drvdata(dev);
+
+	if (sysfs_streq(buf, "0"))
+		sp_iop_normal_mode(iop);
+	else if (sysfs_streq(buf, "1"))
+		sp_iop_standby_mode(iop);
+	return count;
+}
+
+static DEVICE_ATTR_RO(sp_iop_mailbox);
+static DEVICE_ATTR_RW(sp_iop_mode);
+
+static int  sp_iop_get_normal_code(struct device *dev, struct sp_iop *iop)
+{
+	const struct firmware *fw;
+	static const char file[] = "normal.bin";
+	unsigned int err, i;
+
+	err = request_firmware(&fw, file, dev);
+	if (err) {
+		dev_err(dev, "get bin file error\n");
+		return err;
+	}
+
+	for (i = 0; i < NORMAL_CODE_MAX_SIZE; i++) {
+		char temp;
+
+		temp = fw->data[i];
+		iop->iop_normal_code[i] = temp;
+	}
+	release_firmware(fw);
+	return err;
+}
+
+static int  sp_iop_get_standby_code(struct device *dev, struct sp_iop *iop)
+{
+	const struct firmware *fw;
+	static const char file[] = "standby.bin";
+	unsigned int err, i;
+
+	err = request_firmware(&fw, file, dev);
+	if (err) {
+		dev_err(dev, "get bin file error\n");
+		return err;
+	}
+
+	for (i = 0; i < STANDBY_CODE_MAX_SIZE; i++) {
+		char temp;
+
+		temp = fw->data[i];
+		iop->iop_standby_code[i] = temp;
+	}
+	release_firmware(fw);
+	return err;
+}
+
+static int sp_iop_get_resources(struct platform_device *pdev, struct sp_iop *p_sp_iop_info)
+{
+	struct resource *r;
+
+	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "iop");
+	p_sp_iop_info->iop_regs = devm_ioremap_resource(&pdev->dev, r);
+	if (IS_ERR(p_sp_iop_info->iop_regs)) {
+		dev_err(&pdev->dev, "ioremap fail\n");
+		return PTR_ERR(p_sp_iop_info->iop_regs);
+	}
+
+	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "iop_pmc");
+	p_sp_iop_info->pmc_regs = devm_ioremap_resource(&pdev->dev, r);
+	if (IS_ERR(p_sp_iop_info->pmc_regs)) {
+		dev_err(&pdev->dev, "ioremap fail\n");
+		return PTR_ERR(p_sp_iop_info->pmc_regs);
+	}
+
+	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "moon0");
+	p_sp_iop_info->moon0_regs = devm_ioremap_resource(&pdev->dev, r);
+	if (IS_ERR(p_sp_iop_info->moon0_regs)) {
+		dev_err(&pdev->dev, "ioremap fail\n");
+		return PTR_ERR(p_sp_iop_info->moon0_regs);
+	}
+	return IOP_SUCCESS;
+}
+
+static int sp_iop_platform_driver_probe(struct platform_device *pdev)
+{
+	int ret = -ENXIO;
+	int rc;
+	struct sp_iop *iop;
+	struct device_node *memnp;
+	struct resource mem_res;
+
+	iop = devm_kzalloc(&pdev->dev, sizeof(struct sp_iop), GFP_KERNEL);
+	if (!iop) {
+		ret	= -ENOMEM;
+		goto fail_kmalloc;
+	}
+	/* init */
+	mutex_init(&iop->write_lock);
+	ret = sp_iop_get_resources(pdev, iop);
+
+	//Get reserve address
+	memnp = of_parse_phandle(pdev->dev.of_node, "memory-region", 0);
+	if (!memnp) {
+		dev_err(&pdev->dev, "no memory-region node\n");
+		return -EINVAL;
+	}
+
+	rc = of_address_to_resource(memnp, 0, &mem_res);
+	of_node_put(memnp);
+	if (rc) {
+		dev_err(&pdev->dev, "failed to translate memory-region to a resource\n");
+		return -EINVAL;
+	}
+
+	iop->iop_mem_start = mem_res.start;
+	iop->iop_mem_size = resource_size(&mem_res);
+
+	ret = sp_iop_get_normal_code(&pdev->dev, iop);
+	if (ret != 0) {
+		dev_err(&pdev->dev, "get normal code err=%d\n", ret);
+		return ret;
+	}
+
+	ret = sp_iop_get_standby_code(&pdev->dev, iop);
+	if (ret != 0) {
+		dev_err(&pdev->dev, "get standby code err=%d\n", ret);
+		return ret;
+	}
+
+	sp_iop_normal_mode(iop);
+	platform_set_drvdata(pdev, iop);
+	device_create_file(&pdev->dev, &dev_attr_sp_iop_mailbox);
+	device_create_file(&pdev->dev, &dev_attr_sp_iop_mode);
+	iop->gpio_wakeup = of_get_named_gpio(pdev->dev.of_node, "iop-wakeup", 0);
+	return 0;
+
+fail_kmalloc:
+	return ret;
+}
+
+static void sp_iop_platform_driver_shutdown(struct platform_device *pdev)
+{
+	struct sp_iop *iop = platform_get_drvdata(pdev);
+	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
+	unsigned int value;
+
+	sp_iop_standby_mode(iop);
+	mdelay(10);
+	value = readl(&p_iop_reg->iop_data11);
+	if (value == S1)
+		sp_iop_s1mode(&pdev->dev, iop);
+	else
+		sp_iop_s3mode(&pdev->dev, iop);
+}
+
+static const struct of_device_id sp_iop_of_match[] = {
+	{ .compatible = "sunplus,sp7021-iop" },
+	{ /* sentinel */ },
+};
+
+MODULE_DEVICE_TABLE(of, sp_iop_of_match);
+
+static struct platform_driver sp_iop_platform_driver = {
+	.probe		= sp_iop_platform_driver_probe,
+	.shutdown	= sp_iop_platform_driver_shutdown,
+	.driver = {
+		.name	= "sunplus,sp7021-iop",
+		.of_match_table = sp_iop_of_match,
+	}
+};
+
+module_platform_driver(sp_iop_platform_driver);
+
+MODULE_AUTHOR("Tony Huang <tonyhuang.sunplus@gmail.com>");
+MODULE_DESCRIPTION("Sunplus IOP Driver");
+MODULE_LICENSE("GPL v2");
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 2/2] misc: Add iop driver for Sunplus SP7021
  2021-12-24  8:35 ` [PATCH v5 2/2] misc: Add iop driver " Tony Huang
@ 2021-12-24  9:30   ` Greg KH
  2021-12-26 11:29     ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: Greg KH @ 2021-12-24  9:30 UTC (permalink / raw)
  To: Tony Huang
  Cc: robh+dt, devicetree, linux-kernel, derek.kiernan, dragan.cvetic,
	arnd, tony.huang, wells.lu

On Fri, Dec 24, 2021 at 04:35:56PM +0800, Tony Huang wrote:
> IOP (IO Processor) embedded inside SP7021 which is used as
> Processor for I/O control, RTC wake-up and cooperation with
> CPU & PMC in power management purpose.
> The IOP core is DQ8051, so also named IOP8051,
> it supports dedicated JTAG debug pins which share with SP7021.
> In standby mode operation, the power spec reach 400uA.
> 
> Signed-off-by: Tony Huang <tonyhuang.sunplus@gmail.com>
> ---
> Changes in v5:
>  - Modify sysfs read/write function.
>  - Added gpio pin for 8051 wake up linux kernel. 
> 
>  Documentation/ABI/testing/sysfs-platform-soc@B |  18 +
>  MAINTAINERS                                    |   2 +
>  drivers/misc/Kconfig                           |  12 +
>  drivers/misc/Makefile                          |   1 +
>  drivers/misc/sunplus_iop.c                     | 481 +++++++++++++++++++++++++
>  5 files changed, 514 insertions(+)
>  create mode 100644 Documentation/ABI/testing/sysfs-platform-soc@B
>  create mode 100644 drivers/misc/sunplus_iop.c
> 
> diff --git a/Documentation/ABI/testing/sysfs-platform-soc@B b/Documentation/ABI/testing/sysfs-platform-soc@B
> new file mode 100644
> index 0000000..b0c54b5
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-platform-soc@B
> @@ -0,0 +1,18 @@
> +What:		/sys/devices/platform/soc@B/9c000400.iop/sp_iop_mailbox
> +Date:		December 2021
> +KernelVersion:	5.15

5.15 was alread released, this can not be added to older kernels.

> +Contact:	Tony Huang <tonyhuang.sunplus@gmail.com>
> +Description:
> +		Show 8051 mailbox data.
> +
> +What:		/sys/devices/platform/soc@B/9c000400.iop/sp_iop_mode
> +Date:		December 2021
> +KernelVersion:	5.15
> +Contact:	Tony Huang <tonyhuang.sunplus@gmail.com>
> +Description:
> +		Operation mode of IOP is switched to standby mode by writing
> +		"1" to sysfs.
> +		Operation mode of IOP is switched to normal mode by writing
> +		"0" to sysfs.

You are not documenting what reading these sysfs files show.  Remember,
sysfs is "one value per file" and it looks like you are printing out
many values in the same file:

> +static ssize_t sp_iop_mailbox_show(struct device *dev, struct device_attribute *attr, char *buf)
> +{
> +	struct sp_iop *iop = dev_get_drvdata(dev);
> +	struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
> +	unsigned int MB0, MB1, MB2;
> +
> +	MB0 = readl(&p_iop_reg->iop_data0);
> +	MB1 = readl(&p_iop_reg->iop_data1);
> +	MB2 = readl(&p_iop_reg->iop_data2);
> +	return sprintf(buf, "MB0:0x%x MB1:0x%x MB2:0x%x\n", MB0, MB1, MB2);

That is a very odd "single value".

Also please use sysfs_emit().

> +static ssize_t sp_iop_mode_show(struct device *dev, struct device_attribute *attr, char *buf)
> +{
> +	struct sp_iop *iop = dev_get_drvdata(dev);
> +
> +	if (iop->mode == 0)
> +		return sprintf(buf, "normal code\n");
> +	else
> +		return sprintf(buf, "standby code\n");

2 words?



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 2/2] misc: Add iop driver for Sunplus SP7021
  2021-12-24  8:35 ` [PATCH v5 2/2] misc: Add iop driver " Tony Huang
@ 2021-12-26 11:29     ` kernel test robot
  2021-12-26 11:29     ` kernel test robot
  1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2021-12-26 11:29 UTC (permalink / raw)
  To: Tony Huang, robh+dt, devicetree, linux-kernel, derek.kiernan,
	dragan.cvetic, arnd, gregkh
  Cc: kbuild-all, tony.huang, wells.lu, Tony Huang

Hi Tony,

I love your patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on robh/for-next linux/master linus/master v5.16-rc6 next-20211224]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Tony-Huang/Add-iop-driver-for-Sunplus-SP7021/20211224-163743
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 1bb866dcb8cf5054de88f592fc0ec1f275ad9d63
config: powerpc64-randconfig-s032-20211226 (https://download.01.org/0day-ci/archive/20211226/202112261932.8hwlDwCu-lkp@intel.com/config)
compiler: powerpc64le-linux-gcc (GCC) 11.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/0day-ci/linux/commit/a75af7615fe0101c6f3742afc005a39c66b00864
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Tony-Huang/Add-iop-driver-for-Sunplus-SP7021/20211224-163743
        git checkout a75af7615fe0101c6f3742afc005a39c66b00864
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=powerpc SHELL=/bin/bash drivers/misc/ drivers/pinctrl/nuvoton/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
   drivers/misc/sunplus_iop.c:94:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:95:43: sparse: sparse: cast removes address space '__iomem' of expression
>> drivers/misc/sunplus_iop.c:100:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:100:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:100:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:101:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:101:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:101:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:103:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:103:47: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:103:47: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:105:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:105:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:105:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:107:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:107:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:107:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:109:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:109:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:109:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:111:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:111:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:111:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:113:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:113:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:113:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:115:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:115:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:115:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:118:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:118:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:118:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:120:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:120:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:120:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:122:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:122:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:122:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:124:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:124:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:124:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:130:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:131:43: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:136:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:136:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:136:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:137:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:137:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:137:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:139:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:139:47: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:139:47: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:141:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:141:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:141:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:143:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:143:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:143:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:145:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:145:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:145:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:147:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:147:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:147:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:149:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:149:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:149:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:151:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:151:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:151:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:154:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:154:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:154:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:156:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:156:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:156:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:158:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:158:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:158:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:160:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:160:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:160:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:171:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:172:43: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:173:47: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:177:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:177:47: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:177:47: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:179:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:179:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:179:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:181:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:181:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:181:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:183:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:183:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:183:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:185:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:185:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:185:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:188:29: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:188:29: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:188:29: sparse:     got unsigned int *

vim +100 drivers/misc/sunplus_iop.c

    91	
    92	static void sp_iop_normal_mode(struct sp_iop *iop)
    93	{
    94		struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
    95		struct regs_moon0 *p_moon0_reg = (struct regs_moon0 *)iop->moon0_regs;
    96		void __iomem *iop_kernel_base;
    97		unsigned int reg;
    98	
    99		iop_kernel_base = ioremap(iop->iop_mem_start, NORMAL_CODE_MAX_SIZE);
 > 100		memset(iop_kernel_base, 0, NORMAL_CODE_MAX_SIZE);
   101		memcpy(iop_kernel_base, iop->iop_normal_code, NORMAL_CODE_MAX_SIZE);
   102	
   103		writel(0x00100010, &p_moon0_reg->clken[0]);
   104	
   105		reg = readl(&p_iop_reg->iop_control);
   106		reg |= 0x01;
   107		writel(reg, &p_iop_reg->iop_control);
   108	
   109		reg = readl(&p_iop_reg->iop_control);
   110		reg &= ~(0x8000);
   111		writel(reg, &p_iop_reg->iop_control);
   112	
   113		reg = readl(&p_iop_reg->iop_control);
   114		reg |= 0x0200;//disable watchdog event reset IOP
   115		writel(reg, &p_iop_reg->iop_control);
   116	
   117		reg = (iop->iop_mem_start & 0xFFFF);
   118		writel(reg, &p_iop_reg->iop_base_adr_l);
   119		reg	= (iop->iop_mem_start >> 16);
   120		writel(reg, &p_iop_reg->iop_base_adr_h);
   121	
   122		reg = readl(&p_iop_reg->iop_control);
   123		reg &= ~(0x01);
   124		writel(reg, &p_iop_reg->iop_control);
   125		iop->mode = 0;
   126	}
   127	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 2/2] misc: Add iop driver for Sunplus SP7021
@ 2021-12-26 11:29     ` kernel test robot
  0 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2021-12-26 11:29 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 15837 bytes --]

Hi Tony,

I love your patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on robh/for-next linux/master linus/master v5.16-rc6 next-20211224]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Tony-Huang/Add-iop-driver-for-Sunplus-SP7021/20211224-163743
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 1bb866dcb8cf5054de88f592fc0ec1f275ad9d63
config: powerpc64-randconfig-s032-20211226 (https://download.01.org/0day-ci/archive/20211226/202112261932.8hwlDwCu-lkp(a)intel.com/config)
compiler: powerpc64le-linux-gcc (GCC) 11.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/0day-ci/linux/commit/a75af7615fe0101c6f3742afc005a39c66b00864
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Tony-Huang/Add-iop-driver-for-Sunplus-SP7021/20211224-163743
        git checkout a75af7615fe0101c6f3742afc005a39c66b00864
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=powerpc SHELL=/bin/bash drivers/misc/ drivers/pinctrl/nuvoton/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
   drivers/misc/sunplus_iop.c:94:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:95:43: sparse: sparse: cast removes address space '__iomem' of expression
>> drivers/misc/sunplus_iop.c:100:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:100:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:100:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:101:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:101:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:101:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:103:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:103:47: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:103:47: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:105:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:105:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:105:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:107:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:107:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:107:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:109:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:109:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:109:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:111:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:111:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:111:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:113:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:113:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:113:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:115:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:115:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:115:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:118:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:118:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:118:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:120:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:120:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:120:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:122:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:122:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:122:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:124:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:124:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:124:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:130:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:131:43: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:136:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:136:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:136:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:137:16: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *p @@     got void [noderef] __iomem *[assigned] iop_kernel_base @@
   drivers/misc/sunplus_iop.c:137:16: sparse:     expected void *p
   drivers/misc/sunplus_iop.c:137:16: sparse:     got void [noderef] __iomem *[assigned] iop_kernel_base
   drivers/misc/sunplus_iop.c:139:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:139:47: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:139:47: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:141:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:141:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:141:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:143:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:143:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:143:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:145:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:145:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:145:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:147:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:147:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:147:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:149:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:149:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:149:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:151:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:151:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:151:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:154:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:154:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:154:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:156:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:156:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:156:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:158:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:158:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:158:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:160:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:160:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:160:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:171:39: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:172:43: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:173:47: sparse: sparse: cast removes address space '__iomem' of expression
   drivers/misc/sunplus_iop.c:177:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:177:47: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:177:47: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:179:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:179:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:179:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:181:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:181:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:181:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:183:22: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void const volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:183:22: sparse:     expected void const volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:183:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:185:22: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:185:22: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:185:22: sparse:     got unsigned int *
   drivers/misc/sunplus_iop.c:188:29: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void volatile [noderef] __iomem *addr @@     got unsigned int * @@
   drivers/misc/sunplus_iop.c:188:29: sparse:     expected void volatile [noderef] __iomem *addr
   drivers/misc/sunplus_iop.c:188:29: sparse:     got unsigned int *

vim +100 drivers/misc/sunplus_iop.c

    91	
    92	static void sp_iop_normal_mode(struct sp_iop *iop)
    93	{
    94		struct regs_iop *p_iop_reg = (struct regs_iop *)iop->iop_regs;
    95		struct regs_moon0 *p_moon0_reg = (struct regs_moon0 *)iop->moon0_regs;
    96		void __iomem *iop_kernel_base;
    97		unsigned int reg;
    98	
    99		iop_kernel_base = ioremap(iop->iop_mem_start, NORMAL_CODE_MAX_SIZE);
 > 100		memset(iop_kernel_base, 0, NORMAL_CODE_MAX_SIZE);
   101		memcpy(iop_kernel_base, iop->iop_normal_code, NORMAL_CODE_MAX_SIZE);
   102	
   103		writel(0x00100010, &p_moon0_reg->clken[0]);
   104	
   105		reg = readl(&p_iop_reg->iop_control);
   106		reg |= 0x01;
   107		writel(reg, &p_iop_reg->iop_control);
   108	
   109		reg = readl(&p_iop_reg->iop_control);
   110		reg &= ~(0x8000);
   111		writel(reg, &p_iop_reg->iop_control);
   112	
   113		reg = readl(&p_iop_reg->iop_control);
   114		reg |= 0x0200;//disable watchdog event reset IOP
   115		writel(reg, &p_iop_reg->iop_control);
   116	
   117		reg = (iop->iop_mem_start & 0xFFFF);
   118		writel(reg, &p_iop_reg->iop_base_adr_l);
   119		reg	= (iop->iop_mem_start >> 16);
   120		writel(reg, &p_iop_reg->iop_base_adr_h);
   121	
   122		reg = readl(&p_iop_reg->iop_control);
   123		reg &= ~(0x01);
   124		writel(reg, &p_iop_reg->iop_control);
   125		iop->mode = 0;
   126	}
   127	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v5 1/2] dt-binding: misc: Add iop yaml file for Sunplus SP7021
  2021-12-24  8:35 ` [PATCH v5 1/2] dt-binding: misc: Add iop yaml file " Tony Huang
@ 2021-12-27 16:43   ` Rob Herring
  2021-12-29  1:57     ` Tony Huang 黃懷厚
  0 siblings, 1 reply; 8+ messages in thread
From: Rob Herring @ 2021-12-27 16:43 UTC (permalink / raw)
  To: Tony Huang
  Cc: devicetree, linux-kernel, derek.kiernan, dragan.cvetic, arnd,
	gregkh, tony.huang, wells.lu

On Fri, Dec 24, 2021 at 04:35:55PM +0800, Tony Huang wrote:
> Add iop yaml file for Sunplus SP7021
> 
> Signed-off-by: Tony Huang <tonyhuang.sunplus@gmail.com>
> ---
> Changes in v5:
> -Add iop-wakeup pin for 8051 to wake up the Linux kernel in shutdown mode.
> 
>  .../devicetree/bindings/misc/sunplus-iop.yaml      | 72 ++++++++++++++++++++++
>  MAINTAINERS                                        |  5 ++
>  2 files changed, 77 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> 
> diff --git a/Documentation/devicetree/bindings/misc/sunplus-iop.yaml b/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> new file mode 100644
> index 0000000..fad0f50
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> @@ -0,0 +1,72 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +# Copyright (C) Sunplus Ltd. Co. 2021
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/misc/sunplus-iop.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Sunplus IOP(8051) controller
> +
> +maintainers:
> +  - Tony Huang <tonyhuang.sunplus@gmail.com>
> +
> +description: |
> +  Processor for I/O control, RTC wake-up procedure management,
> +  and cooperation with CPU&PMC in power management.
> +
> +properties:
> +  compatible:
> +    enum:
> +      - sunplus,sp7021-iop
> +
> +  reg:
> +    items:
> +      - description: IOP registers regions
> +      - description: PMC registers regions
> +      - description: MOON0 registers regions
> +
> +  reg-names:
> +    items:
> +      - const: iop
> +      - const: iop_pmc
> +      - const: moon0
> +
> +  interrupts:
> +    items:
> +      - description: IOP_INT0. IOP to system Interrupt 0.
> +                     Sent by IOP to system RISC.
> +      - description: IOP_INT1. IOP to System Interrupt 1.
> +                     Sent by IOP to system RISC.
> +
> +  memory-region:
> +    maxItems: 1
> +
> +  iop-wakeup:
> +    description: Notify 8051 to wake up the Linux kernel.

What does that mean? What's the type? Does the standard 'wakeup-source' 
property not work here?

> +
> +required:
> +  - compatible
> +  - reg
> +  - reg-names
> +  - interrupts
> +  - memory-region
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/interrupt-controller/irq.h>
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +    #include <dt-bindings/gpio/gpio.h>
> +    iop: iop@9c000400 {
> +        compatible = "sunplus,sp7021-iop";
> +        reg = <0x9c000400 0x80>, <0x9c003100 0x80>, <0x9c000000 0x80>;
> +        reg-names = "iop", "iop_pmc", "moon0";
> +        interrupt-parent = <&intc>;
> +        interrupts = <41 IRQ_TYPE_LEVEL_HIGH>, <42 IRQ_TYPE_LEVEL_HIGH>;
> +        memory-region = <&iop_reserve>;
> +        pinctrl-names = "default";
> +        pinctrl-0 = <&iop_pins>;
> +        iop-wakeup = <&pctl 1 GPIO_ACTIVE_HIGH>;

That's not how the GPIO binding works.

> +    };
> +...
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 3b79fd4..071b5e6 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -17945,6 +17945,11 @@ L:	netdev@vger.kernel.org
>  S:	Maintained
>  F:	drivers/net/ethernet/dlink/sundance.c
>  
> +SUNPLUS IOP DRIVER
> +M:	Tony Huang <tonyhuang.sunplus@gmail.com>
> +S:	Maintained
> +F:	Documentation/devicetree/bindings/misc/sunplu-iop.yaml
> +
>  SUPERH
>  M:	Yoshinori Sato <ysato@users.sourceforge.jp>
>  M:	Rich Felker <dalias@libc.org>
> -- 
> 2.7.4
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH v5 1/2] dt-binding: misc: Add iop yaml file for Sunplus SP7021
  2021-12-27 16:43   ` Rob Herring
@ 2021-12-29  1:57     ` Tony Huang 黃懷厚
  0 siblings, 0 replies; 8+ messages in thread
From: Tony Huang 黃懷厚 @ 2021-12-29  1:57 UTC (permalink / raw)
  To: Rob Herring, Tony Huang
  Cc: devicetree, linux-kernel, derek.kiernan, dragan.cvetic, arnd,
	gregkh, Wells Lu 呂芳騰

Dear Rob:

> Subject: Re: [PATCH v5 1/2] dt-binding: misc: Add iop yaml file for Sunplus
> SP7021
> 
> On Fri, Dec 24, 2021 at 04:35:55PM +0800, Tony Huang wrote:
> > Add iop yaml file for Sunplus SP7021
> >
> > Signed-off-by: Tony Huang <tonyhuang.sunplus@gmail.com>
> > ---
> > Changes in v5:
> > -Add iop-wakeup pin for 8051 to wake up the Linux kernel in shutdown
> mode.
> >
> >  .../devicetree/bindings/misc/sunplus-iop.yaml      | 72
> ++++++++++++++++++++++
> >  MAINTAINERS                                        |  5 ++
> >  2 files changed, 77 insertions(+)
> >  create mode 100644
> > Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> >
> > diff --git a/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> > b/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> > new file mode 100644
> > index 0000000..fad0f50
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/misc/sunplus-iop.yaml
> > @@ -0,0 +1,72 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) # Copyright
> > +(C) Sunplus Ltd. Co. 2021 %YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/misc/sunplus-iop.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Sunplus IOP(8051) controller
> > +
> > +maintainers:
> > +  - Tony Huang <tonyhuang.sunplus@gmail.com>
> > +
> > +description: |
> > +  Processor for I/O control, RTC wake-up procedure management,
> > +  and cooperation with CPU&PMC in power management.
> > +
> > +properties:
> > +  compatible:
> > +    enum:
> > +      - sunplus,sp7021-iop
> > +
> > +  reg:
> > +    items:
> > +      - description: IOP registers regions
> > +      - description: PMC registers regions
> > +      - description: MOON0 registers regions
> > +
> > +  reg-names:
> > +    items:
> > +      - const: iop
> > +      - const: iop_pmc
> > +      - const: moon0
> > +
> > +  interrupts:
> > +    items:
> > +      - description: IOP_INT0. IOP to system Interrupt 0.
> > +                     Sent by IOP to system RISC.
> > +      - description: IOP_INT1. IOP to System Interrupt 1.
> > +                     Sent by IOP to system RISC.
> > +
> > +  memory-region:
> > +    maxItems: 1
> > +
> > +  iop-wakeup:
> > +    description: Notify 8051 to wake up the Linux kernel.
> 
> What does that mean? What's the type? Does the standard 'wakeup-source'
> property not work here?
> 

When mounting IOP (8051). We can assign a gpio pin to 8051.
When the linux kernel system is powered off. 8051 is always powered.
8051 can receive external signals according to this gpio pin .
8051 receives external signal through gpio pin. 8051 can power on linux kernel system.

> > +
> > +required:
> > +  - compatible
> > +  - reg
> > +  - reg-names
> > +  - interrupts
> > +  - memory-region
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > +  - |
> > +    #include <dt-bindings/interrupt-controller/irq.h>
> > +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> > +    #include <dt-bindings/gpio/gpio.h>
> > +    iop: iop@9c000400 {
> > +        compatible = "sunplus,sp7021-iop";
> > +        reg = <0x9c000400 0x80>, <0x9c003100 0x80>, <0x9c000000
> 0x80>;
> > +        reg-names = "iop", "iop_pmc", "moon0";
> > +        interrupt-parent = <&intc>;
> > +        interrupts = <41 IRQ_TYPE_LEVEL_HIGH>, <42
> IRQ_TYPE_LEVEL_HIGH>;
> > +        memory-region = <&iop_reserve>;
> > +        pinctrl-names = "default";
> > +        pinctrl-0 = <&iop_pins>;
> > +        iop-wakeup = <&pctl 1 GPIO_ACTIVE_HIGH>;
> 
> That's not how the GPIO binding works.
> 
> > +    };
> > +...
> > diff --git a/MAINTAINERS b/MAINTAINERS index 3b79fd4..071b5e6 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -17945,6 +17945,11 @@ L:	netdev@vger.kernel.org
> >  S:	Maintained
> >  F:	drivers/net/ethernet/dlink/sundance.c
> >
> > +SUNPLUS IOP DRIVER
> > +M:	Tony Huang <tonyhuang.sunplus@gmail.com>
> > +S:	Maintained
> > +F:	Documentation/devicetree/bindings/misc/sunplu-iop.yaml
> > +
> >  SUPERH
> >  M:	Yoshinori Sato <ysato@users.sourceforge.jp>
> >  M:	Rich Felker <dalias@libc.org>
> > --
> > 2.7.4
> >
> >

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-12-29  1:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-24  8:35 [PATCH v5 0/2] Add iop driver for Sunplus SP7021 Tony Huang
2021-12-24  8:35 ` [PATCH v5 1/2] dt-binding: misc: Add iop yaml file " Tony Huang
2021-12-27 16:43   ` Rob Herring
2021-12-29  1:57     ` Tony Huang 黃懷厚
2021-12-24  8:35 ` [PATCH v5 2/2] misc: Add iop driver " Tony Huang
2021-12-24  9:30   ` Greg KH
2021-12-26 11:29   ` kernel test robot
2021-12-26 11:29     ` kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.