All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] pinctrl: meson: prepare for new SoC
@ 2017-10-09 10:17 ` Jerome Brunet
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 10:17 UTC (permalink / raw)
  To: Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

The goal of this patchset is to prepare meson pinctrl driver to
add a new meson SoC support. This new SoC will share the same pinconf/gpio
registers but the pinmux part will be slightly different.

First patch allows to compile and ship only the necessary pinctrl drivers,
depending on the architecture and configuration needs. This should save
a bit of memory.

Second patch provide a way to deal with a different pinmux scheme, while
reusing most of the meson pinctrl driver.

Linus, this series depends on
* The offset clean-up series you've already merged [0]
* the fixup regarding pin_base [1]

[0]: https://lkml.kernel.org/r/20170920133927.17390-1-jbrunet@baylibre.com
[1]: https://lkml.kernel.org/r/20171006085407.27905-1-jbrunet@baylibre.com

Jerome Brunet (2):
  pinctrl: meson: separate soc drivers
  pinctrl: meson: rework pinmux ops

 drivers/pinctrl/Kconfig                    |  11 +--
 drivers/pinctrl/meson/Kconfig              |  43 +++++++++
 drivers/pinctrl/meson/Makefile             |   9 +-
 drivers/pinctrl/meson/pinctrl-meson-gxbb.c |  28 +++++-
 drivers/pinctrl/meson/pinctrl-meson-gxl.c  |  28 +++++-
 drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 +++++++++++++++++++++
 drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 ++++++++++
 drivers/pinctrl/meson/pinctrl-meson.c      | 147 ++---------------------------
 drivers/pinctrl/meson/pinctrl-meson.h      |  42 +++------
 drivers/pinctrl/meson/pinctrl-meson8.c     |  28 +++++-
 drivers/pinctrl/meson/pinctrl-meson8b.c    |  28 +++++-
 11 files changed, 333 insertions(+), 186 deletions(-)
 create mode 100644 drivers/pinctrl/meson/Kconfig
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h

-- 
2.13.6


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

* [PATCH 0/2] pinctrl: meson: prepare for new SoC
@ 2017-10-09 10:17 ` Jerome Brunet
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 10:17 UTC (permalink / raw)
  To: linus-amlogic

The goal of this patchset is to prepare meson pinctrl driver to
add a new meson SoC support. This new SoC will share the same pinconf/gpio
registers but the pinmux part will be slightly different.

First patch allows to compile and ship only the necessary pinctrl drivers,
depending on the architecture and configuration needs. This should save
a bit of memory.

Second patch provide a way to deal with a different pinmux scheme, while
reusing most of the meson pinctrl driver.

Linus, this series depends on
* The offset clean-up series you've already merged [0]
* the fixup regarding pin_base [1]

[0]: https://lkml.kernel.org/r/20170920133927.17390-1-jbrunet at baylibre.com
[1]: https://lkml.kernel.org/r/20171006085407.27905-1-jbrunet at baylibre.com

Jerome Brunet (2):
  pinctrl: meson: separate soc drivers
  pinctrl: meson: rework pinmux ops

 drivers/pinctrl/Kconfig                    |  11 +--
 drivers/pinctrl/meson/Kconfig              |  43 +++++++++
 drivers/pinctrl/meson/Makefile             |   9 +-
 drivers/pinctrl/meson/pinctrl-meson-gxbb.c |  28 +++++-
 drivers/pinctrl/meson/pinctrl-meson-gxl.c  |  28 +++++-
 drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 +++++++++++++++++++++
 drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 ++++++++++
 drivers/pinctrl/meson/pinctrl-meson.c      | 147 ++---------------------------
 drivers/pinctrl/meson/pinctrl-meson.h      |  42 +++------
 drivers/pinctrl/meson/pinctrl-meson8.c     |  28 +++++-
 drivers/pinctrl/meson/pinctrl-meson8b.c    |  28 +++++-
 11 files changed, 333 insertions(+), 186 deletions(-)
 create mode 100644 drivers/pinctrl/meson/Kconfig
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h

-- 
2.13.6

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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
  2017-10-09 10:17 ` Jerome Brunet
@ 2017-10-09 10:17   ` Jerome Brunet
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 10:17 UTC (permalink / raw)
  To: Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

When meson pinctrl is enabled, all meson platforms pinctrl drivers are
built in the kernel, with a significant amount of data.

This leads to situation where pinctrl drivers targeting an architecture
are also compiled and shipped on another one (ex: meson8 - ARM - compiled
and shipped on ARM64 builds). This is a waste of memory we can easily
avoid.

This change makes 4 pinctrl drivers (1 per SoC) out the original single
driver, allowing to compile and ship only the ones required.

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
 drivers/pinctrl/Kconfig                    | 11 +------
 drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
 drivers/pinctrl/meson/Makefile             |  8 +++--
 drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
 drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
 drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++----------------------------
 drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
 drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
 drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
 9 files changed, 140 insertions(+), 77 deletions(-)
 create mode 100644 drivers/pinctrl/meson/Kconfig

diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 1778cf4f81c7..15b5b3b76ba9 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
 	  This provides a GPIO interface supporting inputs and outputs.
 	  The I2C versions of the chips can be used as interrupt-controller.
 
-config PINCTRL_MESON
-	bool
-	depends on OF
-	select PINMUX
-	select PINCONF
-	select GENERIC_PINCONF
-	select GPIOLIB
-	select OF_GPIO
-	select REGMAP_MMIO
-
 config PINCTRL_OXNAS
 	bool
 	depends on OF
@@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
 source "drivers/pinctrl/vt8500/Kconfig"
 source "drivers/pinctrl/mediatek/Kconfig"
 source "drivers/pinctrl/zte/Kconfig"
+source "drivers/pinctrl/meson/Kconfig"
 
 config PINCTRL_XWAY
 	bool
diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
new file mode 100644
index 000000000000..15655bfd39b6
--- /dev/null
+++ b/drivers/pinctrl/meson/Kconfig
@@ -0,0 +1,36 @@
+menuconfig PINCTRL_MESON
+	bool "Amlogic SoC pinctrl drivers"
+	depends on ARCH_MESON || COMPILE_TEST
+	depends on OF
+	select PINMUX
+	select PINCONF
+	select GENERIC_PINCONF
+	select GPIOLIB
+	select OF_GPIO
+	select REGMAP_MMIO
+	select PINMUX
+	select GENERIC_PINCONF
+
+if PINCTRL_MESON
+
+config PINCTRL_MESON8
+	bool "Meson 8 SoC pinctrl driver"
+	depends on ARM
+	default y
+
+config PINCTRL_MESON8B
+	bool "Meson 8b SoC pinctrl driver"
+	depends on ARM
+	default y
+
+config PINCTRL_MESON_GXBB
+	bool "Meson gxbb SoC pinctrl driver"
+	depends on ARM64
+	default y
+
+config PINCTRL_MESON_GXL
+	bool "Meson gxl SoC pinctrl driver"
+	depends on ARM64
+	default y
+
+endif
diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
index 27c5b5126008..a6ef5ff4e9b1 100644
--- a/drivers/pinctrl/meson/Makefile
+++ b/drivers/pinctrl/meson/Makefile
@@ -1,3 +1,5 @@
-obj-y	+= pinctrl-meson8.o pinctrl-meson8b.o
-obj-y	+= pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
-obj-y	+= pinctrl-meson.o
+obj-y += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
+obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
+obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
+obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
index 1881d4a0eca2..a87bdb17414b 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
@@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
 	.name		= "periphs-banks",
 	.pins		= meson_gxbb_periphs_pins,
 	.groups		= meson_gxbb_periphs_groups,
@@ -836,7 +836,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
 };
 
-struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
 	.name		= "aobus-banks",
 	.pins		= meson_gxbb_aobus_pins,
 	.groups		= meson_gxbb_aobus_groups,
@@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
 };
+
+static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
+		.data = &meson_gxbb_periphs_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
+		.data = &meson_gxbb_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson_gxbb_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson-gxbb-pinctrl",
+		.of_match_table = meson_gxbb_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson_gxbb_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
index 3a14ecae9f31..088ac94f76b0 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
@@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
 	.name		= "periphs-banks",
 	.pins		= meson_gxl_periphs_pins,
 	.groups		= meson_gxl_periphs_groups,
@@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
 };
 
-struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
 	.name		= "aobus-banks",
 	.pins		= meson_gxl_aobus_pins,
 	.groups		= meson_gxl_aobus_groups,
@@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
 };
+
+static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
+		.data = &meson_gxl_periphs_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
+		.data = &meson_gxl_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson_gxl_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson-gxl-pinctrl",
+		.of_match_table = meson_gxl_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson_gxl_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index 71bccb7acbf8..8fc1f1b45435 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
 	return !!(val & BIT(bit));
 }
 
-static const struct of_device_id meson_pinctrl_dt_match[] = {
-	{
-		.compatible = "amlogic,meson8-cbus-pinctrl",
-		.data = &meson8_cbus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson8b-cbus-pinctrl",
-		.data = &meson8b_cbus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson8-aobus-pinctrl",
-		.data = &meson8_aobus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson8b-aobus-pinctrl",
-		.data = &meson8b_aobus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
-		.data = &meson_gxbb_periphs_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
-		.data = &meson_gxbb_aobus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
-		.data = &meson_gxl_periphs_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
-		.data = &meson_gxl_aobus_pinctrl_data,
-	},
-	{ },
-};
-
 static int meson_gpiolib_register(struct meson_pinctrl *pc)
 {
 	int ret;
@@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
 	return 0;
 }
 
-static int meson_pinctrl_probe(struct platform_device *pdev)
+int meson_pinctrl_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *match;
 	struct device *dev = &pdev->dev;
@@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	pc->dev = dev;
-	match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
+	match = of_match_node(dev->driver->of_match_table, dev->of_node);
 	pc->data = (struct meson_pinctrl_data *) match->data;
 
-	ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
+	ret = meson_pinctrl_parse_dt(pc, dev->of_node);
 	if (ret)
 		return ret;
 
@@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
 
 	return meson_gpiolib_register(pc);
 }
-
-static struct platform_driver meson_pinctrl_driver = {
-	.probe		= meson_pinctrl_probe,
-	.driver = {
-		.name	= "meson-pinctrl",
-		.of_match_table = meson_pinctrl_dt_match,
-	},
-};
-builtin_platform_driver(meson_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
index 7ed0a80fd9dc..284157d43612 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.h
+++ b/drivers/pinctrl/meson/pinctrl-meson.h
@@ -13,6 +13,7 @@
 
 #include <linux/gpio.h>
 #include <linux/pinctrl/pinctrl.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/types.h>
 
@@ -165,11 +166,5 @@ struct meson_pinctrl {
 
 #define MESON_PIN(x) PINCTRL_PIN(x, #x)
 
-extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
+/* Common probe function */
+int meson_pinctrl_probe(struct platform_device *pdev);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
index fbf8ecd1c2b6..68b345fc105a 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8.c
@@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
 	.name		= "cbus-banks",
 	.pins		= meson8_cbus_pins,
 	.groups		= meson8_cbus_groups,
@@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
 };
 
-struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
 	.name		= "ao-bank",
 	.pins		= meson8_aobus_pins,
 	.groups		= meson8_aobus_groups,
@@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
 };
+
+static const struct of_device_id meson8_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson8-cbus-pinctrl",
+		.data = &meson8_cbus_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson8-aobus-pinctrl",
+		.data = &meson8_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson8_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson8-pinctrl",
+		.of_match_table = meson8_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson8_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
index 7af296db48c8..4d61df09bc3f 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
@@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
 	.name		= "cbus-banks",
 	.pins		= meson8b_cbus_pins,
 	.groups		= meson8b_cbus_groups,
@@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
 };
 
-struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
 	.name		= "aobus-banks",
 	.pins		= meson8b_aobus_pins,
 	.groups		= meson8b_aobus_groups,
@@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
 };
+
+static const struct of_device_id meson8b_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson8b-cbus-pinctrl",
+		.data = &meson8b_cbus_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson8b-aobus-pinctrl",
+		.data = &meson8b_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson8b_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson8b-pinctrl",
+		.of_match_table = meson8b_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson8b_pinctrl_driver);
-- 
2.13.6

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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-09 10:17   ` Jerome Brunet
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 10:17 UTC (permalink / raw)
  To: linus-amlogic

When meson pinctrl is enabled, all meson platforms pinctrl drivers are
built in the kernel, with a significant amount of data.

This leads to situation where pinctrl drivers targeting an architecture
are also compiled and shipped on another one (ex: meson8 - ARM - compiled
and shipped on ARM64 builds). This is a waste of memory we can easily
avoid.

This change makes 4 pinctrl drivers (1 per SoC) out the original single
driver, allowing to compile and ship only the ones required.

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
 drivers/pinctrl/Kconfig                    | 11 +------
 drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
 drivers/pinctrl/meson/Makefile             |  8 +++--
 drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
 drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
 drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++----------------------------
 drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
 drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
 drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
 9 files changed, 140 insertions(+), 77 deletions(-)
 create mode 100644 drivers/pinctrl/meson/Kconfig

diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 1778cf4f81c7..15b5b3b76ba9 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
 	  This provides a GPIO interface supporting inputs and outputs.
 	  The I2C versions of the chips can be used as interrupt-controller.
 
-config PINCTRL_MESON
-	bool
-	depends on OF
-	select PINMUX
-	select PINCONF
-	select GENERIC_PINCONF
-	select GPIOLIB
-	select OF_GPIO
-	select REGMAP_MMIO
-
 config PINCTRL_OXNAS
 	bool
 	depends on OF
@@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
 source "drivers/pinctrl/vt8500/Kconfig"
 source "drivers/pinctrl/mediatek/Kconfig"
 source "drivers/pinctrl/zte/Kconfig"
+source "drivers/pinctrl/meson/Kconfig"
 
 config PINCTRL_XWAY
 	bool
diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
new file mode 100644
index 000000000000..15655bfd39b6
--- /dev/null
+++ b/drivers/pinctrl/meson/Kconfig
@@ -0,0 +1,36 @@
+menuconfig PINCTRL_MESON
+	bool "Amlogic SoC pinctrl drivers"
+	depends on ARCH_MESON || COMPILE_TEST
+	depends on OF
+	select PINMUX
+	select PINCONF
+	select GENERIC_PINCONF
+	select GPIOLIB
+	select OF_GPIO
+	select REGMAP_MMIO
+	select PINMUX
+	select GENERIC_PINCONF
+
+if PINCTRL_MESON
+
+config PINCTRL_MESON8
+	bool "Meson 8 SoC pinctrl driver"
+	depends on ARM
+	default y
+
+config PINCTRL_MESON8B
+	bool "Meson 8b SoC pinctrl driver"
+	depends on ARM
+	default y
+
+config PINCTRL_MESON_GXBB
+	bool "Meson gxbb SoC pinctrl driver"
+	depends on ARM64
+	default y
+
+config PINCTRL_MESON_GXL
+	bool "Meson gxl SoC pinctrl driver"
+	depends on ARM64
+	default y
+
+endif
diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
index 27c5b5126008..a6ef5ff4e9b1 100644
--- a/drivers/pinctrl/meson/Makefile
+++ b/drivers/pinctrl/meson/Makefile
@@ -1,3 +1,5 @@
-obj-y	+= pinctrl-meson8.o pinctrl-meson8b.o
-obj-y	+= pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
-obj-y	+= pinctrl-meson.o
+obj-y += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
+obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
+obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
+obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
index 1881d4a0eca2..a87bdb17414b 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
@@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
 	.name		= "periphs-banks",
 	.pins		= meson_gxbb_periphs_pins,
 	.groups		= meson_gxbb_periphs_groups,
@@ -836,7 +836,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
 };
 
-struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
 	.name		= "aobus-banks",
 	.pins		= meson_gxbb_aobus_pins,
 	.groups		= meson_gxbb_aobus_groups,
@@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
 };
+
+static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
+		.data = &meson_gxbb_periphs_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
+		.data = &meson_gxbb_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson_gxbb_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson-gxbb-pinctrl",
+		.of_match_table = meson_gxbb_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson_gxbb_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
index 3a14ecae9f31..088ac94f76b0 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
@@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
 	.name		= "periphs-banks",
 	.pins		= meson_gxl_periphs_pins,
 	.groups		= meson_gxl_periphs_groups,
@@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
 };
 
-struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
 	.name		= "aobus-banks",
 	.pins		= meson_gxl_aobus_pins,
 	.groups		= meson_gxl_aobus_groups,
@@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
 };
+
+static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
+		.data = &meson_gxl_periphs_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
+		.data = &meson_gxl_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson_gxl_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson-gxl-pinctrl",
+		.of_match_table = meson_gxl_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson_gxl_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index 71bccb7acbf8..8fc1f1b45435 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
 	return !!(val & BIT(bit));
 }
 
-static const struct of_device_id meson_pinctrl_dt_match[] = {
-	{
-		.compatible = "amlogic,meson8-cbus-pinctrl",
-		.data = &meson8_cbus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson8b-cbus-pinctrl",
-		.data = &meson8b_cbus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson8-aobus-pinctrl",
-		.data = &meson8_aobus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson8b-aobus-pinctrl",
-		.data = &meson8b_aobus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
-		.data = &meson_gxbb_periphs_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
-		.data = &meson_gxbb_aobus_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
-		.data = &meson_gxl_periphs_pinctrl_data,
-	},
-	{
-		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
-		.data = &meson_gxl_aobus_pinctrl_data,
-	},
-	{ },
-};
-
 static int meson_gpiolib_register(struct meson_pinctrl *pc)
 {
 	int ret;
@@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
 	return 0;
 }
 
-static int meson_pinctrl_probe(struct platform_device *pdev)
+int meson_pinctrl_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *match;
 	struct device *dev = &pdev->dev;
@@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	pc->dev = dev;
-	match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
+	match = of_match_node(dev->driver->of_match_table, dev->of_node);
 	pc->data = (struct meson_pinctrl_data *) match->data;
 
-	ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
+	ret = meson_pinctrl_parse_dt(pc, dev->of_node);
 	if (ret)
 		return ret;
 
@@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
 
 	return meson_gpiolib_register(pc);
 }
-
-static struct platform_driver meson_pinctrl_driver = {
-	.probe		= meson_pinctrl_probe,
-	.driver = {
-		.name	= "meson-pinctrl",
-		.of_match_table = meson_pinctrl_dt_match,
-	},
-};
-builtin_platform_driver(meson_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
index 7ed0a80fd9dc..284157d43612 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.h
+++ b/drivers/pinctrl/meson/pinctrl-meson.h
@@ -13,6 +13,7 @@
 
 #include <linux/gpio.h>
 #include <linux/pinctrl/pinctrl.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/types.h>
 
@@ -165,11 +166,5 @@ struct meson_pinctrl {
 
 #define MESON_PIN(x) PINCTRL_PIN(x, #x)
 
-extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
-extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
-extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
+/* Common probe function */
+int meson_pinctrl_probe(struct platform_device *pdev);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
index fbf8ecd1c2b6..68b345fc105a 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8.c
@@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
 	.name		= "cbus-banks",
 	.pins		= meson8_cbus_pins,
 	.groups		= meson8_cbus_groups,
@@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
 };
 
-struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
 	.name		= "ao-bank",
 	.pins		= meson8_aobus_pins,
 	.groups		= meson8_aobus_groups,
@@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
 };
+
+static const struct of_device_id meson8_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson8-cbus-pinctrl",
+		.data = &meson8_cbus_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson8-aobus-pinctrl",
+		.data = &meson8_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson8_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson8-pinctrl",
+		.of_match_table = meson8_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson8_pinctrl_driver);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
index 7af296db48c8..4d61df09bc3f 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
@@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
 	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
 };
 
-struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
 	.name		= "cbus-banks",
 	.pins		= meson8b_cbus_pins,
 	.groups		= meson8b_cbus_groups,
@@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
 	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
 };
 
-struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
+static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
 	.name		= "aobus-banks",
 	.pins		= meson8b_aobus_pins,
 	.groups		= meson8b_aobus_groups,
@@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
 	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
 };
+
+static const struct of_device_id meson8b_pinctrl_dt_match[] = {
+	{
+		.compatible = "amlogic,meson8b-cbus-pinctrl",
+		.data = &meson8b_cbus_pinctrl_data,
+	},
+	{
+		.compatible = "amlogic,meson8b-aobus-pinctrl",
+		.data = &meson8b_aobus_pinctrl_data,
+	},
+	{ },
+};
+
+static struct platform_driver meson8b_pinctrl_driver = {
+	.probe		= meson_pinctrl_probe,
+	.driver = {
+		.name	= "meson8b-pinctrl",
+		.of_match_table = meson8b_pinctrl_dt_match,
+	},
+};
+builtin_platform_driver(meson8b_pinctrl_driver);
-- 
2.13.6

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

* [PATCH 2/2] pinctrl: meson: rework pinmux ops
  2017-10-09 10:17 ` Jerome Brunet
