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_config_cmd()
57 cmd->opcode = OPCODE_READ; in atmel_i2c_init_read_config_cmd()
62 cmd->param1 = CONFIGURATION_ZONE; in atmel_i2c_init_read_config_cmd()
63 cmd->param2 = cpu_to_le16(DEVICE_LOCK_ADDR); in atmel_i2c_init_read_config_cmd()
64 cmd->count = READ_COUNT; in atmel_i2c_init_read_config_cmd()
68 cmd->msecs = MAX_EXEC_TIME_READ; in atmel_i2c_init_read_config_cmd()
69 cmd->rxsize = READ_RSP_SIZE; in atmel_i2c_init_read_config_cmd()
76 return -1; in atmel_i2c_init_read_otp_cmd()
78 cmd->word_addr = COMMAND; in atmel_i2c_init_read_otp_cmd()
79 cmd->opcode = OPCODE_READ; in atmel_i2c_init_read_otp_cmd()
82 * numbers or similar if persistently pre-initialized and locked in atmel_i2c_init_read_otp_cmd()
84 cmd->param1 = OTP_ZONE; in atmel_i2c_init_read_otp_cmd()
85 cmd->param2 = cpu_to_le16(addr); in atmel_i2c_init_read_otp_cmd()
86 cmd->count = READ_COUNT; in atmel_i2c_init_read_otp_cmd()
90 cmd->msecs = MAX_EXEC_TIME_READ; in atmel_i2c_init_read_otp_cmd()
91 cmd->rxsize = READ_RSP_SIZE; in atmel_i2c_init_read_otp_cmd()
99 cmd->word_addr = COMMAND; in atmel_i2c_init_random_cmd()
100 cmd->opcode = OPCODE_RANDOM; in atmel_i2c_init_random_cmd()
101 cmd->param1 = 0; in atmel_i2c_init_random_cmd()
102 cmd->param2 = 0; in atmel_i2c_init_random_cmd()
103 cmd->count = RANDOM_COUNT; in atmel_i2c_init_random_cmd()
107 cmd->msecs = MAX_EXEC_TIME_RANDOM; in atmel_i2c_init_random_cmd()
108 cmd->rxsize = RANDOM_RSP_SIZE; in atmel_i2c_init_random_cmd()
114 cmd->word_addr = COMMAND; in atmel_i2c_init_genkey_cmd()
115 cmd->count = GENKEY_COUNT; in atmel_i2c_init_genkey_cmd()
116 cmd->opcode = OPCODE_GENKEY; in atmel_i2c_init_genkey_cmd()
117 cmd->param1 = GENKEY_MODE_PRIVATE; in atmel_i2c_init_genkey_cmd()
119 cmd->param2 = cpu_to_le16(keyid); in atmel_i2c_init_genkey_cmd()
123 cmd->msecs = MAX_EXEC_TIME_GENKEY; in atmel_i2c_init_genkey_cmd()
124 cmd->rxsize = GENKEY_RSP_SIZE; in atmel_i2c_init_genkey_cmd()
133 cmd->word_addr = COMMAND; in atmel_i2c_init_ecdh_cmd()
134 cmd->count = ECDH_COUNT; in atmel_i2c_init_ecdh_cmd()
135 cmd->opcode = OPCODE_ECDH; in atmel_i2c_init_ecdh_cmd()
136 cmd->param1 = ECDH_PREFIX_MODE; in atmel_i2c_init_ecdh_cmd()
138 cmd->param2 = cpu_to_le16(DATA_SLOT_2); in atmel_i2c_init_ecdh_cmd()
148 cmd->data, ATMEL_ECC_PUBKEY_SIZE); in atmel_i2c_init_ecdh_cmd()
150 return -EINVAL; in atmel_i2c_init_ecdh_cmd()
154 cmd->msecs = MAX_EXEC_TIME_ECDH; in atmel_i2c_init_ecdh_cmd()
155 cmd->rxsize = ECDH_RSP_SIZE; in atmel_i2c_init_ecdh_cmd()
200 * device is idle, asleep or during waking up. Don't check for error in atmel_i2c_wakeup()
201 * when waking up the device. in atmel_i2c_wakeup()
203 i2c_transfer_buffer_flags(client, i2c_priv->wake_token, in atmel_i2c_wakeup()
204 i2c_priv->wake_token_sz, I2C_M_IGNORE_NAK); in atmel_i2c_wakeup()
216 return atmel_i2c_status(&client->dev, status); in atmel_i2c_wakeup()
227 * atmel_i2c_send_receive() - send a command to the device and receive its
239 * wake it up again.
246 mutex_lock(&i2c_priv->lock); in atmel_i2c_send_receive()
253 ret = i2c_master_send(client, (u8 *)cmd, cmd->count + WORD_ADDR_SIZE); in atmel_i2c_send_receive()
258 msleep(cmd->msecs); in atmel_i2c_send_receive()
261 ret = i2c_master_recv(client, cmd->data, cmd->rxsize); in atmel_i2c_send_receive()
265 /* put the device into low-power mode */ in atmel_i2c_send_receive()
270 mutex_unlock(&i2c_priv->lock); in atmel_i2c_send_receive()
271 return atmel_i2c_status(&client->dev, cmd->data); in atmel_i2c_send_receive()
273 mutex_unlock(&i2c_priv->lock); in atmel_i2c_send_receive()
282 struct atmel_i2c_cmd *cmd = &work_data->cmd; in atmel_i2c_work_handler()
283 struct i2c_client *client = work_data->client; in atmel_i2c_work_handler()
287 work_data->cbk(work_data, work_data->areq, status); in atmel_i2c_work_handler()
297 work_data->cbk = (void *)cbk; in atmel_i2c_enqueue()
298 work_data->areq = areq; in atmel_i2c_enqueue()
300 INIT_WORK(&work_data->work, atmel_i2c_work_handler); in atmel_i2c_enqueue()
301 queue_work(atmel_wq, &work_data->work); in atmel_i2c_enqueue()
326 return -ENOMEM; in device_sanity_check()
340 if (cmd->data[LOCK_CONFIG_IDX] || cmd->data[LOCK_VALUE_IDX]) { in device_sanity_check()
341 dev_err(&client->dev, "Configuration or Data and OTP zones are unlocked!\n"); in device_sanity_check()
342 ret = -ENOTSUPP; in device_sanity_check()
354 struct device *dev = &client->dev; in atmel_i2c_probe()
358 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in atmel_i2c_probe()
360 return -ENODEV; in atmel_i2c_probe()
363 bus_clk_rate = i2c_acpi_find_bus_speed(&client->adapter->dev); in atmel_i2c_probe()
365 ret = device_property_read_u32(&client->adapter->dev, in atmel_i2c_probe()
366 "clock-frequency", &bus_clk_rate); in atmel_i2c_probe()
368 dev_err(dev, "failed to read clock-frequency property\n"); in atmel_i2c_probe()
376 return -EINVAL; in atmel_i2c_probe()
381 return -ENOMEM; in atmel_i2c_probe()
383 i2c_priv->client = client; in atmel_i2c_probe()
384 mutex_init(&i2c_priv->lock); in atmel_i2c_probe()
387 * WAKE_TOKEN_MAX_SIZE was calculated for the maximum bus_clk_rate - in atmel_i2c_probe()
391 i2c_priv->wake_token_sz = atmel_i2c_wake_token_sz(bus_clk_rate); in atmel_i2c_probe()
393 memset(i2c_priv->wake_token, 0, sizeof(i2c_priv->wake_token)); in atmel_i2c_probe()
395 atomic_set(&i2c_priv->tfm_count, 0); in atmel_i2c_probe()
406 return atmel_wq ? 0 : -ENOMEM; in atmel_i2c_init()