Lines Matching refs:gpio

17 #include <linux/gpio/driver.h>
18 #include <linux/gpio/regmap.h>
33 int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base,
48 static int gpio_regmap_simple_xlate(struct gpio_regmap *gpio,
52 unsigned int line = offset % gpio->ngpio_per_reg;
53 unsigned int stride = offset / gpio->ngpio_per_reg;
55 *reg = base + stride * gpio->reg_stride;
63 struct gpio_regmap *gpio = gpiochip_get_data(chip);
68 if (gpio->reg_dat_base)
69 base = gpio_regmap_addr(gpio->reg_dat_base);
71 base = gpio_regmap_addr(gpio->reg_set_base);
73 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask);
77 ret = regmap_read(gpio->regmap, reg, &val);
87 struct gpio_regmap *gpio = gpiochip_get_data(chip);
88 unsigned int base = gpio_regmap_addr(gpio->reg_set_base);
91 gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask);
93 regmap_update_bits(gpio->regmap, reg, mask, mask);
95 regmap_update_bits(gpio->regmap, reg, mask, 0);
101 struct gpio_regmap *gpio = gpiochip_get_data(chip);
105 base = gpio_regmap_addr(gpio->reg_set_base);
107 base = gpio_regmap_addr(gpio->reg_clr_base);
109 gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask);
110 regmap_write(gpio->regmap, reg, mask);
116 struct gpio_regmap *gpio = gpiochip_get_data(chip);
120 if (gpio->reg_dat_base && !gpio->reg_set_base)
122 if (gpio->reg_set_base && !gpio->reg_dat_base)
125 if (gpio->reg_dir_out_base) {
126 base = gpio_regmap_addr(gpio->reg_dir_out_base);
128 } else if (gpio->reg_dir_in_base) {
129 base = gpio_regmap_addr(gpio->reg_dir_in_base);
135 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask);
139 ret = regmap_read(gpio->regmap, reg, &val);
152 struct gpio_regmap *gpio = gpiochip_get_data(chip);
156 if (gpio->reg_dir_out_base) {
157 base = gpio_regmap_addr(gpio->reg_dir_out_base);
159 } else if (gpio->reg_dir_in_base) {
160 base = gpio_regmap_addr(gpio->reg_dir_in_base);
166 ret = gpio->reg_mask_xlate(gpio, base, offset, &reg, &mask);
175 return regmap_update_bits(gpio->regmap, reg, mask, val);
192 void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio)
194 return gpio->driver_data;
206 struct gpio_regmap *gpio;
229 gpio = kzalloc(sizeof(*gpio), GFP_KERNEL);
230 if (!gpio)
233 gpio->parent = config->parent;
234 gpio->driver_data = config->drvdata;
235 gpio->regmap = config->regmap;
236 gpio->ngpio_per_reg = config->ngpio_per_reg;
237 gpio->reg_stride = config->reg_stride;
238 gpio->reg_mask_xlate = config->reg_mask_xlate;
239 gpio->reg_dat_base = config->reg_dat_base;
240 gpio->reg_set_base = config->reg_set_base;
241 gpio->reg_clr_base = config->reg_clr_base;
242 gpio->reg_dir_in_base = config->reg_dir_in_base;
243 gpio->reg_dir_out_base = config->reg_dir_out_base;
246 if (!gpio->ngpio_per_reg)
247 gpio->ngpio_per_reg = config->ngpio;
250 if (!gpio->reg_stride)
251 gpio->reg_stride = 1;
253 if (!gpio->reg_mask_xlate)
254 gpio->reg_mask_xlate = gpio_regmap_simple_xlate;
256 chip = &gpio->gpio_chip;
266 if (gpio->reg_set_base && gpio->reg_clr_base)
268 else if (gpio->reg_set_base)
272 if (gpio->reg_dir_in_base || gpio->reg_dir_out_base) {
277 ret = gpiochip_add_data(chip, gpio);
287 return gpio;
292 kfree(gpio);
299 * @gpio: gpio_regmap device to unregister
301 void gpio_regmap_unregister(struct gpio_regmap *gpio)
303 gpiochip_remove(&gpio->gpio_chip);
304 kfree(gpio);
327 struct gpio_regmap *gpio;
330 gpio = gpio_regmap_register(config);
332 if (IS_ERR(gpio))
333 return gpio;
335 ret = devm_add_action_or_reset(dev, devm_gpio_regmap_unregister, gpio);
339 return gpio;