@ 2017-10-09 10:17   ` Jerome Brunet
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 10:17 UTC (permalink / raw)
  To: Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

This change prepare the introduction of new meson SoC. This new SoC will
share the same gpio/pinconf registers but the pinmux part will be
different. While the format of the data associated with each pinmux group
will change, the way to handle pinmuxing will be similar.

To deal with this new situation, the meson_pmx_struture is kept but the
data associated to it is now generic. This allows to reuse the basic
functions which would otherwise be copy/pasted in each pinmux driver
(such as getting the name a count of groups and functions) Only the
functions actually using this specific data is taken out of the common
code and is handling the SoC pinmuxing

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
 drivers/pinctrl/meson/Kconfig              |   7 ++
 drivers/pinctrl/meson/Makefile             |   1 +
 drivers/pinctrl/meson/pinctrl-meson-gxbb.c |   3 +
 drivers/pinctrl/meson/pinctrl-meson-gxl.c  |   3 +
 drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 +++++++++++++++++++++++++++++
 drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 +++++++++++++
 drivers/pinctrl/meson/pinctrl-meson.c      |  96 ++------------------------
 drivers/pinctrl/meson/pinctrl-meson.h      |  31 +++------
 drivers/pinctrl/meson/pinctrl-meson8.c     |   3 +
 drivers/pinctrl/meson/pinctrl-meson8b.c    |   3 +
 10 files changed, 193 insertions(+), 109 deletions(-)
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h

diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
index 15655bfd39b6..8968603ef6b2 100644
--- a/drivers/pinctrl/meson/Kconfig
+++ b/drivers/pinctrl/meson/Kconfig
@@ -16,21 +16,28 @@ if PINCTRL_MESON
 config PINCTRL_MESON8
 	bool "Meson 8 SoC pinctrl driver"
 	depends on ARM
+	select PINCTRL_MESON_PMX
 	default y
 
 config PINCTRL_MESON8B
 	bool "Meson 8b SoC pinctrl driver"
 	depends on ARM
+	select PINCTRL_MESON_PMX
 	default y
 
 config PINCTRL_MESON_GXBB
 	bool "Meson gxbb SoC pinctrl driver"
 	depends on ARM64
+	select PINCTRL_MESON_PMX
 	default y
 
 config PINCTRL_MESON_GXL
 	bool "Meson gxl SoC pinctrl driver"
 	depends on ARM64
+	select PINCTRL_MESON_PMX
 	default y
 
+config PINCTRL_MESON_PMX
+	bool
+
 endif
diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
index a6ef5ff4e9b1..752ae5fdd59a 100644
--- a/drivers/pinctrl/meson/Makefile
+++ b/drivers/pinctrl/meson/Makefile
@@ -1,4 +1,5 @@
 obj-y += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON_PMX) += pinctrl-meson-pmx.o
 obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
 obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
 obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
index a87bdb17414b..a0571d175091 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
@@ -14,6 +14,7 @@
 
 #include <dt-bindings/gpio/meson-gxbb-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
 	MESON_PIN(GPIOZ_0),
@@ -834,6 +835,7 @@ static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxbb_periphs_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxbb_periphs_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
@@ -846,6 +848,7 @@ static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxbb_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
index 088ac94f76b0..2f51af6a244d 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
@@ -14,6 +14,7 @@
 
 #include <dt-bindings/gpio/meson-gxl-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
 	MESON_PIN(GPIOZ_0),
@@ -819,6 +820,7 @@ static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxl_periphs_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxl_periphs_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
@@ -831,6 +833,7 @@ static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxl_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.c b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
new file mode 100644
index 000000000000..062381891760
--- /dev/null
+++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
@@ -0,0 +1,107 @@
+/*
+ * First generation of pinmux driver for Amlogic Meson SoCs
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* For this first generation of pinctrl driver every pinmux group can be
+ * enabled by a specific bit in the first register range. When all groups for
+ * a given pin are disabled the pin acts as a GPIO.
+ */
+#include <linux/device.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+
+#include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
+
+/**
+ * meson_pmx_disable_other_groups() - disable other groups using a given pin
+ *
+ * @pc:		meson pin controller device
+ * @pin:	number of the pin
+ * @sel_group:	index of the selected group, or -1 if none
+ *
+ * The function disables all pinmux groups using a pin except the
+ * selected one. If @sel_group is -1 all groups are disabled, leaving
+ * the pin in GPIO mode.
+ */
+static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
+					   unsigned int pin, int sel_group)
+{
+	struct meson_pmx_group *group;
+	struct meson_pmx_data *pmx_data;
+	int i, j;
+
+	for (i = 0; i < pc->data->num_groups; i++) {
+		group = &pc->data->groups[i];
+		pmx_data = (struct meson_pmx_data *)group->data;
+		if (pmx_data->is_gpio || i == sel_group)
+			continue;
+
+		for (j = 0; j < group->num_pins; j++) {
+			if (group->pins[j] == pin) {
+				/* We have found a group using the pin */
+				regmap_update_bits(pc->reg_mux,
+						   pmx_data->reg * 4,
+						   BIT(pmx_data->bit), 0);
+			}
+		}
+	}
+}
+
+static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
+			     unsigned group_num)
+{
+	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+	struct meson_pmx_func *func = &pc->data->funcs[func_num];
+	struct meson_pmx_group *group = &pc->data->groups[group_num];
+	struct meson_pmx_data *pmx_data =
+		(struct meson_pmx_data *)group->data;
+	int i, ret = 0;
+
+	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
+		group->name);
+
+	/*
+	 * Disable groups using the same pin.
+	 * The selected group is not disabled to avoid glitches.
+	 */
+	for (i = 0; i < group->num_pins; i++)
+		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
+
+	/* Function 0 (GPIO) doesn't need any additional setting */
+	if (func_num)
+		ret = regmap_update_bits(pc->reg_mux, pmx_data->reg * 4,
+					 BIT(pmx_data->bit), BIT(pmx_data->bit));
+
+	return ret;
+}
+
+static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
+				  struct pinctrl_gpio_range *range,
+				  unsigned offset)
+{
+	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+
+	meson_pmx_disable_other_groups(pc, offset, -1);
+
+	return 0;
+}
+
+const struct pinmux_ops meson_pmx_ops = {
+	.set_mux = meson_pmx_set_mux,
+	.get_functions_count = meson_pmx_get_funcs_count,
+	.get_function_name = meson_pmx_get_func_name,
+	.get_function_groups = meson_pmx_get_groups,
+	.gpio_request_enable = meson_pmx_request_gpio,
+};
diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.h b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
new file mode 100644
index 000000000000..e1ceb50014c2
--- /dev/null
+++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
@@ -0,0 +1,48 @@
+/*
+ * First generation of pinmux driver for Amlogic Meson SoCs
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+struct meson_pmx_data {
+	bool is_gpio;
+	unsigned int reg;
+	unsigned int bit;
+};
+
+#define PMX_DATA(r, b, g)						\
+	{								\
+		.reg = r,						\
+		.bit = b,						\
+		.is_gpio = g,						\
+	}
+
+#define GROUP(grp, r, b)						\
+	{								\
+		.name = #grp,						\
+		.pins = grp ## _pins,					\
+		.num_pins = ARRAY_SIZE(grp ## _pins),			\
+		.data = (const struct meson_pmx_data[]){		\
+			PMX_DATA(r, b, false),				\
+		},							\
+	 }
+
+#define GPIO_GROUP(gpio)						\
+	{								\
+		.name = #gpio,						\
+		.pins = (const unsigned int[]){ gpio },			\
+		.num_pins = 1,						\
+		.data = (const struct meson_pmx_data[]){		\
+			PMX_DATA(0, 0, true),				\
+		},							\
+	}
+
+extern const struct pinmux_ops meson_pmx_ops;
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index 8fc1f1b45435..47ee8349f306 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -31,10 +31,6 @@
  * In some cases the register ranges for pull enable and pull
  * direction are the same and thus there are only 3 register ranges.
  *
- * Every pinmux group can be enabled by a specific bit in the first
- * register range; when all groups for a given pin are disabled the
- * pin acts as a GPIO.
- *
  * For the pull and GPIO configuration every bank uses a contiguous
  * set of bits in the register sets described above; the same register
  * can be shared by more banks with different offsets.
@@ -147,94 +143,24 @@ static const struct pinctrl_ops meson_pctrl_ops = {
 	.pin_dbg_show		= meson_pin_dbg_show,
 };
 
-/**
- * meson_pmx_disable_other_groups() - disable other groups using a given pin
- *
- * @pc:		meson pin controller device
- * @pin:	number of the pin
- * @sel_group:	index of the selected group, or -1 if none
- *
- * The function disables all pinmux groups using a pin except the
- * selected one. If @sel_group is -1 all groups are disabled, leaving
- * the pin in GPIO mode.
- */
-static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
-					   unsigned int pin, int sel_group)
-{
-	struct meson_pmx_group *group;
-	int i, j;
-
-	for (i = 0; i < pc->data->num_groups; i++) {
-		group = &pc->data->groups[i];
-		if (group->is_gpio || i == sel_group)
-			continue;
-
-		for (j = 0; j < group->num_pins; j++) {
-			if (group->pins[j] == pin) {
-				/* We have found a group using the pin */
-				regmap_update_bits(pc->reg_mux,
-						   group->reg * 4,
-						   BIT(group->bit), 0);
-			}
-		}
-	}
-}
-
-static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
-			     unsigned group_num)
-{
-	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
-	struct meson_pmx_func *func = &pc->data->funcs[func_num];
-	struct meson_pmx_group *group = &pc->data->groups[group_num];
-	int i, ret = 0;
-
-	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
-		group->name);
-
-	/*
-	 * Disable groups using the same pin.
-	 * The selected group is not disabled to avoid glitches.
-	 */
-	for (i = 0; i < group->num_pins; i++)
-		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
-
-	/* Function 0 (GPIO) doesn't need any additional setting */
-	if (func_num)
-		ret = regmap_update_bits(pc->reg_mux, group->reg * 4,
-					 BIT(group->bit), BIT(group->bit));
-
-	return ret;
-}
-
-static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
-				  struct pinctrl_gpio_range *range,
-				  unsigned offset)
-{
-	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
-
-	meson_pmx_disable_other_groups(pc, offset, -1);
-
-	return 0;
-}
-
-static int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
+int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
 {
 	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
 	return pc->data->num_funcs;
 }
 
-static const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
-					   unsigned selector)
+const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
+				    unsigned selector)
 {
 	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
 	return pc->data->funcs[selector].name;
 }
 
-static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
-				const char * const **groups,
-				unsigned * const num_groups)
+int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
+			 const char * const **groups,
+			 unsigned * const num_groups)
 {
 	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
@@ -244,14 +170,6 @@ static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
 	return 0;
 }
 
-static const struct pinmux_ops meson_pmx_ops = {
-	.set_mux = meson_pmx_set_mux,
-	.get_functions_count = meson_pmx_get_funcs_count,
-	.get_function_name = meson_pmx_get_func_name,
-	.get_function_groups = meson_pmx_get_groups,
-	.gpio_request_enable = meson_pmx_request_gpio,
-};
-
 static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
 			     unsigned long *configs, unsigned num_configs)
 {
@@ -610,7 +528,7 @@ int meson_pinctrl_probe(struct platform_device *pdev)
 	pc->desc.name		= "pinctrl-meson";
 	pc->desc.owner		= THIS_MODULE;
 	pc->desc.pctlops	= &meson_pctrl_ops;
-	pc->desc.pmxops		= &meson_pmx_ops;
+	pc->desc.pmxops		= pc->data->pmx_ops;
 	pc->desc.confops	= &meson_pinconf_ops;
 	pc->desc.pins		= pc->data->pins;
 	pc->desc.npins		= pc->data->num_pins;
diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
index 284157d43612..183b6e471635 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.h
+++ b/drivers/pinctrl/meson/pinctrl-meson.h
@@ -32,9 +32,7 @@ struct meson_pmx_group {
 	const char *name;
 	const unsigned int *pins;
 	unsigned int num_pins;
-	bool is_gpio;
-	unsigned int reg;
-	unsigned int bit;
+	const void *data;
 };
 
 /**
@@ -109,6 +107,7 @@ struct meson_pinctrl_data {
 	unsigned int num_funcs;
 	struct meson_bank *banks;
 	unsigned int num_banks;
+	const struct pinmux_ops *pmx_ops;
 };
 
 struct meson_pinctrl {
@@ -124,23 +123,6 @@ struct meson_pinctrl {
 	struct device_node *of_node;
 };
 
-#define GROUP(grp, r, b)						\
-	{								\
-		.name = #grp,						\
-		.pins = grp ## _pins,					\
-		.num_pins = ARRAY_SIZE(grp ## _pins),			\
-		.reg = r,						\
-		.bit = b,						\
-	 }
-
-#define GPIO_GROUP(gpio)						\
-	{								\
-		.name = #gpio,						\
-		.pins = (const unsigned int[]){ gpio },			\
-		.num_pins = 1,						\
-		.is_gpio = true,					\
-	 }
-
 #define FUNCTION(fn)							\
 	{								\
 		.name = #fn,						\
@@ -166,5 +148,14 @@ struct meson_pinctrl {
 
 #define MESON_PIN(x) PINCTRL_PIN(x, #x)
 
+/* Common pmx functions */
+int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
+const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
+				    unsigned selector);
+int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
+			 unsigned selector,
+			 const char * const **groups,
+			 unsigned * const num_groups);
+
 /* Common probe function */
 int meson_pinctrl_probe(struct platform_device *pdev);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
index 68b345fc105a..b1a7b992cdef 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8.c
@@ -13,6 +13,7 @@
 
 #include <dt-bindings/gpio/meson8-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson8_cbus_pins[] = {
 	MESON_PIN(GPIOX_0),
@@ -1054,6 +1055,7 @@ static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8_cbus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8_cbus_functions),
 	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
@@ -1066,6 +1068,7 @@ static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson8_pinctrl_dt_match[] = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
index 4d61df09bc3f..05f59f3a0c4e 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
@@ -14,6 +14,7 @@
 
 #include <dt-bindings/gpio/meson8b-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson8b_cbus_pins[] = {
 	MESON_PIN(GPIOX_0),
@@ -914,6 +915,7 @@ static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8b_cbus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8b_cbus_functions),
 	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
@@ -926,6 +928,7 @@ static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8b_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson8b_pinctrl_dt_match[] = {
-- 
2.13.6

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

* [PATCH 2/2] pinctrl: meson: rework pinmux ops
@ 2017-10-09 10:17   ` Jerome Brunet
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 10:17 UTC (permalink / raw)
  To: linus-amlogic

This change prepare the introduction of new meson SoC. This new SoC will
share the same gpio/pinconf registers but the pinmux part will be
different. While the format of the data associated with each pinmux group
will change, the way to handle pinmuxing will be similar.

To deal with this new situation, the meson_pmx_struture is kept but the
data associated to it is now generic. This allows to reuse the basic
functions which would otherwise be copy/pasted in each pinmux driver
(such as getting the name a count of groups and functions) Only the
functions actually using this specific data is taken out of the common
code and is handling the SoC pinmuxing

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
 drivers/pinctrl/meson/Kconfig              |   7 ++
 drivers/pinctrl/meson/Makefile             |   1 +
 drivers/pinctrl/meson/pinctrl-meson-gxbb.c |   3 +
 drivers/pinctrl/meson/pinctrl-meson-gxl.c  |   3 +
 drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 +++++++++++++++++++++++++++++
 drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 +++++++++++++
 drivers/pinctrl/meson/pinctrl-meson.c      |  96 ++------------------------
 drivers/pinctrl/meson/pinctrl-meson.h      |  31 +++------
 drivers/pinctrl/meson/pinctrl-meson8.c     |   3 +
 drivers/pinctrl/meson/pinctrl-meson8b.c    |   3 +
 10 files changed, 193 insertions(+), 109 deletions(-)
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
 create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h

diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
index 15655bfd39b6..8968603ef6b2 100644
--- a/drivers/pinctrl/meson/Kconfig
+++ b/drivers/pinctrl/meson/Kconfig
@@ -16,21 +16,28 @@ if PINCTRL_MESON
 config PINCTRL_MESON8
 	bool "Meson 8 SoC pinctrl driver"
 	depends on ARM
+	select PINCTRL_MESON_PMX
 	default y
 
 config PINCTRL_MESON8B
 	bool "Meson 8b SoC pinctrl driver"
 	depends on ARM
+	select PINCTRL_MESON_PMX
 	default y
 
 config PINCTRL_MESON_GXBB
 	bool "Meson gxbb SoC pinctrl driver"
 	depends on ARM64
+	select PINCTRL_MESON_PMX
 	default y
 
 config PINCTRL_MESON_GXL
 	bool "Meson gxl SoC pinctrl driver"
 	depends on ARM64
+	select PINCTRL_MESON_PMX
 	default y
 
+config PINCTRL_MESON_PMX
+	bool
+
 endif
diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
index a6ef5ff4e9b1..752ae5fdd59a 100644
--- a/drivers/pinctrl/meson/Makefile
+++ b/drivers/pinctrl/meson/Makefile
@@ -1,4 +1,5 @@
 obj-y += pinctrl-meson.o
+obj-$(CONFIG_PINCTRL_MESON_PMX) += pinctrl-meson-pmx.o
 obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
 obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
 obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
index a87bdb17414b..a0571d175091 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
@@ -14,6 +14,7 @@
 
 #include <dt-bindings/gpio/meson-gxbb-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
 	MESON_PIN(GPIOZ_0),
@@ -834,6 +835,7 @@ static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxbb_periphs_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxbb_periphs_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
@@ -846,6 +848,7 @@ static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxbb_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
index 088ac94f76b0..2f51af6a244d 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
@@ -14,6 +14,7 @@
 
 #include <dt-bindings/gpio/meson-gxl-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
 	MESON_PIN(GPIOZ_0),
@@ -819,6 +820,7 @@ static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxl_periphs_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxl_periphs_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
@@ -831,6 +833,7 @@ static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson_gxl_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.c b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
new file mode 100644
index 000000000000..062381891760
--- /dev/null
+++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
@@ -0,0 +1,107 @@
+/*
+ * First generation of pinmux driver for Amlogic Meson SoCs
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* For this first generation of pinctrl driver every pinmux group can be
+ * enabled by a specific bit in the first register range. When all groups for
+ * a given pin are disabled the pin acts as a GPIO.
+ */
+#include <linux/device.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+
+#include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
+
+/**
+ * meson_pmx_disable_other_groups() - disable other groups using a given pin
+ *
+ * @pc:		meson pin controller device
+ * @pin:	number of the pin
+ * @sel_group:	index of the selected group, or -1 if none
+ *
+ * The function disables all pinmux groups using a pin except the
+ * selected one. If @sel_group is -1 all groups are disabled, leaving
+ * the pin in GPIO mode.
+ */
+static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
+					   unsigned int pin, int sel_group)
+{
+	struct meson_pmx_group *group;
+	struct meson_pmx_data *pmx_data;
+	int i, j;
+
+	for (i = 0; i < pc->data->num_groups; i++) {
+		group = &pc->data->groups[i];
+		pmx_data = (struct meson_pmx_data *)group->data;
+		if (pmx_data->is_gpio || i == sel_group)
+			continue;
+
+		for (j = 0; j < group->num_pins; j++) {
+			if (group->pins[j] == pin) {
+				/* We have found a group using the pin */
+				regmap_update_bits(pc->reg_mux,
+						   pmx_data->reg * 4,
+						   BIT(pmx_data->bit), 0);
+			}
+		}
+	}
+}
+
+static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
+			     unsigned group_num)
+{
+	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+	struct meson_pmx_func *func = &pc->data->funcs[func_num];
+	struct meson_pmx_group *group = &pc->data->groups[group_num];
+	struct meson_pmx_data *pmx_data =
+		(struct meson_pmx_data *)group->data;
+	int i, ret = 0;
+
+	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
+		group->name);
+
+	/*
+	 * Disable groups using the same pin.
+	 * The selected group is not disabled to avoid glitches.
+	 */
+	for (i = 0; i < group->num_pins; i++)
+		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
+
+	/* Function 0 (GPIO) doesn't need any additional setting */
+	if (func_num)
+		ret = regmap_update_bits(pc->reg_mux, pmx_data->reg * 4,
+					 BIT(pmx_data->bit), BIT(pmx_data->bit));
+
+	return ret;
+}
+
+static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
+				  struct pinctrl_gpio_range *range,
+				  unsigned offset)
+{
+	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
+
+	meson_pmx_disable_other_groups(pc, offset, -1);
+
+	return 0;
+}
+
+const struct pinmux_ops meson_pmx_ops = {
+	.set_mux = meson_pmx_set_mux,
+	.get_functions_count = meson_pmx_get_funcs_count,
+	.get_function_name = meson_pmx_get_func_name,
+	.get_function_groups = meson_pmx_get_groups,
+	.gpio_request_enable = meson_pmx_request_gpio,
+};
diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.h b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
new file mode 100644
index 000000000000..e1ceb50014c2
--- /dev/null
+++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
@@ -0,0 +1,48 @@
+/*
+ * First generation of pinmux driver for Amlogic Meson SoCs
+ *
+ * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
+ * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+struct meson_pmx_data {
+	bool is_gpio;
+	unsigned int reg;
+	unsigned int bit;
+};
+
+#define PMX_DATA(r, b, g)						\
+	{								\
+		.reg = r,						\
+		.bit = b,						\
+		.is_gpio = g,						\
+	}
+
+#define GROUP(grp, r, b)						\
+	{								\
+		.name = #grp,						\
+		.pins = grp ## _pins,					\
+		.num_pins = ARRAY_SIZE(grp ## _pins),			\
+		.data = (const struct meson_pmx_data[]){		\
+			PMX_DATA(r, b, false),				\
+		},							\
+	 }
+
+#define GPIO_GROUP(gpio)						\
+	{								\
+		.name = #gpio,						\
+		.pins = (const unsigned int[]){ gpio },			\
+		.num_pins = 1,						\
+		.data = (const struct meson_pmx_data[]){		\
+			PMX_DATA(0, 0, true),				\
+		},							\
+	}
+
+extern const struct pinmux_ops meson_pmx_ops;
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index 8fc1f1b45435..47ee8349f306 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -31,10 +31,6 @@
  * In some cases the register ranges for pull enable and pull
  * direction are the same and thus there are only 3 register ranges.
  *
- * Every pinmux group can be enabled by a specific bit in the first
- * register range; when all groups for a given pin are disabled the
- * pin acts as a GPIO.
- *
  * For the pull and GPIO configuration every bank uses a contiguous
  * set of bits in the register sets described above; the same register
  * can be shared by more banks with different offsets.
@@ -147,94 +143,24 @@ static const struct pinctrl_ops meson_pctrl_ops = {
 	.pin_dbg_show		= meson_pin_dbg_show,
 };
 
-/**
- * meson_pmx_disable_other_groups() - disable other groups using a given pin
- *
- * @pc:		meson pin controller device
- * @pin:	number of the pin
- * @sel_group:	index of the selected group, or -1 if none
- *
- * The function disables all pinmux groups using a pin except the
- * selected one. If @sel_group is -1 all groups are disabled, leaving
- * the pin in GPIO mode.
- */
-static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
-					   unsigned int pin, int sel_group)
-{
-	struct meson_pmx_group *group;
-	int i, j;
-
-	for (i = 0; i < pc->data->num_groups; i++) {
-		group = &pc->data->groups[i];
-		if (group->is_gpio || i == sel_group)
-			continue;
-
-		for (j = 0; j < group->num_pins; j++) {
-			if (group->pins[j] == pin) {
-				/* We have found a group using the pin */
-				regmap_update_bits(pc->reg_mux,
-						   group->reg * 4,
-						   BIT(group->bit), 0);
-			}
-		}
-	}
-}
-
-static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
-			     unsigned group_num)
-{
-	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
-	struct meson_pmx_func *func = &pc->data->funcs[func_num];
-	struct meson_pmx_group *group = &pc->data->groups[group_num];
-	int i, ret = 0;
-
-	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
-		group->name);
-
-	/*
-	 * Disable groups using the same pin.
-	 * The selected group is not disabled to avoid glitches.
-	 */
-	for (i = 0; i < group->num_pins; i++)
-		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
-
-	/* Function 0 (GPIO) doesn't need any additional setting */
-	if (func_num)
-		ret = regmap_update_bits(pc->reg_mux, group->reg * 4,
-					 BIT(group->bit), BIT(group->bit));
-
-	return ret;
-}
-
-static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
-				  struct pinctrl_gpio_range *range,
-				  unsigned offset)
-{
-	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
-
-	meson_pmx_disable_other_groups(pc, offset, -1);
-
-	return 0;
-}
-
-static int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
+int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
 {
 	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
 	return pc->data->num_funcs;
 }
 
