linux-mips.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
@ 2022-11-14  9:53 Yinbo Zhu
  2022-11-14  9:53 ` [PATCH v2 2/2] dt-bindings: gpio: add loongson series gpio Yinbo Zhu
  2022-11-15  9:05 ` [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Bartosz Golaszewski
  0 siblings, 2 replies; 11+ messages in thread
From: Yinbo Zhu @ 2022-11-14  9:53 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Rob Herring,
	Krzysztof Kozlowski, WANG Xuerui, Jiaxun Yang,
	Thomas Bogendoerfer, Juxin Gao, Bibo Mao, Yanteng Si, linux-gpio,
	devicetree, linux-kernel, loongarch, linux-mips, Arnaud Patard,
	Huacai Chen, Yinbo Zhu
  Cc: lvjianmin, zhanghongchen, Liu Peibao

The latest Loongson series platform use dts or acpi framework to
register gpio device resources, such as the Loongson-2 series
SoC of LOONGARCH architecture. In order to support dts, acpi and
compatibility with previous platform device resources in driver,
this patch was added.

Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
---
Change in v2:
		1. Fixup of_loongson_gpio_get_props and remove the parse logic about
	           "loongson,conf_offset", "loongson,out_offset", "loongson,in_offset",
		   "loongson,gpio_base", "loongson,support_irq" then kernel driver will
		   initial them that depend compatible except "loongson,gpio_base".

 arch/loongarch/include/asm/loongson.h         |  13 +
 .../include/asm/mach-loongson2ef/loongson.h   |  12 +
 .../include/asm/mach-loongson64/loongson.h    |  13 +
 drivers/gpio/Kconfig                          |   6 +-
 drivers/gpio/gpio-loongson.c                  | 422 +++++++++++++++---
 5 files changed, 391 insertions(+), 75 deletions(-)

diff --git a/arch/loongarch/include/asm/loongson.h b/arch/loongarch/include/asm/loongson.h
index 00db93edae1b..383fdda155f0 100644
--- a/arch/loongarch/include/asm/loongson.h
+++ b/arch/loongarch/include/asm/loongson.h
@@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64, volatile void __iomem *addr)
 	);
 }
 
+/* ============== Data structrues =============== */
+
+/* gpio data */
+struct platform_gpio_data {
+	u32 gpio_conf;
+	u32 gpio_out;
+	u32 gpio_in;
+	u32 support_irq;
+	char *label;
+	int gpio_base;
+	int ngpio;
+};
+
 /* ============== LS7A registers =============== */
 #define LS7A_PCH_REG_BASE		0x10000000UL
 /* LPC regs */
diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h b/arch/mips/include/asm/mach-loongson2ef/loongson.h
index ca039b8dcde3..b261cea4fee1 100644
--- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
+++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
@@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
 
 #endif	/* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
 
+/* ============== Data structrues =============== */
+
+/* gpio data */
+struct platform_gpio_data {
+	u32 gpio_conf;
+	u32 gpio_out;
+	u32 gpio_in;
+	u32 support_irq;
+	char *label;
+	int gpio_base;
+	int ngpio;
+};
 #endif /* __ASM_MACH_LOONGSON2EF_LOONGSON_H */
diff --git a/arch/mips/include/asm/mach-loongson64/loongson.h b/arch/mips/include/asm/mach-loongson64/loongson.h
index f7c3ab6d724e..b9f8a95aff64 100644
--- a/arch/mips/include/asm/mach-loongson64/loongson.h
+++ b/arch/mips/include/asm/mach-loongson64/loongson.h
@@ -12,6 +12,19 @@
 #include <linux/irq.h>
 #include <boot_param.h>
 
+/* ============== Data structrues =============== */
+
+/* gpio data */
+struct platform_gpio_data {
+	u32 gpio_conf;
+	u32 gpio_out;
+	u32 gpio_in;
+	u32 support_irq;
+	char *label;
+	int gpio_base;
+	int ngpio;
+};
+
 enum loongson_fw_interface {
 	LOONGSON_LEFI,
 	LOONGSON_DTB,
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index a01af1180616..fb8f0075a8ae 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -376,10 +376,10 @@ config GPIO_LOGICVC
 	  programmable logic block.
 
 config GPIO_LOONGSON
-	bool "Loongson-2/3 GPIO support"
-	depends on CPU_LOONGSON2EF || CPU_LOONGSON64
+	bool "Loongson series GPIO support"
+	depends on CPU_LOONGSON2EF || CPU_LOONGSON64 || LOONGARCH
 	help
-	  Driver for GPIO functionality on Loongson-2F/3A/3B processors.
+	  Driver for GPIO functionality on Loongson seires processors.
 
 config GPIO_LPC18XX
 	tristate "NXP LPC18XX/43XX GPIO support"
diff --git a/drivers/gpio/gpio-loongson.c b/drivers/gpio/gpio-loongson.c
index a42145873cc9..90b4a0f5cab8 100644
--- a/drivers/gpio/gpio-loongson.c
+++ b/drivers/gpio/gpio-loongson.c
@@ -1,13 +1,14 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 /*
- *  Loongson-2F/3A/3B GPIO Support
+ *  Loongson Series GPIO Support
  *
- *  Copyright (c) 2008 Richard Liu,  STMicroelectronics	 <richard.liu@st.com>
+ *  Copyright (c) 2008 Richard Liu, STMicroelectronics <richard.liu@st.com>
  *  Copyright (c) 2008-2010 Arnaud Patard <apatard@mandriva.com>
  *  Copyright (c) 2013 Hongbing Hu <huhb@lemote.com>
  *  Copyright (c) 2014 Huacai Chen <chenhc@lemote.com>
  */
 
+#include <linux/acpi.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -17,119 +18,396 @@
 #include <linux/platform_device.h>
 #include <linux/bitops.h>
 #include <asm/types.h>
-#include <loongson.h>
-
-#define STLS2F_N_GPIO		4
-#define STLS3A_N_GPIO		16
-
-#ifdef CONFIG_CPU_LOONGSON64
-#define LOONGSON_N_GPIO	STLS3A_N_GPIO
+#if defined(CONFIG_LOONGARCH)
+#include <asm/loongson.h>
+#elif defined(CONFIG_CPU_LOONGSON2EF)
+#include <asm/mach-loongson2ef/loongson.h>
 #else
-#define LOONGSON_N_GPIO	STLS2F_N_GPIO
+#include <asm/mach-loongson64/loongson.h>
 #endif
 
-/*
- * Offset into the register where we read lines, we write them from offset 0.
- * This offset is the only thing that stand between us and using
- * GPIO_GENERIC.
- */
-#define LOONGSON_GPIO_IN_OFFSET	16
+#define LOONGSON_GPIO_IN(x)		(x->base + x->in_offset)
+#define LOONGSON_GPIO_OUT(x)		(x->base + x->out_offset)
+#define LOONGSON_GPIO_OEN(x)		(x->base + x->conf_offset)
+
+#define LOONGSON_GPIO_IN_BYTE(x, gpio)	(x->base +\
+					x->in_offset + gpio)
+#define LOONGSON_GPIO_OUT_BYTE(x, gpio)	(x->base +\
+					x->out_offset + gpio)
+#define LOONGSON_GPIO_OEN_BYTE(x, gpio)	(x->base +\
+					x->conf_offset + gpio)
+
+struct loongson_gpio_chip {
+	struct gpio_chip	chip;
+	spinlock_t		lock;
+	void __iomem		*base;
+	int			conf_offset;
+	int			out_offset;
+	int			in_offset;
+	u16			*gsi_idx_map;
+	u16			mapsize;
+	bool			support_irq;
+};
+
+static int loongson_gpio_request(
+			struct gpio_chip *chip, unsigned int pin)
+{
+	if (pin >= chip->ngpio)
+		return -EINVAL;
+	else
+		return 0;
+}
+
+static inline void __set_direction(struct loongson_gpio_chip *lgpio,
+			unsigned int pin, int input)
+{
+	u64 qval;
+	u8  bval;
+
+	if (!strcmp(lgpio->chip.label, "loongson,ls2k-gpio")) {
+		qval = readq(LOONGSON_GPIO_OEN(lgpio));
+		if (input)
+			qval |= 1ULL << pin;
+		else
+			qval &= ~(1ULL << pin);
+		writeq(qval, LOONGSON_GPIO_OEN(lgpio));
+		return;
+	}
 
-static DEFINE_SPINLOCK(gpio_lock);
+	if (!strcmp(lgpio->chip.label, "loongson,ls7a-gpio") ||
+			!strncmp(lgpio->chip.label, "LOON0002", 8)) {
+		if (input)
+			bval = 1;
+		else
+			bval = 0;
+		writeb(bval, LOONGSON_GPIO_OEN_BYTE(lgpio, pin));
+		return;
+	}
+
+	if (!strcmp(lgpio->chip.label, "loongson,platform-gpio")) {
+		if (input)
+			LOONGSON_GPIOIE |= BIT(pin);
+		else
+			LOONGSON_GPIOIE &= ~BIT(pin);
+		return;
+	}
+}
 
-static int loongson_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
+static void __set_level(struct loongson_gpio_chip *lgpio, unsigned int pin,
+			int high)
 {
-	u32 val;
+	u64 qval;
+	u8 bval;
+
+	if (!strcmp(lgpio->chip.label, "loongson,ls2k-gpio")) {
+		qval = readq(LOONGSON_GPIO_OUT(lgpio));
+		if (high)
+			qval |= 1ULL << pin;
+		else
+			qval &= ~(1ULL << pin);
+		writeq(qval, LOONGSON_GPIO_OUT(lgpio));
+		return;
+	}
 
-	spin_lock(&gpio_lock);
-	val = LOONGSON_GPIODATA;
-	spin_unlock(&gpio_lock);
+	if (!strcmp(lgpio->chip.label, "loongson,ls7a-gpio") ||
+			!strncmp(lgpio->chip.label, "LOON0002", 8)) {
+		if (high)
+			bval = 1;
+		else
+			bval = 0;
+		writeb(bval, LOONGSON_GPIO_OUT_BYTE(lgpio, pin));
+		return;
+	}
 
-	return !!(val & BIT(gpio + LOONGSON_GPIO_IN_OFFSET));
+	if (!strcmp(lgpio->chip.label, "loongson,platform-gpio")) {
+		if (LOONGSON_GPIODATA)
+			LOONGSON_GPIODATA |= BIT(pin);
+		else
+			LOONGSON_GPIODATA &= ~BIT(pin);
+		return;
+	}
 }
 
-static void loongson_gpio_set_value(struct gpio_chip *chip,
-		unsigned gpio, int value)
+static int loongson_gpio_direction_input(
+				struct gpio_chip *chip, unsigned int pin)
 {
-	u32 val;
+	unsigned long flags;
+	struct loongson_gpio_chip *lgpio =
+		container_of(chip, struct loongson_gpio_chip, chip);
 
-	spin_lock(&gpio_lock);
-	val = LOONGSON_GPIODATA;
-	if (value)
-		val |= BIT(gpio);
-	else
-		val &= ~BIT(gpio);
-	LOONGSON_GPIODATA = val;
-	spin_unlock(&gpio_lock);
+	spin_lock_irqsave(&lgpio->lock, flags);
+	__set_direction(lgpio, pin, 1);
+	spin_unlock_irqrestore(&lgpio->lock, flags);
+
+	return 0;
 }
 
-static int loongson_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
+static int loongson_gpio_direction_output(
+				struct gpio_chip *chip, unsigned int pin,
+				int value)
 {
-	u32 temp;
+	struct loongson_gpio_chip *lgpio =
+		container_of(chip, struct loongson_gpio_chip, chip);
+	unsigned long flags;
 
-	spin_lock(&gpio_lock);
-	temp = LOONGSON_GPIOIE;
-	temp |= BIT(gpio);
-	LOONGSON_GPIOIE = temp;
-	spin_unlock(&gpio_lock);
+	spin_lock_irqsave(&lgpio->lock, flags);
+	__set_level(lgpio, pin, value);
+	__set_direction(lgpio, pin, 0);
+	spin_unlock_irqrestore(&lgpio->lock, flags);
 
 	return 0;
 }
 
-static int loongson_gpio_direction_output(struct gpio_chip *chip,
-		unsigned gpio, int level)
+static int loongson_gpio_get(struct gpio_chip *chip, unsigned int pin)
+{
+	u64 qval;
+	u8  bval;
+	int val;
+	struct loongson_gpio_chip *lgpio =
+		container_of(chip, struct loongson_gpio_chip, chip);
+
+	if (!strcmp(lgpio->chip.label, "loongson,ls2k-gpio")) {
+		qval = readq(LOONGSON_GPIO_IN(lgpio));
+		return ((qval & (1ULL << pin)) != 0);
+	}
+
+	if (!strcmp(lgpio->chip.label, "loongson,ls7a-gpio") ||
+			!strncmp(lgpio->chip.label, "LOON0002", 8)) {
+		bval = readb(LOONGSON_GPIO_IN_BYTE(lgpio, pin));
+		return (bval & 1);
+	}
+
+	if (!strcmp(lgpio->chip.label, "loongson,platform-gpio")) {
+		val = LOONGSON_GPIODATA;
+		return !!(val & BIT(pin + lgpio->in_offset));
+	}
+
+	return -ENXIO;
+}
+
+static void loongson_gpio_set(struct gpio_chip *chip, unsigned int pin,
+			int value)
 {
-	u32 temp;
+	unsigned long flags;
+	struct loongson_gpio_chip *lgpio =
+		container_of(chip, struct loongson_gpio_chip, chip);
 
-	loongson_gpio_set_value(chip, gpio, level);
-	spin_lock(&gpio_lock);
-	temp = LOONGSON_GPIOIE;
-	temp &= ~BIT(gpio);
-	LOONGSON_GPIOIE = temp;
-	spin_unlock(&gpio_lock);
+	spin_lock_irqsave(&lgpio->lock, flags);
+	__set_level(lgpio, pin, value);
+	spin_unlock_irqrestore(&lgpio->lock, flags);
+}
+
+static int loongson_gpio_to_irq(
+			struct gpio_chip *chip, unsigned int offset)
+{
+	struct platform_device *pdev =
+		container_of(chip->parent, struct platform_device, dev);
+	struct loongson_gpio_chip *lgpio =
+		container_of(chip, struct loongson_gpio_chip, chip);
+
+	if (offset >= chip->ngpio)
+		return -EINVAL;
+
+	if ((lgpio->gsi_idx_map != NULL) && (offset < lgpio->mapsize))
+		offset = lgpio->gsi_idx_map[offset];
+
+	return platform_get_irq(pdev, offset);
+}
+
+static int loongson_gpio_init(
+			struct device *dev, struct loongson_gpio_chip *lgpio,
+			struct device_node *np, void __iomem *base)
+{
+	lgpio->chip.request = loongson_gpio_request;
+	lgpio->chip.direction_input = loongson_gpio_direction_input;
+	lgpio->chip.get = loongson_gpio_get;
+	lgpio->chip.direction_output = loongson_gpio_direction_output;
+	lgpio->chip.set = loongson_gpio_set;
+	lgpio->chip.can_sleep = 0;
+	lgpio->chip.of_node = np;
+	lgpio->chip.parent = dev;
+	spin_lock_init(&lgpio->lock);
+	lgpio->base = (void __iomem *)base;
+
+	if (!strcmp(lgpio->chip.label, "loongson,ls7a-gpio") ||
+			!strncmp(lgpio->chip.label, "LOON0002", 8) ||
+			!strcmp(lgpio->chip.label, "loongson,ls2k-gpio"))
+		lgpio->chip.to_irq = loongson_gpio_to_irq;
+
+	gpiochip_add(&lgpio->chip);
 
 	return 0;
 }
 
