diff options
Diffstat (limited to 'drivers/char/hw_random/stm32-rng.c')
| -rw-r--r-- | drivers/char/hw_random/stm32-rng.c | 35 | 
1 files changed, 16 insertions, 19 deletions
diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c index 0e903d6e22e3..9d041a67c295 100644 --- a/drivers/char/hw_random/stm32-rng.c +++ b/drivers/char/hw_random/stm32-rng.c @@ -70,6 +70,7 @@ struct stm32_rng_config {  struct stm32_rng_private {  	struct hwrng rng; +	struct device *dev;  	void __iomem *base;  	struct clk *clk;  	struct reset_control *rst; @@ -99,7 +100,7 @@ struct stm32_rng_private {   */  static int stm32_rng_conceal_seed_error_cond_reset(struct stm32_rng_private *priv)  { -	struct device *dev = (struct device *)priv->rng.priv; +	struct device *dev = priv->dev;  	u32 sr = readl_relaxed(priv->base + RNG_SR);  	u32 cr = readl_relaxed(priv->base + RNG_CR);  	int err; @@ -171,7 +172,7 @@ static int stm32_rng_conceal_seed_error(struct hwrng *rng)  {  	struct stm32_rng_private *priv = container_of(rng, struct stm32_rng_private, rng); -	dev_dbg((struct device *)priv->rng.priv, "Concealing seed error\n"); +	dev_dbg(priv->dev, "Concealing seed error\n");  	if (priv->data->has_cond_reset)  		return stm32_rng_conceal_seed_error_cond_reset(priv); @@ -187,7 +188,9 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)  	int retval = 0, err = 0;  	u32 sr; -	pm_runtime_get_sync((struct device *) priv->rng.priv); +	retval = pm_runtime_resume_and_get(priv->dev); +	if (retval) +		return retval;  	if (readl_relaxed(priv->base + RNG_SR) & RNG_SR_SEIS)  		stm32_rng_conceal_seed_error(rng); @@ -204,8 +207,7 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)  								   sr, sr,  								   10, 50000);  			if (err) { -				dev_err((struct device *)priv->rng.priv, -					"%s: timeout %x!\n", __func__, sr); +				dev_err(priv->dev, "%s: timeout %x!\n", __func__, sr);  				break;  			}  		} else if (!sr) { @@ -218,8 +220,7 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)  				err = stm32_rng_conceal_seed_error(rng);  				i++;  				if (err && i > RNG_NB_RECOVER_TRIES) { -					dev_err((struct device *)priv->rng.priv, -						"Couldn't recover from seed error\n"); +					dev_err(priv->dev, "Couldn't recover from seed error\n");  					retval = -ENOTRECOVERABLE;  					goto exit_rpm;  				} @@ -237,8 +238,7 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)  			err = stm32_rng_conceal_seed_error(rng);  			i++;  			if (err && i > RNG_NB_RECOVER_TRIES) { -				dev_err((struct device *)priv->rng.priv, -					"Couldn't recover from seed error"); +				dev_err(priv->dev, "Couldn't recover from seed error");  				retval = -ENOTRECOVERABLE;  				goto exit_rpm;  			} @@ -253,8 +253,8 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)  	}  exit_rpm: -	pm_runtime_mark_last_busy((struct device *) priv->rng.priv); -	pm_runtime_put_sync_autosuspend((struct device *) priv->rng.priv); +	pm_runtime_mark_last_busy(priv->dev); +	pm_runtime_put_sync_autosuspend(priv->dev);  	return retval || !wait ? retval : -EIO;  } @@ -329,8 +329,7 @@ static int stm32_rng_init(struct hwrng *rng)  							10, 50000);  		if (err) {  			clk_disable_unprepare(priv->clk); -			dev_err((struct device *)priv->rng.priv, -				"%s: timeout %x!\n", __func__, reg); +			dev_err(priv->dev, "%s: timeout %x!\n", __func__, reg);  			return -EINVAL;  		}  	} else { @@ -358,8 +357,7 @@ static int stm32_rng_init(struct hwrng *rng)  						10, 100000);  	if (err || (reg & ~RNG_SR_DRDY)) {  		clk_disable_unprepare(priv->clk); -		dev_err((struct device *)priv->rng.priv, -			"%s: timeout:%x SR: %x!\n", __func__, err, reg); +		dev_err(priv->dev, "%s: timeout:%x SR: %x!\n", __func__, err, reg);  		return -EINVAL;  	} @@ -465,8 +463,7 @@ static int __maybe_unused stm32_rng_resume(struct device *dev)  		if (err) {  			clk_disable_unprepare(priv->clk); -			dev_err((struct device *)priv->rng.priv, -				"%s: timeout:%x CR: %x!\n", __func__, err, reg); +			dev_err(priv->dev, "%s: timeout:%x CR: %x!\n", __func__, err, reg);  			return -EINVAL;  		}  	} else { @@ -520,7 +517,7 @@ static int stm32_rng_probe(struct platform_device *ofdev)  	struct stm32_rng_private *priv;  	struct resource *res; -	priv = devm_kzalloc(dev, sizeof(struct stm32_rng_private), GFP_KERNEL); +	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);  	if (!priv)  		return -ENOMEM; @@ -541,6 +538,7 @@ static int stm32_rng_probe(struct platform_device *ofdev)  	priv->ced = of_property_read_bool(np, "clock-error-detect");  	priv->lock_conf = of_property_read_bool(np, "st,rng-lock-conf"); +	priv->dev = dev;  	priv->data = of_device_get_match_data(dev);  	if (!priv->data) @@ -551,7 +549,6 @@ static int stm32_rng_probe(struct platform_device *ofdev)  	priv->rng.name = dev_driver_string(dev);  	priv->rng.init = stm32_rng_init;  	priv->rng.read = stm32_rng_read; -	priv->rng.priv = (unsigned long) dev;  	priv->rng.quality = 900;  	pm_runtime_set_autosuspend_delay(dev, 100);  |