-static const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
-					   unsigned selector)
+const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
+				    unsigned selector)
 {
 	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
 	return pc->data->funcs[selector].name;
 }
 
-static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
-				const char * const **groups,
-				unsigned * const num_groups)
+int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
+			 const char * const **groups,
+			 unsigned * const num_groups)
 {
 	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
 
@@ -244,14 +170,6 @@ static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
 	return 0;
 }
 
-static const struct pinmux_ops meson_pmx_ops = {
-	.set_mux = meson_pmx_set_mux,
-	.get_functions_count = meson_pmx_get_funcs_count,
-	.get_function_name = meson_pmx_get_func_name,
-	.get_function_groups = meson_pmx_get_groups,
-	.gpio_request_enable = meson_pmx_request_gpio,
-};
-
 static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
 			     unsigned long *configs, unsigned num_configs)
 {
@@ -610,7 +528,7 @@ int meson_pinctrl_probe(struct platform_device *pdev)
 	pc->desc.name		= "pinctrl-meson";
 	pc->desc.owner		= THIS_MODULE;
 	pc->desc.pctlops	= &meson_pctrl_ops;
-	pc->desc.pmxops		= &meson_pmx_ops;
+	pc->desc.pmxops		= pc->data->pmx_ops;
 	pc->desc.confops	= &meson_pinconf_ops;
 	pc->desc.pins		= pc->data->pins;
 	pc->desc.npins		= pc->data->num_pins;
diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
index 284157d43612..183b6e471635 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.h
+++ b/drivers/pinctrl/meson/pinctrl-meson.h
@@ -32,9 +32,7 @@ struct meson_pmx_group {
 	const char *name;
 	const unsigned int *pins;
 	unsigned int num_pins;
-	bool is_gpio;
-	unsigned int reg;
-	unsigned int bit;
+	const void *data;
 };
 
 /**
@@ -109,6 +107,7 @@ struct meson_pinctrl_data {
 	unsigned int num_funcs;
 	struct meson_bank *banks;
 	unsigned int num_banks;
+	const struct pinmux_ops *pmx_ops;
 };
 
 struct meson_pinctrl {
@@ -124,23 +123,6 @@ struct meson_pinctrl {
 	struct device_node *of_node;
 };
 
-#define GROUP(grp, r, b)						\
-	{								\
-		.name = #grp,						\
-		.pins = grp ## _pins,					\
-		.num_pins = ARRAY_SIZE(grp ## _pins),			\
-		.reg = r,						\
-		.bit = b,						\
-	 }
-
-#define GPIO_GROUP(gpio)						\
-	{								\
-		.name = #gpio,						\
-		.pins = (const unsigned int[]){ gpio },			\
-		.num_pins = 1,						\
-		.is_gpio = true,					\
-	 }
-
 #define FUNCTION(fn)							\
 	{								\
 		.name = #fn,						\
@@ -166,5 +148,14 @@ struct meson_pinctrl {
 
 #define MESON_PIN(x) PINCTRL_PIN(x, #x)
 
+/* Common pmx functions */
+int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
+const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
+				    unsigned selector);
+int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
+			 unsigned selector,
+			 const char * const **groups,
+			 unsigned * const num_groups);
+
 /* Common probe function */
 int meson_pinctrl_probe(struct platform_device *pdev);
diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
index 68b345fc105a..b1a7b992cdef 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8.c
@@ -13,6 +13,7 @@
 
 #include <dt-bindings/gpio/meson8-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson8_cbus_pins[] = {
 	MESON_PIN(GPIOX_0),
@@ -1054,6 +1055,7 @@ static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8_cbus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8_cbus_functions),
 	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
@@ -1066,6 +1068,7 @@ static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson8_pinctrl_dt_match[] = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
index 4d61df09bc3f..05f59f3a0c4e 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
@@ -14,6 +14,7 @@
 
 #include <dt-bindings/gpio/meson8b-gpio.h>
 #include "pinctrl-meson.h"
+#include "pinctrl-meson-pmx.h"
 
 static const struct pinctrl_pin_desc meson8b_cbus_pins[] = {
 	MESON_PIN(GPIOX_0),
@@ -914,6 +915,7 @@ static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8b_cbus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8b_cbus_functions),
 	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
@@ -926,6 +928,7 @@ static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
 	.num_groups	= ARRAY_SIZE(meson8b_aobus_groups),
 	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
 	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
+	.pmx_ops	= &meson_pmx_ops,
 };
 
 static const struct of_device_id meson8b_pinctrl_dt_match[] = {
-- 
2.13.6

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
  2017-10-09 10:17   ` Jerome Brunet
@ 2017-10-09 11:35     ` Neil Armstrong
  -1 siblings, 0 replies; 22+ messages in thread
From: Neil Armstrong @ 2017-10-09 11:35 UTC (permalink / raw)
  To: Jerome Brunet, Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: linux-gpio, linux-amlogic, linux-kernel

On 09/10/2017 12:17, Jerome Brunet wrote:
> When meson pinctrl is enabled, all meson platforms pinctrl drivers are
> built in the kernel, with a significant amount of data.
> 
> This leads to situation where pinctrl drivers targeting an architecture
> are also compiled and shipped on another one (ex: meson8 - ARM - compiled
> and shipped on ARM64 builds). This is a waste of memory we can easily
> avoid.
> 
> This change makes 4 pinctrl drivers (1 per SoC) out the original single
> driver, allowing to compile and ship only the ones required.
> 
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
>  drivers/pinctrl/Kconfig                    | 11 +------
>  drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
>  drivers/pinctrl/meson/Makefile             |  8 +++--
>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
>  drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++----------------------------
>  drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
>  drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
>  drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
>  9 files changed, 140 insertions(+), 77 deletions(-)
>  create mode 100644 drivers/pinctrl/meson/Kconfig
> 
> diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
> index 1778cf4f81c7..15b5b3b76ba9 100644
> --- a/drivers/pinctrl/Kconfig
> +++ b/drivers/pinctrl/Kconfig
> @@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
>  	  This provides a GPIO interface supporting inputs and outputs.
>  	  The I2C versions of the chips can be used as interrupt-controller.
>  
> -config PINCTRL_MESON
> -	bool
> -	depends on OF
> -	select PINMUX
> -	select PINCONF
> -	select GENERIC_PINCONF
> -	select GPIOLIB
> -	select OF_GPIO
> -	select REGMAP_MMIO
> -
>  config PINCTRL_OXNAS
>  	bool
>  	depends on OF
> @@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
>  source "drivers/pinctrl/vt8500/Kconfig"
>  source "drivers/pinctrl/mediatek/Kconfig"
>  source "drivers/pinctrl/zte/Kconfig"
> +source "drivers/pinctrl/meson/Kconfig"
>  
>  config PINCTRL_XWAY
>  	bool
> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> new file mode 100644
> index 000000000000..15655bfd39b6
> --- /dev/null
> +++ b/drivers/pinctrl/meson/Kconfig
> @@ -0,0 +1,36 @@
> +menuconfig PINCTRL_MESON
> +	bool "Amlogic SoC pinctrl drivers"
> +	depends on ARCH_MESON || COMPILE_TEST
> +	depends on OF
> +	select PINMUX
> +	select PINCONF
> +	select GENERIC_PINCONF
> +	select GPIOLIB
> +	select OF_GPIO
> +	select REGMAP_MMIO
> +	select PINMUX
> +	select GENERIC_PINCONF
> +
> +if PINCTRL_MESON
> +
> +config PINCTRL_MESON8
> +	bool "Meson 8 SoC pinctrl driver"
> +	depends on ARM
> +	default y
> +
> +config PINCTRL_MESON8B
> +	bool "Meson 8b SoC pinctrl driver"
> +	depends on ARM
> +	default y
> +
> +config PINCTRL_MESON_GXBB
> +	bool "Meson gxbb SoC pinctrl driver"
> +	depends on ARM64
> +	default y
> +
> +config PINCTRL_MESON_GXL
> +	bool "Meson gxl SoC pinctrl driver"
> +	depends on ARM64
> +	default y
> +
> +endif
> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> index 27c5b5126008..a6ef5ff4e9b1 100644
> --- a/drivers/pinctrl/meson/Makefile
> +++ b/drivers/pinctrl/meson/Makefile
> @@ -1,3 +1,5 @@
> -obj-y	+= pinctrl-meson8.o pinctrl-meson8b.o
> -obj-y	+= pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
> -obj-y	+= pinctrl-meson.o
> +obj-y += pinctrl-meson.o
> +obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
> +obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
> +obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> +obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> index 1881d4a0eca2..a87bdb17414b 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> @@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>  	.name		= "periphs-banks",
>  	.pins		= meson_gxbb_periphs_pins,
>  	.groups		= meson_gxbb_periphs_groups,
> @@ -836,7 +836,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
>  };
>  
> -struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>  	.name		= "aobus-banks",
>  	.pins		= meson_gxbb_aobus_pins,
>  	.groups		= meson_gxbb_aobus_groups,
> @@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
>  };
> +
> +static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> +		.data = &meson_gxbb_periphs_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> +		.data = &meson_gxbb_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson_gxbb_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson-gxbb-pinctrl",
> +		.of_match_table = meson_gxbb_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson_gxbb_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> index 3a14ecae9f31..088ac94f76b0 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> @@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>  	.name		= "periphs-banks",
>  	.pins		= meson_gxl_periphs_pins,
>  	.groups		= meson_gxl_periphs_groups,
> @@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
>  };
>  
> -struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>  	.name		= "aobus-banks",
>  	.pins		= meson_gxl_aobus_pins,
>  	.groups		= meson_gxl_aobus_groups,
> @@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
>  };
> +
> +static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> +		.data = &meson_gxl_periphs_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> +		.data = &meson_gxl_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson_gxl_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson-gxl-pinctrl",
> +		.of_match_table = meson_gxl_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson_gxl_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
> index 71bccb7acbf8..8fc1f1b45435 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> @@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
>  	return !!(val & BIT(bit));
>  }
>  
> -static const struct of_device_id meson_pinctrl_dt_match[] = {
> -	{
> -		.compatible = "amlogic,meson8-cbus-pinctrl",
> -		.data = &meson8_cbus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson8b-cbus-pinctrl",
> -		.data = &meson8b_cbus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson8-aobus-pinctrl",
> -		.data = &meson8_aobus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson8b-aobus-pinctrl",
> -		.data = &meson8b_aobus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> -		.data = &meson_gxbb_periphs_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> -		.data = &meson_gxbb_aobus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> -		.data = &meson_gxl_periphs_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> -		.data = &meson_gxl_aobus_pinctrl_data,
> -	},
> -	{ },
> -};
> -
>  static int meson_gpiolib_register(struct meson_pinctrl *pc)
>  {
>  	int ret;
> @@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
>  	return 0;
>  }
>  
> -static int meson_pinctrl_probe(struct platform_device *pdev)
> +int meson_pinctrl_probe(struct platform_device *pdev)
>  {
>  	const struct of_device_id *match;
>  	struct device *dev = &pdev->dev;
> @@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>  		return -ENOMEM;
>  
>  	pc->dev = dev;
> -	match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
> +	match = of_match_node(dev->driver->of_match_table, dev->of_node);


Minor comment, maybe you could use of_device_get_match_data(dev) here, it will be simpler.

>  	pc->data = (struct meson_pinctrl_data *) match->data;
>  
> -	ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
> +	ret = meson_pinctrl_parse_dt(pc, dev->of_node);
>  	if (ret)
>  		return ret;
>  
> @@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>  
>  	return meson_gpiolib_register(pc);
>  }
> -
> -static struct platform_driver meson_pinctrl_driver = {
> -	.probe		= meson_pinctrl_probe,
> -	.driver = {
> -		.name	= "meson-pinctrl",
> -		.of_match_table = meson_pinctrl_dt_match,
> -	},
> -};
> -builtin_platform_driver(meson_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
> index 7ed0a80fd9dc..284157d43612 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.h
> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> @@ -13,6 +13,7 @@
>  
>  #include <linux/gpio.h>
>  #include <linux/pinctrl/pinctrl.h>
> +#include <linux/platform_device.h>
>  #include <linux/regmap.h>
>  #include <linux/types.h>
>  
> @@ -165,11 +166,5 @@ struct meson_pinctrl {
>  
>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>  
> -extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
> -extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
> -extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
> -extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
> +/* Common probe function */
> +int meson_pinctrl_probe(struct platform_device *pdev);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
> index fbf8ecd1c2b6..68b345fc105a 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> @@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>  	.name		= "cbus-banks",
>  	.pins		= meson8_cbus_pins,
>  	.groups		= meson8_cbus_groups,
> @@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
>  };
>  
> -struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>  	.name		= "ao-bank",
>  	.pins		= meson8_aobus_pins,
>  	.groups		= meson8_aobus_groups,
> @@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
>  };
> +
> +static const struct of_device_id meson8_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson8-cbus-pinctrl",
> +		.data = &meson8_cbus_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson8-aobus-pinctrl",
> +		.data = &meson8_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson8_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson8-pinctrl",
> +		.of_match_table = meson8_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson8_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
> index 7af296db48c8..4d61df09bc3f 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> @@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>  	.name		= "cbus-banks",
>  	.pins		= meson8b_cbus_pins,
>  	.groups		= meson8b_cbus_groups,
> @@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
>  };
>  
> -struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>  	.name		= "aobus-banks",
>  	.pins		= meson8b_aobus_pins,
>  	.groups		= meson8b_aobus_groups,
> @@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
>  };
> +
> +static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson8b-cbus-pinctrl",
> +		.data = &meson8b_cbus_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson8b-aobus-pinctrl",
> +		.data = &meson8b_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson8b_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson8b-pinctrl",
> +		.of_match_table = meson8b_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson8b_pinctrl_driver);
> 

Apart the comment on of_device_get_match_data() :

Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>

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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-09 11:35     ` Neil Armstrong
  0 siblings, 0 replies; 22+ messages in thread
From: Neil Armstrong @ 2017-10-09 11:35 UTC (permalink / raw)
  To: linus-amlogic

On 09/10/2017 12:17, Jerome Brunet wrote:
> When meson pinctrl is enabled, all meson platforms pinctrl drivers are
> built in the kernel, with a significant amount of data.
> 
> This leads to situation where pinctrl drivers targeting an architecture
> are also compiled and shipped on another one (ex: meson8 - ARM - compiled
> and shipped on ARM64 builds). This is a waste of memory we can easily
> avoid.
> 
> This change makes 4 pinctrl drivers (1 per SoC) out the original single
> driver, allowing to compile and ship only the ones required.
> 
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
>  drivers/pinctrl/Kconfig                    | 11 +------
>  drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
>  drivers/pinctrl/meson/Makefile             |  8 +++--
>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
>  drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++----------------------------
>  drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
>  drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
>  drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
>  9 files changed, 140 insertions(+), 77 deletions(-)
>  create mode 100644 drivers/pinctrl/meson/Kconfig
> 
> diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
> index 1778cf4f81c7..15b5b3b76ba9 100644
> --- a/drivers/pinctrl/Kconfig
> +++ b/drivers/pinctrl/Kconfig
> @@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
>  	  This provides a GPIO interface supporting inputs and outputs.
>  	  The I2C versions of the chips can be used as interrupt-controller.
>  
> -config PINCTRL_MESON
> -	bool
> -	depends on OF
> -	select PINMUX
> -	select PINCONF
> -	select GENERIC_PINCONF
> -	select GPIOLIB
> -	select OF_GPIO
> -	select REGMAP_MMIO
> -
>  config PINCTRL_OXNAS
>  	bool
>  	depends on OF
> @@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
>  source "drivers/pinctrl/vt8500/Kconfig"
>  source "drivers/pinctrl/mediatek/Kconfig"
>  source "drivers/pinctrl/zte/Kconfig"
> +source "drivers/pinctrl/meson/Kconfig"
>  
>  config PINCTRL_XWAY
>  	bool
> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> new file mode 100644
> index 000000000000..15655bfd39b6
> --- /dev/null
> +++ b/drivers/pinctrl/meson/Kconfig
> @@ -0,0 +1,36 @@
> +menuconfig PINCTRL_MESON
> +	bool "Amlogic SoC pinctrl drivers"
> +	depends on ARCH_MESON || COMPILE_TEST
> +	depends on OF
> +	select PINMUX
> +	select PINCONF
> +	select GENERIC_PINCONF
> +	select GPIOLIB
> +	select OF_GPIO
> +	select REGMAP_MMIO
> +	select PINMUX
> +	select GENERIC_PINCONF
> +
> +if PINCTRL_MESON
> +
> +config PINCTRL_MESON8
> +	bool "Meson 8 SoC pinctrl driver"
> +	depends on ARM
> +	default y
> +
> +config PINCTRL_MESON8B
> +	bool "Meson 8b SoC pinctrl driver"
> +	depends on ARM
> +	default y
> +
> +config PINCTRL_MESON_GXBB
> +	bool "Meson gxbb SoC pinctrl driver"
> +	depends on ARM64
> +	default y
> +
> +config PINCTRL_MESON_GXL
> +	bool "Meson gxl SoC pinctrl driver"
> +	depends on ARM64
> +	default y
> +
> +endif
> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> index 27c5b5126008..a6ef5ff4e9b1 100644
> --- a/drivers/pinctrl/meson/Makefile
> +++ b/drivers/pinctrl/meson/Makefile
> @@ -1,3 +1,5 @@
> -obj-y	+= pinctrl-meson8.o pinctrl-meson8b.o
> -obj-y	+= pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
> -obj-y	+= pinctrl-meson.o
> +obj-y += pinctrl-meson.o
> +obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
> +obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
> +obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> +obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> index 1881d4a0eca2..a87bdb17414b 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> @@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>  	.name		= "periphs-banks",
>  	.pins		= meson_gxbb_periphs_pins,
>  	.groups		= meson_gxbb_periphs_groups,
> @@ -836,7 +836,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
>  };
>  
> -struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>  	.name		= "aobus-banks",
>  	.pins		= meson_gxbb_aobus_pins,
>  	.groups		= meson_gxbb_aobus_groups,
> @@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
>  };
> +
> +static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> +		.data = &meson_gxbb_periphs_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> +		.data = &meson_gxbb_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson_gxbb_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson-gxbb-pinctrl",
> +		.of_match_table = meson_gxbb_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson_gxbb_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> index 3a14ecae9f31..088ac94f76b0 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> @@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>  	.name		= "periphs-banks",
>  	.pins		= meson_gxl_periphs_pins,
>  	.groups		= meson_gxl_periphs_groups,
> @@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
>  };
>  
> -struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>  	.name		= "aobus-banks",
>  	.pins		= meson_gxl_aobus_pins,
>  	.groups		= meson_gxl_aobus_groups,
> @@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
>  };
> +
> +static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> +		.data = &meson_gxl_periphs_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> +		.data = &meson_gxl_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson_gxl_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson-gxl-pinctrl",
> +		.of_match_table = meson_gxl_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson_gxl_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
> index 71bccb7acbf8..8fc1f1b45435 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> @@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
>  	return !!(val & BIT(bit));
>  }
>  
> -static const struct of_device_id meson_pinctrl_dt_match[] = {
> -	{
> -		.compatible = "amlogic,meson8-cbus-pinctrl",
> -		.data = &meson8_cbus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson8b-cbus-pinctrl",
> -		.data = &meson8b_cbus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson8-aobus-pinctrl",
> -		.data = &meson8_aobus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson8b-aobus-pinctrl",
> -		.data = &meson8b_aobus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> -		.data = &meson_gxbb_periphs_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> -		.data = &meson_gxbb_aobus_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> -		.data = &meson_gxl_periphs_pinctrl_data,
> -	},
> -	{
> -		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> -		.data = &meson_gxl_aobus_pinctrl_data,
> -	},
> -	{ },
> -};
> -
>  static int meson_gpiolib_register(struct meson_pinctrl *pc)
>  {
>  	int ret;
> @@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
>  	return 0;
>  }
>  
> -static int meson_pinctrl_probe(struct platform_device *pdev)
> +int meson_pinctrl_probe(struct platform_device *pdev)
>  {
>  	const struct of_device_id *match;
>  	struct device *dev = &pdev->dev;
> @@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>  		return -ENOMEM;
>  
>  	pc->dev = dev;
> -	match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
> +	match = of_match_node(dev->driver->of_match_table, dev->of_node);


Minor comment, maybe you could use of_device_get_match_data(dev) here, it will be simpler.

>  	pc->data = (struct meson_pinctrl_data *) match->data;
>  
> -	ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
> +	ret = meson_pinctrl_parse_dt(pc, dev->of_node);
>  	if (ret)
>  		return ret;
>  
> @@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>  
>  	return meson_gpiolib_register(pc);
>  }
> -
> -static struct platform_driver meson_pinctrl_driver = {
> -	.probe		= meson_pinctrl_probe,
> -	.driver = {
> -		.name	= "meson-pinctrl",
> -		.of_match_table = meson_pinctrl_dt_match,
> -	},
> -};
> -builtin_platform_driver(meson_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
> index 7ed0a80fd9dc..284157d43612 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.h
> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> @@ -13,6 +13,7 @@
>  
>  #include <linux/gpio.h>
>  #include <linux/pinctrl/pinctrl.h>
> +#include <linux/platform_device.h>
>  #include <linux/regmap.h>
>  #include <linux/types.h>
>  
> @@ -165,11 +166,5 @@ struct meson_pinctrl {
>  
>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>  
> -extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
> -extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
> -extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
> -extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
> -extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
> +/* Common probe function */
> +int meson_pinctrl_probe(struct platform_device *pdev);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
> index fbf8ecd1c2b6..68b345fc105a 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> @@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>  	.name		= "cbus-banks",
>  	.pins		= meson8_cbus_pins,
>  	.groups		= meson8_cbus_groups,
> @@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
>  };
>  
> -struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>  	.name		= "ao-bank",
>  	.pins		= meson8_aobus_pins,
>  	.groups		= meson8_aobus_groups,
> @@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
>  };
> +
> +static const struct of_device_id meson8_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson8-cbus-pinctrl",
> +		.data = &meson8_cbus_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson8-aobus-pinctrl",
> +		.data = &meson8_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson8_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson8-pinctrl",
> +		.of_match_table = meson8_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson8_pinctrl_driver);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
> index 7af296db48c8..4d61df09bc3f 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> @@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
>  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>  };
>  
> -struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>  	.name		= "cbus-banks",
>  	.pins		= meson8b_cbus_pins,
>  	.groups		= meson8b_cbus_groups,
> @@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>  	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
>  };
>  
> -struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> +static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>  	.name		= "aobus-banks",
>  	.pins		= meson8b_aobus_pins,
>  	.groups		= meson8b_aobus_groups,
> @@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>  	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
>  };
> +
> +static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> +	{
> +		.compatible = "amlogic,meson8b-cbus-pinctrl",
> +		.data = &meson8b_cbus_pinctrl_data,
> +	},
> +	{
> +		.compatible = "amlogic,meson8b-aobus-pinctrl",
> +		.data = &meson8b_aobus_pinctrl_data,
> +	},
> +	{ },
> +};
> +
> +static struct platform_driver meson8b_pinctrl_driver = {
> +	.probe		= meson_pinctrl_probe,
> +	.driver = {
> +		.name	= "meson8b-pinctrl",
> +		.of_match_table = meson8b_pinctrl_dt_match,
> +	},
> +};
> +builtin_platform_driver(meson8b_pinctrl_driver);
> 

Apart the comment on of_device_get_match_data() :

Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>

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

* Re: [PATCH 2/2] pinctrl: meson: rework pinmux ops
  2017-10-09 10:17   ` Jerome Brunet
@ 2017-10-09 11:42     ` Neil Armstrong
  -1 siblings, 0 replies; 22+ messages in thread
From: Neil Armstrong @ 2017-10-09 11:42 UTC (permalink / raw)
  To: Jerome Brunet, Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: linux-gpio, linux-amlogic, linux-kernel

On 09/10/2017 12:17, Jerome Brunet wrote:
> This change prepare the introduction of new meson SoC. This new SoC will
> share the same gpio/pinconf registers but the pinmux part will be
> different. While the format of the data associated with each pinmux group
> will change, the way to handle pinmuxing will be similar.
> 
> To deal with this new situation, the meson_pmx_struture is kept but the
> data associated to it is now generic. This allows to reuse the basic
> functions which would otherwise be copy/pasted in each pinmux driver
> (such as getting the name a count of groups and functions) Only the
> functions actually using this specific data is taken out of the common
> code and is handling the SoC pinmuxing
> 
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
>  drivers/pinctrl/meson/Kconfig              |   7 ++
>  drivers/pinctrl/meson/Makefile             |   1 +
>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c |   3 +
>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  |   3 +
>  drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 +++++++++++++++++++++++++++++
>  drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 +++++++++++++
>  drivers/pinctrl/meson/pinctrl-meson.c      |  96 ++------------------------
>  drivers/pinctrl/meson/pinctrl-meson.h      |  31 +++------
>  drivers/pinctrl/meson/pinctrl-meson8.c     |   3 +
>  drivers/pinctrl/meson/pinctrl-meson8b.c    |   3 +
>  10 files changed, 193 insertions(+), 109 deletions(-)
>  create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
>  create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h
> 
> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> index 15655bfd39b6..8968603ef6b2 100644
> --- a/drivers/pinctrl/meson/Kconfig
> +++ b/drivers/pinctrl/meson/Kconfig
> @@ -16,21 +16,28 @@ if PINCTRL_MESON
>  config PINCTRL_MESON8
>  	bool "Meson 8 SoC pinctrl driver"
>  	depends on ARM
> +	select PINCTRL_MESON_PMX
>  	default y
>  
>  config PINCTRL_MESON8B
>  	bool "Meson 8b SoC pinctrl driver"
>  	depends on ARM
> +	select PINCTRL_MESON_PMX
>  	default y
>  
>  config PINCTRL_MESON_GXBB
>  	bool "Meson gxbb SoC pinctrl driver"
>  	depends on ARM64
> +	select PINCTRL_MESON_PMX
>  	default y
>  
>  config PINCTRL_MESON_GXL
>  	bool "Meson gxl SoC pinctrl driver"
>  	depends on ARM64
> +	select PINCTRL_MESON_PMX
>  	default y
>  
> +config PINCTRL_MESON_PMX
> +	bool
> +
>  endif
> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> index a6ef5ff4e9b1..752ae5fdd59a 100644
> --- a/drivers/pinctrl/meson/Makefile
> +++ b/drivers/pinctrl/meson/Makefile
> @@ -1,4 +1,5 @@
>  obj-y += pinctrl-meson.o
> +obj-$(CONFIG_PINCTRL_MESON_PMX) += pinctrl-meson-pmx.o
>  obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
>  obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
>  obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> index a87bdb17414b..a0571d175091 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson-gxbb-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
>  	MESON_PIN(GPIOZ_0),
> @@ -834,6 +835,7 @@ static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxbb_periphs_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxbb_periphs_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> @@ -846,6 +848,7 @@ static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxbb_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> index 088ac94f76b0..2f51af6a244d 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson-gxl-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
>  	MESON_PIN(GPIOZ_0),
> @@ -819,6 +820,7 @@ static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxl_periphs_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxl_periphs_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> @@ -831,6 +833,7 @@ static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxl_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.c b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
> new file mode 100644
> index 000000000000..062381891760
> --- /dev/null
> +++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
> @@ -0,0 +1,107 @@
> +/*
> + * First generation of pinmux driver for Amlogic Meson SoCs
> + *
> + * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
> + * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/* For this first generation of pinctrl driver every pinmux group can be
> + * enabled by a specific bit in the first register range. When all groups for
> + * a given pin are disabled the pin acts as a GPIO.
> + */
> +#include <linux/device.h>
> +#include <linux/regmap.h>
> +#include <linux/pinctrl/pinctrl.h>
> +#include <linux/pinctrl/pinmux.h>
> +
> +#include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
> +
> +/**
> + * meson_pmx_disable_other_groups() - disable other groups using a given pin
> + *
> + * @pc:		meson pin controller device
> + * @pin:	number of the pin
> + * @sel_group:	index of the selected group, or -1 if none
> + *
> + * The function disables all pinmux groups using a pin except the
> + * selected one. If @sel_group is -1 all groups are disabled, leaving
> + * the pin in GPIO mode.
> + */
> +static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
> +					   unsigned int pin, int sel_group)
> +{
> +	struct meson_pmx_group *group;
> +	struct meson_pmx_data *pmx_data;
> +	int i, j;
> +
> +	for (i = 0; i < pc->data->num_groups; i++) {
> +		group = &pc->data->groups[i];
> +		pmx_data = (struct meson_pmx_data *)group->data;
> +		if (pmx_data->is_gpio || i == sel_group)
> +			continue;
> +
> +		for (j = 0; j < group->num_pins; j++) {
> +			if (group->pins[j] == pin) {
> +				/* We have found a group using the pin */
> +				regmap_update_bits(pc->reg_mux,
> +						   pmx_data->reg * 4,
> +						   BIT(pmx_data->bit), 0);
> +			}
> +		}
> +	}
> +}
> +
> +static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
> +			     unsigned group_num)
> +{
> +	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> +	struct meson_pmx_func *func = &pc->data->funcs[func_num];
> +	struct meson_pmx_group *group = &pc->data->groups[group_num];
> +	struct meson_pmx_data *pmx_data =
> +		(struct meson_pmx_data *)group->data;
> +	int i, ret = 0;
> +
> +	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
> +		group->name);
> +
> +	/*
> +	 * Disable groups using the same pin.
> +	 * The selected group is not disabled to avoid glitches.
> +	 */
> +	for (i = 0; i < group->num_pins; i++)
> +		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
> +
> +	/* Function 0 (GPIO) doesn't need any additional setting */
> +	if (func_num)
> +		ret = regmap_update_bits(pc->reg_mux, pmx_data->reg * 4,
> +					 BIT(pmx_data->bit), BIT(pmx_data->bit));
> +
> +	return ret;
> +}
> +
> +static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
> +				  struct pinctrl_gpio_range *range,
> +				  unsigned offset)
> +{
> +	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> +
> +	meson_pmx_disable_other_groups(pc, offset, -1);
> +
> +	return 0;
> +}
> +
> +const struct pinmux_ops meson_pmx_ops = {
> +	.set_mux = meson_pmx_set_mux,
> +	.get_functions_count = meson_pmx_get_funcs_count,
> +	.get_function_name = meson_pmx_get_func_name,
> +	.get_function_groups = meson_pmx_get_groups,
> +	.gpio_request_enable = meson_pmx_request_gpio,
> +};
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.h b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
> new file mode 100644
> index 000000000000..e1ceb50014c2
> --- /dev/null
> +++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
> @@ -0,0 +1,48 @@
> +/*
> + * First generation of pinmux driver for Amlogic Meson SoCs
> + *
> + * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
> + * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +struct meson_pmx_data {
> +	bool is_gpio;
> +	unsigned int reg;
> +	unsigned int bit;
> +};
> +
> +#define PMX_DATA(r, b, g)						\
> +	{								\
> +		.reg = r,						\
> +		.bit = b,						\
> +		.is_gpio = g,						\
> +	}
> +
> +#define GROUP(grp, r, b)						\
> +	{								\
> +		.name = #grp,						\
> +		.pins = grp ## _pins,					\
> +		.num_pins = ARRAY_SIZE(grp ## _pins),			\
> +		.data = (const struct meson_pmx_data[]){		\
> +			PMX_DATA(r, b, false),				\
> +		},							\
> +	 }
> +
> +#define GPIO_GROUP(gpio)						\
> +	{								\
> +		.name = #gpio,						\
> +		.pins = (const unsigned int[]){ gpio },			\
> +		.num_pins = 1,						\
> +		.data = (const struct meson_pmx_data[]){		\
> +			PMX_DATA(0, 0, true),				\
> +		},							\
> +	}
> +
> +extern const struct pinmux_ops meson_pmx_ops;
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
> index 8fc1f1b45435..47ee8349f306 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> @@ -31,10 +31,6 @@
>   * In some cases the register ranges for pull enable and pull
>   * direction are the same and thus there are only 3 register ranges.
>   *
> - * Every pinmux group can be enabled by a specific bit in the first
> - * register range; when all groups for a given pin are disabled the
> - * pin acts as a GPIO.
> - *
>   * For the pull and GPIO configuration every bank uses a contiguous
>   * set of bits in the register sets described above; the same register
>   * can be shared by more banks with different offsets.
> @@ -147,94 +143,24 @@ static const struct pinctrl_ops meson_pctrl_ops = {
>  	.pin_dbg_show		= meson_pin_dbg_show,
>  };
>  
> -/**
> - * meson_pmx_disable_other_groups() - disable other groups using a given pin
> - *
> - * @pc:		meson pin controller device
> - * @pin:	number of the pin
> - * @sel_group:	index of the selected group, or -1 if none
> - *
> - * The function disables all pinmux groups using a pin except the
> - * selected one. If @sel_group is -1 all groups are disabled, leaving
> - * the pin in GPIO mode.
> - */
> -static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
> -					   unsigned int pin, int sel_group)
> -{
> -	struct meson_pmx_group *group;
> -	int i, j;
> -
> -	for (i = 0; i < pc->data->num_groups; i++) {
> -		group = &pc->data->groups[i];
> -		if (group->is_gpio || i == sel_group)
> -			continue;
> -
> -		for (j = 0; j < group->num_pins; j++) {
> -			if (group->pins[j] == pin) {
> -				/* We have found a group using the pin */
> -				regmap_update_bits(pc->reg_mux,
> -						   group->reg * 4,
> -						   BIT(group->bit), 0);
> -			}
> -		}
> -	}
> -}
> -
> -static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
> -			     unsigned group_num)
> -{
> -	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> -	struct meson_pmx_func *func = &pc->data->funcs[func_num];
> -	struct meson_pmx_group *group = &pc->data->groups[group_num];
> -	int i, ret = 0;
> -
> -	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
> -		group->name);
> -
> -	/*
> -	 * Disable groups using the same pin.
> -	 * The selected group is not disabled to avoid glitches.
> -	 */
> -	for (i = 0; i < group->num_pins; i++)
> -		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
> -
> -	/* Function 0 (GPIO) doesn't need any additional setting */
> -	if (func_num)
> -		ret = regmap_update_bits(pc->reg_mux, group->reg * 4,
> -					 BIT(group->bit), BIT(group->bit));
> -
> -	return ret;
> -}
> -
> -static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
> -				  struct pinctrl_gpio_range *range,
> -				  unsigned offset)
> -{
> -	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> -
> -	meson_pmx_disable_other_groups(pc, offset, -1);
> -
> -	return 0;
> -}
> -
> -static int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
> +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
>  {
>  	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
>  	return pc->data->num_funcs;
>  }
>  
> -static const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> -					   unsigned selector)
> +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> +				    unsigned selector)
>  {
>  	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
>  	return pc->data->funcs[selector].name;
>  }
>  
> -static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
> -				const char * const **groups,
> -				unsigned * const num_groups)
> +int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
> +			 const char * const **groups,
> +			 unsigned * const num_groups)
>  {
>  	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
> @@ -244,14 +170,6 @@ static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
>  	return 0;
>  }
>  
> -static const struct pinmux_ops meson_pmx_ops = {
> -	.set_mux = meson_pmx_set_mux,
> -	.get_functions_count = meson_pmx_get_funcs_count,
> -	.get_function_name = meson_pmx_get_func_name,
> -	.get_function_groups = meson_pmx_get_groups,
> -	.gpio_request_enable = meson_pmx_request_gpio,
> -};
> -
>  static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
>  			     unsigned long *configs, unsigned num_configs)
>  {
> @@ -610,7 +528,7 @@ int meson_pinctrl_probe(struct platform_device *pdev)
>  	pc->desc.name		= "pinctrl-meson";
>  	pc->desc.owner		= THIS_MODULE;
>  	pc->desc.pctlops	= &meson_pctrl_ops;
> -	pc->desc.pmxops		= &meson_pmx_ops;
> +	pc->desc.pmxops		= pc->data->pmx_ops;
>  	pc->desc.confops	= &meson_pinconf_ops;
>  	pc->desc.pins		= pc->data->pins;
>  	pc->desc.npins		= pc->data->num_pins;
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
> index 284157d43612..183b6e471635 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.h
> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> @@ -32,9 +32,7 @@ struct meson_pmx_group {
>  	const char *name;
>  	const unsigned int *pins;
>  	unsigned int num_pins;
> -	bool is_gpio;
> -	unsigned int reg;
> -	unsigned int bit;
> +	const void *data;
>  };
>  
>  /**
> @@ -109,6 +107,7 @@ struct meson_pinctrl_data {
>  	unsigned int num_funcs;
>  	struct meson_bank *banks;
>  	unsigned int num_banks;
> +	const struct pinmux_ops *pmx_ops;
>  };
>  
>  struct meson_pinctrl {
> @@ -124,23 +123,6 @@ struct meson_pinctrl {
>  	struct device_node *of_node;
>  };
>  
> -#define GROUP(grp, r, b)						\
> -	{								\
> -		.name = #grp,						\
> -		.pins = grp ## _pins,					\
> -		.num_pins = ARRAY_SIZE(grp ## _pins),			\
> -		.reg = r,						\
> -		.bit = b,						\
> -	 }
> -
> -#define GPIO_GROUP(gpio)						\
> -	{								\
> -		.name = #gpio,						\
> -		.pins = (const unsigned int[]){ gpio },			\
> -		.num_pins = 1,						\
> -		.is_gpio = true,					\
> -	 }
> -
>  #define FUNCTION(fn)							\
>  	{								\
>  		.name = #fn,						\
> @@ -166,5 +148,14 @@ struct meson_pinctrl {
>  
>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>  
> +/* Common pmx functions */
> +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
> +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> +				    unsigned selector);
> +int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
> +			 unsigned selector,
> +			 const char * const **groups,
> +			 unsigned * const num_groups);

Maybe the naming of the common functions should be changed to something generic
like meson_get_functions_name and meson_get_function_groups and leave "pmx" to the
first version pinmux control implementation.
Same for the ops, meson_pinmux_ops would be better.

> +
>  /* Common probe function */
>  int meson_pinctrl_probe(struct platform_device *pdev);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
> index 68b345fc105a..b1a7b992cdef 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> @@ -13,6 +13,7 @@
>  
>  #include <dt-bindings/gpio/meson8-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson8_cbus_pins[] = {
>  	MESON_PIN(GPIOX_0),
> @@ -1054,6 +1055,7 @@ static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8_cbus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8_cbus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> @@ -1066,6 +1068,7 @@ static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson8_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
> index 4d61df09bc3f..05f59f3a0c4e 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson8b-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson8b_cbus_pins[] = {
>  	MESON_PIN(GPIOX_0),
> @@ -914,6 +915,7 @@ static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8b_cbus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8b_cbus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> @@ -926,6 +928,7 @@ static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8b_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> 

Apart the "pmx" confusing names :
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>

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

* [PATCH 2/2] pinctrl: meson: rework pinmux ops
@ 2017-10-09 11:42     ` Neil Armstrong
  0 siblings, 0 replies; 22+ messages in thread
From: Neil Armstrong @ 2017-10-09 11:42 UTC (permalink / raw)
  To: linus-amlogic