+static void of_loongson_gpio_get_props(struct device_node *np,
+				  struct loongson_gpio_chip *lgpio)
+{
+	const char *name;
+
+	of_property_read_u32(np, "ngpios", (u32 *)&lgpio->chip.ngpio);
+
+	of_property_read_string(np, "compatible", &name);
+	lgpio->chip.label = kstrdup(name, GFP_KERNEL);
+
+	if (!strcmp(name, "loongson,ls2k-gpio")) {
+		lgpio->support_irq = true;
+		lgpio->conf_offset = 0x0;
+		lgpio->out_offset = 0x10;
+		lgpio->in_offset = 0x20;
+		return;
+	}
+
+	if (!strcmp(name, "loongson,ls7a-gpio")) {
+		lgpio->support_irq = true;
+		lgpio->conf_offset = 0x800;
+		lgpio->out_offset = 0x900;
+		lgpio->in_offset = 0xa00;
+		return;
+	}
+}
+
+static void acpi_loongson_gpio_get_props(struct platform_device *pdev,
+				  struct loongson_gpio_chip *lgpio)
+{
+
+	struct device *dev = &pdev->dev;
+	int rval;
+
+	device_property_read_u32(dev, "ngpios", (u32 *)&lgpio->chip.ngpio);
+	device_property_read_u32(dev, "gpio_base", (u32 *)&lgpio->chip.base);
+	device_property_read_u32(dev, "conf_offset",
+					(u32 *)&lgpio->conf_offset);
+	device_property_read_u32(dev, "out_offset",
+					(u32 *)&lgpio->out_offset);
+	device_property_read_u32(dev, "in_offset", (u32 *)&lgpio->in_offset);
+
+	rval = device_property_read_u16_array(dev, "gsi_idx_map", NULL, 0);
+	if (rval > 0) {
+		lgpio->gsi_idx_map =
+			kmalloc_array(rval, sizeof(*lgpio->gsi_idx_map),
+					GFP_KERNEL);
+		if (unlikely(!lgpio->gsi_idx_map)) {
+			dev_err(dev, "Alloc gsi_idx_map fail!\n");
+		} else {
+			lgpio->mapsize = rval;
+			device_property_read_u16_array(dev, "gsi_idx_map",
+					lgpio->gsi_idx_map, lgpio->mapsize);
+		}
+	}
+
+	lgpio->chip.label = kstrdup(pdev->name, GFP_KERNEL);
+}
+
+static void platform_loongson_gpio_get_props(struct platform_device *pdev,
+				  struct loongson_gpio_chip *lgpio)
+{
+	struct platform_gpio_data *gpio_data =
+		(struct platform_gpio_data *)pdev->dev.platform_data;
+
+	lgpio->chip.ngpio = gpio_data->ngpio;
+	lgpio->chip.base = gpio_data->gpio_base;
+	lgpio->conf_offset = gpio_data->gpio_conf;
+	lgpio->out_offset = gpio_data->gpio_out;
+	lgpio->in_offset = gpio_data->gpio_in;
+	lgpio->chip.label = kstrdup(gpio_data->label, GFP_KERNEL);
+}
+
 static int loongson_gpio_probe(struct platform_device *pdev)
 {
-	struct gpio_chip *gc;
+	struct resource *iores;
+	void __iomem *base;
+	struct loongson_gpio_chip *lgpio;
+	struct device_node *np = pdev->dev.of_node;
 	struct device *dev = &pdev->dev;
+	int ret = 0;
 
-	gc = devm_kzalloc(dev, sizeof(*gc), GFP_KERNEL);
-	if (!gc)
+	lgpio = kzalloc(sizeof(struct loongson_gpio_chip), GFP_KERNEL);
+	if (!lgpio)
 		return -ENOMEM;
 
-	gc->label = "loongson-gpio-chip";
-	gc->base = 0;
-	gc->ngpio = LOONGSON_N_GPIO;
-	gc->get = loongson_gpio_get_value;
-	gc->set = loongson_gpio_set_value;
-	gc->direction_input = loongson_gpio_direction_input;
-	gc->direction_output = loongson_gpio_direction_output;
+	if (np)
+		of_loongson_gpio_get_props(np, lgpio);
+	else if (ACPI_COMPANION(&pdev->dev))
+		acpi_loongson_gpio_get_props(pdev, lgpio);
+	else
+		platform_loongson_gpio_get_props(pdev, lgpio);
+
+	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!iores) {
+		ret = -ENODEV;
+		goto out;
+	}
+
+	if (!request_mem_region(iores->start, resource_size(iores),
+				pdev->name)) {
+		ret = -EBUSY;
+		goto out;
+	}
+
+	base = ioremap(iores->start, resource_size(iores));
+	if (!base) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	platform_set_drvdata(pdev, lgpio);
+
+	loongson_gpio_init(dev, lgpio, np, base);
+
+	return 0;
+out:
+	pr_err("%s: %s: missing mandatory property\n", __func__, np->name);
+	return ret;
+}
+
+static int loongson_gpio_remove(struct platform_device *pdev)
+{
+	struct loongson_gpio_chip *lgpio = platform_get_drvdata(pdev);
+	struct resource		*mem;
+
+	platform_set_drvdata(pdev, NULL);
 
-	return gpiochip_add_data(gc, NULL);
+	gpiochip_remove(&lgpio->chip);
+	iounmap(lgpio->base);
+	kfree(lgpio->gsi_idx_map);
+	kfree(lgpio);
+	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	release_mem_region(mem->start, resource_size(mem));
+
+	return 0;
 }
 
+static const struct of_device_id loongson_gpio_dt_ids[] = {
+	{ .compatible = "loongson,ls2k-gpio"},
+	{ .compatible = "loongson,ls7a-gpio"},
+	{}
+};
+MODULE_DEVICE_TABLE(of, loongson_gpio_dt_ids);
+
+static const struct acpi_device_id loongson_gpio_acpi_match[] = {
+	{"LOON0002"},
+	{}
+};
+MODULE_DEVICE_TABLE(acpi, loongson_gpio_acpi_match);
+
 static struct platform_driver loongson_gpio_driver = {
 	.driver = {
 		.name = "loongson-gpio",
+		.owner = THIS_MODULE,
+		.of_match_table = loongson_gpio_dt_ids,
+		.acpi_match_table = ACPI_PTR(loongson_gpio_acpi_match),
 	},
 	.probe = loongson_gpio_probe,
+	.remove = loongson_gpio_remove,
 };
 
 static int __init loongson_gpio_setup(void)
 {
-	struct platform_device *pdev;
-	int ret;
-
-	ret = platform_driver_register(&loongson_gpio_driver);
-	if (ret) {
-		pr_err("error registering loongson GPIO driver\n");
-		return ret;
-	}
-
-	pdev = platform_device_register_simple("loongson-gpio", -1, NULL, 0);
-	return PTR_ERR_OR_ZERO(pdev);
+	return platform_driver_register(&loongson_gpio_driver);
 }
 postcore_initcall(loongson_gpio_setup);
+
+static void __exit loongson_gpio_exit(void)
+{
+	platform_driver_unregister(&loongson_gpio_driver);
+}
-- 
2.31.1


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

