Commit 8c75704e authored by Prarit Bhargava's avatar Prarit Bhargava Committed by Herbert Xu
Browse files

hwrng: geode - Revert managed API changes

After commit e9afc746 ("hwrng: geode - Use linux/io.h instead of
asm/io.h") the geode-rng driver uses devres with pci_dev->dev to keep
track of resources, but does not actually register a PCI driver.  This
results in the following issues:

1.  The driver leaks memory because the driver does not attach to a
device.  The driver only uses the PCI device as a reference.   devm_*()
functions will release resources on driver detach, which the geode-rng
driver will never do.  As a result,

2.  The driver cannot be reloaded because there is always a use of the
ioport and region after the first load of the driver.

Revert the changes made by  e9afc746

 ("hwrng: geode - Use linux/io.h
instead of asm/io.h").

Cc: <>
Signed-off-by: default avatarPrarit Bhargava <>
Fixes: 6e9b5e76

 ("hwrng: geode - Migrate to managed API")
Cc: Matt Mackall <>
Cc: Corentin LABBE <>
Cc: PrasannaKumar Muralidharan <>
Cc: Wei Yongjun <>
Signed-off-by: default avatarHerbert Xu <>
parent 69db7009
......@@ -31,6 +31,9 @@
#include <linux/module.h>
#include <linux/pci.h>
#define GEODE_RNG_DATA_REG 0x50
......@@ -82,6 +85,7 @@ static struct hwrng geode_rng = {
static int __init mod_init(void)
int err = -ENODEV;
struct pci_dev *pdev = NULL;
const struct pci_device_id *ent;
void __iomem *mem;
......@@ -89,27 +93,43 @@ static int __init mod_init(void)
for_each_pci_dev(pdev) {
ent = pci_match_id(pci_tbl, pdev);
if (ent) {
rng_base = pci_resource_start(pdev, 0);
if (rng_base == 0)
return -ENODEV;
mem = devm_ioremap(&pdev->dev, rng_base, 0x58);
if (!mem)
return -ENOMEM;
geode_rng.priv = (unsigned long)mem;
pr_info("AMD Geode RNG detected\n");
return devm_hwrng_register(&pdev->dev, &geode_rng);
if (ent)
goto found;
/* Device not found. */
return -ENODEV;
goto out;
rng_base = pci_resource_start(pdev, 0);
if (rng_base == 0)
goto out;
err = -ENOMEM;
mem = ioremap(rng_base, 0x58);
if (!mem)
goto out;
geode_rng.priv = (unsigned long)mem;
pr_info("AMD Geode RNG detected\n");
err = hwrng_register(&geode_rng);
if (err) {
pr_err(PFX "RNG registering failed (%d)\n",
goto err_unmap;
return err;
goto out;
static void __exit mod_exit(void)
void __iomem *mem = (void __iomem *)geode_rng.priv;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment