Lines Matching refs:rng
74 static int hwrng_init(struct hwrng *rng);
77 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
85 static void add_early_randomness(struct hwrng *rng) in add_early_randomness() argument
91 bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); in add_early_randomness()
99 struct hwrng *rng = container_of(kref, struct hwrng, ref); in cleanup_rng() local
101 if (rng->cleanup) in cleanup_rng()
102 rng->cleanup(rng); in cleanup_rng()
104 complete(&rng->cleanup_done); in cleanup_rng()
107 static int set_current_rng(struct hwrng *rng) in set_current_rng() argument
113 err = hwrng_init(rng); in set_current_rng()
118 current_rng = rng; in set_current_rng()
137 struct hwrng *rng; in get_current_rng() local
142 rng = current_rng; in get_current_rng()
143 if (rng) in get_current_rng()
144 kref_get(&rng->ref); in get_current_rng()
147 return rng; in get_current_rng()
150 static void put_rng(struct hwrng *rng) in put_rng() argument
157 if (rng) in put_rng()
158 kref_put(&rng->ref, cleanup_rng); in put_rng()
162 static int hwrng_init(struct hwrng *rng) in hwrng_init() argument
164 if (kref_get_unless_zero(&rng->ref)) in hwrng_init()
167 if (rng->init) { in hwrng_init()
170 ret = rng->init(rng); in hwrng_init()
175 kref_init(&rng->ref); in hwrng_init()
176 reinit_completion(&rng->cleanup_done); in hwrng_init()
179 add_early_randomness(rng); in hwrng_init()
181 current_quality = rng->quality ? : default_quality; in hwrng_init()
203 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, in rng_get_data() argument
208 if (rng->read) in rng_get_data()
209 return rng->read(rng, (void *)buffer, size, wait); in rng_get_data()
211 if (rng->data_present) in rng_get_data()
212 present = rng->data_present(rng, wait); in rng_get_data()
217 return rng->data_read(rng, (u32 *)buffer); in rng_get_data()
228 struct hwrng *rng; in rng_dev_read() local
231 rng = get_current_rng(); in rng_dev_read()
232 if (IS_ERR(rng)) { in rng_dev_read()
233 err = PTR_ERR(rng); in rng_dev_read()
236 if (!rng) { in rng_dev_read()
243 bytes_read = rng_get_data(rng, rng_buffer, in rng_dev_read()
276 put_rng(rng); in rng_dev_read()
291 put_rng(rng); in rng_dev_read()
319 struct hwrng *rng; in hwrng_attr_current_store() local
325 list_for_each_entry(rng, &rng_list, list) { in hwrng_attr_current_store()
326 if (strcmp(rng->name, buf) == 0) { in hwrng_attr_current_store()
328 if (rng != current_rng) in hwrng_attr_current_store()
329 err = set_current_rng(rng); in hwrng_attr_current_store()
343 struct hwrng *rng; in hwrng_attr_current_show() local
345 rng = get_current_rng(); in hwrng_attr_current_show()
346 if (IS_ERR(rng)) in hwrng_attr_current_show()
347 return PTR_ERR(rng); in hwrng_attr_current_show()
349 ret = snprintf(buf, PAGE_SIZE, "%s\n", rng ? rng->name : "none"); in hwrng_attr_current_show()
350 put_rng(rng); in hwrng_attr_current_show()
360 struct hwrng *rng; in hwrng_attr_available_show() local
366 list_for_each_entry(rng, &rng_list, list) { in hwrng_attr_available_show()
367 strlcat(buf, rng->name, PAGE_SIZE); in hwrng_attr_available_show()
406 struct hwrng *rng; in hwrng_fillfn() local
408 rng = get_current_rng(); in hwrng_fillfn()
409 if (IS_ERR(rng) || !rng) in hwrng_fillfn()
412 rc = rng_get_data(rng, rng_fillbuf, in hwrng_fillfn()
415 put_rng(rng); in hwrng_fillfn()
438 int hwrng_register(struct hwrng *rng) in hwrng_register() argument
443 if (rng->name == NULL || in hwrng_register()
444 (rng->data_read == NULL && rng->read == NULL)) in hwrng_register()
467 if (strcmp(tmp->name, rng->name) == 0) in hwrng_register()
471 init_completion(&rng->cleanup_done); in hwrng_register()
472 complete(&rng->cleanup_done); in hwrng_register()
477 err = set_current_rng(rng); in hwrng_register()
481 list_add_tail(&rng->list, &rng_list); in hwrng_register()
483 if (old_rng && !rng->init) { in hwrng_register()
491 add_early_randomness(rng); in hwrng_register()
501 void hwrng_unregister(struct hwrng *rng) in hwrng_unregister() argument
505 list_del(&rng->list); in hwrng_unregister()
506 if (current_rng == rng) { in hwrng_unregister()
524 wait_for_completion(&rng->cleanup_done); in hwrng_unregister()
543 int devm_hwrng_register(struct device *dev, struct hwrng *rng) in devm_hwrng_register() argument
552 error = hwrng_register(rng); in devm_hwrng_register()
558 *ptr = rng; in devm_hwrng_register()
564 void devm_hwrng_unregister(struct device *dev, struct hwrng *rng) in devm_hwrng_unregister() argument
566 devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng); in devm_hwrng_unregister()