* [PATCH v2 2/2] dt-bindings: gpio: add loongson series gpio
  2022-11-14  9:53 [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Yinbo Zhu
@ 2022-11-14  9:53 ` Yinbo Zhu
  2022-11-18 12:40   ` Krzysztof Kozlowski
  2022-11-15  9:05 ` [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Bartosz Golaszewski
  1 sibling, 1 reply; 11+ messages in thread
From: Yinbo Zhu @ 2022-11-14  9:53 UTC (permalink / raw)
  To: Linus Walleij, Bartosz Golaszewski, Rob Herring,
	Krzysztof Kozlowski, WANG Xuerui, Jiaxun Yang,
	Thomas Bogendoerfer, Juxin Gao, Bibo Mao, Yanteng Si, linux-gpio,
	devicetree, linux-kernel, loongarch, linux-mips, Arnaud Patard,
	Huacai Chen, Yinbo Zhu

Add the Loongson series gpio binding with DT schema format using
json-schema.

Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
---
Change in v2:
		1. Drop "loongson,gpio_base" and "gpio-ranges" will cover it.
		1. Drop "loongson,conf_offset", "loongson,out_offset", "loongson,in_offset",
		   "loongson,support_irq" and kernel driver will initial them that depend
		   compatible in kernel.
		3. Fixup maintainer for this driver.

 .../bindings/gpio/loongson,ls-gpio.yaml       | 126 ++++++++++++++++++
 MAINTAINERS                                   |   8 ++
 2 files changed, 134 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml

diff --git a/Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml b/Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
new file mode 100644
index 000000000000..f54048d03d9b
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
@@ -0,0 +1,126 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/gpio/loongson,ls-gpio.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Loongson series GPIO controller.
+
+maintainers:
+  - Yinbo Zhu <zhuyinbo@loongson.cn>
+
+properties:
+  compatible:
+    enum:
+      - loongson,ls2k-gpio
+      - loongson,ls7a-gpio
+
+  reg:
+    maxItems: 1
+
+  ngpios:
+    minimum: 1
+    maximum: 64
+
+  "#gpio-cells":
+    const: 2
+
+  gpio-controller: true
+
+  gpio-ranges: true
+
+  interrupts:
+    minItems: 1
+    maxItems: 64
+
+required:
+  - compatible
+  - reg
+  - ngpios
+  - "#gpio-cells"
+  - gpio-controller
+  - gpio-ranges
+  - interrupts
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+
+    gpio0: gpio@1fe00500 {
+      compatible = "loongson,ls2k-gpio";
+      reg = <0x1fe00500 0x38>;
+      ngpios = <64>;
+      #gpio-cells = <2>;
+      gpio-controller;
+      gpio-ranges = <&pctrl 0 0 15>,
+                    <&pctrl 16 16 15>,
+                    <&pctrl 32 32 10>,
+                    <&pctrl 44 44 20>;
+      interrupt-parent = <&liointc1>;
+      interrupts = <28 IRQ_TYPE_LEVEL_LOW>,
+                   <29 IRQ_TYPE_LEVEL_LOW>,
+                   <30 IRQ_TYPE_LEVEL_LOW>,
+                   <30 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <26 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <>,
+                   <>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>,
+                   <27 IRQ_TYPE_LEVEL_LOW>;
+    };
diff --git a/MAINTAINERS b/MAINTAINERS
index 5114db9c8f32..7813b857c4a8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12051,6 +12051,14 @@ S:	Maintained
 F:	Documentation/devicetree/bindings/hwinfo/loongson,ls2k-chipid.yaml
 F:	drivers/soc/loongson/loongson2_guts.c
 
+LOONGSON SERIES GPIO DRIVER
+M:	Huacai Chen <chenhuacai@kernel.org>
+M:	Yinbo Zhu <zhuyinbo@loongson.cn>
+L:	linux-gpio@vger.kernel.org
+S:	Maintained
+F:	Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
+F:	drivers/gpio/gpio-loongson.c
+
 LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
 M:	Sathya Prakash <sathya.prakash@broadcom.com>
 M:	Sreekanth Reddy <sreekanth.reddy@broadcom.com>
-- 
2.31.1


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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-14  9:53 [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Yinbo Zhu
  2022-11-14  9:53 ` [PATCH v2 2/2] dt-bindings: gpio: add loongson series gpio Yinbo Zhu
@ 2022-11-15  9:05 ` Bartosz Golaszewski
  2022-11-15  9:53   ` Yinbo Zhu
  1 sibling, 1 reply; 11+ messages in thread
From: Bartosz Golaszewski @ 2022-11-15  9:05 UTC (permalink / raw)
  To: Yinbo Zhu
  Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, WANG Xuerui,
	Jiaxun Yang, Thomas Bogendoerfer, Juxin Gao, Bibo Mao,
	Yanteng Si, linux-gpio, devicetree, linux-kernel, loongarch,
	linux-mips, Arnaud Patard, Huacai Chen, lvjianmin, zhanghongchen,
	Liu Peibao

On Mon, Nov 14, 2022 at 10:53 AM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>
> The latest Loongson series platform use dts or acpi framework to
> register gpio device resources, such as the Loongson-2 series
> SoC of LOONGARCH architecture. In order to support dts, acpi and
> compatibility with previous platform device resources in driver,
> this patch was added.
>
> Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
> Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
> Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
> Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
> ---
> Change in v2:
>                 1. Fixup of_loongson_gpio_get_props and remove the parse logic about
>                    "loongson,conf_offset", "loongson,out_offset", "loongson,in_offset",
>                    "loongson,gpio_base", "loongson,support_irq" then kernel driver will
>                    initial them that depend compatible except "loongson,gpio_base".
>
>  arch/loongarch/include/asm/loongson.h         |  13 +
>  .../include/asm/mach-loongson2ef/loongson.h   |  12 +
>  .../include/asm/mach-loongson64/loongson.h    |  13 +
>  drivers/gpio/Kconfig                          |   6 +-
>  drivers/gpio/gpio-loongson.c                  | 422 +++++++++++++++---
>  5 files changed, 391 insertions(+), 75 deletions(-)
>
> diff --git a/arch/loongarch/include/asm/loongson.h b/arch/loongarch/include/asm/loongson.h
> index 00db93edae1b..383fdda155f0 100644
> --- a/arch/loongarch/include/asm/loongson.h
> +++ b/arch/loongarch/include/asm/loongson.h
> @@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64, volatile void __iomem *addr)
>         );
>  }
>
> +/* ============== Data structrues =============== */
> +
> +/* gpio data */
> +struct platform_gpio_data {
> +       u32 gpio_conf;
> +       u32 gpio_out;
> +       u32 gpio_in;
> +       u32 support_irq;
> +       char *label;
> +       int gpio_base;
> +       int ngpio;
> +};

This is a terrible name for an exported structure. You would at least
need some kind of a namespace prefix. But even then the need to add a
platform data structure is very questionable. We've moved past the
need for platform data in the kernel. I don't see anyone setting it up
in this series either. Could you provide more explanation on why you
would need it and who would use it?

> +
>  /* ============== LS7A registers =============== */
>  #define LS7A_PCH_REG_BASE              0x10000000UL
>  /* LPC regs */
> diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h b/arch/mips/include/asm/mach-loongson2ef/loongson.h
> index ca039b8dcde3..b261cea4fee1 100644
> --- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
> +++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
> @@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
>
>  #endif /* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
>
> +/* ============== Data structrues =============== */
> +
> +/* gpio data */
> +struct platform_gpio_data {
> +       u32 gpio_conf;
> +       u32 gpio_out;
> +       u32 gpio_in;
> +       u32 support_irq;
> +       char *label;
> +       int gpio_base;
> +       int ngpio;
> +};

No idea why you would need to duplicate it like this either. And why
put it in arch/.

[snip]

I will hold off reviewing the rest of the patch until we get that clarified.

Bartosz

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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15  9:05 ` [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Bartosz Golaszewski
@ 2022-11-15  9:53   ` Yinbo Zhu
  2022-11-15 10:17     ` WANG Xuerui
  2022-11-15 10:20     ` Thomas Bogendoerfer
  0 siblings, 2 replies; 11+ messages in thread
From: Yinbo Zhu @ 2022-11-15  9:53 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Linus Walleij, Rob Herring, zhuyinbo, Krzysztof Kozlowski,
	WANG Xuerui, Jiaxun Yang, Thomas Bogendoerfer, Juxin Gao,
	Bibo Mao, Yanteng Si, linux-gpio, devicetree, linux-kernel,
	loongarch, linux-mips, Arnaud Patard, Huacai Chen, lvjianmin,
	zhanghongchen, Liu Peibao



在 2022/11/15 下午5:05, Bartosz Golaszewski 写道:
> On Mon, Nov 14, 2022 at 10:53 AM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>>
>> The latest Loongson series platform use dts or acpi framework to
>> register gpio device resources, such as the Loongson-2 series
>> SoC of LOONGARCH architecture. In order to support dts, acpi and
>> compatibility with previous platform device resources in driver,
>> this patch was added.
>>
>> Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
>> Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
>> Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
>> Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
>> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
>> ---
>> Change in v2:
>>                  1. Fixup of_loongson_gpio_get_props and remove the parse logic about
>>                     "loongson,conf_offset", "loongson,out_offset", "loongson,in_offset",
>>                     "loongson,gpio_base", "loongson,support_irq" then kernel driver will
>>                     initial them that depend compatible except "loongson,gpio_base".
>>
>>   arch/loongarch/include/asm/loongson.h         |  13 +
>>   .../include/asm/mach-loongson2ef/loongson.h   |  12 +
>>   .../include/asm/mach-loongson64/loongson.h    |  13 +
>>   drivers/gpio/Kconfig                          |   6 +-
>>   drivers/gpio/gpio-loongson.c                  | 422 +++++++++++++++---
>>   5 files changed, 391 insertions(+), 75 deletions(-)
>>
>> diff --git a/arch/loongarch/include/asm/loongson.h b/arch/loongarch/include/asm/loongson.h
>> index 00db93edae1b..383fdda155f0 100644
>> --- a/arch/loongarch/include/asm/loongson.h
>> +++ b/arch/loongarch/include/asm/loongson.h
>> @@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64, volatile void __iomem *addr)
>>          );
>>   }
>>
>> +/* ============== Data structrues =============== */
>> +
>> +/* gpio data */
>> +struct platform_gpio_data {
>> +       u32 gpio_conf;
>> +       u32 gpio_out;
>> +       u32 gpio_in;
>> +       u32 support_irq;
>> +       char *label;
>> +       int gpio_base;
>> +       int ngpio;
>> +};
> 
> This is a terrible name for an exported structure. You would at least
> need some kind of a namespace prefix. But even then the need to add a
> platform data structure is very questionable. We've moved past the
> need for platform data in the kernel. I don't see anyone setting it up
> in this series either. Could you provide more explanation on why you
> would need it and who would use it?
okay, I will add a namespace prefix, about this platform data was added
that was to compatible with legacy platforms that do not support dts or
acpi, then, the mips loongson platform or loongarch loongson platform
can implement the gpio device driver to initialize the
platform_gpio_data structure as needed after exporting the structure.
> 
>> +
>>   /* ============== LS7A registers =============== */
>>   #define LS7A_PCH_REG_BASE              0x10000000UL
>>   /* LPC regs */
>> diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>> index ca039b8dcde3..b261cea4fee1 100644
>> --- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
>> +++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>> @@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
>>
>>   #endif /* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
>>
>> +/* ============== Data structrues =============== */
>> +
>> +/* gpio data */
>> +struct platform_gpio_data {
>> +       u32 gpio_conf;
>> +       u32 gpio_out;
>> +       u32 gpio_in;
>> +       u32 support_irq;
>> +       char *label;
>> +       int gpio_base;
>> +       int ngpio;
>> +};
> 
> No idea why you would need to duplicate it like this either. And why
> put it in arch/.
because loongson platform include mips and loongarch, and the gpio 
device data was defined in arch/ in leagcy loongson gpio driver.  so the
latest loongson gpio drvier add platform_gpio_data in same dir.
> 
> [snip]
> 
> I will hold off reviewing the rest of the patch until we get that clarified.
> 
> Bartosz
> 


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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15  9:53   ` Yinbo Zhu
@ 2022-11-15 10:17     ` WANG Xuerui
  2022-11-15 13:07       ` Yinbo Zhu
  2022-11-15 10:20     ` Thomas Bogendoerfer
  1 sibling, 1 reply; 11+ messages in thread
