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()
205 dev_get_platdata(&client->dev); in rmi_i2c_probe()
209 rmi_i2c = devm_kzalloc(&client->dev, sizeof(struct rmi_i2c_xport), in rmi_i2c_probe()
212 return -ENOMEM; in rmi_i2c_probe()
214 pdata = &rmi_i2c->xport.pdata; in rmi_i2c_probe()
216 if (!client->dev.of_node && client_pdata) in rmi_i2c_probe()
219 pdata->irq = client->irq; in rmi_i2c_probe()
221 rmi_dbg(RMI_DEBUG_XPORT, &client->dev, "Probing %s.\n", in rmi_i2c_probe()
222 dev_name(&client->dev)); in rmi_i2c_probe()
224 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in rmi_i2c_probe()
225 dev_err(&client->dev, in rmi_i2c_probe()
227 return -ENODEV; in rmi_i2c_probe()
230 rmi_i2c->supplies[0].supply = "vdd"; in rmi_i2c_probe()
231 rmi_i2c->supplies[1].supply = "vio"; in rmi_i2c_probe()
232 error = devm_regulator_bulk_get(&client->dev, in rmi_i2c_probe()
233 ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_probe()
234 rmi_i2c->supplies); in rmi_i2c_probe()
238 error = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_probe()
239 rmi_i2c->supplies); in rmi_i2c_probe()
243 error = devm_add_action_or_reset(&client->dev, in rmi_i2c_probe()
249 of_property_read_u32(client->dev.of_node, "syna,startup-delay-ms", in rmi_i2c_probe()
250 &rmi_i2c->startup_delay); in rmi_i2c_probe()
252 msleep(rmi_i2c->startup_delay); in rmi_i2c_probe()
254 rmi_i2c->client = client; in rmi_i2c_probe()
255 mutex_init(&rmi_i2c->page_mutex); in rmi_i2c_probe()
257 rmi_i2c->xport.dev = &client->dev; in rmi_i2c_probe()
258 rmi_i2c->xport.proto_name = "i2c"; in rmi_i2c_probe()
259 rmi_i2c->xport.ops = &rmi_i2c_ops; in rmi_i2c_probe()
269 dev_err(&client->dev, "Failed to set page select to 0\n"); in rmi_i2c_probe()
273 dev_info(&client->dev, "registering I2C-connected sensor\n"); in rmi_i2c_probe()
275 error = rmi_register_transport_device(&rmi_i2c->xport); in rmi_i2c_probe()
277 dev_err(&client->dev, "failed to register sensor: %d\n", error); in rmi_i2c_probe()
281 error = devm_add_action_or_reset(&client->dev, in rmi_i2c_probe()
296 ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, true); in rmi_i2c_suspend()
300 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_suspend()
301 rmi_i2c->supplies); in rmi_i2c_suspend()
312 ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_resume()
313 rmi_i2c->supplies); in rmi_i2c_resume()
317 msleep(rmi_i2c->startup_delay); in rmi_i2c_resume()
319 ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, true); in rmi_i2c_resume()
332 ret = rmi_driver_suspend(rmi_i2c->xport.rmi_dev, false); in rmi_i2c_runtime_suspend()
336 regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_runtime_suspend()
337 rmi_i2c->supplies); in rmi_i2c_runtime_suspend()
348 ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), in rmi_i2c_runtime_resume()
349 rmi_i2c->supplies); in rmi_i2c_runtime_resume()
353 msleep(rmi_i2c->startup_delay); in rmi_i2c_runtime_resume()
355 ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, false); in rmi_i2c_runtime_resume()