Lines Matching +full:output +full:- +full:polarity +full:- +full:invert

1 // SPDX-License-Identifier: GPL-2.0+
3 * Take linux kernel driver drivers/gpio/gpio-pca953x.c for reference.
14 * Also the Polarity Inversion feature is not supported now.
19 * 3. Support Polarity Inversion
30 #include <dt-bindings/gpio/gpio.h>
53 * struct pca953x_info - Data for pca953x
57 * @invert: Polarity inversion or not
61 * @reg_output: array to hold the value of output registers
67 int invert; member
79 int bank_shift = fls((info->gpio_count - 1) / BANK_SZ); in pca953x_write_single()
96 int bank_shift = fls((info->gpio_count - 1) / BANK_SZ); in pca953x_read_single()
117 if (info->gpio_count <= 8) { in pca953x_read_regs()
119 } else if (info->gpio_count <= 16) { in pca953x_read_regs()
120 ret = dm_i2c_read(dev, reg << 1, val, info->bank_count); in pca953x_read_regs()
121 } else if (info->gpio_count == 40) { in pca953x_read_regs()
124 info->bank_count); in pca953x_read_regs()
127 return -EINVAL; in pca953x_read_regs()
138 if (info->gpio_count <= 8) { in pca953x_write_regs()
140 } else if (info->gpio_count <= 16) { in pca953x_write_regs()
141 ret = dm_i2c_write(dev, reg << 1, val, info->bank_count); in pca953x_write_regs()
142 } else if (info->gpio_count == 40) { in pca953x_write_regs()
144 ret = dm_i2c_write(dev, (reg << 3) | 0x80, val, info->bank_count); in pca953x_write_regs()
146 return -EINVAL; in pca953x_write_regs()
159 /*0: output; 1: input */ in pca953x_is_output()
160 return !(info->reg_direction[bank] & (1 << off)); in pca953x_is_output()
186 val = info->reg_output[bank] | (1 << off); in pca953x_set_value()
188 val = info->reg_output[bank] & ~(1 << off); in pca953x_set_value()
194 info->reg_output[bank] = val; in pca953x_set_value()
208 val = info->reg_direction[bank] | (1 << off); in pca953x_set_direction()
210 val = info->reg_direction[bank] & ~(1 << off); in pca953x_set_direction()
216 info->reg_direction[bank] = val; in pca953x_set_direction()
228 /* Configure output value. */ in pca953x_direction_output()
231 /* Configure direction as output. */ in pca953x_direction_output()
248 desc->offset = args->args[0]; in pca953x_xlate()
249 desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0; in pca953x_xlate()
277 return -ENODEV; in pca953x_probe()
279 info->addr = addr; in pca953x_probe()
283 info->gpio_count = driver_data & PCA_GPIO_MASK; in pca953x_probe()
284 if (info->gpio_count > MAX_BANK * BANK_SZ) { in pca953x_probe()
286 return -EINVAL; in pca953x_probe()
289 info->chip_type = PCA_CHIP_TYPE(driver_data); in pca953x_probe()
290 if (info->chip_type != PCA953X_TYPE) { in pca953x_probe()
292 return -EINVAL; in pca953x_probe()
295 info->bank_count = DIV_ROUND_UP(info->gpio_count, BANK_SZ); in pca953x_probe()
297 ret = pca953x_read_regs(dev, PCA953X_OUTPUT, info->reg_output); in pca953x_probe()
299 dev_err(dev, "Error reading output register\n"); in pca953x_probe()
303 ret = pca953x_read_regs(dev, PCA953X_DIRECTION, info->reg_direction); in pca953x_probe()
312 memcpy(label, tmp, sizeof(label) - 1); in pca953x_probe()
313 label[sizeof(label) - 1] = '\0'; in pca953x_probe()
314 snprintf(name, sizeof(name), "%s@%x_", label, info->addr); in pca953x_probe()
316 snprintf(name, sizeof(name), "gpio@%x_", info->addr); in pca953x_probe()
319 /* Clear the polarity registers to no invert */ in pca953x_probe()
323 dev_err(dev, "Error writing invert register\n"); in pca953x_probe()
329 return -ENOMEM; in pca953x_probe()
330 uc_priv->bank_name = str; in pca953x_probe()
331 uc_priv->gpio_count = info->gpio_count; in pca953x_probe()