On 09/10/2017 12:17, Jerome Brunet wrote:
> This change prepare the introduction of new meson SoC. This new SoC will
> share the same gpio/pinconf registers but the pinmux part will be
> different. While the format of the data associated with each pinmux group
> will change, the way to handle pinmuxing will be similar.
> 
> To deal with this new situation, the meson_pmx_struture is kept but the
> data associated to it is now generic. This allows to reuse the basic
> functions which would otherwise be copy/pasted in each pinmux driver
> (such as getting the name a count of groups and functions) Only the
> functions actually using this specific data is taken out of the common
> code and is handling the SoC pinmuxing
> 
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
>  drivers/pinctrl/meson/Kconfig              |   7 ++
>  drivers/pinctrl/meson/Makefile             |   1 +
>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c |   3 +
>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  |   3 +
>  drivers/pinctrl/meson/pinctrl-meson-pmx.c  | 107 +++++++++++++++++++++++++++++
>  drivers/pinctrl/meson/pinctrl-meson-pmx.h  |  48 +++++++++++++
>  drivers/pinctrl/meson/pinctrl-meson.c      |  96 ++------------------------
>  drivers/pinctrl/meson/pinctrl-meson.h      |  31 +++------
>  drivers/pinctrl/meson/pinctrl-meson8.c     |   3 +
>  drivers/pinctrl/meson/pinctrl-meson8b.c    |   3 +
>  10 files changed, 193 insertions(+), 109 deletions(-)
>  create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.c
>  create mode 100644 drivers/pinctrl/meson/pinctrl-meson-pmx.h
> 
> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> index 15655bfd39b6..8968603ef6b2 100644
> --- a/drivers/pinctrl/meson/Kconfig
> +++ b/drivers/pinctrl/meson/Kconfig
> @@ -16,21 +16,28 @@ if PINCTRL_MESON
>  config PINCTRL_MESON8
>  	bool "Meson 8 SoC pinctrl driver"
>  	depends on ARM
> +	select PINCTRL_MESON_PMX
>  	default y
>  
>  config PINCTRL_MESON8B
>  	bool "Meson 8b SoC pinctrl driver"
>  	depends on ARM
> +	select PINCTRL_MESON_PMX
>  	default y
>  
>  config PINCTRL_MESON_GXBB
>  	bool "Meson gxbb SoC pinctrl driver"
>  	depends on ARM64
> +	select PINCTRL_MESON_PMX
>  	default y
>  
>  config PINCTRL_MESON_GXL
>  	bool "Meson gxl SoC pinctrl driver"
>  	depends on ARM64
> +	select PINCTRL_MESON_PMX
>  	default y
>  
> +config PINCTRL_MESON_PMX
> +	bool
> +
>  endif
> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> index a6ef5ff4e9b1..752ae5fdd59a 100644
> --- a/drivers/pinctrl/meson/Makefile
> +++ b/drivers/pinctrl/meson/Makefile
> @@ -1,4 +1,5 @@
>  obj-y += pinctrl-meson.o
> +obj-$(CONFIG_PINCTRL_MESON_PMX) += pinctrl-meson-pmx.o
>  obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
>  obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
>  obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> index a87bdb17414b..a0571d175091 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson-gxbb-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
>  	MESON_PIN(GPIOZ_0),
> @@ -834,6 +835,7 @@ static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxbb_periphs_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxbb_periphs_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> @@ -846,6 +848,7 @@ static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxbb_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> index 088ac94f76b0..2f51af6a244d 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson-gxl-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
>  	MESON_PIN(GPIOZ_0),
> @@ -819,6 +820,7 @@ static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxl_periphs_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxl_periphs_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> @@ -831,6 +833,7 @@ static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson_gxl_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.c b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
> new file mode 100644
> index 000000000000..062381891760
> --- /dev/null
> +++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.c
> @@ -0,0 +1,107 @@
> +/*
> + * First generation of pinmux driver for Amlogic Meson SoCs
> + *
> + * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
> + * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/* For this first generation of pinctrl driver every pinmux group can be
> + * enabled by a specific bit in the first register range. When all groups for
> + * a given pin are disabled the pin acts as a GPIO.
> + */
> +#include <linux/device.h>
> +#include <linux/regmap.h>
> +#include <linux/pinctrl/pinctrl.h>
> +#include <linux/pinctrl/pinmux.h>
> +
> +#include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
> +
> +/**
> + * meson_pmx_disable_other_groups() - disable other groups using a given pin
> + *
> + * @pc:		meson pin controller device
> + * @pin:	number of the pin
> + * @sel_group:	index of the selected group, or -1 if none
> + *
> + * The function disables all pinmux groups using a pin except the
> + * selected one. If @sel_group is -1 all groups are disabled, leaving
> + * the pin in GPIO mode.
> + */
> +static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
> +					   unsigned int pin, int sel_group)
> +{
> +	struct meson_pmx_group *group;
> +	struct meson_pmx_data *pmx_data;
> +	int i, j;
> +
> +	for (i = 0; i < pc->data->num_groups; i++) {
> +		group = &pc->data->groups[i];
> +		pmx_data = (struct meson_pmx_data *)group->data;
> +		if (pmx_data->is_gpio || i == sel_group)
> +			continue;
> +
> +		for (j = 0; j < group->num_pins; j++) {
> +			if (group->pins[j] == pin) {
> +				/* We have found a group using the pin */
> +				regmap_update_bits(pc->reg_mux,
> +						   pmx_data->reg * 4,
> +						   BIT(pmx_data->bit), 0);
> +			}
> +		}
> +	}
> +}
> +
> +static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
> +			     unsigned group_num)
> +{
> +	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> +	struct meson_pmx_func *func = &pc->data->funcs[func_num];
> +	struct meson_pmx_group *group = &pc->data->groups[group_num];
> +	struct meson_pmx_data *pmx_data =
> +		(struct meson_pmx_data *)group->data;
> +	int i, ret = 0;
> +
> +	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
> +		group->name);
> +
> +	/*
> +	 * Disable groups using the same pin.
> +	 * The selected group is not disabled to avoid glitches.
> +	 */
> +	for (i = 0; i < group->num_pins; i++)
> +		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
> +
> +	/* Function 0 (GPIO) doesn't need any additional setting */
> +	if (func_num)
> +		ret = regmap_update_bits(pc->reg_mux, pmx_data->reg * 4,
> +					 BIT(pmx_data->bit), BIT(pmx_data->bit));
> +
> +	return ret;
> +}
> +
> +static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
> +				  struct pinctrl_gpio_range *range,
> +				  unsigned offset)
> +{
> +	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> +
> +	meson_pmx_disable_other_groups(pc, offset, -1);
> +
> +	return 0;
> +}
> +
> +const struct pinmux_ops meson_pmx_ops = {
> +	.set_mux = meson_pmx_set_mux,
> +	.get_functions_count = meson_pmx_get_funcs_count,
> +	.get_function_name = meson_pmx_get_func_name,
> +	.get_function_groups = meson_pmx_get_groups,
> +	.gpio_request_enable = meson_pmx_request_gpio,
> +};
> diff --git a/drivers/pinctrl/meson/pinctrl-meson-pmx.h b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
> new file mode 100644
> index 000000000000..e1ceb50014c2
> --- /dev/null
> +++ b/drivers/pinctrl/meson/pinctrl-meson-pmx.h
> @@ -0,0 +1,48 @@
> +/*
> + * First generation of pinmux driver for Amlogic Meson SoCs
> + *
> + * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
> + * Copyright (C) 2017 Jerome Brunet  <jbrunet@baylibre.com>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +struct meson_pmx_data {
> +	bool is_gpio;
> +	unsigned int reg;
> +	unsigned int bit;
> +};
> +
> +#define PMX_DATA(r, b, g)						\
> +	{								\
> +		.reg = r,						\
> +		.bit = b,						\
> +		.is_gpio = g,						\
> +	}
> +
> +#define GROUP(grp, r, b)						\
> +	{								\
> +		.name = #grp,						\
> +		.pins = grp ## _pins,					\
> +		.num_pins = ARRAY_SIZE(grp ## _pins),			\
> +		.data = (const struct meson_pmx_data[]){		\
> +			PMX_DATA(r, b, false),				\
> +		},							\
> +	 }
> +
> +#define GPIO_GROUP(gpio)						\
> +	{								\
> +		.name = #gpio,						\
> +		.pins = (const unsigned int[]){ gpio },			\
> +		.num_pins = 1,						\
> +		.data = (const struct meson_pmx_data[]){		\
> +			PMX_DATA(0, 0, true),				\
> +		},							\
> +	}
> +
> +extern const struct pinmux_ops meson_pmx_ops;
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
> index 8fc1f1b45435..47ee8349f306 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> @@ -31,10 +31,6 @@
>   * In some cases the register ranges for pull enable and pull
>   * direction are the same and thus there are only 3 register ranges.
>   *
> - * Every pinmux group can be enabled by a specific bit in the first
> - * register range; when all groups for a given pin are disabled the
> - * pin acts as a GPIO.
> - *
>   * For the pull and GPIO configuration every bank uses a contiguous
>   * set of bits in the register sets described above; the same register
>   * can be shared by more banks with different offsets.
> @@ -147,94 +143,24 @@ static const struct pinctrl_ops meson_pctrl_ops = {
>  	.pin_dbg_show		= meson_pin_dbg_show,
>  };
>  
> -/**
> - * meson_pmx_disable_other_groups() - disable other groups using a given pin
> - *
> - * @pc:		meson pin controller device
> - * @pin:	number of the pin
> - * @sel_group:	index of the selected group, or -1 if none
> - *
> - * The function disables all pinmux groups using a pin except the
> - * selected one. If @sel_group is -1 all groups are disabled, leaving
> - * the pin in GPIO mode.
> - */
> -static void meson_pmx_disable_other_groups(struct meson_pinctrl *pc,
> -					   unsigned int pin, int sel_group)
> -{
> -	struct meson_pmx_group *group;
> -	int i, j;
> -
> -	for (i = 0; i < pc->data->num_groups; i++) {
> -		group = &pc->data->groups[i];
> -		if (group->is_gpio || i == sel_group)
> -			continue;
> -
> -		for (j = 0; j < group->num_pins; j++) {
> -			if (group->pins[j] == pin) {
> -				/* We have found a group using the pin */
> -				regmap_update_bits(pc->reg_mux,
> -						   group->reg * 4,
> -						   BIT(group->bit), 0);
> -			}
> -		}
> -	}
> -}
> -
> -static int meson_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned func_num,
> -			     unsigned group_num)
> -{
> -	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> -	struct meson_pmx_func *func = &pc->data->funcs[func_num];
> -	struct meson_pmx_group *group = &pc->data->groups[group_num];
> -	int i, ret = 0;
> -
> -	dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
> -		group->name);
> -
> -	/*
> -	 * Disable groups using the same pin.
> -	 * The selected group is not disabled to avoid glitches.
> -	 */
> -	for (i = 0; i < group->num_pins; i++)
> -		meson_pmx_disable_other_groups(pc, group->pins[i], group_num);
> -
> -	/* Function 0 (GPIO) doesn't need any additional setting */
> -	if (func_num)
> -		ret = regmap_update_bits(pc->reg_mux, group->reg * 4,
> -					 BIT(group->bit), BIT(group->bit));
> -
> -	return ret;
> -}
> -
> -static int meson_pmx_request_gpio(struct pinctrl_dev *pcdev,
> -				  struct pinctrl_gpio_range *range,
> -				  unsigned offset)
> -{
> -	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
> -
> -	meson_pmx_disable_other_groups(pc, offset, -1);
> -
> -	return 0;
> -}
> -
> -static int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
> +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev)
>  {
>  	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
>  	return pc->data->num_funcs;
>  }
>  
> -static const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> -					   unsigned selector)
> +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> +				    unsigned selector)
>  {
>  	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
>  	return pc->data->funcs[selector].name;
>  }
>  
> -static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
> -				const char * const **groups,
> -				unsigned * const num_groups)
> +int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
> +			 const char * const **groups,
> +			 unsigned * const num_groups)
>  {
>  	struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
>  
> @@ -244,14 +170,6 @@ static int meson_pmx_get_groups(struct pinctrl_dev *pcdev, unsigned selector,
>  	return 0;
>  }
>  
> -static const struct pinmux_ops meson_pmx_ops = {
> -	.set_mux = meson_pmx_set_mux,
> -	.get_functions_count = meson_pmx_get_funcs_count,
> -	.get_function_name = meson_pmx_get_func_name,
> -	.get_function_groups = meson_pmx_get_groups,
> -	.gpio_request_enable = meson_pmx_request_gpio,
> -};
> -
>  static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
>  			     unsigned long *configs, unsigned num_configs)
>  {
> @@ -610,7 +528,7 @@ int meson_pinctrl_probe(struct platform_device *pdev)
>  	pc->desc.name		= "pinctrl-meson";
>  	pc->desc.owner		= THIS_MODULE;
>  	pc->desc.pctlops	= &meson_pctrl_ops;
> -	pc->desc.pmxops		= &meson_pmx_ops;
> +	pc->desc.pmxops		= pc->data->pmx_ops;
>  	pc->desc.confops	= &meson_pinconf_ops;
>  	pc->desc.pins		= pc->data->pins;
>  	pc->desc.npins		= pc->data->num_pins;
> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
> index 284157d43612..183b6e471635 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson.h
> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> @@ -32,9 +32,7 @@ struct meson_pmx_group {
>  	const char *name;
>  	const unsigned int *pins;
>  	unsigned int num_pins;
> -	bool is_gpio;
> -	unsigned int reg;
> -	unsigned int bit;
> +	const void *data;
>  };
>  
>  /**
> @@ -109,6 +107,7 @@ struct meson_pinctrl_data {
>  	unsigned int num_funcs;
>  	struct meson_bank *banks;
>  	unsigned int num_banks;
> +	const struct pinmux_ops *pmx_ops;
>  };
>  
>  struct meson_pinctrl {
> @@ -124,23 +123,6 @@ struct meson_pinctrl {
>  	struct device_node *of_node;
>  };
>  
> -#define GROUP(grp, r, b)						\
> -	{								\
> -		.name = #grp,						\
> -		.pins = grp ## _pins,					\
> -		.num_pins = ARRAY_SIZE(grp ## _pins),			\
> -		.reg = r,						\
> -		.bit = b,						\
> -	 }
> -
> -#define GPIO_GROUP(gpio)						\
> -	{								\
> -		.name = #gpio,						\
> -		.pins = (const unsigned int[]){ gpio },			\
> -		.num_pins = 1,						\
> -		.is_gpio = true,					\
> -	 }
> -
>  #define FUNCTION(fn)							\
>  	{								\
>  		.name = #fn,						\
> @@ -166,5 +148,14 @@ struct meson_pinctrl {
>  
>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>  
> +/* Common pmx functions */
> +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
> +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> +				    unsigned selector);
> +int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
> +			 unsigned selector,
> +			 const char * const **groups,
> +			 unsigned * const num_groups);

Maybe the naming of the common functions should be changed to something generic
like meson_get_functions_name and meson_get_function_groups and leave "pmx" to the
first version pinmux control implementation.
Same for the ops, meson_pinmux_ops would be better.

