Lines Matching +full:i2cxl +full:- +full:maxsonar
1 // SPDX-License-Identifier: GPL-2.0+
3 * mb1232.c - Support for MaxBotix I2CXL-MaxSonar-EZ series ultrasonic
7 * Copyright (c) 2019 Andreas Klinger <ak@it-klinger.de>
10 * https://www.maxbotix.com/documents/I2CXL-MaxSonar-EZ_Datasheet.pdf
25 /* registers of MaxSonar device */
55 complete(&data->ranging); in mb1232_handle_irq()
62 struct i2c_client *client = data->client; in mb1232_read_distance()
67 mutex_lock(&data->lock); in mb1232_read_distance()
69 reinit_completion(&data->ranging); in mb1232_read_distance()
73 dev_err(&client->dev, "write command - err: %d\n", ret); in mb1232_read_distance()
77 if (data->irqnr >= 0) { in mb1232_read_distance()
79 ret = wait_for_completion_killable_timeout(&data->ranging, in mb1232_read_distance()
84 ret = -ETIMEDOUT; in mb1232_read_distance()
94 dev_err(&client->dev, "i2c_master_recv: ret=%d\n", ret); in mb1232_read_distance()
101 dev_err(&client->dev, "distance=%d\n", distance); in mb1232_read_distance()
102 ret = -EINVAL; in mb1232_read_distance()
106 mutex_unlock(&data->lock); in mb1232_read_distance()
111 mutex_unlock(&data->lock); in mb1232_read_distance()
119 struct iio_dev *indio_dev = pf->indio_dev; in mb1232_trigger_handler()
122 data->scan.distance = mb1232_read_distance(data); in mb1232_trigger_handler()
123 if (data->scan.distance < 0) in mb1232_trigger_handler()
126 iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, in mb1232_trigger_handler()
127 pf->timestamp); in mb1232_trigger_handler()
130 iio_trigger_notify_done(indio_dev->trig); in mb1232_trigger_handler()
141 if (channel->type != IIO_DISTANCE) in mb1232_read_raw()
142 return -EINVAL; in mb1232_read_raw()
157 return -EINVAL; in mb1232_read_raw()
187 struct device *dev = &client->dev; in mb1232_probe()
189 if (!i2c_check_functionality(client->adapter, in mb1232_probe()
192 return -ENODEV; in mb1232_probe()
196 return -ENOMEM; in mb1232_probe()
200 data->client = client; in mb1232_probe()
202 indio_dev->info = &mb1232_info; in mb1232_probe()
203 indio_dev->name = id->name; in mb1232_probe()
204 indio_dev->modes = INDIO_DIRECT_MODE; in mb1232_probe()
205 indio_dev->channels = mb1232_channels; in mb1232_probe()
206 indio_dev->num_channels = ARRAY_SIZE(mb1232_channels); in mb1232_probe()
208 mutex_init(&data->lock); in mb1232_probe()
210 init_completion(&data->ranging); in mb1232_probe()
212 data->irqnr = irq_of_parse_and_map(dev->of_node, 0); in mb1232_probe()
213 if (data->irqnr <= 0) { in mb1232_probe()
215 data->irqnr = -1; in mb1232_probe()
217 ret = devm_request_irq(dev, data->irqnr, mb1232_handle_irq, in mb1232_probe()
218 IRQF_TRIGGER_FALLING, id->name, indio_dev); in mb1232_probe()
249 { "maxbotix-mb1202", },
250 { "maxbotix-mb1212", },
251 { "maxbotix-mb1222", },
252 { "maxbotix-mb1232", },
253 { "maxbotix-mb1242", },
254 { "maxbotix-mb7040", },
255 { "maxbotix-mb7137", },
262 .name = "maxbotix-mb1232",
270 MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");
271 MODULE_DESCRIPTION("Maxbotix I2CXL-MaxSonar i2c ultrasonic ranger driver");