Lines Matching +full:waking +full:- +full:up
1 // SPDX-License-Identifier: GPL-2.0
22 #include "atmel-i2c.h"
37 * atmel_i2c_checksum() - Generate 16-bit CRC as required by ATMEL ECC.
39 * The checksum is saved in little-endian format in the least significant
47 u8 *data = &cmd->count; in atmel_i2c_checksum()
48 size_t len = cmd->count - CRC_SIZE; in atmel_i2c_checksum()
56 cmd->word_addr = COMMAND; in atmel_i2c_init_read_cmd()
57 cmd->opcode = OPCODE_READ; in atmel_i2c_init_read_cmd()
62 cmd->param1 = CONFIGURATION_ZONE; in atmel_i2c_init_read_cmd()
63 cmd->param2 = cpu_to_le16(DEVICE_LOCK_ADDR); in atmel_i2c_init_read_cmd()
64 cmd->count = READ_COUNT; in atmel_i2c_init_read_cmd()
68 cmd->msecs = MAX_EXEC_TIME_READ; in atmel_i2c_init_read_cmd()
69 cmd->rxsize = READ_RSP_SIZE; in atmel_i2c_init_read_cmd()
75 cmd->word_addr = COMMAND; in atmel_i2c_init_random_cmd()
76 cmd->opcode = OPCODE_RANDOM; in atmel_i2c_init_random_cmd()
77 cmd->param1 = 0; in atmel_i2c_init_random_cmd()
78 cmd->param2 = 0; in atmel_i2c_init_random_cmd()
79 cmd->count = RANDOM_COUNT; in atmel_i2c_init_random_cmd()
83 cmd->msecs = MAX_EXEC_TIME_RANDOM; in atmel_i2c_init_random_cmd()
84 cmd->rxsize = RANDOM_RSP_SIZE; in atmel_i2c_init_random_cmd()
90 cmd->word_addr = COMMAND; in atmel_i2c_init_genkey_cmd()
91 cmd->count = GENKEY_COUNT; in atmel_i2c_init_genkey_cmd()
92 cmd->opcode = OPCODE_GENKEY; in atmel_i2c_init_genkey_cmd()
93 cmd->param1 = GENKEY_MODE_PRIVATE; in atmel_i2c_init_genkey_cmd()
95 cmd->param2 = cpu_to_le16(keyid); in atmel_i2c_init_genkey_cmd()
99 cmd->msecs = MAX_EXEC_TIME_GENKEY; in atmel_i2c_init_genkey_cmd()
100 cmd->rxsize = GENKEY_RSP_SIZE; in atmel_i2c_init_genkey_cmd()
109 cmd->word_addr = COMMAND; in atmel_i2c_init_ecdh_cmd()
110 cmd->count = ECDH_COUNT; in atmel_i2c_init_ecdh_cmd()
111 cmd->opcode = OPCODE_ECDH; in atmel_i2c_init_ecdh_cmd()
112 cmd->param1 = ECDH_PREFIX_MODE; in atmel_i2c_init_ecdh_cmd()
114 cmd->param2 = cpu_to_le16(DATA_SLOT_2); in atmel_i2c_init_ecdh_cmd()
124 cmd->data, ATMEL_ECC_PUBKEY_SIZE); in atmel_i2c_init_ecdh_cmd()
126 return -EINVAL; in atmel_i2c_init_ecdh_cmd()
130 cmd->msecs = MAX_EXEC_TIME_ECDH; in atmel_i2c_init_ecdh_cmd()
131 cmd->rxsize = ECDH_RSP_SIZE; in atmel_i2c_init_ecdh_cmd()
176 * device is idle, asleep or during waking up. Don't check for error in atmel_i2c_wakeup()
177 * when waking up the device. in atmel_i2c_wakeup()
179 i2c_transfer_buffer_flags(client, i2c_priv->wake_token, in atmel_i2c_wakeup()
180 i2c_priv->wake_token_sz, I2C_M_IGNORE_NAK); in atmel_i2c_wakeup()
192 return atmel_i2c_status(&client->dev, status); in atmel_i2c_wakeup()
203 * atmel_i2c_send_receive() - send a command to the device and receive its
215 * wake it up again.
222 mutex_lock(&i2c_priv->lock); in atmel_i2c_send_receive()
229 ret = i2c_master_send(client, (u8 *)cmd, cmd->count + WORD_ADDR_SIZE); in atmel_i2c_send_receive()
234 msleep(cmd->msecs); in atmel_i2c_send_receive()
237 ret = i2c_master_recv(client, cmd->data, cmd->rxsize); in atmel_i2c_send_receive()
241 /* put the device into low-power mode */ in atmel_i2c_send_receive()
246 mutex_unlock(&i2c_priv->lock); in atmel_i2c_send_receive()
247 return atmel_i2c_status(&client->dev, cmd->data); in atmel_i2c_send_receive()
249 mutex_unlock(&i2c_priv->lock); in atmel_i2c_send_receive()
258 struct atmel_i2c_cmd *cmd = &work_data->cmd; in atmel_i2c_work_handler()
259 struct i2c_client *client = work_data->client; in atmel_i2c_work_handler()
263 work_data->cbk(work_data, work_data->areq, status); in atmel_i2c_work_handler()
273 work_data->cbk = (void *)cbk; in atmel_i2c_enqueue()
274 work_data->areq = areq; in atmel_i2c_enqueue()
276 INIT_WORK(&work_data->work, atmel_i2c_work_handler); in atmel_i2c_enqueue()
277 queue_work(atmel_wq, &work_data->work); in atmel_i2c_enqueue()
302 return -ENOMEM; in device_sanity_check()
316 if (cmd->data[LOCK_CONFIG_IDX] || cmd->data[LOCK_VALUE_IDX]) { in device_sanity_check()
317 dev_err(&client->dev, "Configuration or Data and OTP zones are unlocked!\n"); in device_sanity_check()
318 ret = -ENOTSUPP; in device_sanity_check()
330 struct device *dev = &client->dev; in atmel_i2c_probe()
334 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in atmel_i2c_probe()
336 return -ENODEV; in atmel_i2c_probe()
339 bus_clk_rate = i2c_acpi_find_bus_speed(&client->adapter->dev); in atmel_i2c_probe()
341 ret = device_property_read_u32(&client->adapter->dev, in atmel_i2c_probe()
342 "clock-frequency", &bus_clk_rate); in atmel_i2c_probe()
344 dev_err(dev, "failed to read clock-frequency property\n"); in atmel_i2c_probe()
352 return -EINVAL; in atmel_i2c_probe()
357 return -ENOMEM; in atmel_i2c_probe()
359 i2c_priv->client = client; in atmel_i2c_probe()
360 mutex_init(&i2c_priv->lock); in atmel_i2c_probe()
363 * WAKE_TOKEN_MAX_SIZE was calculated for the maximum bus_clk_rate - in atmel_i2c_probe()
367 i2c_priv->wake_token_sz = atmel_i2c_wake_token_sz(bus_clk_rate); in atmel_i2c_probe()
369 memset(i2c_priv->wake_token, 0, sizeof(i2c_priv->wake_token)); in atmel_i2c_probe()
371 atomic_set(&i2c_priv->tfm_count, 0); in atmel_i2c_probe()
382 return atmel_wq ? 0 : -ENOMEM; in atmel_i2c_init()