15dc626f8SMasahiro Yamada /* 24e3d8406SMasahiro Yamada * Copyright (C) 2015-2016 Socionext Inc. 34e3d8406SMasahiro Yamada * Author: Masahiro Yamada <yamada.masahiro@socionext.com> 45dc626f8SMasahiro Yamada * 55dc626f8SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 65dc626f8SMasahiro Yamada */ 75dc626f8SMasahiro Yamada 85dc626f8SMasahiro Yamada #ifndef __PINCTRL_UNIPHIER_H__ 95dc626f8SMasahiro Yamada #define __PINCTRL_UNIPHIER_H__ 105dc626f8SMasahiro Yamada 118cc92b99SMasahiro Yamada #include <linux/bitops.h> 1284b8bf6dSMasahiro Yamada #include <linux/bug.h> 135dc626f8SMasahiro Yamada #include <linux/kernel.h> 145dc626f8SMasahiro Yamada #include <linux/types.h> 155dc626f8SMasahiro Yamada 165dc626f8SMasahiro Yamada #define UNIPHIER_PIN_ATTR_PACKED(iectrl) (iectrl) 175dc626f8SMasahiro Yamada uniphier_pin_get_iectrl(unsigned long data)185dc626f8SMasahiro Yamadastatic inline unsigned int uniphier_pin_get_iectrl(unsigned long data) 195dc626f8SMasahiro Yamada { 205dc626f8SMasahiro Yamada return data; 215dc626f8SMasahiro Yamada } 225dc626f8SMasahiro Yamada 235dc626f8SMasahiro Yamada /** 245dc626f8SMasahiro Yamada * struct uniphier_pinctrl_pin - pin data for UniPhier SoC 255dc626f8SMasahiro Yamada * 265dc626f8SMasahiro Yamada * @number: pin number 275dc626f8SMasahiro Yamada * @data: additional per-pin data 285dc626f8SMasahiro Yamada */ 295dc626f8SMasahiro Yamada struct uniphier_pinctrl_pin { 305dc626f8SMasahiro Yamada unsigned number; 315dc626f8SMasahiro Yamada unsigned long data; 325dc626f8SMasahiro Yamada }; 335dc626f8SMasahiro Yamada 345dc626f8SMasahiro Yamada /** 355dc626f8SMasahiro Yamada * struct uniphier_pinctrl_group - pin group data for UniPhier SoC 365dc626f8SMasahiro Yamada * 375dc626f8SMasahiro Yamada * @name: pin group name 385dc626f8SMasahiro Yamada * @pins: array of pins that belong to the group 395dc626f8SMasahiro Yamada * @num_pins: number of pins in the group 405dc626f8SMasahiro Yamada * @muxvals: array of values to be set to pinmux registers 415dc626f8SMasahiro Yamada */ 425dc626f8SMasahiro Yamada struct uniphier_pinctrl_group { 435dc626f8SMasahiro Yamada const char *name; 445dc626f8SMasahiro Yamada const unsigned *pins; 455dc626f8SMasahiro Yamada unsigned num_pins; 465e25b9d5SMasahiro Yamada const int *muxvals; 475dc626f8SMasahiro Yamada }; 485dc626f8SMasahiro Yamada 495dc626f8SMasahiro Yamada /** 505dc626f8SMasahiro Yamada * struct uniphier_pinctrl_socdata - SoC data for UniPhier pin controller 515dc626f8SMasahiro Yamada * 525dc626f8SMasahiro Yamada * @pins: array of pin data 535dc626f8SMasahiro Yamada * @pins_count: number of pin data 545dc626f8SMasahiro Yamada * @groups: array of pin group data 555dc626f8SMasahiro Yamada * @groups_count: number of pin group data 565dc626f8SMasahiro Yamada * @functions: array of pinmux function names 575dc626f8SMasahiro Yamada * @functions_count: number of pinmux functions 585dc626f8SMasahiro Yamada * @mux_bits: bit width of each pinmux register 595dc626f8SMasahiro Yamada * @reg_stride: stride of pinmux register address 608cc92b99SMasahiro Yamada * @caps: SoC-specific capability flag 615dc626f8SMasahiro Yamada */ 625dc626f8SMasahiro Yamada struct uniphier_pinctrl_socdata { 635dc626f8SMasahiro Yamada const struct uniphier_pinctrl_pin *pins; 645dc626f8SMasahiro Yamada int pins_count; 655dc626f8SMasahiro Yamada const struct uniphier_pinctrl_group *groups; 665dc626f8SMasahiro Yamada int groups_count; 675dc626f8SMasahiro Yamada const char * const *functions; 685dc626f8SMasahiro Yamada int functions_count; 698cc92b99SMasahiro Yamada unsigned caps; 70*6a6b9d5dSMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_PUPD_SIMPLE BIT(3) 71bbb11980SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL BIT(2) 72bbb11980SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE BIT(1) 73bbb11980SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_MUX_4BIT BIT(0) 745dc626f8SMasahiro Yamada }; 755dc626f8SMasahiro Yamada 765dc626f8SMasahiro Yamada #define UNIPHIER_PINCTRL_PIN(a, b) \ 775dc626f8SMasahiro Yamada { \ 785dc626f8SMasahiro Yamada .number = a, \ 795dc626f8SMasahiro Yamada .data = UNIPHIER_PIN_ATTR_PACKED(b), \ 805dc626f8SMasahiro Yamada } 815dc626f8SMasahiro Yamada 8264c1cc4cSMasahiro Yamada #define __UNIPHIER_PINCTRL_GROUP(grp) \ 835dc626f8SMasahiro Yamada { \ 845dc626f8SMasahiro Yamada .name = #grp, \ 855dc626f8SMasahiro Yamada .pins = grp##_pins, \ 865dc626f8SMasahiro Yamada .num_pins = ARRAY_SIZE(grp##_pins), \ 875dc626f8SMasahiro Yamada .muxvals = grp##_muxvals + \ 885dc626f8SMasahiro Yamada BUILD_BUG_ON_ZERO(ARRAY_SIZE(grp##_pins) != \ 895dc626f8SMasahiro Yamada ARRAY_SIZE(grp##_muxvals)), \ 905dc626f8SMasahiro Yamada } 915dc626f8SMasahiro Yamada 9264c1cc4cSMasahiro Yamada #define __UNIPHIER_PINMUX_FUNCTION(func) #func 9364c1cc4cSMasahiro Yamada 9464c1cc4cSMasahiro Yamada #ifdef CONFIG_SPL_BUILD 95935e09cdSMasahiro Yamada /* 96935e09cdSMasahiro Yamada * a tricky way to drop unneeded *_pins and *_muxvals arrays from SPL, 97935e09cdSMasahiro Yamada * suppressing "defined but not used" warnings. 98935e09cdSMasahiro Yamada */ 99935e09cdSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp) \ 100935e09cdSMasahiro Yamada { .num_pins = ARRAY_SIZE(grp##_pins) + ARRAY_SIZE(grp##_muxvals) } 10164c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func) NULL 10264c1cc4cSMasahiro Yamada #else 10364c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp) __UNIPHIER_PINCTRL_GROUP(grp) 10464c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func) __UNIPHIER_PINMUX_FUNCTION(func) 10564c1cc4cSMasahiro Yamada #endif 10664c1cc4cSMasahiro Yamada 10764c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP_SPL(grp) __UNIPHIER_PINCTRL_GROUP(grp) 10864c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION_SPL(func) __UNIPHIER_PINMUX_FUNCTION(func) 10964c1cc4cSMasahiro Yamada 1105dc626f8SMasahiro Yamada /** 1115dc626f8SMasahiro Yamada * struct uniphier_pinctrl_priv - private data for UniPhier pinctrl driver 1125dc626f8SMasahiro Yamada * 1135dc626f8SMasahiro Yamada * @base: base address of the pinctrl device 1145dc626f8SMasahiro Yamada * @socdata: SoC specific data 1155dc626f8SMasahiro Yamada */ 1165dc626f8SMasahiro Yamada struct uniphier_pinctrl_priv { 1175dc626f8SMasahiro Yamada void __iomem *base; 1185dc626f8SMasahiro Yamada struct uniphier_pinctrl_socdata *socdata; 1195dc626f8SMasahiro Yamada }; 1205dc626f8SMasahiro Yamada 1215dc626f8SMasahiro Yamada extern const struct pinctrl_ops uniphier_pinctrl_ops; 1225dc626f8SMasahiro Yamada 1235dc626f8SMasahiro Yamada int uniphier_pinctrl_probe(struct udevice *dev, 1245dc626f8SMasahiro Yamada struct uniphier_pinctrl_socdata *socdata); 1255dc626f8SMasahiro Yamada 1265dc626f8SMasahiro Yamada #endif /* __PINCTRL_UNIPHIER_H__ */ 127