hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/char/hw_random/geode-rng.c
....@@ -51,6 +51,10 @@
5151 };
5252 MODULE_DEVICE_TABLE(pci, pci_tbl);
5353
54
+struct amd_geode_priv {
55
+ struct pci_dev *pcidev;
56
+ void __iomem *membase;
57
+};
5458
5559 static int geode_rng_data_read(struct hwrng *rng, u32 *data)
5660 {
....@@ -90,6 +94,7 @@
9094 const struct pci_device_id *ent;
9195 void __iomem *mem;
9296 unsigned long rng_base;
97
+ struct amd_geode_priv *priv;
9398
9499 for_each_pci_dev(pdev) {
95100 ent = pci_match_id(pci_tbl, pdev);
....@@ -97,17 +102,26 @@
97102 goto found;
98103 }
99104 /* Device not found. */
100
- goto out;
105
+ return err;
101106
102107 found:
108
+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
109
+ if (!priv) {
110
+ err = -ENOMEM;
111
+ goto put_dev;
112
+ }
113
+
103114 rng_base = pci_resource_start(pdev, 0);
104115 if (rng_base == 0)
105
- goto out;
116
+ goto free_priv;
106117 err = -ENOMEM;
107118 mem = ioremap(rng_base, 0x58);
108119 if (!mem)
109
- goto out;
110
- geode_rng.priv = (unsigned long)mem;
120
+ goto free_priv;
121
+
122
+ geode_rng.priv = (unsigned long)priv;
123
+ priv->membase = mem;
124
+ priv->pcidev = pdev;
111125
112126 pr_info("AMD Geode RNG detected\n");
113127 err = hwrng_register(&geode_rng);
....@@ -116,20 +130,26 @@
116130 err);
117131 goto err_unmap;
118132 }
119
-out:
120133 return err;
121134
122135 err_unmap:
123136 iounmap(mem);
124
- goto out;
137
+free_priv:
138
+ kfree(priv);
139
+put_dev:
140
+ pci_dev_put(pdev);
141
+ return err;
125142 }
126143
127144 static void __exit mod_exit(void)
128145 {
129
- void __iomem *mem = (void __iomem *)geode_rng.priv;
146
+ struct amd_geode_priv *priv;
130147
148
+ priv = (struct amd_geode_priv *)geode_rng.priv;
131149 hwrng_unregister(&geode_rng);
132
- iounmap(mem);
150
+ iounmap(priv->membase);
151
+ pci_dev_put(priv->pcidev);
152
+ kfree(priv);
133153 }
134154
135155 module_init(mod_init);