@@ -122,7 +122,7 @@ static int pruss_probe(struct platform_device *pdev)
122
122
struct uio_pruss_dev * gdev ;
123
123
struct resource * regs_prussio ;
124
124
struct device * dev = & pdev -> dev ;
125
- int ret = - ENODEV , cnt = 0 , len ;
125
+ int ret , cnt , i , len ;
126
126
struct uio_pruss_pdata * pdata = dev_get_platdata (dev );
127
127
128
128
gdev = kzalloc (sizeof (struct uio_pruss_dev ), GFP_KERNEL );
@@ -131,38 +131,35 @@ static int pruss_probe(struct platform_device *pdev)
131
131
132
132
gdev -> info = kcalloc (MAX_PRUSS_EVT , sizeof (* p ), GFP_KERNEL );
133
133
if (!gdev -> info ) {
134
- kfree ( gdev ) ;
135
- return - ENOMEM ;
134
+ ret = - ENOMEM ;
135
+ goto err_free_gdev ;
136
136
}
137
137
138
138
/* Power on PRU in case its not done as part of boot-loader */
139
139
gdev -> pruss_clk = clk_get (dev , "pruss" );
140
140
if (IS_ERR (gdev -> pruss_clk )) {
141
141
dev_err (dev , "Failed to get clock\n" );
142
142
ret = PTR_ERR (gdev -> pruss_clk );
143
- kfree (gdev -> info );
144
- kfree (gdev );
145
- return ret ;
146
- } else {
147
- ret = clk_enable (gdev -> pruss_clk );
148
- if (ret ) {
149
- dev_err (dev , "Failed to enable clock\n" );
150
- clk_put (gdev -> pruss_clk );
151
- kfree (gdev -> info );
152
- kfree (gdev );
153
- return ret ;
154
- }
143
+ goto err_free_info ;
144
+ }
145
+
146
+ ret = clk_enable (gdev -> pruss_clk );
147
+ if (ret ) {
148
+ dev_err (dev , "Failed to enable clock\n" );
149
+ goto err_clk_put ;
155
150
}
156
151
157
152
regs_prussio = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
158
153
if (!regs_prussio ) {
159
154
dev_err (dev , "No PRUSS I/O resource specified\n" );
160
- goto out_free ;
155
+ ret = - EIO ;
156
+ goto err_clk_disable ;
161
157
}
162
158
163
159
if (!regs_prussio -> start ) {
164
160
dev_err (dev , "Invalid memory resource\n" );
165
- goto out_free ;
161
+ ret = - EIO ;
162
+ goto err_clk_disable ;
166
163
}
167
164
168
165
if (pdata -> sram_pool ) {
@@ -172,22 +169,25 @@ static int pruss_probe(struct platform_device *pdev)
172
169
sram_pool_sz , & gdev -> sram_paddr );
173
170
if (!gdev -> sram_vaddr ) {
174
171
dev_err (dev , "Could not allocate SRAM pool\n" );
175
- goto out_free ;
172
+ ret = - ENOMEM ;
173
+ goto err_clk_disable ;
176
174
}
177
175
}
178
176
179
177
gdev -> ddr_vaddr = dma_alloc_coherent (dev , extram_pool_sz ,
180
178
& (gdev -> ddr_paddr ), GFP_KERNEL | GFP_DMA );
181
179
if (!gdev -> ddr_vaddr ) {
182
180
dev_err (dev , "Could not allocate external memory\n" );
183
- goto out_free ;
181
+ ret = - ENOMEM ;
182
+ goto err_free_sram ;
184
183
}
185
184
186
185
len = resource_size (regs_prussio );
187
186
gdev -> prussio_vaddr = ioremap (regs_prussio -> start , len );
188
187
if (!gdev -> prussio_vaddr ) {
189
188
dev_err (dev , "Can't remap PRUSS I/O address range\n" );
190
- goto out_free ;
189
+ ret = - ENOMEM ;
190
+ goto err_free_ddr_vaddr ;
191
191
}
192
192
193
193
gdev -> pintc_base = pdata -> pintc_base ;
@@ -215,15 +215,36 @@ static int pruss_probe(struct platform_device *pdev)
215
215
p -> priv = gdev ;
216
216
217
217
ret = uio_register_device (dev , p );
218
- if (ret < 0 )
219
- goto out_free ;
218
+ if (ret < 0 ) {
219
+ kfree (p -> name );
220
+ goto err_unloop ;
221
+ }
220
222
}
221
223
222
224
platform_set_drvdata (pdev , gdev );
223
225
return 0 ;
224
226
225
- out_free :
226
- pruss_cleanup (dev , gdev );
227
+ err_unloop :
228
+ for (i = 0 , p = gdev -> info ; i < cnt ; i ++ , p ++ ) {
229
+ uio_unregister_device (p );
230
+ kfree (p -> name );
231
+ }
232
+ iounmap (gdev -> prussio_vaddr );
233
+ err_free_ddr_vaddr :
234
+ dma_free_coherent (dev , extram_pool_sz , gdev -> ddr_vaddr ,
235
+ gdev -> ddr_paddr );
236
+ err_free_sram :
237
+ if (pdata -> sram_pool )
238
+ gen_pool_free (gdev -> sram_pool , gdev -> sram_vaddr , sram_pool_sz );
239
+ err_clk_disable :
240
+ clk_disable (gdev -> pruss_clk );
241
+ err_clk_put :
242
+ clk_put (gdev -> pruss_clk );
243
+ err_free_info :
244
+ kfree (gdev -> info );
245
+ err_free_gdev :
246
+ kfree (gdev );
247
+
227
248
return ret ;
228
249
}
229
250
0 commit comments