#include <linux/hw_random.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#define ST_RNG_STATUS_REG 0x20
#define ST_RNG_DATA_REG 0x24
#define ST_RNG_STATUS_BAD_SEQUENCE BIT(0)
#define ST_RNG_STATUS_BAD_ALTERNANCE BIT(1)
#define ST_RNG_STATUS_FIFO_FULL BIT(5)
#define ST_RNG_SAMPLE_SIZE 2
#define ST_RNG_FIFO_DEPTH 4
#define ST_RNG_FIFO_SIZE (ST_RNG_FIFO_DEPTH * ST_RNG_SAMPLE_SIZE)
#define ST_RNG_FILL_FIFO_TIMEOUT (12 * 2)
static int st_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
struct st_rng_data *ddata = (struct st_rng_data *)rng->priv;
for (i = 0; i < ST_RNG_FILL_FIFO_TIMEOUT; i++) {
status = readl_relaxed(ddata->base + ST_RNG_STATUS_REG);
if (status & ST_RNG_STATUS_FIFO_FULL)