From: WANG Xuerui @ 2022-11-15 10:17 UTC (permalink / raw)
  To: Yinbo Zhu, Bartosz Golaszewski
  Cc: Linus Walleij, Rob Herring, Krzysztof Kozlowski, Jiaxun Yang,
	Thomas Bogendoerfer, Juxin Gao, Bibo Mao, Yanteng Si, linux-gpio,
	devicetree, linux-kernel, loongarch, linux-mips, Arnaud Patard,
	Huacai Chen, lvjianmin, zhanghongchen, Liu Peibao

Sorry for jumping in, but...

On 2022/11/15 17:53, Yinbo Zhu wrote:
> 
> 
> 在 2022/11/15 下午5:05, Bartosz Golaszewski 写道:
>> On Mon, Nov 14, 2022 at 10:53 AM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>>>
>>> The latest Loongson series platform use dts or acpi framework to
>>> register gpio device resources, such as the Loongson-2 series
>>> SoC of LOONGARCH architecture. In order to support dts, acpi and
>>> compatibility with previous platform device resources in driver,
>>> this patch was added.
>>>
>>> Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
>>> Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
>>> Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
>>> Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
>>> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
>>> ---
>>> Change in v2:
>>>                  1. Fixup of_loongson_gpio_get_props and remove the 
>>> parse logic about
>>>                     "loongson,conf_offset", "loongson,out_offset", 
>>> "loongson,in_offset",
>>>                     "loongson,gpio_base", "loongson,support_irq" then 
>>> kernel driver will
>>>                     initial them that depend compatible except 
>>> "loongson,gpio_base".
>>>
>>>   arch/loongarch/include/asm/loongson.h         |  13 +
>>>   .../include/asm/mach-loongson2ef/loongson.h   |  12 +
>>>   .../include/asm/mach-loongson64/loongson.h    |  13 +
>>>   drivers/gpio/Kconfig                          |   6 +-
>>>   drivers/gpio/gpio-loongson.c                  | 422 +++++++++++++++---
>>>   5 files changed, 391 insertions(+), 75 deletions(-)
>>>
>>> diff --git a/arch/loongarch/include/asm/loongson.h 
>>> b/arch/loongarch/include/asm/loongson.h
>>> index 00db93edae1b..383fdda155f0 100644
>>> --- a/arch/loongarch/include/asm/loongson.h
>>> +++ b/arch/loongarch/include/asm/loongson.h
>>> @@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64, 
>>> volatile void __iomem *addr)
>>>          );
>>>   }
>>>
>>> +/* ============== Data structrues =============== */
>>> +
>>> +/* gpio data */
>>> +struct platform_gpio_data {
>>> +       u32 gpio_conf;
>>> +       u32 gpio_out;
>>> +       u32 gpio_in;
>>> +       u32 support_irq;
>>> +       char *label;
>>> +       int gpio_base;
>>> +       int ngpio;
>>> +};
>>
>> This is a terrible name for an exported structure. You would at least
>> need some kind of a namespace prefix. But even then the need to add a
>> platform data structure is very questionable. We've moved past the
>> need for platform data in the kernel. I don't see anyone setting it up
>> in this series either. Could you provide more explanation on why you
>> would need it and who would use it?
> okay, I will add a namespace prefix, about this platform data was added
> that was to compatible with legacy platforms that do not support dts or
> acpi, then, the mips loongson platform or loongarch loongson platform

Why are you trying to support "legacy" LoongArch platforms when the 
architecture was just upstreamed *this year*?

> can implement the gpio device driver to initialize the
> platform_gpio_data structure as needed after exporting the structure.
>>
>>> +
>>>   /* ============== LS7A registers =============== */
>>>   #define LS7A_PCH_REG_BASE              0x10000000UL
>>>   /* LPC regs */
>>> diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h 
>>> b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>> index ca039b8dcde3..b261cea4fee1 100644
>>> --- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>> +++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>> @@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
>>>
>>>   #endif /* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
>>>
>>> +/* ============== Data structrues =============== */
>>> +
>>> +/* gpio data */
>>> +struct platform_gpio_data {
>>> +       u32 gpio_conf;
>>> +       u32 gpio_out;
>>> +       u32 gpio_in;
>>> +       u32 support_irq;
>>> +       char *label;
>>> +       int gpio_base;
>>> +       int ngpio;
>>> +};
>>
>> No idea why you would need to duplicate it like this either. And why
>> put it in arch/.
> because loongson platform include mips and loongarch, and the gpio 
> device data was defined in arch/ in leagcy loongson gpio driver.  so the
> latest loongson gpio drvier add platform_gpio_data in same dir.

I think at this point it's hopefully clear, that the way forward to 
supporting Loongson IP blocks shared between MIPS/LoongArch SoCs is to 
start over and do things properly, making the code as platform-agnostic 
as possible. Just make sure the drivers can get initialized via DT and 
ACPI then you're all set -- the upstream kernel is guaranteed to use one 
of the two well-established boot flows for every Loongson chip it 
supports. Be it hard-coded DT in arch/mips/boot/dts/loongson, or the 
LoongArch ACPI/upcoming DT, no need for hard-coding things in arch/ in 
either case.

>>
>> [snip]
>>
>> I will hold off reviewing the rest of the patch until we get that 
>> clarified.
>>
>> Bartosz
>>
> 

-- 
WANG "xen0n" Xuerui

Linux/LoongArch mailing list: https://lore.kernel.org/loongarch/


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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15  9:53   ` Yinbo Zhu
  2022-11-15 10:17     ` WANG Xuerui
@ 2022-11-15 10:20     ` Thomas Bogendoerfer
  2022-11-16  3:34       ` Yinbo Zhu
  1 sibling, 1 reply; 11+ messages in thread
From: Thomas Bogendoerfer @ 2022-11-15 10:20 UTC (permalink / raw)
  To: Yinbo Zhu
  Cc: Bartosz Golaszewski, Linus Walleij, Rob Herring,
	Krzysztof Kozlowski, WANG Xuerui, Jiaxun Yang, Juxin Gao,
	Bibo Mao, Yanteng Si, linux-gpio, devicetree, linux-kernel,
	loongarch, linux-mips, Arnaud Patard, Huacai Chen, lvjianmin,
	zhanghongchen, Liu Peibao

On Tue, Nov 15, 2022 at 05:53:26PM +0800, Yinbo Zhu wrote:
> > > +/* ============== Data structrues =============== */
> > > +
> > > +/* gpio data */
> > > +struct platform_gpio_data {
> > > +       u32 gpio_conf;
> > > +       u32 gpio_out;
> > > +       u32 gpio_in;
> > > +       u32 support_irq;
> > > +       char *label;
> > > +       int gpio_base;
> > > +       int ngpio;
> > > +};
> > 
> > No idea why you would need to duplicate it like this either. And why
> > put it in arch/.
> because loongson platform include mips and loongarch, and the gpio device
> data was defined in arch/ in leagcy loongson gpio driver.  so the
> latest loongson gpio drvier add platform_gpio_data in same dir.

put the struct into a new file in  include/linux/platform_data and
use that.

Thomas.

