|
31 | 31 | /* param1: ptr, param2: count, param3: flag */ |
32 | 32 | static u32 (*omap3_rom_rng_call)(u32, u32, u32); |
33 | 33 |
|
| 34 | +struct omap_rom_rng { |
| 35 | + struct clk *clk; |
| 36 | + struct device *dev; |
| 37 | + struct hwrng ops; |
| 38 | +}; |
| 39 | + |
34 | 40 | static struct delayed_work idle_work; |
35 | 41 | static int rng_idle; |
36 | 42 | static struct clk *rng_clk; |
@@ -86,48 +92,57 @@ static int omap3_rom_rng_read(struct hwrng *rng, void *data, size_t max, bool w) |
86 | 92 | return 4; |
87 | 93 | } |
88 | 94 |
|
89 | | -static struct hwrng omap3_rom_rng_ops = { |
90 | | - .name = "omap3-rom", |
91 | | - .quality = 900, |
92 | | -}; |
93 | | - |
94 | 95 | static int omap3_rom_rng_probe(struct platform_device *pdev) |
95 | 96 | { |
| 97 | + struct omap_rom_rng *ddata; |
96 | 98 | int ret = 0; |
97 | 99 |
|
98 | | - omap3_rom_rng_ops.read = of_device_get_match_data(&pdev->dev); |
99 | | - if (!omap3_rom_rng_ops.read) { |
| 100 | + ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); |
| 101 | + if (!ddata) |
| 102 | + return -ENOMEM; |
| 103 | + |
| 104 | + ddata->dev = &pdev->dev; |
| 105 | + ddata->ops.priv = (unsigned long)ddata; |
| 106 | + ddata->ops.name = "omap3-rom"; |
| 107 | + ddata->ops.read = of_device_get_match_data(&pdev->dev); |
| 108 | + ddata->ops.quality = 900; |
| 109 | + if (!ddata->ops.read) { |
100 | 110 | dev_err(&pdev->dev, "missing rom code handler\n"); |
101 | 111 |
|
102 | 112 | return -ENODEV; |
103 | 113 | } |
| 114 | + dev_set_drvdata(ddata->dev, ddata); |
104 | 115 |
|
105 | 116 | omap3_rom_rng_call = pdev->dev.platform_data; |
106 | 117 | if (!omap3_rom_rng_call) { |
107 | | - pr_err("omap3_rom_rng_call is NULL\n"); |
| 118 | + dev_err(ddata->dev, "rom_rng_call is NULL\n"); |
108 | 119 | return -EINVAL; |
109 | 120 | } |
110 | 121 |
|
111 | 122 | INIT_DELAYED_WORK(&idle_work, omap3_rom_rng_idle); |
112 | | - rng_clk = devm_clk_get(&pdev->dev, "ick"); |
113 | | - if (IS_ERR(rng_clk)) { |
114 | | - pr_err("unable to get RNG clock\n"); |
115 | | - return PTR_ERR(rng_clk); |
| 123 | + ddata->clk = devm_clk_get(ddata->dev, "ick"); |
| 124 | + if (IS_ERR(ddata->clk)) { |
| 125 | + dev_err(ddata->dev, "unable to get RNG clock\n"); |
| 126 | + return PTR_ERR(ddata->clk); |
116 | 127 | } |
| 128 | + rng_clk = ddata->clk; |
117 | 129 |
|
118 | 130 | /* Leave the RNG in reset state. */ |
119 | | - ret = clk_prepare_enable(rng_clk); |
| 131 | + ret = clk_prepare_enable(ddata->clk); |
120 | 132 | if (ret) |
121 | 133 | return ret; |
122 | 134 | omap3_rom_rng_idle(0); |
123 | 135 |
|
124 | | - return hwrng_register(&omap3_rom_rng_ops); |
| 136 | + return hwrng_register(&ddata->ops); |
125 | 137 | } |
126 | 138 |
|
127 | 139 | static int omap3_rom_rng_remove(struct platform_device *pdev) |
128 | 140 | { |
| 141 | + struct omap_rom_rng *ddata; |
| 142 | + |
| 143 | + ddata = dev_get_drvdata(&pdev->dev); |
129 | 144 | cancel_delayed_work_sync(&idle_work); |
130 | | - hwrng_unregister(&omap3_rom_rng_ops); |
| 145 | + hwrng_unregister(&ddata->ops); |
131 | 146 | if (!rng_idle) |
132 | 147 | clk_disable_unprepare(rng_clk); |
133 | 148 | return 0; |
|
0 commit comments