gpio-viperboard.c (a02001086bbfb4da35d1228bebc2f1b442db455f) gpio-viperboard.c (58383c78425e4ee1c077253cf297b641c861c02e)
1/*
2 * Nano River Technologies viperboard GPIO lib driver
3 *
4 * (C) 2012 by Lemonage GmbH
5 * Author: Lars Poeschel <poeschel@lemonage.de>
6 * All rights reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify it

--- 159 unchanged lines hidden (view full) ---

168 usb_sndctrlpipe(vb->usb_dev, 0),
169 VPRBRD_USB_REQUEST_GPIOA, VPRBRD_USB_TYPE_OUT,
170 0x0000, 0x0000, gamsg,
171 sizeof(struct vprbrd_gpioa_msg), VPRBRD_USB_TIMEOUT_MS);
172
173 mutex_unlock(&vb->lock);
174
175 if (ret != sizeof(struct vprbrd_gpioa_msg))
1/*
2 * Nano River Technologies viperboard GPIO lib driver
3 *
4 * (C) 2012 by Lemonage GmbH
5 * Author: Lars Poeschel <poeschel@lemonage.de>
6 * All rights reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify it

--- 159 unchanged lines hidden (view full) ---

168 usb_sndctrlpipe(vb->usb_dev, 0),
169 VPRBRD_USB_REQUEST_GPIOA, VPRBRD_USB_TYPE_OUT,
170 0x0000, 0x0000, gamsg,
171 sizeof(struct vprbrd_gpioa_msg), VPRBRD_USB_TIMEOUT_MS);
172
173 mutex_unlock(&vb->lock);
174
175 if (ret != sizeof(struct vprbrd_gpioa_msg))
176 dev_err(chip->dev, "usb error setting pin value\n");
176 dev_err(chip->parent, "usb error setting pin value\n");
177 }
178}
179
180static int vprbrd_gpioa_direction_input(struct gpio_chip *chip,
181 unsigned offset)
182{
183 int ret;
184 struct vprbrd_gpio *gpio =

--- 155 unchanged lines hidden (view full) ---

340 usb_sndctrlpipe(vb->usb_dev, 0),
341 VPRBRD_USB_REQUEST_GPIOB, VPRBRD_USB_TYPE_OUT,
342 0x0000, 0x0000, gbmsg,
343 sizeof(struct vprbrd_gpiob_msg), VPRBRD_USB_TIMEOUT_MS);
344
345 mutex_unlock(&vb->lock);
346
347 if (ret != sizeof(struct vprbrd_gpiob_msg))
177 }
178}
179
180static int vprbrd_gpioa_direction_input(struct gpio_chip *chip,
181 unsigned offset)
182{
183 int ret;
184 struct vprbrd_gpio *gpio =

--- 155 unchanged lines hidden (view full) ---

340 usb_sndctrlpipe(vb->usb_dev, 0),
341 VPRBRD_USB_REQUEST_GPIOB, VPRBRD_USB_TYPE_OUT,
342 0x0000, 0x0000, gbmsg,
343 sizeof(struct vprbrd_gpiob_msg), VPRBRD_USB_TIMEOUT_MS);
344
345 mutex_unlock(&vb->lock);
346
347 if (ret != sizeof(struct vprbrd_gpiob_msg))
348 dev_err(chip->dev, "usb error setting pin value\n");
348 dev_err(chip->parent, "usb error setting pin value\n");
349 }
350}
351
352static int vprbrd_gpiob_direction_input(struct gpio_chip *chip,
353 unsigned offset)
354{
355 int ret;
356 struct vprbrd_gpio *gpio =

--- 4 unchanged lines hidden (view full) ---

361
362 mutex_lock(&vb->lock);
363
364 ret = vprbrd_gpiob_setdir(vb, offset, 0);
365
366 mutex_unlock(&vb->lock);
367
368 if (ret)
349 }
350}
351
352static int vprbrd_gpiob_direction_input(struct gpio_chip *chip,
353 unsigned offset)
354{
355 int ret;
356 struct vprbrd_gpio *gpio =

--- 4 unchanged lines hidden (view full) ---

361
362 mutex_lock(&vb->lock);
363
364 ret = vprbrd_gpiob_setdir(vb, offset, 0);
365
366 mutex_unlock(&vb->lock);
367
368 if (ret)
369 dev_err(chip->dev, "usb error setting pin to input\n");
369 dev_err(chip->parent, "usb error setting pin to input\n");
370
371 return ret;
372}
373
374static int vprbrd_gpiob_direction_output(struct gpio_chip *chip,
375 unsigned offset, int value)
376{
377 int ret;
378 struct vprbrd_gpio *gpio =
379 container_of(chip, struct vprbrd_gpio, gpiob);
380 struct vprbrd *vb = gpio->vb;
381
382 gpio->gpiob_out |= (1 << offset);
383
384 mutex_lock(&vb->lock);
385
386 ret = vprbrd_gpiob_setdir(vb, offset, 1);
387 if (ret)
370
371 return ret;
372}
373
374static int vprbrd_gpiob_direction_output(struct gpio_chip *chip,
375 unsigned offset, int value)
376{
377 int ret;
378 struct vprbrd_gpio *gpio =
379 container_of(chip, struct vprbrd_gpio, gpiob);
380 struct vprbrd *vb = gpio->vb;
381
382 gpio->gpiob_out |= (1 << offset);
383
384 mutex_lock(&vb->lock);
385
386 ret = vprbrd_gpiob_setdir(vb, offset, 1);
387 if (ret)
388 dev_err(chip->dev, "usb error setting pin to output\n");
388 dev_err(chip->parent, "usb error setting pin to output\n");
389
390 mutex_unlock(&vb->lock);
391
392 vprbrd_gpiob_set(chip, offset, value);
393
394 return ret;
395}
396

--- 7 unchanged lines hidden (view full) ---

404
405 vb_gpio = devm_kzalloc(&pdev->dev, sizeof(*vb_gpio), GFP_KERNEL);
406 if (vb_gpio == NULL)
407 return -ENOMEM;
408
409 vb_gpio->vb = vb;
410 /* registering gpio a */
411 vb_gpio->gpioa.label = "viperboard gpio a";
389
390 mutex_unlock(&vb->lock);
391
392 vprbrd_gpiob_set(chip, offset, value);
393
394 return ret;
395}
396

