Lines Matching +full:lock +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0-or-later
25 struct mutex lock; member
36 static int cgbc_gpio_get(struct gpio_chip *chip, unsigned int offset) in cgbc_gpio_get() argument
39 struct cgbc_device_data *cgbc = gpio->cgbc; in cgbc_gpio_get()
43 scoped_guard(mutex, &gpio->lock) in cgbc_gpio_get()
44 ret = cgbc_gpio_cmd(cgbc, CGBC_GPIO_CMD_GET, (offset > 7) ? 1 : 0, 0, &val); in cgbc_gpio_get()
46 offset %= 8; in cgbc_gpio_get()
51 return (int)(val & (u8)BIT(offset)); in cgbc_gpio_get()
55 unsigned int offset, int value) in __cgbc_gpio_set() argument
58 struct cgbc_device_data *cgbc = gpio->cgbc; in __cgbc_gpio_set()
62 ret = cgbc_gpio_cmd(cgbc, CGBC_GPIO_CMD_GET, (offset > 7) ? 1 : 0, 0, &val); in __cgbc_gpio_set()
67 val |= BIT(offset % 8); in __cgbc_gpio_set()
69 val &= ~(BIT(offset % 8)); in __cgbc_gpio_set()
71 cgbc_gpio_cmd(cgbc, CGBC_GPIO_CMD_SET, (offset > 7) ? 1 : 0, val, &val); in __cgbc_gpio_set()
75 unsigned int offset, int value) in cgbc_gpio_set() argument
79 scoped_guard(mutex, &gpio->lock) in cgbc_gpio_set()
80 __cgbc_gpio_set(chip, offset, value); in cgbc_gpio_set()
84 unsigned int offset, int direction) in cgbc_gpio_direction_set() argument
87 struct cgbc_device_data *cgbc = gpio->cgbc; in cgbc_gpio_direction_set()
91 ret = cgbc_gpio_cmd(cgbc, CGBC_GPIO_CMD_DIR_GET, (offset > 7) ? 1 : 0, 0, &val); in cgbc_gpio_direction_set()
96 val &= ~(BIT(offset % 8)); in cgbc_gpio_direction_set()
98 val |= BIT(offset % 8); in cgbc_gpio_direction_set()
100 ret = cgbc_gpio_cmd(cgbc, CGBC_GPIO_CMD_DIR_SET, (offset > 7) ? 1 : 0, val, &val); in cgbc_gpio_direction_set()
107 unsigned int offset) in cgbc_gpio_direction_input() argument
111 guard(mutex)(&gpio->lock); in cgbc_gpio_direction_input()
112 return cgbc_gpio_direction_set(chip, offset, GPIO_LINE_DIRECTION_IN); in cgbc_gpio_direction_input()
116 unsigned int offset, int value) in cgbc_gpio_direction_output() argument
120 guard(mutex)(&gpio->lock); in cgbc_gpio_direction_output()
122 __cgbc_gpio_set(chip, offset, value); in cgbc_gpio_direction_output()
123 return cgbc_gpio_direction_set(chip, offset, GPIO_LINE_DIRECTION_OUT); in cgbc_gpio_direction_output()
126 static int cgbc_gpio_get_direction(struct gpio_chip *chip, unsigned int offset) in cgbc_gpio_get_direction() argument
129 struct cgbc_device_data *cgbc = gpio->cgbc; in cgbc_gpio_get_direction()
133 scoped_guard(mutex, &gpio->lock) in cgbc_gpio_get_direction()
134 ret = cgbc_gpio_cmd(cgbc, CGBC_GPIO_CMD_DIR_GET, (offset > 7) ? 1 : 0, 0, &val); in cgbc_gpio_get_direction()
139 if (val & BIT(offset % 8)) in cgbc_gpio_get_direction()
147 struct device *dev = &pdev->dev; in cgbc_gpio_probe()
148 struct cgbc_device_data *cgbc = dev_get_drvdata(dev->parent); in cgbc_gpio_probe()
155 return -ENOMEM; in cgbc_gpio_probe()
157 gpio->cgbc = cgbc; in cgbc_gpio_probe()
161 chip = &gpio->chip; in cgbc_gpio_probe()
162 chip->label = dev_name(&pdev->dev); in cgbc_gpio_probe()
163 chip->owner = THIS_MODULE; in cgbc_gpio_probe()
164 chip->parent = dev; in cgbc_gpio_probe()
165 chip->base = -1; in cgbc_gpio_probe()
166 chip->direction_input = cgbc_gpio_direction_input; in cgbc_gpio_probe()
167 chip->direction_output = cgbc_gpio_direction_output; in cgbc_gpio_probe()
168 chip->get_direction = cgbc_gpio_get_direction; in cgbc_gpio_probe()
169 chip->get = cgbc_gpio_get; in cgbc_gpio_probe()
170 chip->set = cgbc_gpio_set; in cgbc_gpio_probe()
171 chip->ngpio = CGBC_GPIO_NGPIO; in cgbc_gpio_probe()
173 ret = devm_mutex_init(dev, &gpio->lock); in cgbc_gpio_probe()
186 .name = "cgbc-gpio",
196 MODULE_ALIAS("platform:cgbc-gpio");