Skip to content

Commit 1767875

Browse files
author
Jiri Kosina
committed
Merge branch 'for-6.16/hid-gpio-setter-callbacks' into for-linus
- adapt HID drivers to use new gpio_chip's line setter callbacks (Bartosz Golaszewski)
2 parents 5b53c0e + 31a78af commit 1767875

File tree

3 files changed

+52
-47
lines changed

3 files changed

+52
-47
lines changed

drivers/hid/hid-cp2112.c

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
*/
1818

1919
#include <linux/bitops.h>
20+
#include <linux/cleanup.h>
2021
#include <linux/gpio/driver.h>
2122
#include <linux/hid.h>
2223
#include <linux/hidraw.h>
2324
#include <linux/i2c.h>
2425
#include <linux/module.h>
26+
#include <linux/mutex.h>
2527
#include <linux/nls.h>
2628
#include <linux/string_choices.h>
2729
#include <linux/usb/ch9.h>
@@ -185,7 +187,7 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
185187
u8 *buf = dev->in_out_buffer;
186188
int ret;
187189

188-
mutex_lock(&dev->lock);
190+
guard(mutex)(&dev->lock);
189191

190192
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
191193
CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
@@ -194,7 +196,7 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
194196
hid_err(hdev, "error requesting GPIO config: %d\n", ret);
195197
if (ret >= 0)
196198
ret = -EIO;
197-
goto exit;
199+
return ret;
198200
}
199201

200202
buf[1] &= ~BIT(offset);
@@ -207,25 +209,19 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
207209
hid_err(hdev, "error setting GPIO config: %d\n", ret);
208210
if (ret >= 0)
209211
ret = -EIO;
210-
goto exit;
212+
return ret;
211213
}
212214

213-
ret = 0;
214-
215-
exit:
216-
mutex_unlock(&dev->lock);
217-
return ret;
215+
return 0;
218216
}
219217

220-
static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
218+
static int cp2112_gpio_set_unlocked(struct cp2112_device *dev,
219+
unsigned int offset, int value)
221220
{
222-
struct cp2112_device *dev = gpiochip_get_data(chip);
223221
struct hid_device *hdev = dev->hdev;
224222
u8 *buf = dev->in_out_buffer;
225223
int ret;
226224

227-
mutex_lock(&dev->lock);
228-
229225
buf[0] = CP2112_GPIO_SET;
230226
buf[1] = value ? CP2112_GPIO_ALL_GPIO_MASK : 0;
231227
buf[2] = BIT(offset);
@@ -236,7 +232,17 @@ static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
236232
if (ret < 0)
237233
hid_err(hdev, "error setting GPIO values: %d\n", ret);
238234

239-
mutex_unlock(&dev->lock);
235+
return ret;
236+
}
237+
238+
static int cp2112_gpio_set(struct gpio_chip *chip, unsigned int offset,
239+
int value)
240+
{
241+
struct cp2112_device *dev = gpiochip_get_data(chip);
242+
243+
guard(mutex)(&dev->lock);
244+
245+
return cp2112_gpio_set_unlocked(dev, offset, value);
240246
}
241247

242248
static int cp2112_gpio_get_all(struct gpio_chip *chip)
@@ -246,23 +252,17 @@ static int cp2112_gpio_get_all(struct gpio_chip *chip)
246252
u8 *buf = dev->in_out_buffer;
247253
int ret;
248254

249-
mutex_lock(&dev->lock);
255+
guard(mutex)(&dev->lock);
250256

251257
ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf,
252258
CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT,
253259
HID_REQ_GET_REPORT);
254260
if (ret != CP2112_GPIO_GET_LENGTH) {
255261
hid_err(hdev, "error requesting GPIO values: %d\n", ret);
256-
ret = ret < 0 ? ret : -EIO;
257-
goto exit;
262+
return ret < 0 ? ret : -EIO;
258263
}
259264

260-
ret = buf[1];
261-
262-
exit:
263-
mutex_unlock(&dev->lock);
264-
265-
return ret;
265+
return buf[1];
266266
}
267267

268268
static int cp2112_gpio_get(struct gpio_chip *chip, unsigned int offset)
@@ -284,14 +284,14 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
284284
u8 *buf = dev->in_out_buffer;
285285
int ret;
286286

287-
mutex_lock(&dev->lock);
287+
guard(mutex)(&dev->lock);
288288

289289
ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
290290
CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
291291
HID_REQ_GET_REPORT);
292292
if (ret != CP2112_GPIO_CONFIG_LENGTH) {
293293
hid_err(hdev, "error requesting GPIO config: %d\n", ret);
294-
goto fail;
294+
return ret < 0 ? ret : -EIO;
295295
}
296296

297297
buf[1] |= 1 << offset;
@@ -302,22 +302,16 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
302302
HID_REQ_SET_REPORT);
303303
if (ret < 0) {
304304
hid_err(hdev, "error setting GPIO config: %d\n", ret);
305-
goto fail;
305+
return ret;
306306
}
307307

308-
mutex_unlock(&dev->lock);
309-
310308
/*
311309
* Set gpio value when output direction is already set,
312310
* as specified in AN495, Rev. 0.2, cpt. 4.4
313311
*/
314-
cp2112_gpio_set(chip, offset, value);
312+
cp2112_gpio_set_unlocked(dev, offset, value);
315313

316314
return 0;
317-
318-
fail:
319-
mutex_unlock(&dev->lock);
320-
return ret < 0 ? ret : -EIO;
321315
}
322316

