| .. | .. |
|---|
| 181 | 181 | static int iproc_rng200_probe(struct platform_device *pdev) |
|---|
| 182 | 182 | { |
|---|
| 183 | 183 | struct iproc_rng200_dev *priv; |
|---|
| 184 | | - struct resource *res; |
|---|
| 185 | 184 | struct device *dev = &pdev->dev; |
|---|
| 186 | 185 | int ret; |
|---|
| 187 | 186 | |
|---|
| .. | .. |
|---|
| 190 | 189 | return -ENOMEM; |
|---|
| 191 | 190 | |
|---|
| 192 | 191 | /* Map peripheral */ |
|---|
| 193 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 194 | | - if (!res) { |
|---|
| 195 | | - dev_err(dev, "failed to get rng resources\n"); |
|---|
| 196 | | - return -EINVAL; |
|---|
| 197 | | - } |
|---|
| 198 | | - |
|---|
| 199 | | - priv->base = devm_ioremap_resource(dev, res); |
|---|
| 192 | + priv->base = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 200 | 193 | if (IS_ERR(priv->base)) { |
|---|
| 201 | 194 | dev_err(dev, "failed to remap rng regs\n"); |
|---|
| 202 | 195 | return PTR_ERR(priv->base); |
|---|
| 203 | 196 | } |
|---|
| 204 | 197 | |
|---|
| 205 | | - priv->rng.name = "iproc-rng200", |
|---|
| 206 | | - priv->rng.read = iproc_rng200_read, |
|---|
| 207 | | - priv->rng.init = iproc_rng200_init, |
|---|
| 208 | | - priv->rng.cleanup = iproc_rng200_cleanup, |
|---|
| 198 | + dev_set_drvdata(dev, priv); |
|---|
| 199 | + |
|---|
| 200 | + priv->rng.name = "iproc-rng200"; |
|---|
| 201 | + priv->rng.read = iproc_rng200_read; |
|---|
| 202 | + priv->rng.init = iproc_rng200_init; |
|---|
| 203 | + priv->rng.cleanup = iproc_rng200_cleanup; |
|---|
| 209 | 204 | |
|---|
| 210 | 205 | /* Register driver */ |
|---|
| 211 | 206 | ret = devm_hwrng_register(dev, &priv->rng); |
|---|
| .. | .. |
|---|
| 219 | 214 | return 0; |
|---|
| 220 | 215 | } |
|---|
| 221 | 216 | |
|---|
| 217 | +static int __maybe_unused iproc_rng200_suspend(struct device *dev) |
|---|
| 218 | +{ |
|---|
| 219 | + struct iproc_rng200_dev *priv = dev_get_drvdata(dev); |
|---|
| 220 | + |
|---|
| 221 | + iproc_rng200_cleanup(&priv->rng); |
|---|
| 222 | + |
|---|
| 223 | + return 0; |
|---|
| 224 | +} |
|---|
| 225 | + |
|---|
| 226 | +static int __maybe_unused iproc_rng200_resume(struct device *dev) |
|---|
| 227 | +{ |
|---|
| 228 | + struct iproc_rng200_dev *priv = dev_get_drvdata(dev); |
|---|
| 229 | + |
|---|
| 230 | + iproc_rng200_init(&priv->rng); |
|---|
| 231 | + |
|---|
| 232 | + return 0; |
|---|
| 233 | +} |
|---|
| 234 | + |
|---|
| 235 | +static const struct dev_pm_ops iproc_rng200_pm_ops = { |
|---|
| 236 | + SET_SYSTEM_SLEEP_PM_OPS(iproc_rng200_suspend, iproc_rng200_resume) |
|---|
| 237 | +}; |
|---|
| 238 | + |
|---|
| 222 | 239 | static const struct of_device_id iproc_rng200_of_match[] = { |
|---|
| 240 | + { .compatible = "brcm,bcm2711-rng200", }, |
|---|
| 241 | + { .compatible = "brcm,bcm7211-rng200", }, |
|---|
| 223 | 242 | { .compatible = "brcm,bcm7278-rng200", }, |
|---|
| 224 | 243 | { .compatible = "brcm,iproc-rng200", }, |
|---|
| 225 | 244 | {}, |
|---|
| .. | .. |
|---|
| 230 | 249 | .driver = { |
|---|
| 231 | 250 | .name = "iproc-rng200", |
|---|
| 232 | 251 | .of_match_table = iproc_rng200_of_match, |
|---|
| 252 | + .pm = &iproc_rng200_pm_ops, |
|---|
| 233 | 253 | }, |
|---|
| 234 | 254 | .probe = iproc_rng200_probe, |
|---|
| 235 | 255 | }; |
|---|