Lines Matching refs:rng
53 static int hwrng_init(struct hwrng *rng);
56 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
64 static void add_early_randomness(struct hwrng *rng) in add_early_randomness() argument
70 bytes_read = rng_get_data(rng, rng_buffer, size, 0); in add_early_randomness()
78 struct hwrng *rng = container_of(kref, struct hwrng, ref); in cleanup_rng() local
80 if (rng->cleanup) in cleanup_rng()
81 rng->cleanup(rng); in cleanup_rng()
83 complete(&rng->cleanup_done); in cleanup_rng()
86 static int set_current_rng(struct hwrng *rng) in set_current_rng() argument
92 err = hwrng_init(rng); in set_current_rng()
97 current_rng = rng; in set_current_rng()
116 struct hwrng *rng; in get_current_rng() local
121 rng = current_rng; in get_current_rng()
122 if (rng) in get_current_rng()
123 kref_get(&rng->ref); in get_current_rng()
126 return rng; in get_current_rng()
129 static void put_rng(struct hwrng *rng) in put_rng() argument
136 if (rng) in put_rng()
137 kref_put(&rng->ref, cleanup_rng); in put_rng()
141 static int hwrng_init(struct hwrng *rng) in hwrng_init() argument
143 if (kref_get_unless_zero(&rng->ref)) in hwrng_init()
146 if (rng->init) { in hwrng_init()
149 ret = rng->init(rng); in hwrng_init()
154 kref_init(&rng->ref); in hwrng_init()
155 reinit_completion(&rng->cleanup_done); in hwrng_init()
158 add_early_randomness(rng); in hwrng_init()
160 current_quality = rng->quality ? : default_quality; in hwrng_init()
182 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, in rng_get_data() argument
187 if (rng->read) in rng_get_data()
188 return rng->read(rng, (void *)buffer, size, wait); in rng_get_data()
190 if (rng->data_present) in rng_get_data()
191 present = rng->data_present(rng, wait); in rng_get_data()
196 return rng->data_read(rng, (u32 *)buffer); in rng_get_data()
207 struct hwrng *rng; in rng_dev_read() local
210 rng = get_current_rng(); in rng_dev_read()
211 if (IS_ERR(rng)) { in rng_dev_read()
212 err = PTR_ERR(rng); in rng_dev_read()
215 if (!rng) { in rng_dev_read()
225 bytes_read = rng_get_data(rng, rng_buffer, in rng_dev_read()
258 put_rng(rng); in rng_dev_read()
274 put_rng(rng); in rng_dev_read()
323 struct hwrng *rng; in hwrng_attr_current_store() local
332 list_for_each_entry(rng, &rng_list, list) { in hwrng_attr_current_store()
333 if (sysfs_streq(rng->name, buf)) { in hwrng_attr_current_store()
335 err = set_current_rng(rng); in hwrng_attr_current_store()
351 struct hwrng *rng; in hwrng_attr_current_show() local
353 rng = get_current_rng(); in hwrng_attr_current_show()
354 if (IS_ERR(rng)) in hwrng_attr_current_show()
355 return PTR_ERR(rng); in hwrng_attr_current_show()
357 ret = snprintf(buf, PAGE_SIZE, "%s\n", rng ? rng->name : "none"); in hwrng_attr_current_show()
358 put_rng(rng); in hwrng_attr_current_show()
368 struct hwrng *rng; in hwrng_attr_available_show() local
374 list_for_each_entry(rng, &rng_list, list) { in hwrng_attr_available_show()
375 strlcat(buf, rng->name, PAGE_SIZE); in hwrng_attr_available_show()
425 struct hwrng *rng; in hwrng_fillfn() local
427 rng = get_current_rng(); in hwrng_fillfn()
428 if (IS_ERR(rng) || !rng) in hwrng_fillfn()
431 rc = rng_get_data(rng, rng_fillbuf, in hwrng_fillfn()
434 put_rng(rng); in hwrng_fillfn()
457 int hwrng_register(struct hwrng *rng) in hwrng_register() argument
463 if (!rng->name || (!rng->data_read && !rng->read)) in hwrng_register()
470 if (strcmp(tmp->name, rng->name) == 0) in hwrng_register()
474 init_completion(&rng->cleanup_done); in hwrng_register()
475 complete(&rng->cleanup_done); in hwrng_register()
480 if (tmp->quality < rng->quality) in hwrng_register()
483 list_add_tail(&rng->list, rng_list_ptr); in hwrng_register()
488 (!cur_rng_set_by_user && rng->quality > old_rng->quality)) { in hwrng_register()
494 err = set_current_rng(rng); in hwrng_register()
499 if (old_rng && !rng->init) { in hwrng_register()
507 add_early_randomness(rng); in hwrng_register()
517 void hwrng_unregister(struct hwrng *rng) in hwrng_unregister() argument
523 list_del(&rng->list); in hwrng_unregister()
524 if (current_rng == rng) { in hwrng_unregister()
539 wait_for_completion(&rng->cleanup_done); in hwrng_unregister()
558 int devm_hwrng_register(struct device *dev, struct hwrng *rng) in devm_hwrng_register() argument
567 error = hwrng_register(rng); in devm_hwrng_register()
573 *ptr = rng; in devm_hwrng_register()
579 void devm_hwrng_unregister(struct device *dev, struct hwrng *rng) in devm_hwrng_unregister() argument
581 devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng); in devm_hwrng_unregister()