Lines Matching +full:cmd +full:- +full:max +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
19 #include "atmel-i2c.h"
24 struct atmel_i2c_client_priv *i2c_priv = work_data->ctx; in atmel_sha204a_rng_done()
28 dev_warn_ratelimited(&i2c_priv->client->dev, in atmel_sha204a_rng_done()
32 rng->priv = (unsigned long)work_data; in atmel_sha204a_rng_done()
33 atomic_dec(&i2c_priv->tfm_count); in atmel_sha204a_rng_done()
37 size_t max) in atmel_sha204a_rng_read_nonblocking() argument
45 if (!atomic_add_unless(&i2c_priv->tfm_count, 1, 1)) in atmel_sha204a_rng_read_nonblocking()
48 if (rng->priv) { in atmel_sha204a_rng_read_nonblocking()
49 work_data = (struct atmel_i2c_work_data *)rng->priv; in atmel_sha204a_rng_read_nonblocking()
50 max = min(sizeof(work_data->cmd.data), max); in atmel_sha204a_rng_read_nonblocking()
51 memcpy(data, &work_data->cmd.data, max); in atmel_sha204a_rng_read_nonblocking()
52 rng->priv = 0; in atmel_sha204a_rng_read_nonblocking()
56 return -ENOMEM; in atmel_sha204a_rng_read_nonblocking()
58 work_data->ctx = i2c_priv; in atmel_sha204a_rng_read_nonblocking()
59 work_data->client = i2c_priv->client; in atmel_sha204a_rng_read_nonblocking()
61 max = 0; in atmel_sha204a_rng_read_nonblocking()
64 atmel_i2c_init_random_cmd(&work_data->cmd); in atmel_sha204a_rng_read_nonblocking()
67 return max; in atmel_sha204a_rng_read_nonblocking()
70 static int atmel_sha204a_rng_read(struct hwrng *rng, void *data, size_t max, in atmel_sha204a_rng_read() argument
74 struct atmel_i2c_cmd cmd; in atmel_sha204a_rng_read() local
78 return atmel_sha204a_rng_read_nonblocking(rng, data, max); in atmel_sha204a_rng_read()
82 atmel_i2c_init_random_cmd(&cmd); in atmel_sha204a_rng_read()
84 ret = atmel_i2c_send_receive(i2c_priv->client, &cmd); in atmel_sha204a_rng_read()
88 max = min(sizeof(cmd.data), max); in atmel_sha204a_rng_read()
89 memcpy(data, cmd.data, max); in atmel_sha204a_rng_read()
91 return max; in atmel_sha204a_rng_read()
96 struct atmel_i2c_cmd cmd; in atmel_sha204a_otp_read() local
97 int ret = -1; in atmel_sha204a_otp_read()
99 if (atmel_i2c_init_read_otp_cmd(&cmd, addr) < 0) { in atmel_sha204a_otp_read()
100 dev_err(&client->dev, "failed, invalid otp address %04X\n", in atmel_sha204a_otp_read()
105 ret = atmel_i2c_send_receive(client, &cmd); in atmel_sha204a_otp_read()
107 if (cmd.data[0] == 0xff) { in atmel_sha204a_otp_read()
108 dev_err(&client->dev, "failed, device not ready\n"); in atmel_sha204a_otp_read()
109 return -EINVAL; in atmel_sha204a_otp_read()
112 memcpy(otp, cmd.data+1, 4); in atmel_sha204a_otp_read()
136 return str - buf; in otp_show()
146 .name = "atsha204a",
161 memset(&i2c_priv->hwrng, 0, sizeof(i2c_priv->hwrng)); in atmel_sha204a_probe()
163 i2c_priv->hwrng.name = dev_name(&client->dev); in atmel_sha204a_probe()
164 i2c_priv->hwrng.read = atmel_sha204a_rng_read; in atmel_sha204a_probe()
166 ret = devm_hwrng_register(&client->dev, &i2c_priv->hwrng); in atmel_sha204a_probe()
168 dev_warn(&client->dev, "failed to register RNG (%d)\n", ret); in atmel_sha204a_probe()
171 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in atmel_sha204a_probe()
172 return -ENODEV; in atmel_sha204a_probe()
174 ret = sysfs_create_group(&client->dev.kobj, &atmel_sha204a_groups); in atmel_sha204a_probe()
176 dev_err(&client->dev, "failed to register sysfs entry\n"); in atmel_sha204a_probe()
187 if (atomic_read(&i2c_priv->tfm_count)) { in atmel_sha204a_remove()
188 dev_emerg(&client->dev, "Device is busy, will remove it anyhow\n"); in atmel_sha204a_remove()
192 sysfs_remove_group(&client->dev.kobj, &atmel_sha204a_groups); in atmel_sha204a_remove()
194 kfree((void *)i2c_priv->hwrng.priv); in atmel_sha204a_remove()
216 .driver.name = "atmel-sha204a",