-- 
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea.                                                [ RFC1925, 2.3 ]

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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15 10:17     ` WANG Xuerui
@ 2022-11-15 13:07       ` Yinbo Zhu
  2022-11-15 13:35         ` Bartosz Golaszewski
  0 siblings, 1 reply; 11+ messages in thread
From: Yinbo Zhu @ 2022-11-15 13:07 UTC (permalink / raw)
  To: WANG Xuerui, Bartosz Golaszewski
  Cc: Linus Walleij, zhuyinbo, Rob Herring, Krzysztof Kozlowski,
	Jiaxun Yang, Thomas Bogendoerfer, Juxin Gao, Bibo Mao,
	Yanteng Si, linux-gpio, devicetree, linux-kernel, loongarch,
	linux-mips, Arnaud Patard, Huacai Chen, lvjianmin, zhanghongchen,
	Liu Peibao



在 2022/11/15 下午6:17, WANG Xuerui 写道:
> Sorry for jumping in, but...
> 
> On 2022/11/15 17:53, Yinbo Zhu wrote:
>>
>>
>> 在 2022/11/15 下午5:05, Bartosz Golaszewski 写道:
>>> On Mon, Nov 14, 2022 at 10:53 AM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>>>>
>>>> The latest Loongson series platform use dts or acpi framework to
>>>> register gpio device resources, such as the Loongson-2 series
>>>> SoC of LOONGARCH architecture. In order to support dts, acpi and
>>>> compatibility with previous platform device resources in driver,
>>>> this patch was added.
>>>>
>>>> Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
>>>> Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
>>>> Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
>>>> Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
>>>> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
>>>> ---
>>>> Change in v2:
>>>>                  1. Fixup of_loongson_gpio_get_props and remove the 
>>>> parse logic about
>>>>                     "loongson,conf_offset", "loongson,out_offset", 
>>>> "loongson,in_offset",
>>>>                     "loongson,gpio_base", "loongson,support_irq" 
>>>> then kernel driver will
>>>>                     initial them that depend compatible except 
>>>> "loongson,gpio_base".
>>>>
>>>>   arch/loongarch/include/asm/loongson.h         |  13 +
>>>>   .../include/asm/mach-loongson2ef/loongson.h   |  12 +
>>>>   .../include/asm/mach-loongson64/loongson.h    |  13 +
>>>>   drivers/gpio/Kconfig                          |   6 +-
>>>>   drivers/gpio/gpio-loongson.c                  | 422 
>>>> +++++++++++++++---
>>>>   5 files changed, 391 insertions(+), 75 deletions(-)
>>>>
>>>> diff --git a/arch/loongarch/include/asm/loongson.h 
>>>> b/arch/loongarch/include/asm/loongson.h
>>>> index 00db93edae1b..383fdda155f0 100644
>>>> --- a/arch/loongarch/include/asm/loongson.h
>>>> +++ b/arch/loongarch/include/asm/loongson.h
>>>> @@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64, 
>>>> volatile void __iomem *addr)
>>>>          );
>>>>   }
>>>>
>>>> +/* ============== Data structrues =============== */
>>>> +
>>>> +/* gpio data */
>>>> +struct platform_gpio_data {
>>>> +       u32 gpio_conf;
>>>> +       u32 gpio_out;
>>>> +       u32 gpio_in;
>>>> +       u32 support_irq;
>>>> +       char *label;
>>>> +       int gpio_base;
>>>> +       int ngpio;
>>>> +};
>>>
>>> This is a terrible name for an exported structure. You would at least
>>> need some kind of a namespace prefix. But even then the need to add a
>>> platform data structure is very questionable. We've moved past the
>>> need for platform data in the kernel. I don't see anyone setting it up
>>> in this series either. Could you provide more explanation on why you
>>> would need it and who would use it?
>> okay, I will add a namespace prefix, about this platform data was added
>> that was to compatible with legacy platforms that do not support dts or
>> acpi, then, the mips loongson platform or loongarch loongson platform
> 
> Why are you trying to support "legacy" LoongArch platforms when the 
> architecture was just upstreamed *this year*?
the leagacy gpio driver had support LoongArch, and you can find some
gpio register defined in arch/loongarch/include
/asm/loongson.h in legacy gpio driver, such as LOONGSON_GPIODATA,
The legacy gpio driver is the driver that doesn't include my gpio patch.
> 
>> can implement the gpio device driver to initialize the
>> platform_gpio_data structure as needed after exporting the structure.
>>>
>>>> +
>>>>   /* ============== LS7A registers =============== */
>>>>   #define LS7A_PCH_REG_BASE              0x10000000UL
>>>>   /* LPC regs */
>>>> diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h 
>>>> b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>> index ca039b8dcde3..b261cea4fee1 100644
>>>> --- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>> +++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>> @@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
>>>>
>>>>   #endif /* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
>>>>
>>>> +/* ============== Data structrues =============== */
>>>> +
>>>> +/* gpio data */
>>>> +struct platform_gpio_data {
>>>> +       u32 gpio_conf;
>>>> +       u32 gpio_out;
>>>> +       u32 gpio_in;
>>>> +       u32 support_irq;
>>>> +       char *label;
>>>> +       int gpio_base;
>>>> +       int ngpio;
>>>> +};
>>>
>>> No idea why you would need to duplicate it like this either. And why
>>> put it in arch/.
>> because loongson platform include mips and loongarch, and the gpio 
>> device data was defined in arch/ in leagcy loongson gpio driver.  so the
>> latest loongson gpio drvier add platform_gpio_data in same dir.
> 
> I think at this point it's hopefully clear, that the way forward to 
> supporting Loongson IP blocks shared between MIPS/LoongArch SoCs is to 
> start over and do things properly, making the code as platform-agnostic 
> as possible. Just make sure the drivers can get initialized via DT and 
> ACPI then you're all set -- the upstream kernel is guaranteed to use one 
> of the two well-established boot flows for every Loongson chip it 
> supports. Be it hard-coded DT in arch/mips/boot/dts/loongson, or the 
> LoongArch ACPI/upcoming DT, no need for hard-coding things in arch/ in 
> either case.
Our old platforms are used by customers, but we will not maintain those
platforms. Adding dts/acpi support to those old platforms not only makes
no sense, but also affects their use. Because the configuration of
dts/acpi requires the support of the firmware team, but in fact, we have
no one to maintain those old platforms.

in a words, My patch to upstream was supposed to consider dts/acpi in
LoongArch platform  But I have to consider the original legacy gpio
driver and to compatible with it.
> 
>>>
>>> [snip]
>>>
>>> I will hold off reviewing the rest of the patch until we get that 
>>> clarified.
>>>
>>> Bartosz
>>>
>>
> 


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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15 13:07       ` Yinbo Zhu
@ 2022-11-15 13:35         ` Bartosz Golaszewski
  2022-11-16  3:31           ` Yinbo Zhu
  0 siblings, 1 reply; 11+ messages in thread
From: Bartosz Golaszewski @ 2022-11-15 13:35 UTC (permalink / raw)
  To: Yinbo Zhu
  Cc: WANG Xuerui, Linus Walleij, Rob Herring, Krzysztof Kozlowski,
	Jiaxun Yang, Thomas Bogendoerfer, Juxin Gao, Bibo Mao,
	Yanteng Si, linux-gpio, devicetree, linux-kernel, loongarch,
	linux-mips, Arnaud Patard, Huacai Chen, lvjianmin, zhanghongchen,
	Liu Peibao

