at master 9.0 kB view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Interface the pinctrl subsystem 4 * 5 * Copyright (C) 2011 ST-Ericsson SA 6 * Written on behalf of Linaro for ST-Ericsson 7 * This interface is used in the core to keep track of pins. 8 * 9 * Author: Linus Walleij <linus.walleij@linaro.org> 10 */ 11#ifndef __LINUX_PINCTRL_PINCTRL_H 12#define __LINUX_PINCTRL_PINCTRL_H 13 14#include <linux/bits.h> 15#include <linux/types.h> 16 17struct device; 18struct device_node; 19struct gpio_chip; 20struct module; 21struct seq_file; 22 23struct pin_config_item; 24struct pinconf_generic_params; 25struct pinconf_ops; 26struct pinctrl_dev; 27struct pinctrl_map; 28struct pinmux_ops; 29 30/** 31 * struct pingroup - provides information on pingroup 32 * @name: a name for pingroup 33 * @pins: an array of pins in the pingroup 34 * @npins: number of pins in the pingroup 35 */ 36struct pingroup { 37 const char *name; 38 const unsigned int *pins; 39 size_t npins; 40}; 41 42/* Convenience macro to define a single named or anonymous pingroup */ 43#define PINCTRL_PINGROUP(_name, _pins, _npins) \ 44(struct pingroup) { \ 45 .name = _name, \ 46 .pins = _pins, \ 47 .npins = _npins, \ 48} 49 50/** 51 * struct pinctrl_pin_desc - boards/machines provide information on their 52 * pins, pads or other muxable units in this struct 53 * @number: unique pin number from the global pin number space 54 * @name: a name for this pin 55 * @drv_data: driver-defined per-pin data. pinctrl core does not touch this 56 */ 57struct pinctrl_pin_desc { 58 unsigned int number; 59 const char *name; 60 void *drv_data; 61}; 62 63/* Convenience macro to define a single named or anonymous pin descriptor */ 64#define PINCTRL_PIN(a, b) { .number = a, .name = b } 65#define PINCTRL_PIN_ANON(a) { .number = a } 66 67/** 68 * struct pinctrl_gpio_range - each pin controller can provide subranges of 69 * the GPIO number space to be handled by the controller 70 * @node: list node for internal use 71 * @name: a name for the chip in this range 72 * @id: an ID number for the chip in this range 73 * @base: base offset of the GPIO range 74 * @pin_base: base pin number of the GPIO range if pins == NULL 75 * @npins: number of pins in the GPIO range, including the base number 76 * @pins: enumeration of pins in GPIO range or NULL 77 * @gc: an optional pointer to a gpio_chip 78 */ 79struct pinctrl_gpio_range { 80 struct list_head node; 81 const char *name; 82 unsigned int id; 83 unsigned int base; 84 unsigned int pin_base; 85 unsigned int npins; 86 unsigned int const *pins; 87 struct gpio_chip *gc; 88}; 89 90/** 91 * struct pinctrl_ops - global pin control operations, to be implemented by 92 * pin controller drivers. 93 * @get_groups_count: Returns the count of total number of groups registered. 94 * @get_group_name: return the group name of the pin group 95 * @get_group_pins: return an array of pins corresponding to a certain 96 * group selector @pins, and the size of the array in @num_pins 97 * @pin_dbg_show: optional debugfs display hook that will provide per-device 98 * info for a certain pin in debugfs 99 * @dt_node_to_map: parse a device tree "pin configuration node", and create 100 * mapping table entries for it. These are returned through the @map and 101 * @num_maps output parameters. This function is optional, and may be 102 * omitted for pinctrl drivers that do not support device tree. 103 * @dt_free_map: free mapping table entries created via @dt_node_to_map. The 104 * top-level @map pointer must be freed, along with any dynamically 105 * allocated members of the mapping table entries themselves. This 106 * function is optional, and may be omitted for pinctrl drivers that do 107 * not support device tree. 108 */ 109struct pinctrl_ops { 110 int (*get_groups_count) (struct pinctrl_dev *pctldev); 111 const char *(*get_group_name) (struct pinctrl_dev *pctldev, 112 unsigned int selector); 113 int (*get_group_pins) (struct pinctrl_dev *pctldev, 114 unsigned int selector, 115 const unsigned int **pins, 116 unsigned int *num_pins); 117 void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file *s, 118 unsigned int offset); 119 int (*dt_node_to_map) (struct pinctrl_dev *pctldev, 120 struct device_node *np_config, 121 struct pinctrl_map **map, unsigned int *num_maps); 122 void (*dt_free_map) (struct pinctrl_dev *pctldev, 123 struct pinctrl_map *map, unsigned int num_maps); 124}; 125 126/** 127 * struct pinctrl_desc - pin controller descriptor, register this to pin 128 * control subsystem 129 * @name: name for the pin controller 130 * @pins: an array of pin descriptors describing all the pins handled by 131 * this pin controller 132 * @npins: number of descriptors in the array, usually just ARRAY_SIZE() 133 * of the pins field above 134 * @pctlops: pin control operation vtable, to support global concepts like 135 * grouping of pins, this is optional. 136 * @pmxops: pinmux operations vtable, if you support pinmuxing in your driver 137 * @confops: pin config operations vtable, if you support pin configuration in 138 * your driver 139 * @owner: module providing the pin controller, used for refcounting 140 * @num_custom_params: Number of driver-specific custom parameters to be parsed 141 * from the hardware description 142 * @custom_params: List of driver_specific custom parameters to be parsed from 143 * the hardware description 144 * @custom_conf_items: Information how to print @params in debugfs, must be 145 * the same size as the @custom_params, i.e. @num_custom_params 146 * @link_consumers: If true create a device link between pinctrl and its 147 * consumers (i.e. the devices requesting pin control states). This is 148 * sometimes necessary to ascertain the right suspend/resume order for 149 * example. 150 */ 151struct pinctrl_desc { 152 const char *name; 153 const struct pinctrl_pin_desc *pins; 154 unsigned int npins; 155 const struct pinctrl_ops *pctlops; 156 const struct pinmux_ops *pmxops; 157 const struct pinconf_ops *confops; 158 struct module *owner; 159#ifdef CONFIG_GENERIC_PINCONF 160 unsigned int num_custom_params; 161 const struct pinconf_generic_params *custom_params; 162 const struct pin_config_item *custom_conf_items; 163#endif 164 bool link_consumers; 165}; 166 167/* External interface to pin controller */ 168 169extern int pinctrl_register_and_init(const struct pinctrl_desc *pctldesc, 170 struct device *dev, void *driver_data, 171 struct pinctrl_dev **pctldev); 172extern int pinctrl_enable(struct pinctrl_dev *pctldev); 173 174/* Please use pinctrl_register_and_init() and pinctrl_enable() instead */ 175extern struct pinctrl_dev *pinctrl_register(const struct pinctrl_desc *pctldesc, 176 struct device *dev, void *driver_data); 177 178extern void pinctrl_unregister(struct pinctrl_dev *pctldev); 179 180extern int devm_pinctrl_register_and_init(struct device *dev, 181 const struct pinctrl_desc *pctldesc, 182 void *driver_data, 183 struct pinctrl_dev **pctldev); 184 185/* Please use devm_pinctrl_register_and_init() instead */ 186extern struct pinctrl_dev *devm_pinctrl_register(struct device *dev, 187 const struct pinctrl_desc *pctldesc, 188 void *driver_data); 189 190extern void devm_pinctrl_unregister(struct device *dev, 191 struct pinctrl_dev *pctldev); 192 193extern void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev, 194 struct pinctrl_gpio_range *range); 195extern void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev, 196 struct pinctrl_gpio_range *ranges, 197 unsigned int nranges); 198extern void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev, 199 struct pinctrl_gpio_range *range); 200 201extern struct pinctrl_dev *pinctrl_find_and_add_gpio_range(const char *devname, 202 struct pinctrl_gpio_range *range); 203extern struct pinctrl_gpio_range * 204pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, 205 unsigned int pin); 206extern int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 207 const char *pin_group, const unsigned int **pins, 208 unsigned int *num_pins); 209 210#define PINFUNCTION_FLAG_GPIO BIT(0) 211 212/** 213 * struct pinfunction - Description about a function 214 * @name: Name of the function 215 * @groups: An array of groups for this function 216 * @ngroups: Number of groups in @groups 217 * @flags: Additional pin function flags 218 */ 219struct pinfunction { 220 const char *name; 221 const char * const *groups; 222 size_t ngroups; 223 unsigned long flags; 224}; 225 226/* Convenience macro to define a single named pinfunction */ 227#define PINCTRL_PINFUNCTION(_name, _groups, _ngroups) \ 228(struct pinfunction) { \ 229 .name = (_name), \ 230 .groups = (_groups), \ 231 .ngroups = (_ngroups), \ 232 } 233 234/* Same as PINCTRL_PINFUNCTION() but for the GPIO category of functions */ 235#define PINCTRL_GPIO_PINFUNCTION(_name, _groups, _ngroups) \ 236(struct pinfunction) { \ 237 .name = (_name), \ 238 .groups = (_groups), \ 239 .ngroups = (_ngroups), \ 240 .flags = PINFUNCTION_FLAG_GPIO, \ 241 } 242 243#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_PINCTRL) 244extern struct pinctrl_dev *of_pinctrl_get(struct device_node *np); 245#else 246static inline 247struct pinctrl_dev *of_pinctrl_get(struct device_node *np) 248{ 249 return NULL; 250} 251#endif /* CONFIG_OF */ 252 253extern const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev); 254extern const char *pinctrl_dev_get_devname(struct pinctrl_dev *pctldev); 255extern void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev); 256 257#endif /* __LINUX_PINCTRL_PINCTRL_H */