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

pinctrl: samsung: Add exynos8895 SoC pinctrl configuration

Add support for the pin-controller found on the Exynos8895 SoC
used in Samsung Galaxy S8 and S8 Plus phones.

It has a newly applied pinctrl register layer for FSYS0 with a
different bank type offset that consists of the following bit
fields:

CON: 4, DAT: 1, PUD: 2, DRV: 3, CONPDN: 2, PUDPDN: 2

Signed-off-by: Ivaylo Ivanov <ivo.ivanov.ivanov1@gmail.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20240920154508.1618410-6-ivo.ivanov.ivanov1@gmail.com
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

authored by

Ivaylo Ivanov and committed by
Krzysztof Kozlowski
eed2e792 e2d58d1e

+150
+137
drivers/pinctrl/samsung/pinctrl-exynos-arm64.c
··· 58 58 .reg_offset = { 0x00, 0x04, 0x08, 0x0c, }, 59 59 }; 60 60 61 + /* 62 + * Bank type for non-alive type. Bit fields: 63 + * CON: 4, DAT: 1, PUD: 2, DRV: 3, CONPDN: 2, PUDPDN: 2 64 + */ 65 + static const struct samsung_pin_bank_type exynos8895_bank_type_off = { 66 + .fld_width = { 4, 1, 2, 3, 2, 2, }, 67 + .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, }, 68 + }; 69 + 61 70 /* Pad retention control code for accessing PMU regmap */ 62 71 static atomic_t exynos_shared_retention_refcnt; 63 72 ··· 873 864 const struct samsung_pinctrl_of_match_data exynosautov920_of_data __initconst = { 874 865 .ctrl = exynosautov920_pin_ctrl, 875 866 .num_ctrl = ARRAY_SIZE(exynosautov920_pin_ctrl), 867 + }; 868 + 869 + /* pin banks of exynos8895 pin-controller 0 (ALIVE) */ 870 + static const struct samsung_pin_bank_data exynos8895_pin_banks0[] __initconst = { 871 + EXYNOS_PIN_BANK_EINTW(8, 0x020, "gpa0", 0x00), 872 + EXYNOS_PIN_BANK_EINTW(8, 0x040, "gpa1", 0x04), 873 + EXYNOS_PIN_BANK_EINTW(8, 0x060, "gpa2", 0x08), 874 + EXYNOS_PIN_BANK_EINTW(8, 0x080, "gpa3", 0x0c), 875 + EXYNOS_PIN_BANK_EINTW(7, 0x0a0, "gpa4", 0x24), 876 + }; 877 + 878 + /* pin banks of exynos8895 pin-controller 1 (ABOX) */ 879 + static const struct samsung_pin_bank_data exynos8895_pin_banks1[] __initconst = { 880 + EXYNOS_PIN_BANK_EINTG(8, 0x000, "gph0", 0x00), 881 + EXYNOS_PIN_BANK_EINTG(7, 0x020, "gph1", 0x04), 882 + EXYNOS_PIN_BANK_EINTG(4, 0x040, "gph3", 0x08), 883 + }; 884 + 885 + /* pin banks of exynos8895 pin-controller 2 (VTS) */ 886 + static const struct samsung_pin_bank_data exynos8895_pin_banks2[] __initconst = { 887 + EXYNOS_PIN_BANK_EINTG(3, 0x000, "gph2", 0x00), 888 + }; 889 + 890 + /* pin banks of exynos8895 pin-controller 3 (FSYS0) */ 891 + static const struct samsung_pin_bank_data exynos8895_pin_banks3[] __initconst = { 892 + EXYNOS8895_PIN_BANK_EINTG(3, 0x000, "gpi0", 0x00), 893 + EXYNOS8895_PIN_BANK_EINTG(8, 0x020, "gpi1", 0x04), 894 + }; 895 + 896 + /* pin banks of exynos8895 pin-controller 4 (FSYS1) */ 897 + static const struct samsung_pin_bank_data exynos8895_pin_banks4[] __initconst = { 898 + EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj1", 0x00), 899 + EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpj0", 0x04), 900 + }; 901 + 902 + /* pin banks of exynos8895 pin-controller 5 (BUSC) */ 903 + static const struct samsung_pin_bank_data exynos8895_pin_banks5[] __initconst = { 904 + EXYNOS_PIN_BANK_EINTG(2, 0x000, "gpb2", 0x00), 905 + }; 906 + 907 + /* pin banks of exynos8895 pin-controller 6 (PERIC0) */ 908 + static const struct samsung_pin_bank_data exynos8895_pin_banks6[] __initconst = { 909 + EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpd0", 0x00), 910 + EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpd1", 0x04), 911 + EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpd2", 0x08), 912 + EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpd3", 0x0C), 913 + EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10), 914 + EXYNOS_PIN_BANK_EINTG(8, 0x0a0, "gpe7", 0x14), 915 + EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpf1", 0x18), 916 + }; 917 + 918 + /* pin banks of exynos8895 pin-controller 7 (PERIC1) */ 919 + static const struct samsung_pin_bank_data exynos8895_pin_banks7[] __initconst = { 920 + EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpb0", 0x00), 921 + EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpc0", 0x04), 922 + EXYNOS_PIN_BANK_EINTG(5, 0x040, "gpc1", 0x08), 923 + EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpc2", 0x0C), 924 + EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpc3", 0x10), 925 + EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpk0", 0x14), 926 + EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpe5", 0x18), 927 + EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe6", 0x1C), 928 + EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe2", 0x20), 929 + EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpe3", 0x24), 930 + EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe4", 0x28), 931 + EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpf0", 0x2C), 932 + EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe1", 0x30), 933 + EXYNOS_PIN_BANK_EINTG(2, 0x1a0, "gpg0", 0x34), 934 + }; 935 + 936 + static const struct samsung_pin_ctrl exynos8895_pin_ctrl[] __initconst = { 937 + { 938 + /* pin-controller instance 0 ALIVE data */ 939 + .pin_banks = exynos8895_pin_banks0, 940 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks0), 941 + .eint_gpio_init = exynos_eint_gpio_init, 942 + .eint_wkup_init = exynos_eint_wkup_init, 943 + .suspend = exynos_pinctrl_suspend, 944 + .resume = exynos_pinctrl_resume, 945 + }, { 946 + /* pin-controller instance 1 ABOX data */ 947 + .pin_banks = exynos8895_pin_banks1, 948 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks1), 949 + }, { 950 + /* pin-controller instance 2 VTS data */ 951 + .pin_banks = exynos8895_pin_banks2, 952 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks2), 953 + .eint_gpio_init = exynos_eint_gpio_init, 954 + }, { 955 + /* pin-controller instance 3 FSYS0 data */ 956 + .pin_banks = exynos8895_pin_banks3, 957 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks3), 958 + .eint_gpio_init = exynos_eint_gpio_init, 959 + .suspend = exynos_pinctrl_suspend, 960 + .resume = exynos_pinctrl_resume, 961 + }, { 962 + /* pin-controller instance 4 FSYS1 data */ 963 + .pin_banks = exynos8895_pin_banks4, 964 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks4), 965 + .eint_gpio_init = exynos_eint_gpio_init, 966 + .suspend = exynos_pinctrl_suspend, 967 + .resume = exynos_pinctrl_resume, 968 + }, { 969 + /* pin-controller instance 5 BUSC data */ 970 + .pin_banks = exynos8895_pin_banks5, 971 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks5), 972 + .eint_gpio_init = exynos_eint_gpio_init, 973 + .suspend = exynos_pinctrl_suspend, 974 + .resume = exynos_pinctrl_resume, 975 + }, { 976 + /* pin-controller instance 6 PERIC0 data */ 977 + .pin_banks = exynos8895_pin_banks6, 978 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks6), 979 + .eint_gpio_init = exynos_eint_gpio_init, 980 + .suspend = exynos_pinctrl_suspend, 981 + .resume = exynos_pinctrl_resume, 982 + }, { 983 + /* pin-controller instance 7 PERIC1 data */ 984 + .pin_banks = exynos8895_pin_banks7, 985 + .nr_banks = ARRAY_SIZE(exynos8895_pin_banks7), 986 + .eint_gpio_init = exynos_eint_gpio_init, 987 + .suspend = exynos_pinctrl_suspend, 988 + .resume = exynos_pinctrl_resume, 989 + }, 990 + }; 991 + 992 + const struct samsung_pinctrl_of_match_data exynos8895_of_data __initconst = { 993 + .ctrl = exynos8895_pin_ctrl, 994 + .num_ctrl = ARRAY_SIZE(exynos8895_pin_ctrl), 876 995 }; 877 996 878 997 /*
+10
drivers/pinctrl/samsung/pinctrl-exynos.h
··· 141 141 .name = id \ 142 142 } 143 143 144 + #define EXYNOS8895_PIN_BANK_EINTG(pins, reg, id, offs) \ 145 + { \ 146 + .type = &exynos8895_bank_type_off, \ 147 + .pctl_offset = reg, \ 148 + .nr_pins = pins, \ 149 + .eint_type = EINT_TYPE_GPIO, \ 150 + .eint_offset = offs, \ 151 + .name = id \ 152 + } 153 + 144 154 #define EXYNOSV920_PIN_BANK_EINTG(pins, reg, id, con_offs, mask_offs, pend_offs) \ 145 155 { \ 146 156 .type = &exynos850_bank_type_off, \
+2
drivers/pinctrl/samsung/pinctrl-samsung.c
··· 1477 1477 .data = &exynos7885_of_data }, 1478 1478 { .compatible = "samsung,exynos850-pinctrl", 1479 1479 .data = &exynos850_of_data }, 1480 + { .compatible = "samsung,exynos8895-pinctrl", 1481 + .data = &exynos8895_of_data }, 1480 1482 { .compatible = "samsung,exynosautov9-pinctrl", 1481 1483 .data = &exynosautov9_of_data }, 1482 1484 { .compatible = "samsung,exynosautov920-pinctrl",
+1
drivers/pinctrl/samsung/pinctrl-samsung.h
··· 384 384 extern const struct samsung_pinctrl_of_match_data exynos7_of_data; 385 385 extern const struct samsung_pinctrl_of_match_data exynos7885_of_data; 386 386 extern const struct samsung_pinctrl_of_match_data exynos850_of_data; 387 + extern const struct samsung_pinctrl_of_match_data exynos8895_of_data; 387 388 extern const struct samsung_pinctrl_of_match_data exynosautov9_of_data; 388 389 extern const struct samsung_pinctrl_of_match_data exynosautov920_of_data; 389 390 extern const struct samsung_pinctrl_of_match_data fsd_of_data;