Lines Matching full:gpio

3  * regmap based generic GPIO driver
17 #include <linux/gpio/driver.h>
18 #include <linux/gpio/regmap.h>
41 int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base,
56 static int gpio_regmap_simple_xlate(struct gpio_regmap *gpio, in gpio_regmap_simple_xlate() argument
60 unsigned int line = offset % gpio->ngpio_per_reg; in gpio_regmap_simple_xlate()
61 unsigned int stride = offset / gpio->ngpio_per_reg; in gpio_regmap_simple_xlate()
63 *reg = base + stride * gpio->reg_stride; in gpio_regmap_simple_xlate()
71 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_get() local
76 if (gpio->reg_dat_base) in gpio_regmap_get()
77 base = gpio_regmap_addr(gpio->reg_dat_base); in gpio_regmap_get()
79 base = gpio_regmap_addr(gpio->reg_set_base); in gpio_regmap_get()
81 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask); in gpio_regmap_get()
86 if (gpio->reg_dat_base == gpio->reg_set_base) in gpio_regmap_get()
87 ret = regmap_read_bypassed(gpio->regmap, reg, &val); in gpio_regmap_get()
89 ret = regmap_read(gpio->regmap, reg, &val); in gpio_regmap_get()
99 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_set() local
100 unsigned int base = gpio_regmap_addr(gpio->reg_set_base); in gpio_regmap_set()
104 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask); in gpio_regmap_set()
114 if (gpio->reg_dat_base == gpio->reg_set_base) in gpio_regmap_set()
115 ret = regmap_write_bits(gpio->regmap, reg, mask, mask_val); in gpio_regmap_set()
117 ret = regmap_update_bits(gpio->regmap, reg, mask, mask_val); in gpio_regmap_set()
125 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_set_with_clear() local
130 base = gpio_regmap_addr(gpio->reg_set_base); in gpio_regmap_set_with_clear()
132 base = gpio_regmap_addr(gpio->reg_clr_base); in gpio_regmap_set_with_clear()
134 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask); in gpio_regmap_set_with_clear()
138 return regmap_write(gpio->regmap, reg, mask); in gpio_regmap_set_with_clear()
144 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_get_direction() local
148 if (gpio->fixed_direction_output) { in gpio_regmap_get_direction()
149 if (test_bit(offset, gpio->fixed_direction_output)) in gpio_regmap_get_direction()
155 if (gpio->reg_dat_base && !gpio->reg_set_base) in gpio_regmap_get_direction()
157 if (gpio->reg_set_base && !gpio->reg_dat_base) in gpio_regmap_get_direction()
160 if (gpio->reg_dir_out_base) { in gpio_regmap_get_direction()
161 base = gpio_regmap_addr(gpio->reg_dir_out_base); in gpio_regmap_get_direction()
163 } else if (gpio->reg_dir_in_base) { in gpio_regmap_get_direction()
164 base = gpio_regmap_addr(gpio->reg_dir_in_base); in gpio_regmap_get_direction()
170 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask); in gpio_regmap_get_direction()
174 ret = regmap_read(gpio->regmap, reg, &val); in gpio_regmap_get_direction()
187 struct gpio_regmap *gpio = gpiochip_get_data(chip); in gpio_regmap_set_direction() local
191 if (gpio->reg_dir_out_base) { in gpio_regmap_set_direction()
192 base = gpio_regmap_addr(gpio->reg_dir_out_base); in gpio_regmap_set_direction()
194 } else if (gpio->reg_dir_in_base) { in gpio_regmap_set_direction()
195 base = gpio_regmap_addr(gpio->reg_dir_in_base); in gpio_regmap_set_direction()
201 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask); in gpio_regmap_set_direction()
210 return regmap_update_bits(gpio->regmap, reg, mask, val); in gpio_regmap_set_direction()
227 void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio) in gpio_regmap_get_drvdata() argument
229 return gpio->driver_data; in gpio_regmap_get_drvdata()
234 * gpio_regmap_register() - Register a generic regmap GPIO controller
242 struct gpio_regmap *gpio; in gpio_regmap_register() local
262 gpio = kzalloc_obj(*gpio); in gpio_regmap_register()
263 if (!gpio) in gpio_regmap_register()
266 gpio->parent = config->parent; in gpio_regmap_register()
267 gpio->driver_data = config->drvdata; in gpio_regmap_register()
268 gpio->regmap = config->regmap; in gpio_regmap_register()
269 gpio->reg_dat_base = config->reg_dat_base; in gpio_regmap_register()
270 gpio->reg_set_base = config->reg_set_base; in gpio_regmap_register()
271 gpio->reg_clr_base = config->reg_clr_base; in gpio_regmap_register()
272 gpio->reg_dir_in_base = config->reg_dir_in_base; in gpio_regmap_register()
273 gpio->reg_dir_out_base = config->reg_dir_out_base; in gpio_regmap_register()
275 chip = &gpio->gpio_chip; in gpio_regmap_register()
287 if (gpio->reg_set_base && gpio->reg_clr_base) in gpio_regmap_register()
289 else if (gpio->reg_set_base) in gpio_regmap_register()
293 if (gpio->reg_dir_in_base || gpio->reg_dir_out_base) { in gpio_regmap_register()
306 gpio->fixed_direction_output = bitmap_alloc(chip->ngpio, in gpio_regmap_register()
308 if (!gpio->fixed_direction_output) { in gpio_regmap_register()
312 bitmap_copy(gpio->fixed_direction_output, in gpio_regmap_register()
317 gpio->ngpio_per_reg = config->ngpio_per_reg; in gpio_regmap_register()
318 if (!gpio->ngpio_per_reg) in gpio_regmap_register()
319 gpio->ngpio_per_reg = config->ngpio; in gpio_regmap_register()
322 gpio->reg_stride = config->reg_stride; in gpio_regmap_register()
323 if (!gpio->reg_stride) in gpio_regmap_register()
324 gpio->reg_stride = 1; in gpio_regmap_register()
326 gpio->reg_mask_xlate = config->reg_mask_xlate; in gpio_regmap_register()
327 if (!gpio->reg_mask_xlate) in gpio_regmap_register()
328 gpio->reg_mask_xlate = gpio_regmap_simple_xlate; in gpio_regmap_register()
330 ret = gpiochip_add_data(chip, gpio); in gpio_regmap_register()
336 gpio->regmap_irq_line = config->regmap_irq_line; in gpio_regmap_register()
339 0, config->regmap_irq_chip, &gpio->irq_chip_data); in gpio_regmap_register()
343 irq_domain = regmap_irq_get_domain(gpio->irq_chip_data); in gpio_regmap_register()
354 return gpio; in gpio_regmap_register()
359 bitmap_free(gpio->fixed_direction_output); in gpio_regmap_register()
361 kfree(gpio); in gpio_regmap_register()
367 * gpio_regmap_unregister() - Unregister a generic regmap GPIO controller
368 * @gpio: gpio_regmap device to unregister
370 void gpio_regmap_unregister(struct gpio_regmap *gpio) in gpio_regmap_unregister() argument
373 if (gpio->irq_chip_data) in gpio_regmap_unregister()
374 regmap_del_irq_chip(gpio->regmap_irq_line, gpio->irq_chip_data); in gpio_regmap_unregister()
377 gpiochip_remove(&gpio->gpio_chip); in gpio_regmap_unregister()
378 bitmap_free(gpio->fixed_direction_output); in gpio_regmap_unregister()
379 kfree(gpio); in gpio_regmap_unregister()
390 * @dev: device that is registering this GPIO device
393 * Managed gpio_regmap_register(). For generic regmap GPIO device registered by
402 struct gpio_regmap *gpio; in devm_gpio_regmap_register() local
405 gpio = gpio_regmap_register(config); in devm_gpio_regmap_register()
407 if (IS_ERR(gpio)) in devm_gpio_regmap_register()
408 return gpio; in devm_gpio_regmap_register()
410 ret = devm_add_action_or_reset(dev, devm_gpio_regmap_unregister, gpio); in devm_gpio_regmap_register()
414 return gpio; in devm_gpio_regmap_register()
419 MODULE_DESCRIPTION("GPIO generic regmap driver core");