Lines Matching +full:lock +full:- +full:offset
51 u8 offset; member
83 …"gpio-a sampling freq in Hz (default is 1000Hz) valid values: 10, 100, 1000, 10000, 100000, 100000…
85 /* ----- begin of gipo a chip -------------------------------------------- */
88 unsigned offset) in vprbrd_gpioa_get() argument
92 struct vprbrd *vb = gpio->vb; in vprbrd_gpioa_get()
93 struct vprbrd_gpioa_msg *gamsg = (struct vprbrd_gpioa_msg *)vb->buf; in vprbrd_gpioa_get()
96 if (gpio->gpioa_out & (1 << offset)) in vprbrd_gpioa_get()
97 return !!(gpio->gpioa_val & (1 << offset)); in vprbrd_gpioa_get()
99 mutex_lock(&vb->lock); in vprbrd_gpioa_get()
101 gamsg->cmd = VPRBRD_GPIOA_CMD_GETIN; in vprbrd_gpioa_get()
102 gamsg->clk = 0x00; in vprbrd_gpioa_get()
103 gamsg->offset = offset; in vprbrd_gpioa_get()
104 gamsg->t1 = 0x00; in vprbrd_gpioa_get()
105 gamsg->t2 = 0x00; in vprbrd_gpioa_get()
106 gamsg->invert = 0x00; in vprbrd_gpioa_get()
107 gamsg->pwmlevel = 0x00; in vprbrd_gpioa_get()
108 gamsg->outval = 0x00; in vprbrd_gpioa_get()
109 gamsg->risefall = 0x00; in vprbrd_gpioa_get()
110 gamsg->answer = 0x00; in vprbrd_gpioa_get()
111 gamsg->__fill = 0x00; in vprbrd_gpioa_get()
113 ret = usb_control_msg(vb->usb_dev, usb_sndctrlpipe(vb->usb_dev, 0), in vprbrd_gpioa_get()
118 error = -EREMOTEIO; in vprbrd_gpioa_get()
120 ret = usb_control_msg(vb->usb_dev, usb_rcvctrlpipe(vb->usb_dev, 0), in vprbrd_gpioa_get()
124 answer = gamsg->answer & 0x01; in vprbrd_gpioa_get()
126 mutex_unlock(&vb->lock); in vprbrd_gpioa_get()
129 error = -EREMOTEIO; in vprbrd_gpioa_get()
138 unsigned offset, int value) in vprbrd_gpioa_set() argument
142 struct vprbrd *vb = gpio->vb; in vprbrd_gpioa_set()
143 struct vprbrd_gpioa_msg *gamsg = (struct vprbrd_gpioa_msg *)vb->buf; in vprbrd_gpioa_set()
145 if (gpio->gpioa_out & (1 << offset)) { in vprbrd_gpioa_set()
147 gpio->gpioa_val |= (1 << offset); in vprbrd_gpioa_set()
149 gpio->gpioa_val &= ~(1 << offset); in vprbrd_gpioa_set()
151 mutex_lock(&vb->lock); in vprbrd_gpioa_set()
153 gamsg->cmd = VPRBRD_GPIOA_CMD_SETOUT; in vprbrd_gpioa_set()
154 gamsg->clk = 0x00; in vprbrd_gpioa_set()
155 gamsg->offset = offset; in vprbrd_gpioa_set()
156 gamsg->t1 = 0x00; in vprbrd_gpioa_set()
157 gamsg->t2 = 0x00; in vprbrd_gpioa_set()
158 gamsg->invert = 0x00; in vprbrd_gpioa_set()
159 gamsg->pwmlevel = 0x00; in vprbrd_gpioa_set()
160 gamsg->outval = value; in vprbrd_gpioa_set()
161 gamsg->risefall = 0x00; in vprbrd_gpioa_set()
162 gamsg->answer = 0x00; in vprbrd_gpioa_set()
163 gamsg->__fill = 0x00; in vprbrd_gpioa_set()
165 ret = usb_control_msg(vb->usb_dev, in vprbrd_gpioa_set()
166 usb_sndctrlpipe(vb->usb_dev, 0), in vprbrd_gpioa_set()
171 mutex_unlock(&vb->lock); in vprbrd_gpioa_set()
174 dev_err(chip->parent, "usb error setting pin value\n"); in vprbrd_gpioa_set()
179 unsigned offset) in vprbrd_gpioa_direction_input() argument
183 struct vprbrd *vb = gpio->vb; in vprbrd_gpioa_direction_input()
184 struct vprbrd_gpioa_msg *gamsg = (struct vprbrd_gpioa_msg *)vb->buf; in vprbrd_gpioa_direction_input()
186 gpio->gpioa_out &= ~(1 << offset); in vprbrd_gpioa_direction_input()
188 mutex_lock(&vb->lock); in vprbrd_gpioa_direction_input()
190 gamsg->cmd = VPRBRD_GPIOA_CMD_SETIN; in vprbrd_gpioa_direction_input()
191 gamsg->clk = gpioa_clk; in vprbrd_gpioa_direction_input()
192 gamsg->offset = offset; in vprbrd_gpioa_direction_input()
193 gamsg->t1 = 0x00; in vprbrd_gpioa_direction_input()
194 gamsg->t2 = 0x00; in vprbrd_gpioa_direction_input()
195 gamsg->invert = 0x00; in vprbrd_gpioa_direction_input()
196 gamsg->pwmlevel = 0x00; in vprbrd_gpioa_direction_input()
197 gamsg->outval = 0x00; in vprbrd_gpioa_direction_input()
198 gamsg->risefall = 0x00; in vprbrd_gpioa_direction_input()
199 gamsg->answer = 0x00; in vprbrd_gpioa_direction_input()
200 gamsg->__fill = 0x00; in vprbrd_gpioa_direction_input()
202 ret = usb_control_msg(vb->usb_dev, usb_sndctrlpipe(vb->usb_dev, 0), in vprbrd_gpioa_direction_input()
207 mutex_unlock(&vb->lock); in vprbrd_gpioa_direction_input()
210 return -EREMOTEIO; in vprbrd_gpioa_direction_input()
216 unsigned offset, int value) in vprbrd_gpioa_direction_output() argument
220 struct vprbrd *vb = gpio->vb; in vprbrd_gpioa_direction_output()
221 struct vprbrd_gpioa_msg *gamsg = (struct vprbrd_gpioa_msg *)vb->buf; in vprbrd_gpioa_direction_output()
223 gpio->gpioa_out |= (1 << offset); in vprbrd_gpioa_direction_output()
225 gpio->gpioa_val |= (1 << offset); in vprbrd_gpioa_direction_output()
227 gpio->gpioa_val &= ~(1 << offset); in vprbrd_gpioa_direction_output()
229 mutex_lock(&vb->lock); in vprbrd_gpioa_direction_output()
231 gamsg->cmd = VPRBRD_GPIOA_CMD_SETOUT; in vprbrd_gpioa_direction_output()
232 gamsg->clk = 0x00; in vprbrd_gpioa_direction_output()
233 gamsg->offset = offset; in vprbrd_gpioa_direction_output()
234 gamsg->t1 = 0x00; in vprbrd_gpioa_direction_output()
235 gamsg->t2 = 0x00; in vprbrd_gpioa_direction_output()
236 gamsg->invert = 0x00; in vprbrd_gpioa_direction_output()
237 gamsg->pwmlevel = 0x00; in vprbrd_gpioa_direction_output()
238 gamsg->outval = value; in vprbrd_gpioa_direction_output()
239 gamsg->risefall = 0x00; in vprbrd_gpioa_direction_output()
240 gamsg->answer = 0x00; in vprbrd_gpioa_direction_output()
241 gamsg->__fill = 0x00; in vprbrd_gpioa_direction_output()
243 ret = usb_control_msg(vb->usb_dev, usb_sndctrlpipe(vb->usb_dev, 0), in vprbrd_gpioa_direction_output()
248 mutex_unlock(&vb->lock); in vprbrd_gpioa_direction_output()
251 return -EREMOTEIO; in vprbrd_gpioa_direction_output()
256 /* ----- end of gpio a chip ---------------------------------------------- */
258 /* ----- begin of gipo b chip -------------------------------------------- */
260 static int vprbrd_gpiob_setdir(struct vprbrd *vb, unsigned offset, in vprbrd_gpiob_setdir() argument
263 struct vprbrd_gpiob_msg *gbmsg = (struct vprbrd_gpiob_msg *)vb->buf; in vprbrd_gpiob_setdir()
266 gbmsg->cmd = VPRBRD_GPIOB_CMD_SETDIR; in vprbrd_gpiob_setdir()
267 gbmsg->val = cpu_to_be16(dir << offset); in vprbrd_gpiob_setdir()
268 gbmsg->mask = cpu_to_be16(0x0001 << offset); in vprbrd_gpiob_setdir()
270 ret = usb_control_msg(vb->usb_dev, usb_sndctrlpipe(vb->usb_dev, 0), in vprbrd_gpiob_setdir()
276 return -EREMOTEIO; in vprbrd_gpiob_setdir()
282 unsigned offset) in vprbrd_gpiob_get() argument
287 struct vprbrd *vb = gpio->vb; in vprbrd_gpiob_get()
288 struct vprbrd_gpiob_msg *gbmsg = (struct vprbrd_gpiob_msg *)vb->buf; in vprbrd_gpiob_get()
291 if (gpio->gpiob_out & (1 << offset)) in vprbrd_gpiob_get()
292 return gpio->gpiob_val & (1 << offset); in vprbrd_gpiob_get()
294 mutex_lock(&vb->lock); in vprbrd_gpiob_get()
296 ret = usb_control_msg(vb->usb_dev, usb_rcvctrlpipe(vb->usb_dev, 0), in vprbrd_gpiob_get()
300 val = gbmsg->val; in vprbrd_gpiob_get()
302 mutex_unlock(&vb->lock); in vprbrd_gpiob_get()
308 gpio->gpiob_val = be16_to_cpu(val); in vprbrd_gpiob_get()
310 return (gpio->gpiob_val >> offset) & 0x1; in vprbrd_gpiob_get()
314 unsigned offset, int value) in vprbrd_gpiob_set() argument
318 struct vprbrd *vb = gpio->vb; in vprbrd_gpiob_set()
319 struct vprbrd_gpiob_msg *gbmsg = (struct vprbrd_gpiob_msg *)vb->buf; in vprbrd_gpiob_set()
321 if (gpio->gpiob_out & (1 << offset)) { in vprbrd_gpiob_set()
323 gpio->gpiob_val |= (1 << offset); in vprbrd_gpiob_set()
325 gpio->gpiob_val &= ~(1 << offset); in vprbrd_gpiob_set()
327 mutex_lock(&vb->lock); in vprbrd_gpiob_set()
329 gbmsg->cmd = VPRBRD_GPIOB_CMD_SETVAL; in vprbrd_gpiob_set()
330 gbmsg->val = cpu_to_be16(value << offset); in vprbrd_gpiob_set()
331 gbmsg->mask = cpu_to_be16(0x0001 << offset); in vprbrd_gpiob_set()
333 ret = usb_control_msg(vb->usb_dev, in vprbrd_gpiob_set()
334 usb_sndctrlpipe(vb->usb_dev, 0), in vprbrd_gpiob_set()
339 mutex_unlock(&vb->lock); in vprbrd_gpiob_set()
342 dev_err(chip->parent, "usb error setting pin value\n"); in vprbrd_gpiob_set()
347 unsigned offset) in vprbrd_gpiob_direction_input() argument
351 struct vprbrd *vb = gpio->vb; in vprbrd_gpiob_direction_input()
353 gpio->gpiob_out &= ~(1 << offset); in vprbrd_gpiob_direction_input()
355 mutex_lock(&vb->lock); in vprbrd_gpiob_direction_input()
357 ret = vprbrd_gpiob_setdir(vb, offset, 0); in vprbrd_gpiob_direction_input()
359 mutex_unlock(&vb->lock); in vprbrd_gpiob_direction_input()
362 dev_err(chip->parent, "usb error setting pin to input\n"); in vprbrd_gpiob_direction_input()
368 unsigned offset, int value) in vprbrd_gpiob_direction_output() argument
372 struct vprbrd *vb = gpio->vb; in vprbrd_gpiob_direction_output()
374 gpio->gpiob_out |= (1 << offset); in vprbrd_gpiob_direction_output()
376 mutex_lock(&vb->lock); in vprbrd_gpiob_direction_output()
378 ret = vprbrd_gpiob_setdir(vb, offset, 1); in vprbrd_gpiob_direction_output()
380 dev_err(chip->parent, "usb error setting pin to output\n"); in vprbrd_gpiob_direction_output()
382 mutex_unlock(&vb->lock); in vprbrd_gpiob_direction_output()
384 vprbrd_gpiob_set(chip, offset, value); in vprbrd_gpiob_direction_output()
389 /* ----- end of gpio b chip ---------------------------------------------- */
393 struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent); in vprbrd_gpio_probe()
397 vb_gpio = devm_kzalloc(&pdev->dev, sizeof(*vb_gpio), GFP_KERNEL); in vprbrd_gpio_probe()
399 return -ENOMEM; in vprbrd_gpio_probe()
401 vb_gpio->vb = vb; in vprbrd_gpio_probe()
403 vb_gpio->gpioa.label = "viperboard gpio a"; in vprbrd_gpio_probe()
404 vb_gpio->gpioa.parent = &pdev->dev; in vprbrd_gpio_probe()
405 vb_gpio->gpioa.owner = THIS_MODULE; in vprbrd_gpio_probe()
406 vb_gpio->gpioa.base = -1; in vprbrd_gpio_probe()
407 vb_gpio->gpioa.ngpio = 16; in vprbrd_gpio_probe()
408 vb_gpio->gpioa.can_sleep = true; in vprbrd_gpio_probe()
409 vb_gpio->gpioa.set = vprbrd_gpioa_set; in vprbrd_gpio_probe()
410 vb_gpio->gpioa.get = vprbrd_gpioa_get; in vprbrd_gpio_probe()
411 vb_gpio->gpioa.direction_input = vprbrd_gpioa_direction_input; in vprbrd_gpio_probe()
412 vb_gpio->gpioa.direction_output = vprbrd_gpioa_direction_output; in vprbrd_gpio_probe()
413 ret = devm_gpiochip_add_data(&pdev->dev, &vb_gpio->gpioa, vb_gpio); in vprbrd_gpio_probe()
415 dev_err(vb_gpio->gpioa.parent, "could not add gpio a"); in vprbrd_gpio_probe()
420 vb_gpio->gpiob.label = "viperboard gpio b"; in vprbrd_gpio_probe()
421 vb_gpio->gpiob.parent = &pdev->dev; in vprbrd_gpio_probe()
422 vb_gpio->gpiob.owner = THIS_MODULE; in vprbrd_gpio_probe()
423 vb_gpio->gpiob.base = -1; in vprbrd_gpio_probe()
424 vb_gpio->gpiob.ngpio = 16; in vprbrd_gpio_probe()
425 vb_gpio->gpiob.can_sleep = true; in vprbrd_gpio_probe()
426 vb_gpio->gpiob.set = vprbrd_gpiob_set; in vprbrd_gpio_probe()
427 vb_gpio->gpiob.get = vprbrd_gpiob_get; in vprbrd_gpio_probe()
428 vb_gpio->gpiob.direction_input = vprbrd_gpiob_direction_input; in vprbrd_gpio_probe()
429 vb_gpio->gpiob.direction_output = vprbrd_gpiob_direction_output; in vprbrd_gpio_probe()
430 ret = devm_gpiochip_add_data(&pdev->dev, &vb_gpio->gpiob, vb_gpio); in vprbrd_gpio_probe()
432 dev_err(vb_gpio->gpiob.parent, "could not add gpio b"); in vprbrd_gpio_probe()
442 .driver.name = "viperboard-gpio",
485 MODULE_ALIAS("platform:viperboard-gpio");