diff options
| author | Soren Brinkmann <soren.brinkmann@xilinx.com> | 2015-01-09 10:43:46 -0500 |
|---|---|---|
| committer | Linus Walleij <linus.walleij@linaro.org> | 2015-01-11 16:32:19 -0500 |
| commit | dd4d01f7bad886c22687224bc7070b87de8deb51 (patch) | |
| tree | f1e2e99a8cc4859a48372212213ceb59aa183e38 /include/linux/pinctrl | |
| parent | 31c89c959667194350f496947b576c149503ce98 (diff) | |
pinctrl: pinconf-generic: Allow driver to specify DT params
Additionally to the generic DT parameters, allow drivers to provide
driver-specific DT parameters to be used with the generic parser
infrastructure.
To achieve this 'struct pinctrl_desc' is extended to pass custom pinconf
option to the core. In order to pass this kind of information, the
related data structures - 'struct pinconf_generic_dt_params',
'pin_config_item' - are moved from pinconf internals to the
pinconf-generic header.
Additionally pinconfg-generic is refactored to not only iterate over the
generic pinconf parameters but also take the parameters into account
that are provided through the driver's 'struct pinctrl_desc'.
In particular 'pinconf_generic_parse_dt_config()' and
'pinconf_generic_dump' helpers are split into two parts each. In order
to have a more generic helper that can be used to process the generic
parameters as well as the driver-specific ones.
v2:
- fix typo
- add missing documentation for @conf_items member in struct
- rebase to pinctrl/devel: conflict in abx500
- rename _pinconf_generic_dump() to pinconf_generic_dump_one()
- removed '_' from _parse_dt_cfg()
- removed BUG_ONs, error condition is handled in if statements
- removed pinconf_generic_dump_group() & pinconf_generic_dump_pin
helpers
- fixed up corresponding call sites
- renamed pinconf_generic_dump() to pinconf_generic_dump_pins()
- added kernel-doc to pinconf_generic_dump_pins()
- add kernel-doc
- more verbose commit message
Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
Tested-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'include/linux/pinctrl')
| -rw-r--r-- | include/linux/pinctrl/pinconf-generic.h | 18 | ||||
| -rw-r--r-- | include/linux/pinctrl/pinctrl.h | 9 |
2 files changed, 27 insertions, 0 deletions
diff --git a/include/linux/pinctrl/pinconf-generic.h b/include/linux/pinctrl/pinconf-generic.h index 83c89f5ab705..342409f7f3ec 100644 --- a/include/linux/pinctrl/pinconf-generic.h +++ b/include/linux/pinctrl/pinconf-generic.h | |||
| @@ -115,6 +115,18 @@ enum pin_config_param { | |||
| 115 | PIN_CONFIG_END = 0x7FFF, | 115 | PIN_CONFIG_END = 0x7FFF, |
| 116 | }; | 116 | }; |
| 117 | 117 | ||
| 118 | #ifdef CONFIG_DEBUG_FS | ||
| 119 | #define PCONFDUMP(a, b, c, d) { .param = a, .display = b, .format = c, \ | ||
| 120 | .has_arg = d } | ||
| 121 | |||
| 122 | struct pin_config_item { | ||
| 123 | const enum pin_config_param param; | ||
| 124 | const char * const display; | ||
| 125 | const char * const format; | ||
| 126 | bool has_arg; | ||
| 127 | }; | ||
| 128 | #endif /* CONFIG_DEBUG_FS */ | ||
| 129 | |||
| 118 | /* | 130 | /* |
| 119 | * Helpful configuration macro to be used in tables etc. | 131 | * Helpful configuration macro to be used in tables etc. |
| 120 | */ | 132 | */ |
| @@ -150,6 +162,12 @@ static inline unsigned long pinconf_to_config_packed(enum pin_config_param param | |||
| 150 | struct pinctrl_dev; | 162 | struct pinctrl_dev; |
| 151 | struct pinctrl_map; | 163 | struct pinctrl_map; |
| 152 | 164 | ||
| 165 | struct pinconf_generic_dt_params { | ||
| 166 | const char * const property; | ||
| 167 | enum pin_config_param param; | ||
| 168 | u32 default_value; | ||
| 169 | }; | ||
| 170 | |||
| 153 | int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev, | 171 | int pinconf_generic_dt_subnode_to_map(struct pinctrl_dev *pctldev, |
| 154 | struct device_node *np, struct pinctrl_map **map, | 172 | struct device_node *np, struct pinctrl_map **map, |
| 155 | unsigned *reserved_maps, unsigned *num_maps, | 173 | unsigned *reserved_maps, unsigned *num_maps, |
diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h index cc8e1aff0e28..c58b3e11ba8e 100644 --- a/include/linux/pinctrl/pinctrl.h +++ b/include/linux/pinctrl/pinctrl.h | |||
| @@ -24,6 +24,7 @@ struct pinctrl_dev; | |||
| 24 | struct pinctrl_map; | 24 | struct pinctrl_map; |
| 25 | struct pinmux_ops; | 25 | struct pinmux_ops; |
| 26 | struct pinconf_ops; | 26 | struct pinconf_ops; |
| 27 | struct pin_config_item; | ||
| 27 | struct gpio_chip; | 28 | struct gpio_chip; |
| 28 | struct device_node; | 29 | struct device_node; |
| 29 | 30 | ||
| @@ -117,6 +118,9 @@ struct pinctrl_ops { | |||
| 117 | * @confops: pin config operations vtable, if you support pin configuration in | 118 | * @confops: pin config operations vtable, if you support pin configuration in |
| 118 | * your driver | 119 | * your driver |
| 119 | * @owner: module providing the pin controller, used for refcounting | 120 | * @owner: module providing the pin controller, used for refcounting |
| 121 | * @num_dt_params: Number of driver-specific DT parameters | ||
| 122 | * @params: List of DT parameters | ||
| 123 | * @conf_items: Information how to print @params in debugfs | ||
| 120 | */ | 124 | */ |
| 121 | struct pinctrl_desc { | 125 | struct pinctrl_desc { |
| 122 | const char *name; | 126 | const char *name; |
| @@ -126,6 +130,11 @@ struct pinctrl_desc { | |||
| 126 | const struct pinmux_ops *pmxops; | 130 | const struct pinmux_ops *pmxops; |
| 127 | const struct pinconf_ops *confops; | 131 | const struct pinconf_ops *confops; |
| 128 | struct module *owner; | 132 | struct module *owner; |
| 133 | #if defined(CONFIG_GENERIC_PINCONF) && defined(CONFIG_OF) | ||
| 134 | unsigned int num_dt_params; | ||
| 135 | const struct pinconf_generic_dt_params *params; | ||
| 136 | const struct pin_config_item *conf_items; | ||
| 137 | #endif | ||
| 129 | }; | 138 | }; |
| 130 | 139 | ||
| 131 | /* External interface to pin controller */ | 140 | /* External interface to pin controller */ |
