24
24
#define RNG_MASK 0x10
25
25
26
26
struct bcm63xx_rng_priv {
27
+ struct hwrng rng ;
27
28
struct clk * clk ;
28
29
void __iomem * regs ;
29
30
};
30
31
31
- #define to_rng_priv (rng ) (( struct bcm63xx_rng_priv *) rng->priv )
32
+ #define to_rng_priv (rng ) container_of(rng, struct bcm63xx_rng_priv, rng)
32
33
33
34
static int bcm63xx_rng_init (struct hwrng * rng )
34
35
{
35
36
struct bcm63xx_rng_priv * priv = to_rng_priv (rng );
36
37
u32 val ;
38
+ int error ;
39
+
40
+ error = clk_prepare_enable (priv -> clk );
41
+ if (error )
42
+ return error ;
37
43
38
44
val = __raw_readl (priv -> regs + RNG_CTRL );
39
45
val |= RNG_EN ;
@@ -50,6 +56,8 @@ static void bcm63xx_rng_cleanup(struct hwrng *rng)
50
56
val = __raw_readl (priv -> regs + RNG_CTRL );
51
57
val &= ~RNG_EN ;
52
58
__raw_writel (val , priv -> regs + RNG_CTRL );
59
+
60
+ clk_didsable_unprepare (prov -> clk );
53
61
}
54
62
55
63
static int bcm63xx_rng_data_present (struct hwrng * rng , int wait )
@@ -79,86 +87,53 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
79
87
r = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
80
88
if (!r ) {
81
89
dev_err (& pdev -> dev , "no iomem resource\n" );
82
- ret = - ENXIO ;
83
- goto out ;
90
+ return - ENXIO ;
84
91
}
85
92
86
93
priv = devm_kzalloc (& pdev -> dev , sizeof (* priv ), GFP_KERNEL );
87
- if (!priv ) {
88
- ret = - ENOMEM ;
89
- goto out ;
90
- }
91
-
92
- rng = devm_kzalloc (& pdev -> dev , sizeof (* rng ), GFP_KERNEL );
93
- if (!rng ) {
94
- ret = - ENOMEM ;
95
- goto out ;
94
+ if (!priv )
95
+ return - ENOMEM ;
96
+
97
+ priv -> rng .name = pdev -> name ;
98
+ priv -> rng .init = bcm63xx_rng_init ;
99
+ priv -> rng .cleanup = bcm63xx_rng_cleanup ;
100
+ prov -> rng .data_present = bcm63xx_rng_data_present ;
101
+ priv -> rng .data_read = bcm63xx_rng_data_read ;
102
+
103
+ priv -> clk = devm_clk_get (& pdev -> dev , "ipsec" );
104
+ if (IS_ERR (priv -> clk )) {
105
+ error = PTR_ERR (priv -> clk );
106
+ dev_err (& pdev -> dev , "no clock for device: %d\n" , error );
107
+ return error ;
96
108
}
97
109
98
- platform_set_drvdata (pdev , rng );
99
- rng -> priv = (unsigned long )priv ;
100
- rng -> name = pdev -> name ;
101
- rng -> init = bcm63xx_rng_init ;
102
- rng -> cleanup = bcm63xx_rng_cleanup ;
103
- rng -> data_present = bcm63xx_rng_data_present ;
104
- rng -> data_read = bcm63xx_rng_data_read ;
105
-
106
- clk = clk_get (& pdev -> dev , "ipsec" );
107
- if (IS_ERR (clk )) {
108
- dev_err (& pdev -> dev , "no clock for device\n" );
109
- ret = PTR_ERR (clk );
110
- goto out ;
111
- }
112
-
113
- priv -> clk = clk ;
114
-
115
110
if (!devm_request_mem_region (& pdev -> dev , r -> start ,
116
111
resource_size (r ), pdev -> name )) {
117
112
dev_err (& pdev -> dev , "request mem failed" );
118
- ret = - ENOMEM ;
119
- goto out ;
113
+ return - EBUSY ;
120
114
}
121
115
122
116
priv -> regs = devm_ioremap_nocache (& pdev -> dev , r -> start ,
123
117
resource_size (r ));
124
118
if (!priv -> regs ) {
125
119
dev_err (& pdev -> dev , "ioremap failed" );
126
- ret = - ENOMEM ;
127
- goto out ;
120
+ return - ENOMEM ;
128
121
}
129
122
130
- clk_enable (clk );
131
-
132
- ret = hwrng_register (rng );
133
- if (ret ) {
134
- dev_err (& pdev -> dev , "failed to register rng device\n" );
135
- goto out_clk_disable ;
123
+ error = devm_hwrng_register (& pdev -> dev , & priv -> rng );
124
+ if (error ) {
125
+ dev_err (& pdev -> dev , "failed to register rng device: %d\n" ,
126
+ error );
127
+ return error ;
136
128
}
137
129
138
130
dev_info (& pdev -> dev , "registered RNG driver\n" );
139
131
140
- return 0 ;
141
-
142
- out_clk_disable :
143
- clk_disable (clk );
144
- out :
145
- return ret ;
146
- }
147
-
148
- static int bcm63xx_rng_remove (struct platform_device * pdev )
149
- {
150
- struct hwrng * rng = platform_get_drvdata (pdev );
151
- struct bcm63xx_rng_priv * priv = to_rng_priv (rng );
152
-
153
- hwrng_unregister (rng );
154
- clk_disable (priv -> clk );
155
-
156
132
return 0 ;
157
133
}
158
134
159
135
static struct platform_driver bcm63xx_rng_driver = {
160
136
.probe = bcm63xx_rng_probe ,
161
- .remove = bcm63xx_rng_remove ,
162
137
.driver = {
163
138
.name = "bcm63xx-rng" ,
164
139
},
0 commit comments