Lines Matching +full:startup +full:- +full:sensor
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2011-2016 Synaptics Incorporated
17 * struct rmi_i2c_xport - stores information for i2c communication
25 * @tx_buf: Buffer used for transmitting data to the sensor over i2c.
49 * rmi_set_page - Set RMI page
53 * RMI devices have 16-bit addressing, but some of the transport
54 * implementations (like SMBus) only have 8-bit addressing. So RMI implements
60 * Returns zero on success, non-zero on failure.
64 struct i2c_client *client = rmi_i2c->client; in rmi_set_page()
70 dev_err(&client->dev, in rmi_set_page()
72 return (retval < 0) ? retval : -EIO; in rmi_set_page()
75 rmi_i2c->page = page; in rmi_set_page()
84 struct i2c_client *client = rmi_i2c->client; in rmi_i2c_write_block()
88 mutex_lock(&rmi_i2c->page_mutex); in rmi_i2c_write_block()
90 if (!rmi_i2c->tx_buf || rmi_i2c->tx_buf_size < tx_size) { in rmi_i2c_write_block()
91 if (rmi_i2c->tx_buf) in rmi_i2c_write_block()
92 devm_kfree(&client->dev, rmi_i2c->tx_buf); in rmi_i2c_write_block()
93 rmi_i2c->tx_buf_size = tx_size + BUFFER_SIZE_INCREMENT; in rmi_i2c_write_block()
94 rmi_i2c->tx_buf = devm_kzalloc(&client->dev, in rmi_i2c_write_block()
95 rmi_i2c->tx_buf_size, in rmi_i2c_write_block()
97 if (!rmi_i2c->tx_buf) { in rmi_i2c_write_block()
98 rmi_i2c->tx_buf_size = 0; in rmi_i2c_write_block()
99 retval = -ENOMEM; in rmi_i2c_write_block()
104 rmi_i2c->tx_buf[0] = addr & 0xff; in rmi_i2c_write_block()
105 memcpy(rmi_i2c->tx_buf + 1, buf, len); in rmi_i2c_write_block()
107 if (RMI_I2C_PAGE(addr) != rmi_i2c->page) { in rmi_i2c_write_block()
113 retval = i2c_master_send(client, rmi_i2c->tx_buf, tx_size); in rmi_i2c_write_block()
117 retval = -EIO; in rmi_i2c_write_block()
120 rmi_dbg(RMI_DEBUG_XPORT, &client->dev, in rmi_i2c_write_block()
124 mutex_unlock(&rmi_i2c->page_mutex); in rmi_i2c_write_block()
133 struct i2c_client *client = rmi_i2c->client; in rmi_i2c_read_block()
138 .addr = client->addr, in rmi_i2c_read_block()
143 .addr = client->addr, in rmi_i2c_read_block()
150 mutex_lock(&rmi_i2c->page_mutex); in rmi_i2c_read_block()
152 if (RMI_I2C_PAGE(addr) != rmi_i2c->page) { in rmi_i2c_read_block()
158 retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in rmi_i2c_read_block()
162 retval = -EIO; in rmi_i2c_read_block()
165 rmi_dbg(RMI_DEBUG_XPORT, &client->dev, in rmi_i2c_read_block()
169 mutex_unlock(&rmi_i2c->page_mutex); in rmi_i2c_read_block()
180 { .compatible = "syna,rmi4-i2c" },
190 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_regulator_bulk_disable()
191 rmi_i2c->supplies); in rmi_i2c_regulator_bulk_disable()
198 rmi_unregister_transport_device(&rmi_i2c->xport); in rmi_i2c_unregister_transport()
206 dev_get_platdata(&client->dev); in rmi_i2c_probe()
210 rmi_i2c = devm_kzalloc(&client->dev, sizeof(struct rmi_i2c_xport), in rmi_i2c_probe()
213 return -ENOMEM; in rmi_i2c_probe()
215 pdata = &rmi_i2c->xport.pdata; in rmi_i2c_probe()
217 if (!client->dev.of_node && client_pdata) in rmi_i2c_probe()
220 pdata->irq = client->irq; in rmi_i2c_probe()
222 rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Probing %s.\n", in rmi_i2c_probe()
223 dev_name(&client->dev)); in rmi_i2c_probe()
225 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in rmi_i2c_probe()
226 dev_err(&client->dev, in rmi_i2c_probe()
228 return -ENODEV; in rmi_i2c_probe()
231 rmi_i2c->supplies[0].supply = "vdd"; in rmi_i2c_probe()
232 rmi_i2c->supplies[1].supply = "vio"; in rmi_i2c_probe()
233 error = devm_regulator_bulk_get(&client->dev, in rmi_i2c_probe()
234 ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_probe()
235 rmi_i2c->supplies); in rmi_i2c_probe()
239 error = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_probe()
240 rmi_i2c->supplies); in rmi_i2c_probe()
244 error = devm_add_action_or_reset(&client->dev, in rmi_i2c_probe()
250 of_property_read_u32(client->dev.of_node, "syna,startup-delay-ms", in rmi_i2c_probe()
251 &rmi_i2c->startup_delay); in rmi_i2c_probe()
253 msleep(rmi_i2c->startup_delay); in rmi_i2c_probe()
255 rmi_i2c->client = client; in rmi_i2c_probe()
256 mutex_init(&rmi_i2c->page_mutex); in rmi_i2c_probe()
258 rmi_i2c->xport.dev = &client->dev; in rmi_i2c_probe()
259 rmi_i2c->xport.proto_name = "i2c"; in rmi_i2c_probe()
260 rmi_i2c->xport.ops = &rmi_i2c_ops; in rmi_i2c_probe()
270 dev_err(&client->dev, "Failed to set page select to 0\n"); in rmi_i2c_probe()
274 dev_info(&client->dev, "registering I2C-connected sensor\n"); in rmi_i2c_probe()
276 error = rmi_register_transport_device(&rmi_i2c->xport); in rmi_i2c_probe()
278 dev_err(&client->dev, "failed to register sensor: %d\n", error); in rmi_i2c_probe()
282 error = devm_add_action_or_reset(&client->dev, in rmi_i2c_probe()
298 ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, true); in rmi_i2c_suspend()
302 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_suspend()
303 rmi_i2c->supplies); in rmi_i2c_suspend()
314 ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_resume()
315 rmi_i2c->supplies); in rmi_i2c_resume()
319 msleep(rmi_i2c->startup_delay); in rmi_i2c_resume()
321 ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, true); in rmi_i2c_resume()
336 ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, false); in rmi_i2c_runtime_suspend()
340 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_runtime_suspend()
341 rmi_i2c->supplies); in rmi_i2c_runtime_suspend()
352 ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_runtime_resume()
353 rmi_i2c->supplies); in rmi_i2c_runtime_resume()
357 msleep(rmi_i2c->startup_delay); in rmi_i2c_runtime_resume()
359 ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, false); in rmi_i2c_runtime_resume()