1*6e908892SMasahiro Yamada /* 2*6e908892SMasahiro Yamada * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com> 3*6e908892SMasahiro Yamada * 4*6e908892SMasahiro Yamada * This program is free software; you can redistribute it and/or modify 5*6e908892SMasahiro Yamada * it under the terms of the GNU General Public License as published by 6*6e908892SMasahiro Yamada * the Free Software Foundation; either version 2 of the License, or 7*6e908892SMasahiro Yamada * (at your option) any later version. 8*6e908892SMasahiro Yamada * 9*6e908892SMasahiro Yamada * This program is distributed in the hope that it will be useful, 10*6e908892SMasahiro Yamada * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*6e908892SMasahiro Yamada * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*6e908892SMasahiro Yamada * GNU General Public License for more details. 13*6e908892SMasahiro Yamada */ 14*6e908892SMasahiro Yamada 15*6e908892SMasahiro Yamada #ifndef __PINCTRL_UNIPHIER_H__ 16*6e908892SMasahiro Yamada #define __PINCTRL_UNIPHIER_H__ 17*6e908892SMasahiro Yamada 18*6e908892SMasahiro Yamada #include <linux/bug.h> 19*6e908892SMasahiro Yamada #include <linux/kernel.h> 20*6e908892SMasahiro Yamada #include <linux/types.h> 21*6e908892SMasahiro Yamada 22*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_PINMUX_BASE 0x0 23*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_LOAD_PINMUX 0x700 24*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_DRVCTRL_BASE 0x800 25*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_DRV2CTRL_BASE 0x900 26*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_PUPDCTRL_BASE 0xa00 27*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_IECTRL 0xd00 28*6e908892SMasahiro Yamada 29*6e908892SMasahiro Yamada /* input enable control register bit */ 30*6e908892SMasahiro Yamada #define UNIPHIER_PIN_IECTRL_SHIFT 0 31*6e908892SMasahiro Yamada #define UNIPHIER_PIN_IECTRL_BITS 8 32*6e908892SMasahiro Yamada #define UNIPHIER_PIN_IECTRL_MASK ((1UL << (UNIPHIER_PIN_IECTRL_BITS)) \ 33*6e908892SMasahiro Yamada - 1) 34*6e908892SMasahiro Yamada 35*6e908892SMasahiro Yamada /* drive strength control register number */ 36*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRVCTRL_SHIFT ((UNIPHIER_PIN_IECTRL_SHIFT) + \ 37*6e908892SMasahiro Yamada (UNIPHIER_PIN_IECTRL_BITS)) 38*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRVCTRL_BITS 9 39*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRVCTRL_MASK ((1UL << (UNIPHIER_PIN_DRVCTRL_BITS)) \ 40*6e908892SMasahiro Yamada - 1) 41*6e908892SMasahiro Yamada 42*6e908892SMasahiro Yamada /* supported drive strength (mA) */ 43*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRV_STR_SHIFT ((UNIPHIER_PIN_DRVCTRL_SHIFT) + \ 44*6e908892SMasahiro Yamada (UNIPHIER_PIN_DRVCTRL_BITS)) 45*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRV_STR_BITS 3 46*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRV_STR_MASK ((1UL << (UNIPHIER_PIN_DRV_STR_BITS)) \ 47*6e908892SMasahiro Yamada - 1) 48*6e908892SMasahiro Yamada 49*6e908892SMasahiro Yamada /* pull-up / pull-down register number */ 50*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PUPDCTRL_SHIFT ((UNIPHIER_PIN_DRV_STR_SHIFT) + \ 51*6e908892SMasahiro Yamada (UNIPHIER_PIN_DRV_STR_BITS)) 52*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PUPDCTRL_BITS 9 53*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PUPDCTRL_MASK ((1UL << (UNIPHIER_PIN_PUPDCTRL_BITS))\ 54*6e908892SMasahiro Yamada - 1) 55*6e908892SMasahiro Yamada 56*6e908892SMasahiro Yamada /* direction of pull register */ 57*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PULL_DIR_SHIFT ((UNIPHIER_PIN_PUPDCTRL_SHIFT) + \ 58*6e908892SMasahiro Yamada (UNIPHIER_PIN_PUPDCTRL_BITS)) 59*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PULL_DIR_BITS 3 60*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PULL_DIR_MASK ((1UL << (UNIPHIER_PIN_PULL_DIR_BITS))\ 61*6e908892SMasahiro Yamada - 1) 62*6e908892SMasahiro Yamada 63*6e908892SMasahiro Yamada #if UNIPHIER_PIN_PULL_DIR_SHIFT + UNIPHIER_PIN_PULL_DIR_BITS > BITS_PER_LONG 64*6e908892SMasahiro Yamada #error "unable to pack pin attributes." 65*6e908892SMasahiro Yamada #endif 66*6e908892SMasahiro Yamada 67*6e908892SMasahiro Yamada #define UNIPHIER_PIN_IECTRL_NONE (UNIPHIER_PIN_IECTRL_MASK) 68*6e908892SMasahiro Yamada 69*6e908892SMasahiro Yamada /* selectable drive strength */ 70*6e908892SMasahiro Yamada enum uniphier_pin_drv_str { 71*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_4_8, /* 2 level control: 4/8 mA */ 72*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_8_12_16_20, /* 4 level control: 8/12/16/20 mA */ 73*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_FIXED_4, /* fixed to 4mA */ 74*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_FIXED_5, /* fixed to 5mA */ 75*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_FIXED_8, /* fixed to 8mA */ 76*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_NONE, /* no support (input only pin) */ 77*6e908892SMasahiro Yamada }; 78*6e908892SMasahiro Yamada 79*6e908892SMasahiro Yamada /* direction of pull register (no pin supports bi-directional pull biasing) */ 80*6e908892SMasahiro Yamada enum uniphier_pin_pull_dir { 81*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_UP, /* pull-up or disabled */ 82*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_DOWN, /* pull-down or disabled */ 83*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_UP_FIXED, /* always pull-up */ 84*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_DOWN_FIXED, /* always pull-down */ 85*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_NONE, /* no pull register */ 86*6e908892SMasahiro Yamada }; 87*6e908892SMasahiro Yamada 88*6e908892SMasahiro Yamada #define UNIPHIER_PIN_IECTRL(x) \ 89*6e908892SMasahiro Yamada (((x) & (UNIPHIER_PIN_IECTRL_MASK)) << (UNIPHIER_PIN_IECTRL_SHIFT)) 90*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRVCTRL(x) \ 91*6e908892SMasahiro Yamada (((x) & (UNIPHIER_PIN_DRVCTRL_MASK)) << (UNIPHIER_PIN_DRVCTRL_SHIFT)) 92*6e908892SMasahiro Yamada #define UNIPHIER_PIN_DRV_STR(x) \ 93*6e908892SMasahiro Yamada (((x) & (UNIPHIER_PIN_DRV_STR_MASK)) << (UNIPHIER_PIN_DRV_STR_SHIFT)) 94*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PUPDCTRL(x) \ 95*6e908892SMasahiro Yamada (((x) & (UNIPHIER_PIN_PUPDCTRL_MASK)) << (UNIPHIER_PIN_PUPDCTRL_SHIFT)) 96*6e908892SMasahiro Yamada #define UNIPHIER_PIN_PULL_DIR(x) \ 97*6e908892SMasahiro Yamada (((x) & (UNIPHIER_PIN_PULL_DIR_MASK)) << (UNIPHIER_PIN_PULL_DIR_SHIFT)) 98*6e908892SMasahiro Yamada 99*6e908892SMasahiro Yamada #define UNIPHIER_PIN_ATTR_PACKED(iectrl, drvctrl, drv_str, pupdctrl, pull_dir)\ 100*6e908892SMasahiro Yamada (UNIPHIER_PIN_IECTRL(iectrl) | \ 101*6e908892SMasahiro Yamada UNIPHIER_PIN_DRVCTRL(drvctrl) | \ 102*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_STR(drv_str) | \ 103*6e908892SMasahiro Yamada UNIPHIER_PIN_PUPDCTRL(pupdctrl) | \ 104*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_DIR(pull_dir)) 105*6e908892SMasahiro Yamada 106*6e908892SMasahiro Yamada static inline unsigned int uniphier_pin_get_iectrl(void *drv_data) 107*6e908892SMasahiro Yamada { 108*6e908892SMasahiro Yamada return ((unsigned long)drv_data >> UNIPHIER_PIN_IECTRL_SHIFT) & 109*6e908892SMasahiro Yamada UNIPHIER_PIN_IECTRL_MASK; 110*6e908892SMasahiro Yamada } 111*6e908892SMasahiro Yamada 112*6e908892SMasahiro Yamada static inline unsigned int uniphier_pin_get_drvctrl(void *drv_data) 113*6e908892SMasahiro Yamada { 114*6e908892SMasahiro Yamada return ((unsigned long)drv_data >> UNIPHIER_PIN_DRVCTRL_SHIFT) & 115*6e908892SMasahiro Yamada UNIPHIER_PIN_DRVCTRL_MASK; 116*6e908892SMasahiro Yamada } 117*6e908892SMasahiro Yamada 118*6e908892SMasahiro Yamada static inline unsigned int uniphier_pin_get_drv_str(void *drv_data) 119*6e908892SMasahiro Yamada { 120*6e908892SMasahiro Yamada return ((unsigned long)drv_data >> UNIPHIER_PIN_DRV_STR_SHIFT) & 121*6e908892SMasahiro Yamada UNIPHIER_PIN_DRV_STR_MASK; 122*6e908892SMasahiro Yamada } 123*6e908892SMasahiro Yamada 124*6e908892SMasahiro Yamada static inline unsigned int uniphier_pin_get_pupdctrl(void *drv_data) 125*6e908892SMasahiro Yamada { 126*6e908892SMasahiro Yamada return ((unsigned long)drv_data >> UNIPHIER_PIN_PUPDCTRL_SHIFT) & 127*6e908892SMasahiro Yamada UNIPHIER_PIN_PUPDCTRL_MASK; 128*6e908892SMasahiro Yamada } 129*6e908892SMasahiro Yamada 130*6e908892SMasahiro Yamada static inline unsigned int uniphier_pin_get_pull_dir(void *drv_data) 131*6e908892SMasahiro Yamada { 132*6e908892SMasahiro Yamada return ((unsigned long)drv_data >> UNIPHIER_PIN_PULL_DIR_SHIFT) & 133*6e908892SMasahiro Yamada UNIPHIER_PIN_PULL_DIR_MASK; 134*6e908892SMasahiro Yamada } 135*6e908892SMasahiro Yamada 136*6e908892SMasahiro Yamada enum uniphier_pinmux_gpio_range_type { 137*6e908892SMasahiro Yamada UNIPHIER_PINMUX_GPIO_RANGE_PORT, 138*6e908892SMasahiro Yamada UNIPHIER_PINMUX_GPIO_RANGE_IRQ, 139*6e908892SMasahiro Yamada UNIPHIER_PINMUX_GPIO_RANGE_NONE, 140*6e908892SMasahiro Yamada }; 141*6e908892SMasahiro Yamada 142*6e908892SMasahiro Yamada struct uniphier_pinctrl_group { 143*6e908892SMasahiro Yamada const char *name; 144*6e908892SMasahiro Yamada const unsigned *pins; 145*6e908892SMasahiro Yamada unsigned num_pins; 146*6e908892SMasahiro Yamada const unsigned *muxvals; 147*6e908892SMasahiro Yamada enum uniphier_pinmux_gpio_range_type range_type; 148*6e908892SMasahiro Yamada }; 149*6e908892SMasahiro Yamada 150*6e908892SMasahiro Yamada struct uniphier_pinmux_function { 151*6e908892SMasahiro Yamada const char *name; 152*6e908892SMasahiro Yamada const char * const *groups; 153*6e908892SMasahiro Yamada unsigned num_groups; 154*6e908892SMasahiro Yamada }; 155*6e908892SMasahiro Yamada 156*6e908892SMasahiro Yamada struct uniphier_pinctrl_socdata { 157*6e908892SMasahiro Yamada const struct uniphier_pinctrl_group *groups; 158*6e908892SMasahiro Yamada int groups_count; 159*6e908892SMasahiro Yamada const struct uniphier_pinmux_function *functions; 160*6e908892SMasahiro Yamada int functions_count; 161*6e908892SMasahiro Yamada unsigned mux_bits; 162*6e908892SMasahiro Yamada unsigned reg_stride; 163*6e908892SMasahiro Yamada bool load_pinctrl; 164*6e908892SMasahiro Yamada }; 165*6e908892SMasahiro Yamada 166*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_PIN(a, b, c, d, e, f, g) \ 167*6e908892SMasahiro Yamada { \ 168*6e908892SMasahiro Yamada .number = a, \ 169*6e908892SMasahiro Yamada .name = b, \ 170*6e908892SMasahiro Yamada .drv_data = (void *)UNIPHIER_PIN_ATTR_PACKED(c, d, e, f, g), \ 171*6e908892SMasahiro Yamada } 172*6e908892SMasahiro Yamada 173*6e908892SMasahiro Yamada #define __UNIPHIER_PINCTRL_GROUP(grp, type) \ 174*6e908892SMasahiro Yamada { \ 175*6e908892SMasahiro Yamada .name = #grp, \ 176*6e908892SMasahiro Yamada .pins = grp##_pins, \ 177*6e908892SMasahiro Yamada .num_pins = ARRAY_SIZE(grp##_pins), \ 178*6e908892SMasahiro Yamada .muxvals = grp##_muxvals + \ 179*6e908892SMasahiro Yamada BUILD_BUG_ON_ZERO(ARRAY_SIZE(grp##_pins) != \ 180*6e908892SMasahiro Yamada ARRAY_SIZE(grp##_muxvals)), \ 181*6e908892SMasahiro Yamada .range_type = type, \ 182*6e908892SMasahiro Yamada } 183*6e908892SMasahiro Yamada 184*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp) \ 185*6e908892SMasahiro Yamada __UNIPHIER_PINCTRL_GROUP(grp, UNIPHIER_PINMUX_GPIO_RANGE_NONE) 186*6e908892SMasahiro Yamada 187*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(grp) \ 188*6e908892SMasahiro Yamada __UNIPHIER_PINCTRL_GROUP(grp, UNIPHIER_PINMUX_GPIO_RANGE_PORT) 189*6e908892SMasahiro Yamada 190*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ(grp) \ 191*6e908892SMasahiro Yamada __UNIPHIER_PINCTRL_GROUP(grp, UNIPHIER_PINMUX_GPIO_RANGE_IRQ) 192*6e908892SMasahiro Yamada 193*6e908892SMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP_SINGLE(grp, array, ofst) \ 194*6e908892SMasahiro Yamada { \ 195*6e908892SMasahiro Yamada .name = #grp, \ 196*6e908892SMasahiro Yamada .pins = array##_pins + ofst, \ 197*6e908892SMasahiro Yamada .num_pins = 1, \ 198*6e908892SMasahiro Yamada .muxvals = array##_muxvals + ofst, \ 199*6e908892SMasahiro Yamada } 200*6e908892SMasahiro Yamada 201*6e908892SMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func) \ 202*6e908892SMasahiro Yamada { \ 203*6e908892SMasahiro Yamada .name = #func, \ 204*6e908892SMasahiro Yamada .groups = func##_groups, \ 205*6e908892SMasahiro Yamada .num_groups = ARRAY_SIZE(func##_groups), \ 206*6e908892SMasahiro Yamada } 207*6e908892SMasahiro Yamada 208*6e908892SMasahiro Yamada struct platform_device; 209*6e908892SMasahiro Yamada struct pinctrl_desc; 210*6e908892SMasahiro Yamada 211*6e908892SMasahiro Yamada int uniphier_pinctrl_probe(struct platform_device *pdev, 212*6e908892SMasahiro Yamada struct pinctrl_desc *desc, 213*6e908892SMasahiro Yamada struct uniphier_pinctrl_socdata *socdata); 214*6e908892SMasahiro Yamada 215*6e908892SMasahiro Yamada int uniphier_pinctrl_remove(struct platform_device *pdev); 216*6e908892SMasahiro Yamada 217*6e908892SMasahiro Yamada #endif /* __PINCTRL_UNIPHIER_H__ */ 218