@@ -221,13 +221,20 @@ static irqreturn_t ske_keypad_irq(int irq, void *dev_id)
221221 return IRQ_HANDLED ;
222222}
223223
224+ static void ske_keypad_board_exit (void * data )
225+ {
226+ struct ske_keypad * keypad = data ;
227+
228+ keypad -> board -> exit ();
229+ }
230+
224231static int __init ske_keypad_probe (struct platform_device * pdev )
225232{
226233 const struct ske_keypad_platform_data * plat =
227234 dev_get_platdata (& pdev -> dev );
235+ struct device * dev = & pdev -> dev ;
228236 struct ske_keypad * keypad ;
229237 struct input_dev * input ;
230- struct resource * res ;
231238 int irq ;
232239 int error ;
233240
@@ -238,52 +245,35 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
238245
239246 irq = platform_get_irq (pdev , 0 );
240247 if (irq < 0 )
241- return - EINVAL ;
242-
243- res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
244- if (!res ) {
245- dev_err (& pdev -> dev , "missing platform resources\n" );
246- return - EINVAL ;
247- }
248+ return irq ;
248249
249- keypad = kzalloc (sizeof (struct ske_keypad ), GFP_KERNEL );
250- input = input_allocate_device ();
250+ keypad = devm_kzalloc (dev , sizeof (struct ske_keypad ),
251+ GFP_KERNEL );
252+ input = devm_input_allocate_device (dev );
251253 if (!keypad || !input ) {
252254 dev_err (& pdev -> dev , "failed to allocate keypad memory\n" );
253- error = - ENOMEM ;
254- goto err_free_mem ;
255+ return - ENOMEM ;
255256 }
256257
257258 keypad -> irq = irq ;
258259 keypad -> board = plat ;
259260 keypad -> input = input ;
260261 spin_lock_init (& keypad -> ske_keypad_lock );
261262
262- if (!request_mem_region (res -> start , resource_size (res ), pdev -> name )) {
263- dev_err (& pdev -> dev , "failed to request I/O memory\n" );
264- error = - EBUSY ;
265- goto err_free_mem ;
266- }
267-
268- keypad -> reg_base = ioremap (res -> start , resource_size (res ));
269- if (!keypad -> reg_base ) {
270- dev_err (& pdev -> dev , "failed to remap I/O memory\n" );
271- error = - ENXIO ;
272- goto err_free_mem_region ;
273- }
263+ keypad -> reg_base = devm_platform_ioremap_resource (pdev , 0 );
264+ if (IS_ERR (keypad -> reg_base ))
265+ return PTR_ERR (keypad -> reg_base );
274266
275- keypad -> pclk = clk_get ( & pdev -> dev , "apb_pclk" );
267+ keypad -> pclk = devm_clk_get_enabled ( dev , "apb_pclk" );
276268 if (IS_ERR (keypad -> pclk )) {
277269 dev_err (& pdev -> dev , "failed to get pclk\n" );
278- error = PTR_ERR (keypad -> pclk );
279- goto err_iounmap ;
270+ return PTR_ERR (keypad -> pclk );
280271 }
281272
282- keypad -> clk = clk_get ( & pdev -> dev , NULL );
273+ keypad -> clk = devm_clk_get_enabled ( dev , NULL );
283274 if (IS_ERR (keypad -> clk )) {
284275 dev_err (& pdev -> dev , "failed to get clk\n" );
285- error = PTR_ERR (keypad -> clk );
286- goto err_pclk ;
276+ return PTR_ERR (keypad -> clk );
287277 }
288278
289279 input -> id .bustype = BUS_HOST ;
@@ -295,96 +285,50 @@ static int __init ske_keypad_probe(struct platform_device *pdev)
295285 keypad -> keymap , input );
296286 if (error ) {
297287 dev_err (& pdev -> dev , "Failed to build keymap\n" );
298- goto err_clk ;
288+ return error ;
299289 }
300290
301291 input_set_capability (input , EV_MSC , MSC_SCAN );
302292 if (!plat -> no_autorepeat )
303293 __set_bit (EV_REP , input -> evbit );
304294
305- error = clk_prepare_enable (keypad -> pclk );
306- if (error ) {
307- dev_err (& pdev -> dev , "Failed to prepare/enable pclk\n" );
308- goto err_clk ;
309- }
310-
311- error = clk_prepare_enable (keypad -> clk );
312- if (error ) {
313- dev_err (& pdev -> dev , "Failed to prepare/enable clk\n" );
314- goto err_pclk_disable ;
315- }
316-
317-
318295 /* go through board initialization helpers */
319296 if (keypad -> board -> init )
320297 keypad -> board -> init ();
321298
299+ if (keypad -> board -> exit ) {
300+ error = devm_add_action_or_reset (dev , ske_keypad_board_exit ,
301+ keypad );
302+ if (error )
303+ return error ;
304+ }
305+
322306 error = ske_keypad_chip_init (keypad );
323307 if (error ) {
324308 dev_err (& pdev -> dev , "unable to init keypad hardware\n" );
325- goto err_clk_disable ;
309+ return error ;
326310 }
327311
328- error = request_threaded_irq (keypad -> irq , NULL , ske_keypad_irq ,
329- IRQF_ONESHOT , "ske-keypad" , keypad );
312+ error = devm_request_threaded_irq (dev , keypad -> irq ,
313+ NULL , ske_keypad_irq ,
314+ IRQF_ONESHOT , "ske-keypad" , keypad );
330315 if (error ) {
331316 dev_err (& pdev -> dev , "allocate irq %d failed\n" , keypad -> irq );
332- goto err_clk_disable ;
317+ return error ;
333318 }
334319
335320 error = input_register_device (input );
336321 if (error ) {
337322 dev_err (& pdev -> dev ,
338- "unable to register input device: %d\n" , error );
339- goto err_free_irq ;
323+ "unable to register input device: %d\n" , error );
324+ return error ;
340325 }
341326
342327 if (plat -> wakeup_enable )
343328 device_init_wakeup (& pdev -> dev , true);
344329
345330 platform_set_drvdata (pdev , keypad );
346331
347- return 0 ;
348-
349- err_free_irq :
350- free_irq (keypad -> irq , keypad );
351- err_clk_disable :
352- clk_disable_unprepare (keypad -> clk );
353- err_pclk_disable :
354- clk_disable_unprepare (keypad -> pclk );
355- err_clk :
356- clk_put (keypad -> clk );
357- err_pclk :
358- clk_put (keypad -> pclk );
359- err_iounmap :
360- iounmap (keypad -> reg_base );
361- err_free_mem_region :
362- release_mem_region (res -> start , resource_size (res ));
363- err_free_mem :
364- input_free_device (input );
365- kfree (keypad );
366- return error ;
367- }
368-
369- static int ske_keypad_remove (struct platform_device * pdev )
370- {
371- struct ske_keypad * keypad = platform_get_drvdata (pdev );
372- struct resource * res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
373-
374- free_irq (keypad -> irq , keypad );
375-
376- input_unregister_device (keypad -> input );
377-
378- clk_disable_unprepare (keypad -> clk );
379- clk_put (keypad -> clk );
380-
381- if (keypad -> board -> exit )
382- keypad -> board -> exit ();
383-
384- iounmap (keypad -> reg_base );
385- release_mem_region (res -> start , resource_size (res ));
386- kfree (keypad );
387-
388332 return 0 ;
389333}
390334
@@ -424,7 +368,6 @@ static struct platform_driver ske_keypad_driver = {
424368 .name = "nmk-ske-keypad" ,
425369 .pm = pm_sleep_ptr (& ske_keypad_dev_pm_ops ),
426370 },
427- .remove = ske_keypad_remove ,
428371};
429372
430373module_platform_driver_probe (ske_keypad_driver , ske_keypad_probe );
0 commit comments