Lines Matching full:gpio
3 * regmap based generic GPIO driver
17 #include <linux/gpio/driver.h>
18 #include <linux/gpio/regmap.h>
35 int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base,
50 static int gpio_regmap_simple_xlate(struct gpio_regmap *gpio, in gpio_regmap_simple_xlate() argument
54 unsigned int line = offset % gpio->ngpio_per_reg; in gpio_regmap_simple_xlate()
55 unsigned int stride = offset / gpio->ngpio_per_reg; in gpio_regmap_simple_xlate()
57 *reg = base + stride * gpio->reg_stride; in gpio_regmap_simple_xlate()
65 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_get() local
70 if (gpio->reg_dat_base) in gpio_regmap_get()
71 base = gpio_regmap_addr(gpio->reg_dat_base); in gpio_regmap_get()
73 base = gpio_regmap_addr(gpio->reg_set_base); in gpio_regmap_get()
75 ret = gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); in gpio_regmap_get()
79 ret = regmap_read(gpio->regmap, reg, &val); in gpio_regmap_get()
89 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_set() local
90 unsigned int base = gpio_regmap_addr(gpio->reg_set_base); in gpio_regmap_set()
94 ret = gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); in gpio_regmap_set()
99 ret = regmap_update_bits(gpio->regmap, reg, mask, mask); in gpio_regmap_set()
101 ret = regmap_update_bits(gpio->regmap, reg, mask, 0); in gpio_regmap_set()
109 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_set_with_clear() local
114 base = gpio_regmap_addr(gpio->reg_set_base); in gpio_regmap_set_with_clear()
116 base = gpio_regmap_addr(gpio->reg_clr_base); in gpio_regmap_set_with_clear()
118 ret = gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); in gpio_regmap_set_with_clear()
122 return regmap_write(gpio->regmap, reg, mask); in gpio_regmap_set_with_clear()
128 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_get_direction() local
132 if (gpio->reg_dat_base && !gpio->reg_set_base) in gpio_regmap_get_direction()
134 if (gpio->reg_set_base && !gpio->reg_dat_base) in gpio_regmap_get_direction()
137 if (gpio->reg_dir_out_base) { in gpio_regmap_get_direction()
138 base = gpio_regmap_addr(gpio->reg_dir_out_base); in gpio_regmap_get_direction()
140 } else if (gpio->reg_dir_in_base) { in gpio_regmap_get_direction()
141 base = gpio_regmap_addr(gpio->reg_dir_in_base); in gpio_regmap_get_direction()
147 ret = gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); in gpio_regmap_get_direction()
151 ret = regmap_read(gpio->regmap, reg, &val); in gpio_regmap_get_direction()
164 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_set_direction() local
168 if (gpio->reg_dir_out_base) { in gpio_regmap_set_direction()
169 base = gpio_regmap_addr(gpio->reg_dir_out_base); in gpio_regmap_set_direction()
171 } else if (gpio->reg_dir_in_base) { in gpio_regmap_set_direction()
172 base = gpio_regmap_addr(gpio->reg_dir_in_base); in gpio_regmap_set_direction()
178 ret = gpio->reg_mask_xlate(gpio, base, offset, ®, &mask); in gpio_regmap_set_direction()
187 return regmap_update_bits(gpio->regmap, reg, mask, val); in gpio_regmap_set_direction()
204 void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio) in gpio_regmap_get_drvdata() argument
206 return gpio->driver_data; in gpio_regmap_get_drvdata()
211 * gpio_regmap_register() - Register a generic regmap GPIO controller
218 struct gpio_regmap *gpio; in gpio_regmap_register() local
238 gpio = kzalloc(sizeof(*gpio), GFP_KERNEL); in gpio_regmap_register()
239 if (!gpio) in gpio_regmap_register()
242 gpio->parent = config->parent; in gpio_regmap_register()
243 gpio->driver_data = config->drvdata; in gpio_regmap_register()
244 gpio->regmap = config->regmap; in gpio_regmap_register()
245 gpio->reg_dat_base = config->reg_dat_base; in gpio_regmap_register()
246 gpio->reg_set_base = config->reg_set_base; in gpio_regmap_register()
247 gpio->reg_clr_base = config->reg_clr_base; in gpio_regmap_register()
248 gpio->reg_dir_in_base = config->reg_dir_in_base; in gpio_regmap_register()
249 gpio->reg_dir_out_base = config->reg_dir_out_base; in gpio_regmap_register()
251 chip = &gpio->gpio_chip; in gpio_regmap_register()
262 if (gpio->reg_set_base && gpio->reg_clr_base) in gpio_regmap_register()
264 else if (gpio->reg_set_base) in gpio_regmap_register()
268 if (gpio->reg_dir_in_base || gpio->reg_dir_out_base) { in gpio_regmap_register()
281 gpio->ngpio_per_reg = config->ngpio_per_reg; in gpio_regmap_register()
282 if (!gpio->ngpio_per_reg) in gpio_regmap_register()
283 gpio->ngpio_per_reg = config->ngpio; in gpio_regmap_register()
286 gpio->reg_stride = config->reg_stride; in gpio_regmap_register()
287 if (!gpio->reg_stride) in gpio_regmap_register()
288 gpio->reg_stride = 1; in gpio_regmap_register()
290 gpio->reg_mask_xlate = config->reg_mask_xlate; in gpio_regmap_register()
291 if (!gpio->reg_mask_xlate) in gpio_regmap_register()
292 gpio->reg_mask_xlate = gpio_regmap_simple_xlate; in gpio_regmap_register()
294 ret = gpiochip_add_data(chip, gpio); in gpio_regmap_register()
304 return gpio; in gpio_regmap_register()
309 kfree(gpio); in gpio_regmap_register()
315 * gpio_regmap_unregister() - Unregister a generic regmap GPIO controller
316 * @gpio: gpio_regmap device to unregister
318 void gpio_regmap_unregister(struct gpio_regmap *gpio) in gpio_regmap_unregister() argument
320 gpiochip_remove(&gpio->gpio_chip); in gpio_regmap_unregister()
321 kfree(gpio); in gpio_regmap_unregister()
332 * @dev: device that is registering this GPIO device
335 * Managed gpio_regmap_register(). For generic regmap GPIO device registered by
344 struct gpio_regmap *gpio; in devm_gpio_regmap_register() local
347 gpio = gpio_regmap_register(config); in devm_gpio_regmap_register()
349 if (IS_ERR(gpio)) in devm_gpio_regmap_register()
350 return gpio; in devm_gpio_regmap_register()
352 ret = devm_add_action_or_reset(dev, devm_gpio_regmap_unregister, gpio); in devm_gpio_regmap_register()
356 return gpio; in devm_gpio_regmap_register()
361 MODULE_DESCRIPTION("GPIO generic regmap driver core");