--- 7 unchanged lines hidden (view full) ---

404
405 vb_gpio = devm_kzalloc(&pdev->dev, sizeof(*vb_gpio), GFP_KERNEL);
406 if (vb_gpio == NULL)
407 return -ENOMEM;
408
409 vb_gpio->vb = vb;
410 /* registering gpio a */
411 vb_gpio->gpioa.label = "viperboard gpio a";
412 vb_gpio->gpioa.dev = &pdev->dev;
412 vb_gpio->gpioa.parent = &pdev->dev;
413 vb_gpio->gpioa.owner = THIS_MODULE;
414 vb_gpio->gpioa.base = -1;
415 vb_gpio->gpioa.ngpio = 16;
416 vb_gpio->gpioa.can_sleep = true;
417 vb_gpio->gpioa.set = vprbrd_gpioa_set;
418 vb_gpio->gpioa.get = vprbrd_gpioa_get;
419 vb_gpio->gpioa.direction_input = vprbrd_gpioa_direction_input;
420 vb_gpio->gpioa.direction_output = vprbrd_gpioa_direction_output;
421 ret = gpiochip_add(&vb_gpio->gpioa);
422 if (ret < 0) {
413 vb_gpio->gpioa.owner = THIS_MODULE;
414 vb_gpio->gpioa.base = -1;
415 vb_gpio->gpioa.ngpio = 16;
416 vb_gpio->gpioa.can_sleep = true;
417 vb_gpio->gpioa.set = vprbrd_gpioa_set;
418 vb_gpio->gpioa.get = vprbrd_gpioa_get;
419 vb_gpio->gpioa.direction_input = vprbrd_gpioa_direction_input;
420 vb_gpio->gpioa.direction_output = vprbrd_gpioa_direction_output;
421 ret = gpiochip_add(&vb_gpio->gpioa);
422 if (ret < 0) {
423 dev_err(vb_gpio->gpioa.dev, "could not add gpio a");
423 dev_err(vb_gpio->gpioa.parent, "could not add gpio a");
424 goto err_gpioa;
425 }
426
427 /* registering gpio b */
428 vb_gpio->gpiob.label = "viperboard gpio b";
424 goto err_gpioa;
425 }
426
427 /* registering gpio b */
428 vb_gpio->gpiob.label = "viperboard gpio b";
429 vb_gpio->gpiob.dev = &pdev->dev;
429 vb_gpio->gpiob.parent = &pdev->dev;
430 vb_gpio->gpiob.owner = THIS_MODULE;
431 vb_gpio->gpiob.base = -1;
432 vb_gpio->gpiob.ngpio = 16;
433 vb_gpio->gpiob.can_sleep = true;
434 vb_gpio->gpiob.set = vprbrd_gpiob_set;
435 vb_gpio->gpiob.get = vprbrd_gpiob_get;
436 vb_gpio->gpiob.direction_input = vprbrd_gpiob_direction_input;
437 vb_gpio->gpiob.direction_output = vprbrd_gpiob_direction_output;
438 ret = gpiochip_add(&vb_gpio->gpiob);
439 if (ret < 0) {
430 vb_gpio->gpiob.owner = THIS_MODULE;
431 vb_gpio->gpiob.base = -1;
432 vb_gpio->gpiob.ngpio = 16;
433 vb_gpio->gpiob.can_sleep = true;
434 vb_gpio->gpiob.set = vprbrd_gpiob_set;
435 vb_gpio->gpiob.get = vprbrd_gpiob_get;
436 vb_gpio->gpiob.direction_input = vprbrd_gpiob_direction_input;
437 vb_gpio->gpiob.direction_output = vprbrd_gpiob_direction_output;
438 ret = gpiochip_add(&vb_gpio->gpiob);
439 if (ret < 0) {
440 dev_err(vb_gpio->gpiob.dev, "could not add gpio b");
440 dev_err(vb_gpio->gpiob.parent, "could not add gpio b");
441 goto err_gpiob;
442 }
443
444 platform_set_drvdata(pdev, vb_gpio);
445
446 return ret;
447
448err_gpiob:

--- 62 unchanged lines hidden ---
441 goto err_gpiob;
442 }
443
444 platform_set_drvdata(pdev, vb_gpio);
445
446 return ret;
447
448err_gpiob:

--- 62 unchanged lines hidden ---