> +
>  /* Common probe function */
>  int meson_pinctrl_probe(struct platform_device *pdev);
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
> index 68b345fc105a..b1a7b992cdef 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> @@ -13,6 +13,7 @@
>  
>  #include <dt-bindings/gpio/meson8-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson8_cbus_pins[] = {
>  	MESON_PIN(GPIOX_0),
> @@ -1054,6 +1055,7 @@ static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8_cbus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8_cbus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> @@ -1066,6 +1068,7 @@ static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson8_pinctrl_dt_match[] = {
> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
> index 4d61df09bc3f..05f59f3a0c4e 100644
> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> @@ -14,6 +14,7 @@
>  
>  #include <dt-bindings/gpio/meson8b-gpio.h>
>  #include "pinctrl-meson.h"
> +#include "pinctrl-meson-pmx.h"
>  
>  static const struct pinctrl_pin_desc meson8b_cbus_pins[] = {
>  	MESON_PIN(GPIOX_0),
> @@ -914,6 +915,7 @@ static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8b_cbus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8b_cbus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> @@ -926,6 +928,7 @@ static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>  	.num_groups	= ARRAY_SIZE(meson8b_aobus_groups),
>  	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
>  	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
> +	.pmx_ops	= &meson_pmx_ops,
>  };
>  
>  static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> 

Apart the "pmx" confusing names :
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
  2017-10-09 11:35     ` Neil Armstrong
@ 2017-10-09 13:11       ` Jerome Brunet
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 13:11 UTC (permalink / raw)
  To: Neil Armstrong, Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: linux-gpio, linux-amlogic, linux-kernel

On Mon, 2017-10-09 at 13:35 +0200, Neil Armstrong wrote:
> On 09/10/2017 12:17, Jerome Brunet wrote:
> > When meson pinctrl is enabled, all meson platforms pinctrl drivers are
> > built in the kernel, with a significant amount of data.
> > 
> > This leads to situation where pinctrl drivers targeting an architecture
> > are also compiled and shipped on another one (ex: meson8 - ARM - compiled
> > and shipped on ARM64 builds). This is a waste of memory we can easily
> > avoid.
> > 
> > This change makes 4 pinctrl drivers (1 per SoC) out the original single
> > driver, allowing to compile and ship only the ones required.
> > 
> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> > ---
> >  drivers/pinctrl/Kconfig                    | 11 +------
> >  drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
> >  drivers/pinctrl/meson/Makefile             |  8 +++--
> >  drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
> >  drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
> >  drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++-------------------------
> > ---
> >  drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
> >  drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
> >  drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
> >  9 files changed, 140 insertions(+), 77 deletions(-)
> >  create mode 100644 drivers/pinctrl/meson/Kconfig
> > 
> > diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
> > index 1778cf4f81c7..15b5b3b76ba9 100644
> > --- a/drivers/pinctrl/Kconfig
> > +++ b/drivers/pinctrl/Kconfig
> > @@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
> >  	  This provides a GPIO interface supporting inputs and outputs.
> >  	  The I2C versions of the chips can be used as interrupt-
> > controller.
> >  
> > -config PINCTRL_MESON
> > -	bool
> > -	depends on OF
> > -	select PINMUX
> > -	select PINCONF
> > -	select GENERIC_PINCONF
> > -	select GPIOLIB
> > -	select OF_GPIO
> > -	select REGMAP_MMIO
> > -
> >  config PINCTRL_OXNAS
> >  	bool
> >  	depends on OF
> > @@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
> >  source "drivers/pinctrl/vt8500/Kconfig"
> >  source "drivers/pinctrl/mediatek/Kconfig"
> >  source "drivers/pinctrl/zte/Kconfig"
> > +source "drivers/pinctrl/meson/Kconfig"
> >  
> >  config PINCTRL_XWAY
> >  	bool
> > diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> > new file mode 100644
> > index 000000000000..15655bfd39b6
> > --- /dev/null
> > +++ b/drivers/pinctrl/meson/Kconfig
> > @@ -0,0 +1,36 @@
> > +menuconfig PINCTRL_MESON
> > +	bool "Amlogic SoC pinctrl drivers"
> > +	depends on ARCH_MESON || COMPILE_TEST
> > +	depends on OF
> > +	select PINMUX
> > +	select PINCONF
> > +	select GENERIC_PINCONF
> > +	select GPIOLIB
> > +	select OF_GPIO
> > +	select REGMAP_MMIO
> > +	select PINMUX
> > +	select GENERIC_PINCONF
> > +
> > +if PINCTRL_MESON
> > +
> > +config PINCTRL_MESON8
> > +	bool "Meson 8 SoC pinctrl driver"
> > +	depends on ARM
> > +	default y
> > +
> > +config PINCTRL_MESON8B
> > +	bool "Meson 8b SoC pinctrl driver"
> > +	depends on ARM
> > +	default y
> > +
> > +config PINCTRL_MESON_GXBB
> > +	bool "Meson gxbb SoC pinctrl driver"
> > +	depends on ARM64
> > +	default y
> > +
> > +config PINCTRL_MESON_GXL
> > +	bool "Meson gxl SoC pinctrl driver"
> > +	depends on ARM64
> > +	default y
> > +
> > +endif
> > diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> > index 27c5b5126008..a6ef5ff4e9b1 100644
> > --- a/drivers/pinctrl/meson/Makefile
> > +++ b/drivers/pinctrl/meson/Makefile
> > @@ -1,3 +1,5 @@
> > -obj-y	+= pinctrl-meson8.o pinctrl-meson8b.o
> > -obj-y	+= pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
> > -obj-y	+= pinctrl-meson.o
> > +obj-y += pinctrl-meson.o
> > +obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
> > +obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
> > +obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> > +obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > index 1881d4a0eca2..a87bdb17414b 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > @@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0,
> > 16,  0,  0,  0, 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
> >  	.name		= "periphs-banks",
> >  	.pins		= meson_gxbb_periphs_pins,
> >  	.groups		= meson_gxbb_periphs_groups,
> > @@ -836,7 +836,7 @@ struct meson_pinctrl_data
> > meson_gxbb_periphs_pinctrl_data = {
> >  	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> >  	.name		= "aobus-banks",
> >  	.pins		= meson_gxbb_aobus_pins,
> >  	.groups		= meson_gxbb_aobus_groups,
> > @@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data
> > = {
> >  	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> > +		.data = &meson_gxbb_periphs_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> > +		.data = &meson_gxbb_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson_gxbb_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson-gxbb-pinctrl",
> > +		.of_match_table = meson_gxbb_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson_gxbb_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > index 3a14ecae9f31..088ac94f76b0 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > @@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0,
> > 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
> >  	.name		= "periphs-banks",
> >  	.pins		= meson_gxl_periphs_pins,
> >  	.groups		= meson_gxl_periphs_groups,
> > @@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data
> > = {
> >  	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> >  	.name		= "aobus-banks",
> >  	.pins		= meson_gxl_aobus_pins,
> >  	.groups		= meson_gxl_aobus_groups,
> > @@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data
> > = {
> >  	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> > +		.data = &meson_gxl_periphs_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> > +		.data = &meson_gxl_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson_gxl_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson-gxl-pinctrl",
> > +		.of_match_table = meson_gxl_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson_gxl_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson.c
> > b/drivers/pinctrl/meson/pinctrl-meson.c
> > index 71bccb7acbf8..8fc1f1b45435 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> > @@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip,
> > unsigned gpio)
> >  	return !!(val & BIT(bit));
> >  }
> >  
> > -static const struct of_device_id meson_pinctrl_dt_match[] = {
> > -	{
> > -		.compatible = "amlogic,meson8-cbus-pinctrl",
> > -		.data = &meson8_cbus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson8b-cbus-pinctrl",
> > -		.data = &meson8b_cbus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson8-aobus-pinctrl",
> > -		.data = &meson8_aobus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson8b-aobus-pinctrl",
> > -		.data = &meson8b_aobus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> > -		.data = &meson_gxbb_periphs_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> > -		.data = &meson_gxbb_aobus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> > -		.data = &meson_gxl_periphs_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> > -		.data = &meson_gxl_aobus_pinctrl_data,
> > -	},
> > -	{ },
> > -};
> > -
> >  static int meson_gpiolib_register(struct meson_pinctrl *pc)
> >  {
> >  	int ret;
> > @@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl
> > *pc,
> >  	return 0;
> >  }
> >  
> > -static int meson_pinctrl_probe(struct platform_device *pdev)
> > +int meson_pinctrl_probe(struct platform_device *pdev)
> >  {
> >  	const struct of_device_id *match;
> >  	struct device *dev = &pdev->dev;
> > @@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device
> > *pdev)
> >  		return -ENOMEM;
> >  
> >  	pc->dev = dev;
> > -	match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
> > +	match = of_match_node(dev->driver->of_match_table, dev->of_node);
> 
> 
> Minor comment, maybe you could use of_device_get_match_data(dev) here, it will
> be simpler.

Indeed, I missed this particular helper. Thx !

> 
> >  	pc->data = (struct meson_pinctrl_data *) match->data;
> >  
> > -	ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
> > +	ret = meson_pinctrl_parse_dt(pc, dev->of_node);
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device
> > *pdev)
> >  
> >  	return meson_gpiolib_register(pc);
> >  }
> > -
> > -static struct platform_driver meson_pinctrl_driver = {
> > -	.probe		= meson_pinctrl_probe,
> > -	.driver = {
> > -		.name	= "meson-pinctrl",
> > -		.of_match_table = meson_pinctrl_dt_match,
> > -	},
> > -};
> > -builtin_platform_driver(meson_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson.h
> > b/drivers/pinctrl/meson/pinctrl-meson.h
> > index 7ed0a80fd9dc..284157d43612 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson.h
> > +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> > @@ -13,6 +13,7 @@
> >  
> >  #include <linux/gpio.h>
> >  #include <linux/pinctrl/pinctrl.h>
> > +#include <linux/platform_device.h>
> >  #include <linux/regmap.h>
> >  #include <linux/types.h>
> >  
> > @@ -165,11 +166,5 @@ struct meson_pinctrl {
> >  
> >  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
> >  
> > -extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
> > +/* Common probe function */
> > +int meson_pinctrl_probe(struct platform_device *pdev);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c
> > b/drivers/pinctrl/meson/pinctrl-meson8.c
> > index fbf8ecd1c2b6..68b345fc105a 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> > @@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0,
> > 16,  0,  0,  0, 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> >  	.name		= "cbus-banks",
> >  	.pins		= meson8_cbus_pins,
> >  	.groups		= meson8_cbus_groups,
> > @@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> >  	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> >  	.name		= "ao-bank",
> >  	.pins		= meson8_aobus_pins,
> >  	.groups		= meson8_aobus_groups,
> > @@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data =
> > {
> >  	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson8_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson8-cbus-pinctrl",
> > +		.data = &meson8_cbus_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson8-aobus-pinctrl",
> > +		.data = &meson8_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson8_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson8-pinctrl",
> > +		.of_match_table = meson8_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson8_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c
> > b/drivers/pinctrl/meson/pinctrl-meson8b.c
> > index 7af296db48c8..4d61df09bc3f 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> > @@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0,
> > 16,  0,  0,  0, 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> >  	.name		= "cbus-banks",
> >  	.pins		= meson8b_cbus_pins,
> >  	.groups		= meson8b_cbus_groups,
> > @@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> >  	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> >  	.name		= "aobus-banks",
> >  	.pins		= meson8b_aobus_pins,
> >  	.groups		= meson8b_aobus_groups,
> > @@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data =
> > {
> >  	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson8b-cbus-pinctrl",
> > +		.data = &meson8b_cbus_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson8b-aobus-pinctrl",
> > +		.data = &meson8b_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson8b_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson8b-pinctrl",
> > +		.of_match_table = meson8b_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson8b_pinctrl_driver);
> > 
> 
> Apart the comment on of_device_get_match_data() :
> 
> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>


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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-09 13:11       ` Jerome Brunet
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 13:11 UTC (permalink / raw)
  To: linus-amlogic

On Mon, 2017-10-09 at 13:35 +0200, Neil Armstrong wrote:
> On 09/10/2017 12:17, Jerome Brunet wrote:
> > When meson pinctrl is enabled, all meson platforms pinctrl drivers are
> > built in the kernel, with a significant amount of data.
> > 
> > This leads to situation where pinctrl drivers targeting an architecture
> > are also compiled and shipped on another one (ex: meson8 - ARM - compiled
> > and shipped on ARM64 builds). This is a waste of memory we can easily
> > avoid.
> > 
> > This change makes 4 pinctrl drivers (1 per SoC) out the original single
> > driver, allowing to compile and ship only the ones required.
> > 
> > Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> > ---
> >  drivers/pinctrl/Kconfig                    | 11 +------
> >  drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
> >  drivers/pinctrl/meson/Makefile             |  8 +++--
> >  drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
> >  drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
> >  drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++-------------------------
> > ---
> >  drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
> >  drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
> >  drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
> >  9 files changed, 140 insertions(+), 77 deletions(-)
> >  create mode 100644 drivers/pinctrl/meson/Kconfig
> > 
> > diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
> > index 1778cf4f81c7..15b5b3b76ba9 100644
> > --- a/drivers/pinctrl/Kconfig
> > +++ b/drivers/pinctrl/Kconfig
> > @@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
> >  	  This provides a GPIO interface supporting inputs and outputs.
> >  	  The I2C versions of the chips can be used as interrupt-
> > controller.
> >  
> > -config PINCTRL_MESON
> > -	bool
> > -	depends on OF
> > -	select PINMUX
> > -	select PINCONF
> > -	select GENERIC_PINCONF
> > -	select GPIOLIB
> > -	select OF_GPIO
> > -	select REGMAP_MMIO
> > -
> >  config PINCTRL_OXNAS
> >  	bool
> >  	depends on OF
> > @@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
> >  source "drivers/pinctrl/vt8500/Kconfig"
> >  source "drivers/pinctrl/mediatek/Kconfig"
> >  source "drivers/pinctrl/zte/Kconfig"
> > +source "drivers/pinctrl/meson/Kconfig"
> >  
> >  config PINCTRL_XWAY
> >  	bool
> > diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
> > new file mode 100644
> > index 000000000000..15655bfd39b6
> > --- /dev/null
> > +++ b/drivers/pinctrl/meson/Kconfig
> > @@ -0,0 +1,36 @@
> > +menuconfig PINCTRL_MESON
> > +	bool "Amlogic SoC pinctrl drivers"
> > +	depends on ARCH_MESON || COMPILE_TEST
> > +	depends on OF
> > +	select PINMUX
> > +	select PINCONF
> > +	select GENERIC_PINCONF
> > +	select GPIOLIB
> > +	select OF_GPIO
> > +	select REGMAP_MMIO
> > +	select PINMUX
> > +	select GENERIC_PINCONF
> > +
> > +if PINCTRL_MESON
> > +
> > +config PINCTRL_MESON8
> > +	bool "Meson 8 SoC pinctrl driver"
> > +	depends on ARM
> > +	default y
> > +
> > +config PINCTRL_MESON8B
> > +	bool "Meson 8b SoC pinctrl driver"
> > +	depends on ARM
> > +	default y
> > +
> > +config PINCTRL_MESON_GXBB
> > +	bool "Meson gxbb SoC pinctrl driver"
> > +	depends on ARM64
> > +	default y
> > +
> > +config PINCTRL_MESON_GXL
> > +	bool "Meson gxl SoC pinctrl driver"
> > +	depends on ARM64
> > +	default y
> > +
> > +endif
> > diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
> > index 27c5b5126008..a6ef5ff4e9b1 100644
> > --- a/drivers/pinctrl/meson/Makefile
> > +++ b/drivers/pinctrl/meson/Makefile
> > @@ -1,3 +1,5 @@
> > -obj-y	+= pinctrl-meson8.o pinctrl-meson8b.o
> > -obj-y	+= pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
> > -obj-y	+= pinctrl-meson.o
> > +obj-y += pinctrl-meson.o
> > +obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
> > +obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
> > +obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
> > +obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > index 1881d4a0eca2..a87bdb17414b 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
> > @@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0,
> > 16,  0,  0,  0, 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
> >  	.name		= "periphs-banks",
> >  	.pins		= meson_gxbb_periphs_pins,
> >  	.groups		= meson_gxbb_periphs_groups,
> > @@ -836,7 +836,7 @@ struct meson_pinctrl_data
> > meson_gxbb_periphs_pinctrl_data = {
> >  	.num_banks	= ARRAY_SIZE(meson_gxbb_periphs_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
> >  	.name		= "aobus-banks",
> >  	.pins		= meson_gxbb_aobus_pins,
> >  	.groups		= meson_gxbb_aobus_groups,
> > @@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data
> > = {
> >  	.num_funcs	= ARRAY_SIZE(meson_gxbb_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson_gxbb_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> > +		.data = &meson_gxbb_periphs_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> > +		.data = &meson_gxbb_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson_gxbb_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson-gxbb-pinctrl",
> > +		.of_match_table = meson_gxbb_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson_gxbb_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > index 3a14ecae9f31..088ac94f76b0 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
> > @@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0,
> > 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
> >  	.name		= "periphs-banks",
> >  	.pins		= meson_gxl_periphs_pins,
> >  	.groups		= meson_gxl_periphs_groups,
> > @@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data
> > = {
> >  	.num_banks	= ARRAY_SIZE(meson_gxl_periphs_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
> >  	.name		= "aobus-banks",
> >  	.pins		= meson_gxl_aobus_pins,
> >  	.groups		= meson_gxl_aobus_groups,
> > @@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data
> > = {
> >  	.num_funcs	= ARRAY_SIZE(meson_gxl_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson_gxl_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> > +		.data = &meson_gxl_periphs_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> > +		.data = &meson_gxl_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson_gxl_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson-gxl-pinctrl",
> > +		.of_match_table = meson_gxl_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson_gxl_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson.c
> > b/drivers/pinctrl/meson/pinctrl-meson.c
> > index 71bccb7acbf8..8fc1f1b45435 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson.c
> > @@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip,
> > unsigned gpio)
> >  	return !!(val & BIT(bit));
> >  }
> >  
> > -static const struct of_device_id meson_pinctrl_dt_match[] = {
> > -	{
> > -		.compatible = "amlogic,meson8-cbus-pinctrl",
> > -		.data = &meson8_cbus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson8b-cbus-pinctrl",
> > -		.data = &meson8b_cbus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson8-aobus-pinctrl",
> > -		.data = &meson8_aobus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson8b-aobus-pinctrl",
> > -		.data = &meson8b_aobus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxbb-periphs-pinctrl",
> > -		.data = &meson_gxbb_periphs_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxbb-aobus-pinctrl",
> > -		.data = &meson_gxbb_aobus_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxl-periphs-pinctrl",
> > -		.data = &meson_gxl_periphs_pinctrl_data,
> > -	},
> > -	{
> > -		.compatible = "amlogic,meson-gxl-aobus-pinctrl",
> > -		.data = &meson_gxl_aobus_pinctrl_data,
> > -	},
> > -	{ },
> > -};
> > -
> >  static int meson_gpiolib_register(struct meson_pinctrl *pc)
> >  {
> >  	int ret;
> > @@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl
> > *pc,
> >  	return 0;
> >  }
> >  
> > -static int meson_pinctrl_probe(struct platform_device *pdev)
> > +int meson_pinctrl_probe(struct platform_device *pdev)
> >  {
> >  	const struct of_device_id *match;
> >  	struct device *dev = &pdev->dev;
> > @@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device
> > *pdev)
> >  		return -ENOMEM;
> >  
> >  	pc->dev = dev;
> > -	match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
> > +	match = of_match_node(dev->driver->of_match_table, dev->of_node);
> 
> 
> Minor comment, maybe you could use of_device_get_match_data(dev) here, it will
> be simpler.

Indeed, I missed this particular helper. Thx !

> 
> >  	pc->data = (struct meson_pinctrl_data *) match->data;
> >  
> > -	ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
> > +	ret = meson_pinctrl_parse_dt(pc, dev->of_node);
> >  	if (ret)
> >  		return ret;
> >  
> > @@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device
> > *pdev)
> >  
> >  	return meson_gpiolib_register(pc);
> >  }
> > -
> > -static struct platform_driver meson_pinctrl_driver = {
> > -	.probe		= meson_pinctrl_probe,
> > -	.driver = {
> > -		.name	= "meson-pinctrl",
> > -		.of_match_table = meson_pinctrl_dt_match,
> > -	},
> > -};
> > -builtin_platform_driver(meson_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson.h
> > b/drivers/pinctrl/meson/pinctrl-meson.h
> > index 7ed0a80fd9dc..284157d43612 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson.h
> > +++ b/drivers/pinctrl/meson/pinctrl-meson.h
> > @@ -13,6 +13,7 @@
> >  
> >  #include <linux/gpio.h>
> >  #include <linux/pinctrl/pinctrl.h>
> > +#include <linux/platform_device.h>
> >  #include <linux/regmap.h>
> >  #include <linux/types.h>
> >  
> > @@ -165,11 +166,5 @@ struct meson_pinctrl {
> >  
> >  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
> >  
> > -extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
> > -extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
> > +/* Common probe function */
> > +int meson_pinctrl_probe(struct platform_device *pdev);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c
> > b/drivers/pinctrl/meson/pinctrl-meson8.c
> > index fbf8ecd1c2b6..68b345fc105a 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson8.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
> > @@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0,
> > 16,  0,  0,  0, 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> >  	.name		= "cbus-banks",
> >  	.pins		= meson8_cbus_pins,
> >  	.groups		= meson8_cbus_groups,
> > @@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
> >  	.num_banks	= ARRAY_SIZE(meson8_cbus_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
> >  	.name		= "ao-bank",
> >  	.pins		= meson8_aobus_pins,
> >  	.groups		= meson8_aobus_groups,
> > @@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data =
> > {
> >  	.num_funcs	= ARRAY_SIZE(meson8_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson8_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson8_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson8-cbus-pinctrl",
> > +		.data = &meson8_cbus_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson8-aobus-pinctrl",
> > +		.data = &meson8_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson8_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson8-pinctrl",
> > +		.of_match_table = meson8_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson8_pinctrl_driver);
> > diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c
> > b/drivers/pinctrl/meson/pinctrl-meson8b.c
> > index 7af296db48c8..4d61df09bc3f 100644
> > --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
> > +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
> > @@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
> >  	BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0,
> > 16,  0,  0,  0, 16,  1,  0),
> >  };
> >  
> > -struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> >  	.name		= "cbus-banks",
> >  	.pins		= meson8b_cbus_pins,
> >  	.groups		= meson8b_cbus_groups,
> > @@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
> >  	.num_banks	= ARRAY_SIZE(meson8b_cbus_banks),
> >  };
> >  
> > -struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> > +static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
> >  	.name		= "aobus-banks",
> >  	.pins		= meson8b_aobus_pins,
> >  	.groups		= meson8b_aobus_groups,
> > @@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data =
> > {
> >  	.num_funcs	= ARRAY_SIZE(meson8b_aobus_functions),
> >  	.num_banks	= ARRAY_SIZE(meson8b_aobus_banks),
> >  };
> > +
> > +static const struct of_device_id meson8b_pinctrl_dt_match[] = {
> > +	{
> > +		.compatible = "amlogic,meson8b-cbus-pinctrl",
> > +		.data = &meson8b_cbus_pinctrl_data,
> > +	},
> > +	{
> > +		.compatible = "amlogic,meson8b-aobus-pinctrl",
> > +		.data = &meson8b_aobus_pinctrl_data,
> > +	},
> > +	{ },
> > +};
> > +
> > +static struct platform_driver meson8b_pinctrl_driver = {
> > +	.probe		= meson_pinctrl_probe,
> > +	.driver = {
> > +		.name	= "meson8b-pinctrl",
> > +		.of_match_table = meson8b_pinctrl_dt_match,
> > +	},
> > +};
> > +builtin_platform_driver(meson8b_pinctrl_driver);
> > 
> 
> Apart the comment on of_device_get_match_data() :
> 
> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>

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

* Re: [PATCH 2/2] pinctrl: meson: rework pinmux ops
  2017-10-09 11:42     ` Neil Armstrong
@ 2017-10-09 13:25       ` Jerome Brunet
  -1 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 13:25 UTC (permalink / raw)
  To: Neil Armstrong, Linus Walleij, Kevin Hilman, Carlo Caione
  Cc: linux-gpio, linux-amlogic, linux-kernel

On Mon, 2017-10-09 at 13:42 +0200, Neil Armstrong wrote:
> > +/* Common pmx functions */
> > +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
> > +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> > +                                 unsigned selector);
> > +int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
> > +                      unsigned selector,
> > +                      const char * const **groups,
> > +                      unsigned * const num_groups);
> 
> Maybe the naming of the common functions should be changed to something
> generic
> like meson_get_functions_name and meson_get_function_groups and leave "pmx" to
> the
> first version pinmux control implementation.
> Same for the ops, meson_pinmux_ops would be better.

I was thinking that the naming convention around this might be confusing. Thx
for the confirmation !

However, I think "pmx" was intially meant to denote a pinmux function, since
pinconf, gpio and pinmux are all mixed in pinctrl-meson.c. I'd prefer to keep
this "pmx" for this reason.

Maybe the SoC specific bits should be named after the first SoC supporting it:
* files: pinctrl-meson-pmx.* => pinctrl-meson8-pmx.*
* functions: meson_pmx_* => meson8_pmx_* 

What do you think ?

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

* [PATCH 2/2] pinctrl: meson: rework pinmux ops
@ 2017-10-09 13:25       ` Jerome Brunet
  0 siblings, 0 replies; 22+ messages in thread
From: Jerome Brunet @ 2017-10-09 13:25 UTC (permalink / raw)
  To: linus-amlogic

On Mon, 2017-10-09 at 13:42 +0200, Neil Armstrong wrote:
> > +/* Common pmx functions */
> > +int meson_pmx_get_funcs_count(struct pinctrl_dev *pcdev);
> > +const char *meson_pmx_get_func_name(struct pinctrl_dev *pcdev,
> > +                                 unsigned selector);
> > +int meson_pmx_get_groups(struct pinctrl_dev *pcdev,
> > +                      unsigned selector,
> > +                      const char * const **groups,
> > +                      unsigned * const num_groups);
> 
> Maybe the naming of the common functions should be changed to something
> generic
> like meson_get_functions_name and meson_get_function_groups and leave "pmx" to
> the
> first version pinmux control implementation.
> Same for the ops, meson_pinmux_ops would be better.

I was thinking that the naming convention around this might be confusing. Thx
for the confirmation !

However, I think "pmx" was intially meant to denote a pinmux function, since
pinconf, gpio and pinmux are all mixed in pinctrl-meson.c. I'd prefer to keep
this "pmx" for this reason.

Maybe the SoC specific bits should be named after the first SoC supporting it:
* files: pinctrl-meson-pmx.* => pinctrl-meson8-pmx.*
* functions: meson_pmx_* => meson8_pmx_* 

What do you think ?

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
  2017-10-09 11:35     ` Neil Armstrong
@ 2017-10-11  2:55       ` Yixun Lan
  -1 siblings, 0 replies; 22+ messages in thread
From: Yixun Lan @ 2017-10-11  2:55 UTC (permalink / raw)
  To: Neil Armstrong
  Cc: Jerome Brunet, Linus Walleij, Kevin Hilman, Carlo Caione,
	linux-gpio, linux-kernel, linux-amlogic

hi jerome:


On Mon, Oct 9, 2017 at 7:35 PM, Neil Armstrong <narmstrong@baylibre.com> wrote:
> On 09/10/2017 12:17, Jerome Brunet wrote:
>> When meson pinctrl is enabled, all meson platforms pinctrl drivers are
>> built in the kernel, with a significant amount of data.
>>
>> This leads to situation where pinctrl drivers targeting an architecture
>> are also compiled and shipped on another one (ex: meson8 - ARM - compiled
>> and shipped on ARM64 builds). This is a waste of memory we can easily
>> avoid.
>>
>> This change makes 4 pinctrl drivers (1 per SoC) out the original single
>> driver, allowing to compile and ship only the ones required.
>>
>> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
>> ---
>>  drivers/pinctrl/Kconfig                    | 11 +------
>>  drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
>>  drivers/pinctrl/meson/Makefile             |  8 +++--
>>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
>>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
>>  drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++----------------------------
>>  drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
>>  drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
>>  drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
>>  9 files changed, 140 insertions(+), 77 deletions(-)
>>  create mode 100644 drivers/pinctrl/meson/Kconfig
>>
>> diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
>> index 1778cf4f81c7..15b5b3b76ba9 100644
>> --- a/drivers/pinctrl/Kconfig
>> +++ b/drivers/pinctrl/Kconfig
>> @@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
>>         This provides a GPIO interface supporting inputs and outputs.
>>         The I2C versions of the chips can be used as interrupt-controller.
>>
>> -config PINCTRL_MESON
>> -     bool
>> -     depends on OF
>> -     select PINMUX
>> -     select PINCONF
>> -     select GENERIC_PINCONF
>> -     select GPIOLIB
>> -     select OF_GPIO
>> -     select REGMAP_MMIO
>> -
>>  config PINCTRL_OXNAS
>>       bool
>>       depends on OF
>> @@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
>>  source "drivers/pinctrl/vt8500/Kconfig"
>>  source "drivers/pinctrl/mediatek/Kconfig"
>>  source "drivers/pinctrl/zte/Kconfig"
>> +source "drivers/pinctrl/meson/Kconfig"
>>
>>  config PINCTRL_XWAY
>>       bool
>> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
>> new file mode 100644
>> index 000000000000..15655bfd39b6
>> --- /dev/null
>> +++ b/drivers/pinctrl/meson/Kconfig
>> @@ -0,0 +1,36 @@
>> +menuconfig PINCTRL_MESON
>> +     bool "Amlogic SoC pinctrl drivers"
>> +     depends on ARCH_MESON || COMPILE_TEST
>> +     depends on OF
>> +     select PINMUX
>> +     select PINCONF
>> +     select GENERIC_PINCONF
>> +     select GPIOLIB
>> +     select OF_GPIO
>> +     select REGMAP_MMIO
>> +     select PINMUX
>> +     select GENERIC_PINCONF
>> +
>> +if PINCTRL_MESON
>> +
>> +config PINCTRL_MESON8
>> +     bool "Meson 8 SoC pinctrl driver"
>> +     depends on ARM
>> +     default y
>> +
>> +config PINCTRL_MESON8B
>> +     bool "Meson 8b SoC pinctrl driver"
>> +     depends on ARM
>> +     default y
>> +
>> +config PINCTRL_MESON_GXBB
>> +     bool "Meson gxbb SoC pinctrl driver"
>> +     depends on ARM64
>> +     default y
>> +
>> +config PINCTRL_MESON_GXL
>> +     bool "Meson gxl SoC pinctrl driver"
>> +     depends on ARM64
>> +     default y
>> +
>> +endif
>> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
>> index 27c5b5126008..a6ef5ff4e9b1 100644
>> --- a/drivers/pinctrl/meson/Makefile
>> +++ b/drivers/pinctrl/meson/Makefile
>> @@ -1,3 +1,5 @@
>> -obj-y        += pinctrl-meson8.o pinctrl-meson8b.o
>> -obj-y        += pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
>> -obj-y        += pinctrl-meson.o
>> +obj-y += pinctrl-meson.o
>> +obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
>> +obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
>> +obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
>> +obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
>> index 1881d4a0eca2..a87bdb17414b 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
>> @@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>>       .name           = "periphs-banks",
>>       .pins           = meson_gxbb_periphs_pins,
>>       .groups         = meson_gxbb_periphs_groups,
>> @@ -836,7 +836,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson_gxbb_periphs_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>>       .name           = "aobus-banks",
>>       .pins           = meson_gxbb_aobus_pins,
>>       .groups         = meson_gxbb_aobus_groups,
>> @@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson_gxbb_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson_gxbb_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
>> +             .data = &meson_gxbb_periphs_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
>> +             .data = &meson_gxbb_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson_gxbb_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson-gxbb-pinctrl",
>> +             .of_match_table = meson_gxbb_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson_gxbb_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
>> index 3a14ecae9f31..088ac94f76b0 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
>> @@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>>       .name           = "periphs-banks",
>>       .pins           = meson_gxl_periphs_pins,
>>       .groups         = meson_gxl_periphs_groups,
>> @@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson_gxl_periphs_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>>       .name           = "aobus-banks",
>>       .pins           = meson_gxl_aobus_pins,
>>       .groups         = meson_gxl_aobus_groups,
>> @@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson_gxl_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson_gxl_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson-gxl-periphs-pinctrl",
>> +             .data = &meson_gxl_periphs_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson-gxl-aobus-pinctrl",
>> +             .data = &meson_gxl_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson_gxl_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson-gxl-pinctrl",
>> +             .of_match_table = meson_gxl_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson_gxl_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
>> index 71bccb7acbf8..8fc1f1b45435 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
>> @@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
>>       return !!(val & BIT(bit));
>>  }
>>
>> -static const struct of_device_id meson_pinctrl_dt_match[] = {
>> -     {
>> -             .compatible = "amlogic,meson8-cbus-pinctrl",
>> -             .data = &meson8_cbus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson8b-cbus-pinctrl",
>> -             .data = &meson8b_cbus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson8-aobus-pinctrl",
>> -             .data = &meson8_aobus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson8b-aobus-pinctrl",
>> -             .data = &meson8b_aobus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
>> -             .data = &meson_gxbb_periphs_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
>> -             .data = &meson_gxbb_aobus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxl-periphs-pinctrl",
>> -             .data = &meson_gxl_periphs_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxl-aobus-pinctrl",
>> -             .data = &meson_gxl_aobus_pinctrl_data,
>> -     },
>> -     { },
>> -};
>> -
>>  static int meson_gpiolib_register(struct meson_pinctrl *pc)
>>  {
>>       int ret;
>> @@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
>>       return 0;
>>  }
>>
>> -static int meson_pinctrl_probe(struct platform_device *pdev)
>> +int meson_pinctrl_probe(struct platform_device *pdev)
>>  {
>>       const struct of_device_id *match;
>>       struct device *dev = &pdev->dev;
>> @@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>>               return -ENOMEM;
>>
>>       pc->dev = dev;
>> -     match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
>> +     match = of_match_node(dev->driver->of_match_table, dev->of_node);
>
>
> Minor comment, maybe you could use of_device_get_match_data(dev) here, it will be simpler.
>
with the of_device_get_match_data() been used, I've got this error, probably
you should add "#include <linux/of_device.h>" ?

 AR      drivers/base/built-in.o
drivers/pinctrl/meson/pinctrl-meson.c: In function ‘meson_pinctrl_probe’:
drivers/pinctrl/meson/pinctrl-meson.c:520:43: error: implicit
declaration of function ‘of_device_get_match_data’
[-Werror=implicit-function-declaration]
  pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev);
                                           ^~~~~~~~~~~~~~~~~~~~~~~~
drivers/pinctrl/meson/pinctrl-meson.c:520:13: warning: cast to pointer
from integer of different size [-Wint-to-pointer-cast]
  pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev);
             ^


>>       pc->data = (struct meson_pinctrl_data *) match->data;
>>
>> -     ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
>> +     ret = meson_pinctrl_parse_dt(pc, dev->of_node);
>>       if (ret)
>>               return ret;
>>
>> @@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>>
>>       return meson_gpiolib_register(pc);
>>  }
>> -
>> -static struct platform_driver meson_pinctrl_driver = {
>> -     .probe          = meson_pinctrl_probe,
>> -     .driver = {
>> -             .name   = "meson-pinctrl",
>> -             .of_match_table = meson_pinctrl_dt_match,
>> -     },
>> -};
>> -builtin_platform_driver(meson_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
>> index 7ed0a80fd9dc..284157d43612 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson.h
>> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
>> @@ -13,6 +13,7 @@
>>
>>  #include <linux/gpio.h>
>>  #include <linux/pinctrl/pinctrl.h>
>> +#include <linux/platform_device.h>
>>  #include <linux/regmap.h>
>>  #include <linux/types.h>
>>
>> @@ -165,11 +166,5 @@ struct meson_pinctrl {
>>
>>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>>
>> -extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
>> +/* Common probe function */
>> +int meson_pinctrl_probe(struct platform_device *pdev);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
>> index fbf8ecd1c2b6..68b345fc105a 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
>> @@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>>       .name           = "cbus-banks",
>>       .pins           = meson8_cbus_pins,
>>       .groups         = meson8_cbus_groups,
>> @@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson8_cbus_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>>       .name           = "ao-bank",
>>       .pins           = meson8_aobus_pins,
>>       .groups         = meson8_aobus_groups,
>> @@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson8_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson8_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson8_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson8-cbus-pinctrl",
>> +             .data = &meson8_cbus_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson8-aobus-pinctrl",
>> +             .data = &meson8_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson8_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson8-pinctrl",
>> +             .of_match_table = meson8_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson8_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
>> index 7af296db48c8..4d61df09bc3f 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
>> @@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>>       .name           = "cbus-banks",
>>       .pins           = meson8b_cbus_pins,
>>       .groups         = meson8b_cbus_groups,
>> @@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson8b_cbus_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>>       .name           = "aobus-banks",
>>       .pins           = meson8b_aobus_pins,
>>       .groups         = meson8b_aobus_groups,
>> @@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson8b_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson8b_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson8b_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson8b-cbus-pinctrl",
>> +             .data = &meson8b_cbus_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson8b-aobus-pinctrl",
>> +             .data = &meson8b_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson8b_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson8b-pinctrl",
>> +             .of_match_table = meson8b_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson8b_pinctrl_driver);
>>
>
> Apart the comment on of_device_get_match_data() :
>
> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
>
> _______________________________________________
> linux-amlogic mailing list
> linux-amlogic@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-amlogic

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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-11  2:55       ` Yixun Lan
  0 siblings, 0 replies; 22+ messages in thread
From: Yixun Lan @ 2017-10-11  2:55 UTC (permalink / raw)
  To: linus-amlogic

hi jerome:


On Mon, Oct 9, 2017 at 7:35 PM, Neil Armstrong <narmstrong@baylibre.com> wrote:
> On 09/10/2017 12:17, Jerome Brunet wrote:
>> When meson pinctrl is enabled, all meson platforms pinctrl drivers are
>> built in the kernel, with a significant amount of data.
>>
>> This leads to situation where pinctrl drivers targeting an architecture
>> are also compiled and shipped on another one (ex: meson8 - ARM - compiled
>> and shipped on ARM64 builds). This is a waste of memory we can easily
>> avoid.
>>
>> This change makes 4 pinctrl drivers (1 per SoC) out the original single
>> driver, allowing to compile and ship only the ones required.
>>
>> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
>> ---
>>  drivers/pinctrl/Kconfig                    | 11 +------
>>  drivers/pinctrl/meson/Kconfig              | 36 +++++++++++++++++++++
>>  drivers/pinctrl/meson/Makefile             |  8 +++--
>>  drivers/pinctrl/meson/pinctrl-meson-gxbb.c | 25 +++++++++++++--
>>  drivers/pinctrl/meson/pinctrl-meson-gxl.c  | 25 +++++++++++++--
>>  drivers/pinctrl/meson/pinctrl-meson.c      | 51 ++----------------------------
>>  drivers/pinctrl/meson/pinctrl-meson.h      | 11 ++-----
>>  drivers/pinctrl/meson/pinctrl-meson8.c     | 25 +++++++++++++--
>>  drivers/pinctrl/meson/pinctrl-meson8b.c    | 25 +++++++++++++--
>>  9 files changed, 140 insertions(+), 77 deletions(-)
>>  create mode 100644 drivers/pinctrl/meson/Kconfig
>>
>> diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
>> index 1778cf4f81c7..15b5b3b76ba9 100644
>> --- a/drivers/pinctrl/Kconfig
>> +++ b/drivers/pinctrl/Kconfig
>> @@ -167,16 +167,6 @@ config PINCTRL_MCP23S08
>>         This provides a GPIO interface supporting inputs and outputs.
>>         The I2C versions of the chips can be used as interrupt-controller.
>>
>> -config PINCTRL_MESON
>> -     bool
>> -     depends on OF
>> -     select PINMUX
>> -     select PINCONF
>> -     select GENERIC_PINCONF
>> -     select GPIOLIB
>> -     select OF_GPIO
>> -     select REGMAP_MMIO
>> -
>>  config PINCTRL_OXNAS
>>       bool
>>       depends on OF
>> @@ -368,6 +358,7 @@ source "drivers/pinctrl/uniphier/Kconfig"
>>  source "drivers/pinctrl/vt8500/Kconfig"
>>  source "drivers/pinctrl/mediatek/Kconfig"
>>  source "drivers/pinctrl/zte/Kconfig"
>> +source "drivers/pinctrl/meson/Kconfig"
>>
>>  config PINCTRL_XWAY
>>       bool
>> diff --git a/drivers/pinctrl/meson/Kconfig b/drivers/pinctrl/meson/Kconfig
>> new file mode 100644
>> index 000000000000..15655bfd39b6
>> --- /dev/null
>> +++ b/drivers/pinctrl/meson/Kconfig
>> @@ -0,0 +1,36 @@
>> +menuconfig PINCTRL_MESON
>> +     bool "Amlogic SoC pinctrl drivers"
>> +     depends on ARCH_MESON || COMPILE_TEST
>> +     depends on OF
>> +     select PINMUX
>> +     select PINCONF
>> +     select GENERIC_PINCONF
>> +     select GPIOLIB
>> +     select OF_GPIO
>> +     select REGMAP_MMIO
>> +     select PINMUX
>> +     select GENERIC_PINCONF
>> +
>> +if PINCTRL_MESON
>> +
>> +config PINCTRL_MESON8
>> +     bool "Meson 8 SoC pinctrl driver"
>> +     depends on ARM
>> +     default y
>> +
>> +config PINCTRL_MESON8B
>> +     bool "Meson 8b SoC pinctrl driver"
>> +     depends on ARM
>> +     default y
>> +
>> +config PINCTRL_MESON_GXBB
>> +     bool "Meson gxbb SoC pinctrl driver"
>> +     depends on ARM64
>> +     default y
>> +
>> +config PINCTRL_MESON_GXL
>> +     bool "Meson gxl SoC pinctrl driver"
>> +     depends on ARM64
>> +     default y
>> +
>> +endif
>> diff --git a/drivers/pinctrl/meson/Makefile b/drivers/pinctrl/meson/Makefile
>> index 27c5b5126008..a6ef5ff4e9b1 100644
>> --- a/drivers/pinctrl/meson/Makefile
>> +++ b/drivers/pinctrl/meson/Makefile
>> @@ -1,3 +1,5 @@
>> -obj-y        += pinctrl-meson8.o pinctrl-meson8b.o
>> -obj-y        += pinctrl-meson-gxbb.o pinctrl-meson-gxl.o
>> -obj-y        += pinctrl-meson.o
>> +obj-y += pinctrl-meson.o
>> +obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
>> +obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
>> +obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
>> +obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
>> index 1881d4a0eca2..a87bdb17414b 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
>> @@ -824,7 +824,7 @@ static struct meson_bank meson_gxbb_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0,  GPIOAO_13, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>>       .name           = "periphs-banks",
>>       .pins           = meson_gxbb_periphs_pins,
>>       .groups         = meson_gxbb_periphs_groups,
>> @@ -836,7 +836,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson_gxbb_periphs_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>>       .name           = "aobus-banks",
>>       .pins           = meson_gxbb_aobus_pins,
>>       .groups         = meson_gxbb_aobus_groups,
>> @@ -847,3 +847,24 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson_gxbb_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson_gxbb_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
>> +             .data = &meson_gxbb_periphs_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
>> +             .data = &meson_gxbb_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson_gxbb_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson-gxbb-pinctrl",
>> +             .of_match_table = meson_gxbb_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson_gxbb_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
>> index 3a14ecae9f31..088ac94f76b0 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
>> @@ -809,7 +809,7 @@ static struct meson_bank meson_gxl_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0,  GPIOAO_9, 0, 9, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>>       .name           = "periphs-banks",
>>       .pins           = meson_gxl_periphs_pins,
>>       .groups         = meson_gxl_periphs_groups,
>> @@ -821,7 +821,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson_gxl_periphs_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>>       .name           = "aobus-banks",
>>       .pins           = meson_gxl_aobus_pins,
>>       .groups         = meson_gxl_aobus_groups,
>> @@ -832,3 +832,24 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson_gxl_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson_gxl_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson_gxl_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson-gxl-periphs-pinctrl",
>> +             .data = &meson_gxl_periphs_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson-gxl-aobus-pinctrl",
>> +             .data = &meson_gxl_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson_gxl_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson-gxl-pinctrl",
>> +             .of_match_table = meson_gxl_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson_gxl_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
>> index 71bccb7acbf8..8fc1f1b45435 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson.c
>> @@ -481,42 +481,6 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)
>>       return !!(val & BIT(bit));
>>  }
>>
>> -static const struct of_device_id meson_pinctrl_dt_match[] = {
>> -     {
>> -             .compatible = "amlogic,meson8-cbus-pinctrl",
>> -             .data = &meson8_cbus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson8b-cbus-pinctrl",
>> -             .data = &meson8b_cbus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson8-aobus-pinctrl",
>> -             .data = &meson8_aobus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson8b-aobus-pinctrl",
>> -             .data = &meson8b_aobus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxbb-periphs-pinctrl",
>> -             .data = &meson_gxbb_periphs_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxbb-aobus-pinctrl",
>> -             .data = &meson_gxbb_aobus_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxl-periphs-pinctrl",
>> -             .data = &meson_gxl_periphs_pinctrl_data,
>> -     },
>> -     {
>> -             .compatible = "amlogic,meson-gxl-aobus-pinctrl",
>> -             .data = &meson_gxl_aobus_pinctrl_data,
>> -     },
>> -     { },
>> -};
>> -
>>  static int meson_gpiolib_register(struct meson_pinctrl *pc)
>>  {
>>       int ret;
>> @@ -624,7 +588,7 @@ static int meson_pinctrl_parse_dt(struct meson_pinctrl *pc,
>>       return 0;
>>  }
>>
>> -static int meson_pinctrl_probe(struct platform_device *pdev)
>> +int meson_pinctrl_probe(struct platform_device *pdev)
>>  {
>>       const struct of_device_id *match;
>>       struct device *dev = &pdev->dev;
>> @@ -636,10 +600,10 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>>               return -ENOMEM;
>>
>>       pc->dev = dev;
>> -     match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node);
>> +     match = of_match_node(dev->driver->of_match_table, dev->of_node);
>
>
> Minor comment, maybe you could use of_device_get_match_data(dev) here, it will be simpler.
>
with the of_device_get_match_data() been used, I've got this error, probably
you should add "#include <linux/of_device.h>" ?

 AR      drivers/base/built-in.o
drivers/pinctrl/meson/pinctrl-meson.c: In function ?meson_pinctrl_probe?:
drivers/pinctrl/meson/pinctrl-meson.c:520:43: error: implicit
declaration of function ?of_device_get_match_data?
[-Werror=implicit-function-declaration]
  pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev);
                                           ^~~~~~~~~~~~~~~~~~~~~~~~
drivers/pinctrl/meson/pinctrl-meson.c:520:13: warning: cast to pointer
from integer of different size [-Wint-to-pointer-cast]
  pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev);
             ^


>>       pc->data = (struct meson_pinctrl_data *) match->data;
>>
>> -     ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node);
>> +     ret = meson_pinctrl_parse_dt(pc, dev->of_node);
>>       if (ret)
>>               return ret;
>>
>> @@ -659,12 +623,3 @@ static int meson_pinctrl_probe(struct platform_device *pdev)
>>
>>       return meson_gpiolib_register(pc);
>>  }
>> -
>> -static struct platform_driver meson_pinctrl_driver = {
>> -     .probe          = meson_pinctrl_probe,
>> -     .driver = {
>> -             .name   = "meson-pinctrl",
>> -             .of_match_table = meson_pinctrl_dt_match,
>> -     },
>> -};
>> -builtin_platform_driver(meson_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson.h b/drivers/pinctrl/meson/pinctrl-meson.h
>> index 7ed0a80fd9dc..284157d43612 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson.h
>> +++ b/drivers/pinctrl/meson/pinctrl-meson.h
>> @@ -13,6 +13,7 @@
>>
>>  #include <linux/gpio.h>
>>  #include <linux/pinctrl/pinctrl.h>
>> +#include <linux/platform_device.h>
>>  #include <linux/regmap.h>
>>  #include <linux/types.h>
>>
>> @@ -165,11 +166,5 @@ struct meson_pinctrl {
>>
>>  #define MESON_PIN(x) PINCTRL_PIN(x, #x)
>>
>> -extern struct meson_pinctrl_data meson8_cbus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson8_aobus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data;
>> -extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data;
>> +/* Common probe function */
>> +int meson_pinctrl_probe(struct platform_device *pdev);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
>> index fbf8ecd1c2b6..68b345fc105a 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson8.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson8.c
>> @@ -1044,7 +1044,7 @@ static struct meson_bank meson8_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>>       .name           = "cbus-banks",
>>       .pins           = meson8_cbus_pins,
>>       .groups         = meson8_cbus_groups,
>> @@ -1056,7 +1056,7 @@ struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson8_cbus_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>>       .name           = "ao-bank",
>>       .pins           = meson8_aobus_pins,
>>       .groups         = meson8_aobus_groups,
>> @@ -1067,3 +1067,24 @@ struct meson_pinctrl_data meson8_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson8_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson8_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson8_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson8-cbus-pinctrl",
>> +             .data = &meson8_cbus_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson8-aobus-pinctrl",
>> +             .data = &meson8_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson8_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson8-pinctrl",
>> +             .of_match_table = meson8_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson8_pinctrl_driver);
>> diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
>> index 7af296db48c8..4d61df09bc3f 100644
>> --- a/drivers/pinctrl/meson/pinctrl-meson8b.c
>> +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
>> @@ -904,7 +904,7 @@ static struct meson_bank meson8b_aobus_banks[] = {
>>       BANK("AO",   GPIOAO_0, GPIO_TEST_N, 0, 13, 0,  0,  0, 16,  0,  0,  0, 16,  1,  0),
>>  };
>>
>> -struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>>       .name           = "cbus-banks",
>>       .pins           = meson8b_cbus_pins,
>>       .groups         = meson8b_cbus_groups,
>> @@ -916,7 +916,7 @@ struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
>>       .num_banks      = ARRAY_SIZE(meson8b_cbus_banks),
>>  };
>>
>> -struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>> +static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>>       .name           = "aobus-banks",
>>       .pins           = meson8b_aobus_pins,
>>       .groups         = meson8b_aobus_groups,
>> @@ -927,3 +927,24 @@ struct meson_pinctrl_data meson8b_aobus_pinctrl_data = {
>>       .num_funcs      = ARRAY_SIZE(meson8b_aobus_functions),
>>       .num_banks      = ARRAY_SIZE(meson8b_aobus_banks),
>>  };
>> +
>> +static const struct of_device_id meson8b_pinctrl_dt_match[] = {
>> +     {
>> +             .compatible = "amlogic,meson8b-cbus-pinctrl",
>> +             .data = &meson8b_cbus_pinctrl_data,
>> +     },
>> +     {
>> +             .compatible = "amlogic,meson8b-aobus-pinctrl",
>> +             .data = &meson8b_aobus_pinctrl_data,
>> +     },
>> +     { },
>> +};
>> +
>> +static struct platform_driver meson8b_pinctrl_driver = {
>> +     .probe          = meson_pinctrl_probe,
>> +     .driver = {
>> +             .name   = "meson8b-pinctrl",
>> +             .of_match_table = meson8b_pinctrl_dt_match,
>> +     },
>> +};
>> +builtin_platform_driver(meson8b_pinctrl_driver);
>>
>
> Apart the comment on of_device_get_match_data() :
>
> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
>
> _______________________________________________
> linux-amlogic mailing list
> linux-amlogic at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-amlogic

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
  2017-10-09 10:17   ` Jerome Brunet
  (?)
@ 2017-10-12  6:09     ` kbuild test robot
  -1 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-10-12  6:09 UTC (permalink / raw)
  Cc: kbuild-all, Linus Walleij, Kevin Hilman, Carlo Caione,
	Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

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

Hi Jerome,

[auto build test ERROR on pinctrl/devel]
[also build test ERROR on v4.14-rc4 next-20171009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jerome-Brunet/pinctrl-meson-prepare-for-new-SoC/20171012-094645
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All error/warnings (new ones prefixed by >>):

   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
>> arch/x86/include/asm/arch_hweight.h:17:17: error: expected identifier before string constant
    #define REG_OUT "a"
                    ^
>> drivers/pinctrl/meson/pinctrl-meson.h:74:2: note: in expansion of macro 'REG_OUT'
     REG_OUT,
     ^~~~~~~
   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
>> drivers/pinctrl/meson/pinctrl-meson.h:99:29: error: 'NUM_REG' undeclared here (not in a function)
     struct meson_reg_desc regs[NUM_REG];
                                ^~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_direction_output':
>> arch/x86/include/asm/arch_hweight.h:17:17: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_OUT "a"
                    ^
>> drivers/pinctrl/meson/pinctrl-meson.c:446:37: note: in expansion of macro 'REG_OUT'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_set':
>> arch/x86/include/asm/arch_hweight.h:17:17: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_OUT "a"
                    ^
   drivers/pinctrl/meson/pinctrl-meson.c:462:37: note: in expansion of macro 'REG_OUT'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_get':
   arch/x86/include/asm/arch_hweight.h:16:16: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_IN "a"
                   ^
>> drivers/pinctrl/meson/pinctrl-meson.c:478:37: note: in expansion of macro 'REG_IN'
     meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
                                        ^~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~

vim +/NUM_REG +99 drivers/pinctrl/meson/pinctrl-meson.h

6ac73095 Beniamino Galvani 2015-01-17   66  
6ac73095 Beniamino Galvani 2015-01-17   67  /**
6ac73095 Beniamino Galvani 2015-01-17   68   * enum meson_reg_type - type of registers encoded in @meson_reg_desc
6ac73095 Beniamino Galvani 2015-01-17   69   */
6ac73095 Beniamino Galvani 2015-01-17   70  enum meson_reg_type {
6ac73095 Beniamino Galvani 2015-01-17   71  	REG_PULLEN,
6ac73095 Beniamino Galvani 2015-01-17   72  	REG_PULL,
6ac73095 Beniamino Galvani 2015-01-17   73  	REG_DIR,
6ac73095 Beniamino Galvani 2015-01-17  @74  	REG_OUT,
6ac73095 Beniamino Galvani 2015-01-17   75  	REG_IN,
6ac73095 Beniamino Galvani 2015-01-17   76  	NUM_REG,
6ac73095 Beniamino Galvani 2015-01-17   77  };
6ac73095 Beniamino Galvani 2015-01-17   78  
6ac73095 Beniamino Galvani 2015-01-17   79  /**
6ac73095 Beniamino Galvani 2015-01-17   80   * struct meson bank
6ac73095 Beniamino Galvani 2015-01-17   81   *
6ac73095 Beniamino Galvani 2015-01-17   82   * @name:	bank name
6ac73095 Beniamino Galvani 2015-01-17   83   * @first:	first pin of the bank
6ac73095 Beniamino Galvani 2015-01-17   84   * @last:	last pin of the bank
6c9dc843 Jerome Brunet     2017-06-08   85   * @irq:	hwirq base number of the bank
6ac73095 Beniamino Galvani 2015-01-17   86   * @regs:	array of register descriptors
6ac73095 Beniamino Galvani 2015-01-17   87   *
6ac73095 Beniamino Galvani 2015-01-17   88   * A bank represents a set of pins controlled by a contiguous set of
6ac73095 Beniamino Galvani 2015-01-17   89   * bits in the domain registers. The structure specifies which bits in
6ac73095 Beniamino Galvani 2015-01-17   90   * the regmap control the different functionalities. Each member of
6ac73095 Beniamino Galvani 2015-01-17   91   * the @regs array refers to the first pin of the bank.
6ac73095 Beniamino Galvani 2015-01-17   92   */
6ac73095 Beniamino Galvani 2015-01-17   93  struct meson_bank {
6ac73095 Beniamino Galvani 2015-01-17   94  	const char *name;
6ac73095 Beniamino Galvani 2015-01-17   95  	unsigned int first;
6ac73095 Beniamino Galvani 2015-01-17   96  	unsigned int last;
6c9dc843 Jerome Brunet     2017-06-08   97  	int irq_first;
6c9dc843 Jerome Brunet     2017-06-08   98  	int irq_last;
6ac73095 Beniamino Galvani 2015-01-17  @99  	struct meson_reg_desc regs[NUM_REG];
6ac73095 Beniamino Galvani 2015-01-17  100  };
6ac73095 Beniamino Galvani 2015-01-17  101  

:::::: The code at line 99 was first introduced by commit
:::::: 6ac730951104a437bf828683bcf9ba66336c4fa7 pinctrl: add driver for Amlogic Meson SoCs

:::::: TO: Beniamino Galvani <b.galvani@gmail.com>
:::::: CC: Linus Walleij <linus.walleij@linaro.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61805 bytes --]

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-12  6:09     ` kbuild test robot
  0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-10-12  6:09 UTC (permalink / raw)
  To: Jerome Brunet
  Cc: kbuild-all, Linus Walleij, Kevin Hilman, Carlo Caione,
	Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

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

Hi Jerome,

[auto build test ERROR on pinctrl/devel]
[also build test ERROR on v4.14-rc4 next-20171009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jerome-Brunet/pinctrl-meson-prepare-for-new-SoC/20171012-094645
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All error/warnings (new ones prefixed by >>):

   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
>> arch/x86/include/asm/arch_hweight.h:17:17: error: expected identifier before string constant
    #define REG_OUT "a"
                    ^
>> drivers/pinctrl/meson/pinctrl-meson.h:74:2: note: in expansion of macro 'REG_OUT'
     REG_OUT,
     ^~~~~~~
   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
>> drivers/pinctrl/meson/pinctrl-meson.h:99:29: error: 'NUM_REG' undeclared here (not in a function)
     struct meson_reg_desc regs[NUM_REG];
                                ^~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_direction_output':
>> arch/x86/include/asm/arch_hweight.h:17:17: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_OUT "a"
                    ^
>> drivers/pinctrl/meson/pinctrl-meson.c:446:37: note: in expansion of macro 'REG_OUT'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_set':
>> arch/x86/include/asm/arch_hweight.h:17:17: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_OUT "a"
                    ^
   drivers/pinctrl/meson/pinctrl-meson.c:462:37: note: in expansion of macro 'REG_OUT'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_get':
   arch/x86/include/asm/arch_hweight.h:16:16: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_IN "a"
                   ^
>> drivers/pinctrl/meson/pinctrl-meson.c:478:37: note: in expansion of macro 'REG_IN'
     meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
                                        ^~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~

vim +/NUM_REG +99 drivers/pinctrl/meson/pinctrl-meson.h

6ac73095 Beniamino Galvani 2015-01-17   66  
6ac73095 Beniamino Galvani 2015-01-17   67  /**
6ac73095 Beniamino Galvani 2015-01-17   68   * enum meson_reg_type - type of registers encoded in @meson_reg_desc
6ac73095 Beniamino Galvani 2015-01-17   69   */
6ac73095 Beniamino Galvani 2015-01-17   70  enum meson_reg_type {
6ac73095 Beniamino Galvani 2015-01-17   71  	REG_PULLEN,
6ac73095 Beniamino Galvani 2015-01-17   72  	REG_PULL,
6ac73095 Beniamino Galvani 2015-01-17   73  	REG_DIR,
6ac73095 Beniamino Galvani 2015-01-17  @74  	REG_OUT,
6ac73095 Beniamino Galvani 2015-01-17   75  	REG_IN,
6ac73095 Beniamino Galvani 2015-01-17   76  	NUM_REG,
6ac73095 Beniamino Galvani 2015-01-17   77  };
6ac73095 Beniamino Galvani 2015-01-17   78  
6ac73095 Beniamino Galvani 2015-01-17   79  /**
6ac73095 Beniamino Galvani 2015-01-17   80   * struct meson bank
6ac73095 Beniamino Galvani 2015-01-17   81   *
6ac73095 Beniamino Galvani 2015-01-17   82   * @name:	bank name
6ac73095 Beniamino Galvani 2015-01-17   83   * @first:	first pin of the bank
6ac73095 Beniamino Galvani 2015-01-17   84   * @last:	last pin of the bank
6c9dc843 Jerome Brunet     2017-06-08   85   * @irq:	hwirq base number of the bank
6ac73095 Beniamino Galvani 2015-01-17   86   * @regs:	array of register descriptors
6ac73095 Beniamino Galvani 2015-01-17   87   *
6ac73095 Beniamino Galvani 2015-01-17   88   * A bank represents a set of pins controlled by a contiguous set of
6ac73095 Beniamino Galvani 2015-01-17   89   * bits in the domain registers. The structure specifies which bits in
6ac73095 Beniamino Galvani 2015-01-17   90   * the regmap control the different functionalities. Each member of
6ac73095 Beniamino Galvani 2015-01-17   91   * the @regs array refers to the first pin of the bank.
6ac73095 Beniamino Galvani 2015-01-17   92   */
6ac73095 Beniamino Galvani 2015-01-17   93  struct meson_bank {
6ac73095 Beniamino Galvani 2015-01-17   94  	const char *name;
6ac73095 Beniamino Galvani 2015-01-17   95  	unsigned int first;
6ac73095 Beniamino Galvani 2015-01-17   96  	unsigned int last;
6c9dc843 Jerome Brunet     2017-06-08   97  	int irq_first;
6c9dc843 Jerome Brunet     2017-06-08   98  	int irq_last;
6ac73095 Beniamino Galvani 2015-01-17  @99  	struct meson_reg_desc regs[NUM_REG];
6ac73095 Beniamino Galvani 2015-01-17  100  };
6ac73095 Beniamino Galvani 2015-01-17  101  

:::::: The code at line 99 was first introduced by commit
:::::: 6ac730951104a437bf828683bcf9ba66336c4fa7 pinctrl: add driver for Amlogic Meson SoCs

:::::: TO: Beniamino Galvani <b.galvani@gmail.com>
:::::: CC: Linus Walleij <linus.walleij@linaro.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61805 bytes --]

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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-12  6:09     ` kbuild test robot
  0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-10-12  6:09 UTC (permalink / raw)
  To: linus-amlogic

Hi Jerome,

[auto build test ERROR on pinctrl/devel]
[also build test ERROR on v4.14-rc4 next-20171009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jerome-Brunet/pinctrl-meson-prepare-for-new-SoC/20171012-094645
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All error/warnings (new ones prefixed by >>):

   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
>> arch/x86/include/asm/arch_hweight.h:17:17: error: expected identifier before string constant
    #define REG_OUT "a"
                    ^
>> drivers/pinctrl/meson/pinctrl-meson.h:74:2: note: in expansion of macro 'REG_OUT'
     REG_OUT,
     ^~~~~~~
   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
>> drivers/pinctrl/meson/pinctrl-meson.h:99:29: error: 'NUM_REG' undeclared here (not in a function)
     struct meson_reg_desc regs[NUM_REG];
                                ^~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_direction_output':
>> arch/x86/include/asm/arch_hweight.h:17:17: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_OUT "a"
                    ^
>> drivers/pinctrl/meson/pinctrl-meson.c:446:37: note: in expansion of macro 'REG_OUT'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_set':
>> arch/x86/include/asm/arch_hweight.h:17:17: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_OUT "a"
                    ^
   drivers/pinctrl/meson/pinctrl-meson.c:462:37: note: in expansion of macro 'REG_OUT'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   In file included from arch/x86/include/asm/bitops.h:513:0,
                    from include/linux/bitops.h:37,
                    from include/linux/kernel.h:10,
                    from include/linux/list.h:8,
                    from include/linux/kobject.h:20,
                    from include/linux/device.h:17,
                    from drivers/pinctrl/meson/pinctrl-meson.c:47:
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_get':
   arch/x86/include/asm/arch_hweight.h:16:16: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
    #define REG_IN "a"
                   ^
>> drivers/pinctrl/meson/pinctrl-meson.c:478:37: note: in expansion of macro 'REG_IN'
     meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
                                        ^~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~

vim +/NUM_REG +99 drivers/pinctrl/meson/pinctrl-meson.h

6ac73095 Beniamino Galvani 2015-01-17   66  
6ac73095 Beniamino Galvani 2015-01-17   67  /**
6ac73095 Beniamino Galvani 2015-01-17   68   * enum meson_reg_type - type of registers encoded in @meson_reg_desc
6ac73095 Beniamino Galvani 2015-01-17   69   */
6ac73095 Beniamino Galvani 2015-01-17   70  enum meson_reg_type {
6ac73095 Beniamino Galvani 2015-01-17   71  	REG_PULLEN,
6ac73095 Beniamino Galvani 2015-01-17   72  	REG_PULL,
6ac73095 Beniamino Galvani 2015-01-17   73  	REG_DIR,
6ac73095 Beniamino Galvani 2015-01-17  @74  	REG_OUT,
6ac73095 Beniamino Galvani 2015-01-17   75  	REG_IN,
6ac73095 Beniamino Galvani 2015-01-17   76  	NUM_REG,
6ac73095 Beniamino Galvani 2015-01-17   77  };
6ac73095 Beniamino Galvani 2015-01-17   78  
6ac73095 Beniamino Galvani 2015-01-17   79  /**
6ac73095 Beniamino Galvani 2015-01-17   80   * struct meson bank
6ac73095 Beniamino Galvani 2015-01-17   81   *
6ac73095 Beniamino Galvani 2015-01-17   82   * @name:	bank name
6ac73095 Beniamino Galvani 2015-01-17   83   * @first:	first pin of the bank
6ac73095 Beniamino Galvani 2015-01-17   84   * @last:	last pin of the bank
6c9dc843 Jerome Brunet     2017-06-08   85   * @irq:	hwirq base number of the bank
6ac73095 Beniamino Galvani 2015-01-17   86   * @regs:	array of register descriptors
6ac73095 Beniamino Galvani 2015-01-17   87   *
6ac73095 Beniamino Galvani 2015-01-17   88   * A bank represents a set of pins controlled by a contiguous set of
6ac73095 Beniamino Galvani 2015-01-17   89   * bits in the domain registers. The structure specifies which bits in
6ac73095 Beniamino Galvani 2015-01-17   90   * the regmap control the different functionalities. Each member of
6ac73095 Beniamino Galvani 2015-01-17   91   * the @regs array refers to the first pin of the bank.
6ac73095 Beniamino Galvani 2015-01-17   92   */
6ac73095 Beniamino Galvani 2015-01-17   93  struct meson_bank {
6ac73095 Beniamino Galvani 2015-01-17   94  	const char *name;
6ac73095 Beniamino Galvani 2015-01-17   95  	unsigned int first;
6ac73095 Beniamino Galvani 2015-01-17   96  	unsigned int last;
6c9dc843 Jerome Brunet     2017-06-08   97  	int irq_first;
6c9dc843 Jerome Brunet     2017-06-08   98  	int irq_last;
6ac73095 Beniamino Galvani 2015-01-17  @99  	struct meson_reg_desc regs[NUM_REG];
6ac73095 Beniamino Galvani 2015-01-17  100  };
6ac73095 Beniamino Galvani 2015-01-17  101  

:::::: The code at line 99 was first introduced by commit
:::::: 6ac730951104a437bf828683bcf9ba66336c4fa7 pinctrl: add driver for Amlogic Meson SoCs

:::::: TO: Beniamino Galvani <b.galvani@gmail.com>
:::::: CC: Linus Walleij <linus.walleij@linaro.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 61805 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20171012/3ba32933/attachment.gz>

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
  2017-10-09 10:17   ` Jerome Brunet
  (?)
@ 2017-10-12 11:12     ` kbuild test robot
  -1 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-10-12 11:12 UTC (permalink / raw)
  Cc: kbuild-all, Linus Walleij, Kevin Hilman, Carlo Caione,
	Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

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

Hi Jerome,

[auto build test ERROR on pinctrl/devel]
[also build test ERROR on v4.14-rc4 next-20171009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jerome-Brunet/pinctrl-meson-prepare-for-new-SoC/20171012-094645
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-allyesconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
>> drivers/pinctrl/meson/pinctrl-meson.h:74:2: error: expected identifier before string constant
     REG_OUT,
     ^~~
   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
   drivers/pinctrl/meson/pinctrl-meson.h:99:29: error: 'NUM_REG' undeclared here (not in a function)
     struct meson_reg_desc regs[NUM_REG];
                                ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_direction_output':
>> drivers/pinctrl/meson/pinctrl-meson.c:446:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_set':
   drivers/pinctrl/meson/pinctrl-meson.c:462:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_get':
   drivers/pinctrl/meson/pinctrl-meson.c:478:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~

vim +74 drivers/pinctrl/meson/pinctrl-meson.h

6ac73095 Beniamino Galvani 2015-01-17  66  
6ac73095 Beniamino Galvani 2015-01-17  67  /**
6ac73095 Beniamino Galvani 2015-01-17  68   * enum meson_reg_type - type of registers encoded in @meson_reg_desc
6ac73095 Beniamino Galvani 2015-01-17  69   */
6ac73095 Beniamino Galvani 2015-01-17  70  enum meson_reg_type {
6ac73095 Beniamino Galvani 2015-01-17  71  	REG_PULLEN,
6ac73095 Beniamino Galvani 2015-01-17  72  	REG_PULL,
6ac73095 Beniamino Galvani 2015-01-17  73  	REG_DIR,
6ac73095 Beniamino Galvani 2015-01-17 @74  	REG_OUT,
6ac73095 Beniamino Galvani 2015-01-17  75  	REG_IN,
6ac73095 Beniamino Galvani 2015-01-17  76  	NUM_REG,
6ac73095 Beniamino Galvani 2015-01-17  77  };
6ac73095 Beniamino Galvani 2015-01-17  78  

:::::: The code at line 74 was first introduced by commit
:::::: 6ac730951104a437bf828683bcf9ba66336c4fa7 pinctrl: add driver for Amlogic Meson SoCs

:::::: TO: Beniamino Galvani <b.galvani@gmail.com>
:::::: CC: Linus Walleij <linus.walleij@linaro.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61108 bytes --]

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

* Re: [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-12 11:12     ` kbuild test robot
  0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-10-12 11:12 UTC (permalink / raw)
  To: Jerome Brunet
  Cc: kbuild-all, Linus Walleij, Kevin Hilman, Carlo Caione,
	Jerome Brunet, linux-gpio, linux-amlogic, linux-kernel

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

Hi Jerome,

[auto build test ERROR on pinctrl/devel]
[also build test ERROR on v4.14-rc4 next-20171009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jerome-Brunet/pinctrl-meson-prepare-for-new-SoC/20171012-094645
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-allyesconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
>> drivers/pinctrl/meson/pinctrl-meson.h:74:2: error: expected identifier before string constant
     REG_OUT,
     ^~~
   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
   drivers/pinctrl/meson/pinctrl-meson.h:99:29: error: 'NUM_REG' undeclared here (not in a function)
     struct meson_reg_desc regs[NUM_REG];
                                ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_direction_output':
>> drivers/pinctrl/meson/pinctrl-meson.c:446:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_set':
   drivers/pinctrl/meson/pinctrl-meson.c:462:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_get':
   drivers/pinctrl/meson/pinctrl-meson.c:478:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~

vim +74 drivers/pinctrl/meson/pinctrl-meson.h

6ac73095 Beniamino Galvani 2015-01-17  66  
6ac73095 Beniamino Galvani 2015-01-17  67  /**
6ac73095 Beniamino Galvani 2015-01-17  68   * enum meson_reg_type - type of registers encoded in @meson_reg_desc
6ac73095 Beniamino Galvani 2015-01-17  69   */
6ac73095 Beniamino Galvani 2015-01-17  70  enum meson_reg_type {
6ac73095 Beniamino Galvani 2015-01-17  71  	REG_PULLEN,
6ac73095 Beniamino Galvani 2015-01-17  72  	REG_PULL,
6ac73095 Beniamino Galvani 2015-01-17  73  	REG_DIR,
6ac73095 Beniamino Galvani 2015-01-17 @74  	REG_OUT,
6ac73095 Beniamino Galvani 2015-01-17  75  	REG_IN,
6ac73095 Beniamino Galvani 2015-01-17  76  	NUM_REG,
6ac73095 Beniamino Galvani 2015-01-17  77  };
6ac73095 Beniamino Galvani 2015-01-17  78  

:::::: The code at line 74 was first introduced by commit
:::::: 6ac730951104a437bf828683bcf9ba66336c4fa7 pinctrl: add driver for Amlogic Meson SoCs

:::::: TO: Beniamino Galvani <b.galvani@gmail.com>
:::::: CC: Linus Walleij <linus.walleij@linaro.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61108 bytes --]

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

* [PATCH 1/2] pinctrl: meson: separate soc drivers
@ 2017-10-12 11:12     ` kbuild test robot
  0 siblings, 0 replies; 22+ messages in thread
From: kbuild test robot @ 2017-10-12 11:12 UTC (permalink / raw)
  To: linus-amlogic

Hi Jerome,

[auto build test ERROR on pinctrl/devel]
[also build test ERROR on v4.14-rc4 next-20171009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jerome-Brunet/pinctrl-meson-prepare-for-new-SoC/20171012-094645
base:   https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-allyesconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
>> drivers/pinctrl/meson/pinctrl-meson.h:74:2: error: expected identifier before string constant
     REG_OUT,
     ^~~
   In file included from drivers/pinctrl/meson/pinctrl-meson.c:63:0:
   drivers/pinctrl/meson/pinctrl-meson.h:99:29: error: 'NUM_REG' undeclared here (not in a function)
     struct meson_reg_desc regs[NUM_REG];
                                ^~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_direction_output':
>> drivers/pinctrl/meson/pinctrl-meson.c:446:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_set':
   drivers/pinctrl/meson/pinctrl-meson.c:462:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_OUT, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~
   drivers/pinctrl/meson/pinctrl-meson.c: In function 'meson_gpio_get':
   drivers/pinctrl/meson/pinctrl-meson.c:478:37: error: incompatible type for argument 3 of 'meson_calc_reg_and_bit'
     meson_calc_reg_and_bit(bank, gpio, REG_IN, &reg, &bit);
                                        ^~~
   drivers/pinctrl/meson/pinctrl-meson.c:99:13: note: expected 'enum meson_reg_type' but argument is of type 'char *'
    static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,
                ^~~~~~~~~~~~~~~~~~~~~~

vim +74 drivers/pinctrl/meson/pinctrl-meson.h

6ac73095 Beniamino Galvani 2015-01-17  66  
6ac73095 Beniamino Galvani 2015-01-17  67  /**
6ac73095 Beniamino Galvani 2015-01-17  68   * enum meson_reg_type - type of registers encoded in @meson_reg_desc
6ac73095 Beniamino Galvani 2015-01-17  69   */
6ac73095 Beniamino Galvani 2015-01-17  70  enum meson_reg_type {
6ac73095 Beniamino Galvani 2015-01-17  71  	REG_PULLEN,
6ac73095 Beniamino Galvani 2015-01-17  72  	REG_PULL,
6ac73095 Beniamino Galvani 2015-01-17  73  	REG_DIR,
6ac73095 Beniamino Galvani 2015-01-17 @74  	REG_OUT,
6ac73095 Beniamino Galvani 2015-01-17  75  	REG_IN,
6ac73095 Beniamino Galvani 2015-01-17  76  	NUM_REG,
6ac73095 Beniamino Galvani 2015-01-17  77  };
6ac73095 Beniamino Galvani 2015-01-17  78  

:::::: The code at line 74 was first introduced by commit
:::::: 6ac730951104a437bf828683bcf9ba66336c4fa7 pinctrl: add driver for Amlogic Meson SoCs

:::::: TO: Beniamino Galvani <b.galvani@gmail.com>
:::::: CC: Linus Walleij <linus.walleij@linaro.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 61108 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-amlogic/attachments/20171012/58baf2fc/attachment.gz>

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

end of thread, other threads:[~2017-10-12 11:13 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-09 10:17 [PATCH 0/2] pinctrl: meson: prepare for new SoC Jerome Brunet
2017-10-09 10:17 ` Jerome Brunet
2017-10-09 10:17 ` [PATCH 1/2] pinctrl: meson: separate soc drivers Jerome Brunet
2017-10-09 10:17   ` Jerome Brunet
2017-10-09 11:35   ` Neil Armstrong
2017-10-09 11:35     ` Neil Armstrong
2017-10-09 13:11     ` Jerome Brunet
2017-10-09 13:11       ` Jerome Brunet
2017-10-11  2:55     ` Yixun Lan
2017-10-11  2:55       ` Yixun Lan
2017-10-12  6:09   ` kbuild test robot
2017-10-12  6:09     ` kbuild test robot
2017-10-12  6:09     ` kbuild test robot
2017-10-12 11:12   ` kbuild test robot
2017-10-12 11:12     ` kbuild test robot
2017-10-12 11:12     ` kbuild test robot
2017-10-09 10:17 ` [PATCH 2/2] pinctrl: meson: rework pinmux ops Jerome Brunet
2017-10-09 10:17   ` Jerome Brunet
2017-10-09 11:42   ` Neil Armstrong
2017-10-09 11:42     ` Neil Armstrong
2017-10-09 13:25     ` Jerome Brunet
2017-10-09 13:25       ` Jerome Brunet

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.