On Tue, Nov 15, 2022 at 2:07 PM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>
>
>
> 在 2022/11/15 下午6:17, WANG Xuerui 写道:
> > Sorry for jumping in, but...
> >
> > On 2022/11/15 17:53, Yinbo Zhu wrote:
> >>
> >>
> >> 在 2022/11/15 下午5:05, Bartosz Golaszewski 写道:
> >>> On Mon, Nov 14, 2022 at 10:53 AM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
> >>>>
> >>>> The latest Loongson series platform use dts or acpi framework to
> >>>> register gpio device resources, such as the Loongson-2 series
> >>>> SoC of LOONGARCH architecture. In order to support dts, acpi and
> >>>> compatibility with previous platform device resources in driver,
> >>>> this patch was added.
> >>>>
> >>>> Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
> >>>> Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
> >>>> Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
> >>>> Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
> >>>> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
> >>>> ---
> >>>> Change in v2:
> >>>>                  1. Fixup of_loongson_gpio_get_props and remove the
> >>>> parse logic about
> >>>>                     "loongson,conf_offset", "loongson,out_offset",
> >>>> "loongson,in_offset",
> >>>>                     "loongson,gpio_base", "loongson,support_irq"
> >>>> then kernel driver will
> >>>>                     initial them that depend compatible except
> >>>> "loongson,gpio_base".
> >>>>
> >>>>   arch/loongarch/include/asm/loongson.h         |  13 +
> >>>>   .../include/asm/mach-loongson2ef/loongson.h   |  12 +
> >>>>   .../include/asm/mach-loongson64/loongson.h    |  13 +
> >>>>   drivers/gpio/Kconfig                          |   6 +-
> >>>>   drivers/gpio/gpio-loongson.c                  | 422
> >>>> +++++++++++++++---
> >>>>   5 files changed, 391 insertions(+), 75 deletions(-)
> >>>>
> >>>> diff --git a/arch/loongarch/include/asm/loongson.h
> >>>> b/arch/loongarch/include/asm/loongson.h
> >>>> index 00db93edae1b..383fdda155f0 100644
> >>>> --- a/arch/loongarch/include/asm/loongson.h
> >>>> +++ b/arch/loongarch/include/asm/loongson.h
> >>>> @@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64,
> >>>> volatile void __iomem *addr)
> >>>>          );
> >>>>   }
> >>>>
> >>>> +/* ============== Data structrues =============== */
> >>>> +
> >>>> +/* gpio data */
> >>>> +struct platform_gpio_data {
> >>>> +       u32 gpio_conf;
> >>>> +       u32 gpio_out;
> >>>> +       u32 gpio_in;
> >>>> +       u32 support_irq;
> >>>> +       char *label;
> >>>> +       int gpio_base;
> >>>> +       int ngpio;
> >>>> +};
> >>>
> >>> This is a terrible name for an exported structure. You would at least
> >>> need some kind of a namespace prefix. But even then the need to add a
> >>> platform data structure is very questionable. We've moved past the
> >>> need for platform data in the kernel. I don't see anyone setting it up
> >>> in this series either. Could you provide more explanation on why you
> >>> would need it and who would use it?
> >> okay, I will add a namespace prefix, about this platform data was added
> >> that was to compatible with legacy platforms that do not support dts or
> >> acpi, then, the mips loongson platform or loongarch loongson platform
> >
> > Why are you trying to support "legacy" LoongArch platforms when the
> > architecture was just upstreamed *this year*?
> the leagacy gpio driver had support LoongArch, and you can find some
> gpio register defined in arch/loongarch/include
> /asm/loongson.h in legacy gpio driver, such as LOONGSON_GPIODATA,
> The legacy gpio driver is the driver that doesn't include my gpio patch.
> >
> >> can implement the gpio device driver to initialize the
> >> platform_gpio_data structure as needed after exporting the structure.
> >>>
> >>>> +
> >>>>   /* ============== LS7A registers =============== */
> >>>>   #define LS7A_PCH_REG_BASE              0x10000000UL
> >>>>   /* LPC regs */
> >>>> diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h
> >>>> b/arch/mips/include/asm/mach-loongson2ef/loongson.h
> >>>> index ca039b8dcde3..b261cea4fee1 100644
> >>>> --- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
> >>>> +++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
> >>>> @@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
> >>>>
> >>>>   #endif /* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
> >>>>
> >>>> +/* ============== Data structrues =============== */
> >>>> +
> >>>> +/* gpio data */
> >>>> +struct platform_gpio_data {
> >>>> +       u32 gpio_conf;
> >>>> +       u32 gpio_out;
> >>>> +       u32 gpio_in;
> >>>> +       u32 support_irq;
> >>>> +       char *label;
> >>>> +       int gpio_base;
> >>>> +       int ngpio;
> >>>> +};
> >>>
> >>> No idea why you would need to duplicate it like this either. And why
> >>> put it in arch/.
> >> because loongson platform include mips and loongarch, and the gpio
> >> device data was defined in arch/ in leagcy loongson gpio driver.  so the
> >> latest loongson gpio drvier add platform_gpio_data in same dir.
> >
> > I think at this point it's hopefully clear, that the way forward to
> > supporting Loongson IP blocks shared between MIPS/LoongArch SoCs is to
> > start over and do things properly, making the code as platform-agnostic
> > as possible. Just make sure the drivers can get initialized via DT and
> > ACPI then you're all set -- the upstream kernel is guaranteed to use one
> > of the two well-established boot flows for every Loongson chip it
> > supports. Be it hard-coded DT in arch/mips/boot/dts/loongson, or the
> > LoongArch ACPI/upcoming DT, no need for hard-coding things in arch/ in
> > either case.
> Our old platforms are used by customers, but we will not maintain those
> platforms. Adding dts/acpi support to those old platforms not only makes
> no sense, but also affects their use. Because the configuration of
> dts/acpi requires the support of the firmware team, but in fact, we have
> no one to maintain those old platforms.
>
> in a words, My patch to upstream was supposed to consider dts/acpi in
> LoongArch platform  But I have to consider the original legacy gpio
> driver and to compatible with it.

Which legacy driver are you referring to? Neither gpio-loongson nor
gpio-loongson1 define any platform data. If it wasn't needed before
then it's sure we won't be adding it in 2022. If you have board-files
upstream that need to use this driver then you can do fine with
regular device properties.

Bartosz

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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15 13:35         ` Bartosz Golaszewski
@ 2022-11-16  3:31           ` Yinbo Zhu
  0 siblings, 0 replies; 11+ messages in thread
From: Yinbo Zhu @ 2022-11-16  3:31 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: WANG Xuerui, Linus Walleij, zhuyinbo, Rob Herring,
	Krzysztof Kozlowski, Jiaxun Yang, Thomas Bogendoerfer, Juxin Gao,
	Bibo Mao, Yanteng Si, linux-gpio, devicetree, linux-kernel,
	loongarch, linux-mips, Arnaud Patard, Huacai Chen, lvjianmin,
	zhanghongchen, Liu Peibao