323317
static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
@@ -1205,7 +1199,11 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
12051199
if (!dev->in_out_buffer)
12061200
return -ENOMEM;
12071201

1208-
mutex_init(&dev->lock);
1202+
ret = devm_mutex_init(&hdev->dev, &dev->lock);
1203+
if (ret) {
1204+
hid_err(hdev, "mutex init failed\n");
1205+
return ret;
1206+
}
12091207

12101208
ret = hid_parse(hdev);
12111209
if (ret) {
@@ -1290,7 +1288,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
12901288
dev->gc.label = "cp2112_gpio";
12911289
dev->gc.direction_input = cp2112_gpio_direction_input;
12921290
dev->gc.direction_output = cp2112_gpio_direction_output;
1293-
dev->gc.set = cp2112_gpio_set;
1291+
dev->gc.set_rv = cp2112_gpio_set;
12941292
dev->gc.get = cp2112_gpio_get;
12951293
dev->gc.base = -1;
12961294
dev->gc.ngpio = CP2112_GPIO_MAX_GPIO;

drivers/hid/hid-mcp2200.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ static int mcp_cmd_read_all(struct mcp2200 *mcp)
127127
return mcp->status;
128128
}
129129

130-
static void mcp_set_multiple(struct gpio_chip *gc, unsigned long *mask,
131-
unsigned long *bits)
130+
static int mcp_set_multiple(struct gpio_chip *gc, unsigned long *mask,
131+
unsigned long *bits)
132132
{
133133
struct mcp2200 *mcp = gpiochip_get_data(gc);
134134
u8 value;
@@ -150,16 +150,20 @@ static void mcp_set_multiple(struct gpio_chip *gc, unsigned long *mask,
150150

151151
if (status == sizeof(struct mcp_set_clear_outputs))
152152
mcp->gpio_val = value;
153+
else
154+
status = -EIO;
153155

154156
mutex_unlock(&mcp->lock);
157+
158+
return status;
155159
}
156160

157-
static void mcp_set(struct gpio_chip *gc, unsigned int gpio_nr, int value)
161+
static int mcp_set(struct gpio_chip *gc, unsigned int gpio_nr, int value)
158162
{
159163
unsigned long mask = 1 << gpio_nr;
160164
unsigned long bmap_value = value << gpio_nr;
161165

162-
mcp_set_multiple(gc, &mask, &bmap_value);
166+
return mcp_set_multiple(gc, &mask, &bmap_value);
163167
}
164168

165169
static int mcp_get_multiple(struct gpio_chip *gc, unsigned long *mask,
@@ -263,9 +267,10 @@ static int mcp_direction_output(struct gpio_chip *gc, unsigned int gpio_nr,
263267
bmap_value = value << gpio_nr;
264268

265269
ret = mcp_set_direction(gc, gpio_nr, MCP2200_DIR_OUT);
266-
if (!ret)
267-
mcp_set_multiple(gc, &mask, &bmap_value);
268-
return ret;
270+
if (ret)
271+
return ret;
272+
273+
return mcp_set_multiple(gc, &mask, &bmap_value);
269274
}
270275

271276
static const struct gpio_chip template_chip = {
@@ -274,8 +279,8 @@ static const struct gpio_chip template_chip = {
274279
.get_direction = mcp_get_direction,
275280
.direction_input = mcp_direction_input,
276281
.direction_output = mcp_direction_output,
277-
.set = mcp_set,
278-
.set_multiple = mcp_set_multiple,
282+
.set_rv = mcp_set,
283+
.set_multiple_rv = mcp_set_multiple,
279284
.get = mcp_get,
280285
.get_multiple = mcp_get_multiple,
281286
.base = -1,

drivers/hid/hid-mcp2221.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,10 +624,10 @@ static int mcp_gpio_get(struct gpio_chip *gc,
624624
return ret;
625625
}
626626

627-
static void mcp_gpio_set(struct gpio_chip *gc,
628-
unsigned int offset, int value)
627+
static int mcp_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)
629628
{
630629
struct mcp2221 *mcp = gpiochip_get_data(gc);
630+
int ret;
631631

632632
memset(mcp->txbuf, 0, 18);
633633
mcp->txbuf[0] = MCP2221_GPIO_SET;
@@ -638,8 +638,10 @@ static void mcp_gpio_set(struct gpio_chip *gc,
638638
mcp->txbuf[mcp->gp_idx] = !!value;
639639

640640
mutex_lock(&mcp->lock);
641-
mcp_send_data_req_status(mcp, mcp->txbuf, 18);
641+
ret = mcp_send_data_req_status(mcp, mcp->txbuf, 18);
642642
mutex_unlock(&mcp->lock);
643+
644+
return ret;
643645
}
644646

645647
static int mcp_gpio_dir_set(struct mcp2221 *mcp,
@@ -1206,7 +1208,7 @@ static int mcp2221_probe(struct hid_device *hdev,
12061208
mcp->gc->direction_input = mcp_gpio_direction_input;
12071209
mcp->gc->direction_output = mcp_gpio_direction_output;
12081210
mcp->gc->get_direction = mcp_gpio_get_direction;
1209-
mcp->gc->set = mcp_gpio_set;
1211+
mcp->gc->set_rv = mcp_gpio_set;
12101212
mcp->gc->get = mcp_gpio_get;
12111213
mcp->gc->ngpio = MCP_NGPIO;
12121214
mcp->gc->base = -1;

0 commit comments

Comments
 (0)