Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: meson: separate soc drivers

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.

Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
Reviewed-by: Kevin Hilman <khilman@baylibre.com>
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Jerome Brunet and committed by
Linus Walleij
277d14eb fbe87498

+139 -79
+1 -10
drivers/pinctrl/Kconfig
··· 167 167 This provides a GPIO interface supporting inputs and outputs. 168 168 The I2C versions of the chips can be used as interrupt-controller. 169 169 170 - config PINCTRL_MESON 171 - bool 172 - depends on OF 173 - select PINMUX 174 - select PINCONF 175 - select GENERIC_PINCONF 176 - select GPIOLIB 177 - select OF_GPIO 178 - select REGMAP_MMIO 179 - 180 170 config PINCTRL_OXNAS 181 171 bool 182 172 depends on OF ··· 359 369 source "drivers/pinctrl/vt8500/Kconfig" 360 370 source "drivers/pinctrl/mediatek/Kconfig" 361 371 source "drivers/pinctrl/zte/Kconfig" 372 + source "drivers/pinctrl/meson/Kconfig" 362 373 363 374 config PINCTRL_XWAY 364 375 bool
+34
drivers/pinctrl/meson/Kconfig
··· 1 + menuconfig PINCTRL_MESON 2 + bool "Amlogic SoC pinctrl drivers" 3 + depends on ARCH_MESON 4 + depends on OF 5 + select PINMUX 6 + select PINCONF 7 + select GENERIC_PINCONF 8 + select GPIOLIB 9 + select OF_GPIO 10 + select REGMAP_MMIO 11 + 12 + if PINCTRL_MESON 13 + 14 + config PINCTRL_MESON8 15 + bool "Meson 8 SoC pinctrl driver" 16 + depends on ARM 17 + default y 18 + 19 + config PINCTRL_MESON8B 20 + bool "Meson 8b SoC pinctrl driver" 21 + depends on ARM 22 + default y 23 + 24 + config PINCTRL_MESON_GXBB 25 + bool "Meson gxbb SoC pinctrl driver" 26 + depends on ARM64 27 + default y 28 + 29 + config PINCTRL_MESON_GXL 30 + bool "Meson gxl SoC pinctrl driver" 31 + depends on ARM64 32 + default y 33 + 34 + endif
+5 -3
drivers/pinctrl/meson/Makefile
··· 1 - obj-y += pinctrl-meson8.o pinctrl-meson8b.o 2 - obj-y += pinctrl-meson-gxbb.o pinctrl-meson-gxl.o 3 - obj-y += pinctrl-meson.o 1 + obj-$(CONFIG_PINCTRL_MESON) += pinctrl-meson.o 2 + obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o 3 + obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o 4 + obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o 5 + obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
+23 -2
drivers/pinctrl/meson/pinctrl-meson-gxbb.c
··· 824 824 BANK("AO", GPIOAO_0, GPIOAO_13, 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 825 825 }; 826 826 827 - struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = { 827 + static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = { 828 828 .name = "periphs-banks", 829 829 .pins = meson_gxbb_periphs_pins, 830 830 .groups = meson_gxbb_periphs_groups, ··· 836 836 .num_banks = ARRAY_SIZE(meson_gxbb_periphs_banks), 837 837 }; 838 838 839 - struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = { 839 + static struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = { 840 840 .name = "aobus-banks", 841 841 .pins = meson_gxbb_aobus_pins, 842 842 .groups = meson_gxbb_aobus_groups, ··· 847 847 .num_funcs = ARRAY_SIZE(meson_gxbb_aobus_functions), 848 848 .num_banks = ARRAY_SIZE(meson_gxbb_aobus_banks), 849 849 }; 850 + 851 + static const struct of_device_id meson_gxbb_pinctrl_dt_match[] = { 852 + { 853 + .compatible = "amlogic,meson-gxbb-periphs-pinctrl", 854 + .data = &meson_gxbb_periphs_pinctrl_data, 855 + }, 856 + { 857 + .compatible = "amlogic,meson-gxbb-aobus-pinctrl", 858 + .data = &meson_gxbb_aobus_pinctrl_data, 859 + }, 860 + { }, 861 + }; 862 + 863 + static struct platform_driver meson_gxbb_pinctrl_driver = { 864 + .probe = meson_pinctrl_probe, 865 + .driver = { 866 + .name = "meson-gxbb-pinctrl", 867 + .of_match_table = meson_gxbb_pinctrl_dt_match, 868 + }, 869 + }; 870 + builtin_platform_driver(meson_gxbb_pinctrl_driver);
+23 -2
drivers/pinctrl/meson/pinctrl-meson-gxl.c
··· 809 809 BANK("AO", GPIOAO_0, GPIOAO_9, 0, 9, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 810 810 }; 811 811 812 - struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = { 812 + static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = { 813 813 .name = "periphs-banks", 814 814 .pins = meson_gxl_periphs_pins, 815 815 .groups = meson_gxl_periphs_groups, ··· 821 821 .num_banks = ARRAY_SIZE(meson_gxl_periphs_banks), 822 822 }; 823 823 824 - struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = { 824 + static struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = { 825 825 .name = "aobus-banks", 826 826 .pins = meson_gxl_aobus_pins, 827 827 .groups = meson_gxl_aobus_groups, ··· 832 832 .num_funcs = ARRAY_SIZE(meson_gxl_aobus_functions), 833 833 .num_banks = ARRAY_SIZE(meson_gxl_aobus_banks), 834 834 }; 835 + 836 + static const struct of_device_id meson_gxl_pinctrl_dt_match[] = { 837 + { 838 + .compatible = "amlogic,meson-gxl-periphs-pinctrl", 839 + .data = &meson_gxl_periphs_pinctrl_data, 840 + }, 841 + { 842 + .compatible = "amlogic,meson-gxl-aobus-pinctrl", 843 + .data = &meson_gxl_aobus_pinctrl_data, 844 + }, 845 + { }, 846 + }; 847 + 848 + static struct platform_driver meson_gxl_pinctrl_driver = { 849 + .probe = meson_pinctrl_probe, 850 + .driver = { 851 + .name = "meson-gxl-pinctrl", 852 + .of_match_table = meson_gxl_pinctrl_dt_match, 853 + }, 854 + }; 855 + builtin_platform_driver(meson_gxl_pinctrl_driver);
+4 -50
drivers/pinctrl/meson/pinctrl-meson.c
··· 50 50 #include <linux/io.h> 51 51 #include <linux/of.h> 52 52 #include <linux/of_address.h> 53 + #include <linux/of_device.h> 53 54 #include <linux/pinctrl/pinconf-generic.h> 54 55 #include <linux/pinctrl/pinconf.h> 55 56 #include <linux/pinctrl/pinctrl.h> ··· 482 481 return !!(val & BIT(bit)); 483 482 } 484 483 485 - static const struct of_device_id meson_pinctrl_dt_match[] = { 486 - { 487 - .compatible = "amlogic,meson8-cbus-pinctrl", 488 - .data = &meson8_cbus_pinctrl_data, 489 - }, 490 - { 491 - .compatible = "amlogic,meson8b-cbus-pinctrl", 492 - .data = &meson8b_cbus_pinctrl_data, 493 - }, 494 - { 495 - .compatible = "amlogic,meson8-aobus-pinctrl", 496 - .data = &meson8_aobus_pinctrl_data, 497 - }, 498 - { 499 - .compatible = "amlogic,meson8b-aobus-pinctrl", 500 - .data = &meson8b_aobus_pinctrl_data, 501 - }, 502 - { 503 - .compatible = "amlogic,meson-gxbb-periphs-pinctrl", 504 - .data = &meson_gxbb_periphs_pinctrl_data, 505 - }, 506 - { 507 - .compatible = "amlogic,meson-gxbb-aobus-pinctrl", 508 - .data = &meson_gxbb_aobus_pinctrl_data, 509 - }, 510 - { 511 - .compatible = "amlogic,meson-gxl-periphs-pinctrl", 512 - .data = &meson_gxl_periphs_pinctrl_data, 513 - }, 514 - { 515 - .compatible = "amlogic,meson-gxl-aobus-pinctrl", 516 - .data = &meson_gxl_aobus_pinctrl_data, 517 - }, 518 - { }, 519 - }; 520 - 521 484 static int meson_gpiolib_register(struct meson_pinctrl *pc) 522 485 { 523 486 int ret; ··· 589 624 return 0; 590 625 } 591 626 592 - static int meson_pinctrl_probe(struct platform_device *pdev) 627 + int meson_pinctrl_probe(struct platform_device *pdev) 593 628 { 594 - const struct of_device_id *match; 595 629 struct device *dev = &pdev->dev; 596 630 struct meson_pinctrl *pc; 597 631 int ret; ··· 600 636 return -ENOMEM; 601 637 602 638 pc->dev = dev; 603 - match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node); 604 - pc->data = (struct meson_pinctrl_data *) match->data; 639 + pc->data = (struct meson_pinctrl_data *) of_device_get_match_data(dev); 605 640 606 - ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node); 641 + ret = meson_pinctrl_parse_dt(pc, dev->of_node); 607 642 if (ret) 608 643 return ret; 609 644 ··· 622 659 623 660 return meson_gpiolib_register(pc); 624 661 } 625 - 626 - static struct platform_driver meson_pinctrl_driver = { 627 - .probe = meson_pinctrl_probe, 628 - .driver = { 629 - .name = "meson-pinctrl", 630 - .of_match_table = meson_pinctrl_dt_match, 631 - }, 632 - }; 633 - builtin_platform_driver(meson_pinctrl_driver);
+3 -8
drivers/pinctrl/meson/pinctrl-meson.h
··· 13 13 14 14 #include <linux/gpio.h> 15 15 #include <linux/pinctrl/pinctrl.h> 16 + #include <linux/platform_device.h> 16 17 #include <linux/regmap.h> 17 18 #include <linux/types.h> 18 19 ··· 166 165 167 166 #define MESON_PIN(x) PINCTRL_PIN(x, #x) 168 167 169 - extern struct meson_pinctrl_data meson8_cbus_pinctrl_data; 170 - extern struct meson_pinctrl_data meson8_aobus_pinctrl_data; 171 - extern struct meson_pinctrl_data meson8b_cbus_pinctrl_data; 172 - extern struct meson_pinctrl_data meson8b_aobus_pinctrl_data; 173 - extern struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data; 174 - extern struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data; 175 - extern struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data; 176 - extern struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data; 168 + /* Common probe function */ 169 + int meson_pinctrl_probe(struct platform_device *pdev);
+23 -2
drivers/pinctrl/meson/pinctrl-meson8.c
··· 1044 1044 BANK("AO", GPIOAO_0, GPIO_TEST_N, 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 1045 1045 }; 1046 1046 1047 - struct meson_pinctrl_data meson8_cbus_pinctrl_data = { 1047 + static struct meson_pinctrl_data meson8_cbus_pinctrl_data = { 1048 1048 .name = "cbus-banks", 1049 1049 .pins = meson8_cbus_pins, 1050 1050 .groups = meson8_cbus_groups, ··· 1056 1056 .num_banks = ARRAY_SIZE(meson8_cbus_banks), 1057 1057 }; 1058 1058 1059 - struct meson_pinctrl_data meson8_aobus_pinctrl_data = { 1059 + static struct meson_pinctrl_data meson8_aobus_pinctrl_data = { 1060 1060 .name = "ao-bank", 1061 1061 .pins = meson8_aobus_pins, 1062 1062 .groups = meson8_aobus_groups, ··· 1067 1067 .num_funcs = ARRAY_SIZE(meson8_aobus_functions), 1068 1068 .num_banks = ARRAY_SIZE(meson8_aobus_banks), 1069 1069 }; 1070 + 1071 + static const struct of_device_id meson8_pinctrl_dt_match[] = { 1072 + { 1073 + .compatible = "amlogic,meson8-cbus-pinctrl", 1074 + .data = &meson8_cbus_pinctrl_data, 1075 + }, 1076 + { 1077 + .compatible = "amlogic,meson8-aobus-pinctrl", 1078 + .data = &meson8_aobus_pinctrl_data, 1079 + }, 1080 + { }, 1081 + }; 1082 + 1083 + static struct platform_driver meson8_pinctrl_driver = { 1084 + .probe = meson_pinctrl_probe, 1085 + .driver = { 1086 + .name = "meson8-pinctrl", 1087 + .of_match_table = meson8_pinctrl_dt_match, 1088 + }, 1089 + }; 1090 + builtin_platform_driver(meson8_pinctrl_driver);
+23 -2
drivers/pinctrl/meson/pinctrl-meson8b.c
··· 904 904 BANK("AO", GPIOAO_0, GPIO_TEST_N, 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 905 905 }; 906 906 907 - struct meson_pinctrl_data meson8b_cbus_pinctrl_data = { 907 + static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = { 908 908 .name = "cbus-banks", 909 909 .pins = meson8b_cbus_pins, 910 910 .groups = meson8b_cbus_groups, ··· 916 916 .num_banks = ARRAY_SIZE(meson8b_cbus_banks), 917 917 }; 918 918 919 - struct meson_pinctrl_data meson8b_aobus_pinctrl_data = { 919 + static struct meson_pinctrl_data meson8b_aobus_pinctrl_data = { 920 920 .name = "aobus-banks", 921 921 .pins = meson8b_aobus_pins, 922 922 .groups = meson8b_aobus_groups, ··· 927 927 .num_funcs = ARRAY_SIZE(meson8b_aobus_functions), 928 928 .num_banks = ARRAY_SIZE(meson8b_aobus_banks), 929 929 }; 930 + 931 + static const struct of_device_id meson8b_pinctrl_dt_match[] = { 932 + { 933 + .compatible = "amlogic,meson8b-cbus-pinctrl", 934 + .data = &meson8b_cbus_pinctrl_data, 935 + }, 936 + { 937 + .compatible = "amlogic,meson8b-aobus-pinctrl", 938 + .data = &meson8b_aobus_pinctrl_data, 939 + }, 940 + { }, 941 + }; 942 + 943 + static struct platform_driver meson8b_pinctrl_driver = { 944 + .probe = meson_pinctrl_probe, 945 + .driver = { 946 + .name = "meson8b-pinctrl", 947 + .of_match_table = meson8b_pinctrl_dt_match, 948 + }, 949 + }; 950 + builtin_platform_driver(meson8b_pinctrl_driver);