Lines Matching refs:drvdata
98 struct ps2_gpio_data *drvdata = serio->port_data;
100 drvdata->t_irq_last = 0;
101 drvdata->tx.t_xfer_end = 0;
103 enable_irq(drvdata->irq);
109 struct ps2_gpio_data *drvdata = serio->port_data;
111 flush_delayed_work(&drvdata->tx.work);
112 disable_irq(drvdata->irq);
117 struct ps2_gpio_data *drvdata = serio->port_data;
119 disable_irq_nosync(drvdata->irq);
120 gpiod_direction_output(drvdata->gpio_clk, 0);
122 drvdata->mode = PS2_MODE_TX;
123 drvdata->tx.byte = val;
125 schedule_delayed_work(&drvdata->tx.work, usecs_to_jiffies(200));
132 struct ps2_gpio_data *drvdata = serio->port_data;
136 mutex_lock(&drvdata->tx.mutex);
138 if (!wait_for_completion_timeout(&drvdata->tx.complete,
141 mutex_unlock(&drvdata->tx.mutex);
152 struct ps2_gpio_data *drvdata = container_of(dwork,
156 drvdata->tx.t_xfer_start = ktime_get();
157 enable_irq(drvdata->irq);
158 gpiod_direction_output(drvdata->gpio_data, 0);
159 gpiod_direction_input(drvdata->gpio_clk);
162 static irqreturn_t ps2_gpio_irq_rx(struct ps2_gpio_data *drvdata)
169 byte = drvdata->rx.byte;
170 cnt = drvdata->rx.cnt;
172 drvdata->t_irq_now = ktime_get();
178 us_delta = ktime_us_delta(drvdata->t_irq_now, drvdata->tx.t_xfer_end);
182 us_delta = ktime_us_delta(drvdata->t_irq_now, drvdata->t_irq_last);
184 dev_err(drvdata->dev,
191 drvdata->t_irq_last = drvdata->t_irq_now;
193 data = gpiod_get_value(drvdata->gpio_data);
195 dev_err(drvdata->dev, "RX: failed to get data gpio val: %d\n",
204 dev_err(drvdata->dev, "RX: start bit should be low\n");
224 dev_warn(drvdata->dev, "RX: parity error\n");
225 if (!drvdata->write_enable)
232 dev_err(drvdata->dev, "RX: stop bit should be high\n");
240 if (!drvdata->write_enable) {
247 serio_interrupt(drvdata->serio, byte, rxflags);
248 dev_dbg(drvdata->dev, "RX: sending byte 0x%x\n", byte);
254 dev_err(drvdata->dev, "RX: got out of sync with the device\n");
263 __ps2_gpio_write(drvdata->serio, PS2_CMD_RESEND);
265 drvdata->rx.cnt = cnt;
266 drvdata->rx.byte = byte;
270 static irqreturn_t ps2_gpio_irq_tx(struct ps2_gpio_data *drvdata)
276 cnt = drvdata->tx.cnt;
277 byte = drvdata->tx.byte;
279 drvdata->t_irq_now = ktime_get();
287 us_delta = ktime_us_delta(drvdata->t_irq_now,
288 drvdata->tx.t_xfer_start);
292 us_delta = ktime_us_delta(drvdata->t_irq_now, drvdata->t_irq_last);
294 dev_err(drvdata->dev,
301 drvdata->t_irq_last = drvdata->t_irq_now;
306 dev_err(drvdata->dev,
318 gpiod_set_value(drvdata->gpio_data, data);
323 gpiod_set_value(drvdata->gpio_data, data);
327 gpiod_direction_input(drvdata->gpio_data);
330 data = gpiod_get_value(drvdata->gpio_data);
332 dev_warn(drvdata->dev, "TX: received NACK, retry\n");
336 drvdata->tx.t_xfer_end = ktime_get();
337 drvdata->mode = PS2_MODE_RX;
338 complete(&drvdata->tx.complete);
347 gpiod_direction_input(drvdata->gpio_data);
348 dev_err(drvdata->dev, "TX: got out of sync with the device\n");
357 gpiod_direction_input(drvdata->gpio_data);
358 __ps2_gpio_write(drvdata->serio, drvdata->tx.byte);
360 drvdata->tx.cnt = cnt;
366 struct ps2_gpio_data *drvdata = dev_id;
368 return drvdata->mode ? ps2_gpio_irq_tx(drvdata) :
369 ps2_gpio_irq_rx(drvdata);
373 struct ps2_gpio_data *drvdata)
380 drvdata->gpio_data = devm_gpiod_get(dev, "data", gflags);
381 if (IS_ERR(drvdata->gpio_data)) {
383 PTR_ERR(drvdata->gpio_data));
384 return PTR_ERR(drvdata->gpio_data);
387 drvdata->gpio_clk = devm_gpiod_get(dev, "clk", gflags);
388 if (IS_ERR(drvdata->gpio_clk)) {
390 PTR_ERR(drvdata->gpio_clk));
391 return PTR_ERR(drvdata->gpio_clk);
394 drvdata->write_enable = device_property_read_bool(dev,
402 struct ps2_gpio_data *drvdata;
407 drvdata = devm_kzalloc(dev, sizeof(struct ps2_gpio_data), GFP_KERNEL);
409 if (!drvdata || !serio) {
414 error = ps2_gpio_get_props(dev, drvdata);
418 if (gpiod_cansleep(drvdata->gpio_data) ||
419 gpiod_cansleep(drvdata->gpio_clk)) {
425 drvdata->irq = platform_get_irq(pdev, 0);
426 if (drvdata->irq < 0) {
427 error = drvdata->irq;
431 error = devm_request_irq(dev, drvdata->irq, ps2_gpio_irq,
432 IRQF_NO_THREAD, DRIVER_NAME, drvdata);
435 drvdata->irq, error);
440 disable_irq(drvdata->irq);
449 serio->write = drvdata->write_enable ? ps2_gpio_write : NULL;
450 serio->port_data = drvdata;
455 drvdata->serio = serio;
456 drvdata->dev = dev;
457 drvdata->mode = PS2_MODE_RX;
463 drvdata->tx.cnt = 1;
465 INIT_DELAYED_WORK(&drvdata->tx.work, ps2_gpio_tx_work_fn);
466 init_completion(&drvdata->tx.complete);
467 mutex_init(&drvdata->tx.mutex);
470 platform_set_drvdata(pdev, drvdata);
481 struct ps2_gpio_data *drvdata = platform_get_drvdata(pdev);
483 serio_unregister_port(drvdata->serio);