.. | .. |
---|
15 | 15 | #define OWL_PINCONF_SLEW_SLOW 0 |
---|
16 | 16 | #define OWL_PINCONF_SLEW_FAST 1 |
---|
17 | 17 | |
---|
18 | | -enum owl_pinconf_pull { |
---|
19 | | - OWL_PINCONF_PULL_HIZ, |
---|
20 | | - OWL_PINCONF_PULL_DOWN, |
---|
21 | | - OWL_PINCONF_PULL_UP, |
---|
22 | | - OWL_PINCONF_PULL_HOLD, |
---|
23 | | -}; |
---|
| 18 | +#define MUX_PG(group_name, reg, shift, width) \ |
---|
| 19 | + { \ |
---|
| 20 | + .name = #group_name, \ |
---|
| 21 | + .pads = group_name##_pads, \ |
---|
| 22 | + .npads = ARRAY_SIZE(group_name##_pads), \ |
---|
| 23 | + .funcs = group_name##_funcs, \ |
---|
| 24 | + .nfuncs = ARRAY_SIZE(group_name##_funcs), \ |
---|
| 25 | + .mfpctl_reg = MFCTL##reg, \ |
---|
| 26 | + .mfpctl_shift = shift, \ |
---|
| 27 | + .mfpctl_width = width, \ |
---|
| 28 | + .drv_reg = -1, \ |
---|
| 29 | + .drv_shift = -1, \ |
---|
| 30 | + .drv_width = -1, \ |
---|
| 31 | + .sr_reg = -1, \ |
---|
| 32 | + .sr_shift = -1, \ |
---|
| 33 | + .sr_width = -1, \ |
---|
| 34 | + } |
---|
| 35 | + |
---|
| 36 | +#define DRV_PG(group_name, reg, shift, width) \ |
---|
| 37 | + { \ |
---|
| 38 | + .name = #group_name, \ |
---|
| 39 | + .pads = group_name##_pads, \ |
---|
| 40 | + .npads = ARRAY_SIZE(group_name##_pads), \ |
---|
| 41 | + .mfpctl_reg = -1, \ |
---|
| 42 | + .mfpctl_shift = -1, \ |
---|
| 43 | + .mfpctl_width = -1, \ |
---|
| 44 | + .drv_reg = PAD_DRV##reg, \ |
---|
| 45 | + .drv_shift = shift, \ |
---|
| 46 | + .drv_width = width, \ |
---|
| 47 | + .sr_reg = -1, \ |
---|
| 48 | + .sr_shift = -1, \ |
---|
| 49 | + .sr_width = -1, \ |
---|
| 50 | + } |
---|
| 51 | + |
---|
| 52 | +#define SR_PG(group_name, reg, shift, width) \ |
---|
| 53 | + { \ |
---|
| 54 | + .name = #group_name, \ |
---|
| 55 | + .pads = group_name##_pads, \ |
---|
| 56 | + .npads = ARRAY_SIZE(group_name##_pads), \ |
---|
| 57 | + .mfpctl_reg = -1, \ |
---|
| 58 | + .mfpctl_shift = -1, \ |
---|
| 59 | + .mfpctl_width = -1, \ |
---|
| 60 | + .drv_reg = -1, \ |
---|
| 61 | + .drv_shift = -1, \ |
---|
| 62 | + .drv_width = -1, \ |
---|
| 63 | + .sr_reg = PAD_SR##reg, \ |
---|
| 64 | + .sr_shift = shift, \ |
---|
| 65 | + .sr_width = width, \ |
---|
| 66 | + } |
---|
| 67 | + |
---|
| 68 | +#define FUNCTION(fname) \ |
---|
| 69 | + { \ |
---|
| 70 | + .name = #fname, \ |
---|
| 71 | + .groups = fname##_groups, \ |
---|
| 72 | + .ngroups = ARRAY_SIZE(fname##_groups), \ |
---|
| 73 | + } |
---|
| 74 | + |
---|
| 75 | +/* PAD PULL UP/DOWN CONFIGURES */ |
---|
| 76 | +#define PULLCTL_CONF(pull_reg, pull_sft, pull_wdt) \ |
---|
| 77 | + { \ |
---|
| 78 | + .reg = PAD_PULLCTL##pull_reg, \ |
---|
| 79 | + .shift = pull_sft, \ |
---|
| 80 | + .width = pull_wdt, \ |
---|
| 81 | + } |
---|
| 82 | + |
---|
| 83 | +#define PAD_PULLCTL_CONF(pad_name, pull_reg, pull_sft, pull_wdt) \ |
---|
| 84 | + struct owl_pullctl pad_name##_pullctl_conf \ |
---|
| 85 | + = PULLCTL_CONF(pull_reg, pull_sft, pull_wdt) |
---|
| 86 | + |
---|
| 87 | +#define ST_CONF(st_reg, st_sft, st_wdt) \ |
---|
| 88 | + { \ |
---|
| 89 | + .reg = PAD_ST##st_reg, \ |
---|
| 90 | + .shift = st_sft, \ |
---|
| 91 | + .width = st_wdt, \ |
---|
| 92 | + } |
---|
| 93 | + |
---|
| 94 | +#define PAD_ST_CONF(pad_name, st_reg, st_sft, st_wdt) \ |
---|
| 95 | + struct owl_st pad_name##_st_conf \ |
---|
| 96 | + = ST_CONF(st_reg, st_sft, st_wdt) |
---|
| 97 | + |
---|
| 98 | +#define PAD_INFO(name) \ |
---|
| 99 | + { \ |
---|
| 100 | + .pad = name, \ |
---|
| 101 | + .pullctl = NULL, \ |
---|
| 102 | + .st = NULL, \ |
---|
| 103 | + } |
---|
| 104 | + |
---|
| 105 | +#define PAD_INFO_ST(name) \ |
---|
| 106 | + { \ |
---|
| 107 | + .pad = name, \ |
---|
| 108 | + .pullctl = NULL, \ |
---|
| 109 | + .st = &name##_st_conf, \ |
---|
| 110 | + } |
---|
| 111 | + |
---|
| 112 | +#define PAD_INFO_PULLCTL(name) \ |
---|
| 113 | + { \ |
---|
| 114 | + .pad = name, \ |
---|
| 115 | + .pullctl = &name##_pullctl_conf, \ |
---|
| 116 | + .st = NULL, \ |
---|
| 117 | + } |
---|
| 118 | + |
---|
| 119 | +#define PAD_INFO_PULLCTL_ST(name) \ |
---|
| 120 | + { \ |
---|
| 121 | + .pad = name, \ |
---|
| 122 | + .pullctl = &name##_pullctl_conf, \ |
---|
| 123 | + .st = &name##_st_conf, \ |
---|
| 124 | + } |
---|
| 125 | + |
---|
| 126 | +#define OWL_GPIO_PORT_A 0 |
---|
| 127 | +#define OWL_GPIO_PORT_B 1 |
---|
| 128 | +#define OWL_GPIO_PORT_C 2 |
---|
| 129 | +#define OWL_GPIO_PORT_D 3 |
---|
| 130 | +#define OWL_GPIO_PORT_E 4 |
---|
| 131 | +#define OWL_GPIO_PORT_F 5 |
---|
| 132 | + |
---|
| 133 | +#define OWL_GPIO_PORT(port, base, count, _outen, _inen, _dat, _intc_ctl,\ |
---|
| 134 | + _intc_pd, _intc_msk, _intc_type, _share) \ |
---|
| 135 | + [OWL_GPIO_PORT_##port] = { \ |
---|
| 136 | + .offset = base, \ |
---|
| 137 | + .pins = count, \ |
---|
| 138 | + .outen = _outen, \ |
---|
| 139 | + .inen = _inen, \ |
---|
| 140 | + .dat = _dat, \ |
---|
| 141 | + .intc_ctl = _intc_ctl, \ |
---|
| 142 | + .intc_pd = _intc_pd, \ |
---|
| 143 | + .intc_msk = _intc_msk, \ |
---|
| 144 | + .intc_type = _intc_type, \ |
---|
| 145 | + .shared_ctl_offset = _share, \ |
---|
| 146 | + } |
---|
24 | 147 | |
---|
25 | 148 | enum owl_pinconf_drv { |
---|
26 | 149 | OWL_PINCONF_DRV_2MA, |
---|
.. | .. |
---|
148 | 271 | unsigned int intc_pd; |
---|
149 | 272 | unsigned int intc_msk; |
---|
150 | 273 | unsigned int intc_type; |
---|
| 274 | + u8 shared_ctl_offset; |
---|
151 | 275 | }; |
---|
152 | 276 | |
---|
153 | 277 | /** |
---|
.. | .. |
---|
174 | 298 | unsigned int ngpios; |
---|
175 | 299 | const struct owl_gpio_port *ports; |
---|
176 | 300 | unsigned int nports; |
---|
| 301 | + int (*padctl_val2arg)(const struct owl_padinfo *padinfo, |
---|
| 302 | + unsigned int param, |
---|
| 303 | + u32 *arg); |
---|
| 304 | + int (*padctl_arg2val)(const struct owl_padinfo *info, |
---|
| 305 | + unsigned int param, |
---|
| 306 | + u32 *arg); |
---|
177 | 307 | }; |
---|
178 | 308 | |
---|
179 | 309 | int owl_pinctrl_probe(struct platform_device *pdev, |
---|