在 2022/11/15 下午9:35, Bartosz Golaszewski 写道:
> On Tue, Nov 15, 2022 at 2:07 PM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>>
>>
>>
>> 在 2022/11/15 下午6:17, WANG Xuerui 写道:
>>> Sorry for jumping in, but...
>>>
>>> On 2022/11/15 17:53, Yinbo Zhu wrote:
>>>>
>>>>
>>>> 在 2022/11/15 下午5:05, Bartosz Golaszewski 写道:
>>>>> On Mon, Nov 14, 2022 at 10:53 AM Yinbo Zhu <zhuyinbo@loongson.cn> wrote:
>>>>>>
>>>>>> The latest Loongson series platform use dts or acpi framework to
>>>>>> register gpio device resources, such as the Loongson-2 series
>>>>>> SoC of LOONGARCH architecture. In order to support dts, acpi and
>>>>>> compatibility with previous platform device resources in driver,
>>>>>> this patch was added.
>>>>>>
>>>>>> Signed-off-by: lvjianmin <lvjianmin@loongson.cn>
>>>>>> Signed-off-by: zhanghongchen <zhanghongchen@loongson.cn>
>>>>>> Signed-off-by: Liu Peibao <liupeibao@loongson.cn>
>>>>>> Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
>>>>>> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
>>>>>> ---
>>>>>> Change in v2:
>>>>>>                   1. Fixup of_loongson_gpio_get_props and remove the
>>>>>> parse logic about
>>>>>>                      "loongson,conf_offset", "loongson,out_offset",
>>>>>> "loongson,in_offset",
>>>>>>                      "loongson,gpio_base", "loongson,support_irq"
>>>>>> then kernel driver will
>>>>>>                      initial them that depend compatible except
>>>>>> "loongson,gpio_base".
>>>>>>
>>>>>>    arch/loongarch/include/asm/loongson.h         |  13 +
>>>>>>    .../include/asm/mach-loongson2ef/loongson.h   |  12 +
>>>>>>    .../include/asm/mach-loongson64/loongson.h    |  13 +
>>>>>>    drivers/gpio/Kconfig                          |   6 +-
>>>>>>    drivers/gpio/gpio-loongson.c                  | 422
>>>>>> +++++++++++++++---
>>>>>>    5 files changed, 391 insertions(+), 75 deletions(-)
>>>>>>
>>>>>> diff --git a/arch/loongarch/include/asm/loongson.h
>>>>>> b/arch/loongarch/include/asm/loongson.h
>>>>>> index 00db93edae1b..383fdda155f0 100644
>>>>>> --- a/arch/loongarch/include/asm/loongson.h
>>>>>> +++ b/arch/loongarch/include/asm/loongson.h
>>>>>> @@ -60,6 +60,19 @@ static inline void xconf_writeq(u64 val64,
>>>>>> volatile void __iomem *addr)
>>>>>>           );
>>>>>>    }
>>>>>>
>>>>>> +/* ============== Data structrues =============== */
>>>>>> +
>>>>>> +/* gpio data */
>>>>>> +struct platform_gpio_data {
>>>>>> +       u32 gpio_conf;
>>>>>> +       u32 gpio_out;
>>>>>> +       u32 gpio_in;
>>>>>> +       u32 support_irq;
>>>>>> +       char *label;
>>>>>> +       int gpio_base;
>>>>>> +       int ngpio;
>>>>>> +};
>>>>>
>>>>> This is a terrible name for an exported structure. You would at least
>>>>> need some kind of a namespace prefix. But even then the need to add a
>>>>> platform data structure is very questionable. We've moved past the
>>>>> need for platform data in the kernel. I don't see anyone setting it up
>>>>> in this series either. Could you provide more explanation on why you
>>>>> would need it and who would use it?
>>>> okay, I will add a namespace prefix, about this platform data was added
>>>> that was to compatible with legacy platforms that do not support dts or
>>>> acpi, then, the mips loongson platform or loongarch loongson platform
>>>
>>> Why are you trying to support "legacy" LoongArch platforms when the
>>> architecture was just upstreamed *this year*?
>> the leagacy gpio driver had support LoongArch, and you can find some
>> gpio register defined in arch/loongarch/include
>> /asm/loongson.h in legacy gpio driver, such as LOONGSON_GPIODATA,
>> The legacy gpio driver is the driver that doesn't include my gpio patch.
>>>
>>>> can implement the gpio device driver to initialize the
>>>> platform_gpio_data structure as needed after exporting the structure.
>>>>>
>>>>>> +
>>>>>>    /* ============== LS7A registers =============== */
>>>>>>    #define LS7A_PCH_REG_BASE              0x10000000UL
>>>>>>    /* LPC regs */
>>>>>> diff --git a/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>>>> b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>>>> index ca039b8dcde3..b261cea4fee1 100644
>>>>>> --- a/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>>>> +++ b/arch/mips/include/asm/mach-loongson2ef/loongson.h
>>>>>> @@ -315,4 +315,16 @@ extern unsigned long _loongson_addrwincfg_base;
>>>>>>
>>>>>>    #endif /* ! CONFIG_CPU_SUPPORTS_ADDRWINCFG */
>>>>>>
>>>>>> +/* ============== Data structrues =============== */
>>>>>> +
>>>>>> +/* gpio data */
>>>>>> +struct platform_gpio_data {
>>>>>> +       u32 gpio_conf;
>>>>>> +       u32 gpio_out;
>>>>>> +       u32 gpio_in;
>>>>>> +       u32 support_irq;
>>>>>> +       char *label;
>>>>>> +       int gpio_base;
>>>>>> +       int ngpio;
>>>>>> +};
>>>>>
>>>>> No idea why you would need to duplicate it like this either. And why
>>>>> put it in arch/.
>>>> because loongson platform include mips and loongarch, and the gpio
>>>> device data was defined in arch/ in leagcy loongson gpio driver.  so the
>>>> latest loongson gpio drvier add platform_gpio_data in same dir.
>>>
>>> I think at this point it's hopefully clear, that the way forward to
>>> supporting Loongson IP blocks shared between MIPS/LoongArch SoCs is to
>>> start over and do things properly, making the code as platform-agnostic
>>> as possible. Just make sure the drivers can get initialized via DT and
>>> ACPI then you're all set -- the upstream kernel is guaranteed to use one
>>> of the two well-established boot flows for every Loongson chip it
>>> supports. Be it hard-coded DT in arch/mips/boot/dts/loongson, or the
>>> LoongArch ACPI/upcoming DT, no need for hard-coding things in arch/ in
>>> either case.
>> Our old platforms are used by customers, but we will not maintain those
>> platforms. Adding dts/acpi support to those old platforms not only makes
>> no sense, but also affects their use. Because the configuration of
>> dts/acpi requires the support of the firmware team, but in fact, we have
>> no one to maintain those old platforms.
>>
>> in a words, My patch to upstream was supposed to consider dts/acpi in
>> LoongArch platform  But I have to consider the original legacy gpio
>> driver and to compatible with it.
> 
> Which legacy driver are you referring to? Neither gpio-loongson nor
> gpio-loongson1 define any platform data. If it wasn't needed before
> then it's sure we won't be adding it in 2022. If you have board-files
> upstream that need to use this driver then you can do fine with
> regular device properties.
in fact, It is my gpio driver need to be compatible with 
gpio-loongson.c, because I need use this name gpio-loongson.c and doesn't
drop this driver.

The legacy driver also uses a set of common definitions, but does not
use the structure to encapsulate it.  then use platform_device_register
to register device, and my driver is to suppot dts/acpi gpio and need
separate platform device register logic, so gpio device need a platform
data to register device. It's confusing that as for some legacy platform
device drvier to set loongson platform device properties that required
by gpio driver, but if supply a platform data for device drvier it will
clear.

in addition, I have a look about include/linux/platform_data/
I think it is appropriate for me to add gpio platform data here

Thanks

BRs,
Yinbo
> 
> Bartosz
> 


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

* Re: [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support
  2022-11-15 10:20     ` Thomas Bogendoerfer
@ 2022-11-16  3:34       ` Yinbo Zhu
  0 siblings, 0 replies; 11+ messages in thread
From: Yinbo Zhu @ 2022-11-16  3:34 UTC (permalink / raw)
  To: Thomas Bogendoerfer
  Cc: Bartosz Golaszewski, Linus Walleij, zhuyinbo, Rob Herring,
	Krzysztof Kozlowski, WANG Xuerui, Jiaxun Yang, Juxin Gao,
	Bibo Mao, Yanteng Si, linux-gpio, devicetree, linux-kernel,
	loongarch, linux-mips, Arnaud Patard, Huacai Chen, lvjianmin,
	zhanghongchen, Liu Peibao



在 2022/11/15 下午6:20, Thomas Bogendoerfer 写道:
> On Tue, Nov 15, 2022 at 05:53:26PM +0800, Yinbo Zhu wrote:
>>>> +/* ============== Data structrues =============== */
>>>> +
>>>> +/* gpio data */
>>>> +struct platform_gpio_data {
>>>> +       u32 gpio_conf;
>>>> +       u32 gpio_out;
>>>> +       u32 gpio_in;
>>>> +       u32 support_irq;
>>>> +       char *label;
>>>> +       int gpio_base;
>>>> +       int ngpio;
>>>> +};
>>>
>>> No idea why you would need to duplicate it like this either. And why
>>> put it in arch/.
>> because loongson platform include mips and loongarch, and the gpio device
>> data was defined in arch/ in leagcy loongson gpio driver.  so the
>> latest loongson gpio drvier add platform_gpio_data in same dir.
> 
> put the struct into a new file in  include/linux/platform_data and
> use that.
> 
> Thomas.
Hi Thomas,

I think it is okay for me about your advice. I will move gpio platform
data in include/linux/platform_data.

Thanks
Yinbo.

> 


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

* Re: [PATCH v2 2/2] dt-bindings: gpio: add loongson series gpio
  2022-11-14  9:53 ` [PATCH v2 2/2] dt-bindings: gpio: add loongson series gpio Yinbo Zhu
@ 2022-11-18 12:40   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 11+ messages in thread
From: Krzysztof Kozlowski @ 2022-11-18 12:40 UTC (permalink / raw)
  To: Yinbo Zhu, Linus Walleij, Bartosz Golaszewski, Rob Herring,
	Krzysztof Kozlowski, WANG Xuerui, Jiaxun Yang,
	Thomas Bogendoerfer, Juxin Gao, Bibo Mao, Yanteng Si, linux-gpio,
	devicetree, linux-kernel, loongarch, linux-mips, Arnaud Patard,
	Huacai Chen

On 14/11/2022 10:53, Yinbo Zhu wrote:
> Add the Loongson series gpio binding with DT schema format using
> json-schema.
> 
> Signed-off-by: Yinbo Zhu <zhuyinbo@loongson.cn>
> ---


Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Best regards,
Krzysztof


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

end of thread, other threads:[~2022-11-18 12:40 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-14  9:53 [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Yinbo Zhu
2022-11-14  9:53 ` [PATCH v2 2/2] dt-bindings: gpio: add loongson series gpio Yinbo Zhu
2022-11-18 12:40   ` Krzysztof Kozlowski
2022-11-15  9:05 ` [PATCH v2 1/2] gpio: loongson: add dts/acpi gpio support Bartosz Golaszewski
2022-11-15  9:53   ` Yinbo Zhu
2022-11-15 10:17     ` WANG Xuerui
2022-11-15 13:07       ` Yinbo Zhu
2022-11-15 13:35         ` Bartosz Golaszewski
2022-11-16  3:31           ` Yinbo Zhu
2022-11-15 10:20     ` Thomas Bogendoerfer
2022-11-16  3:34       ` Yinbo Zhu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).