@@ -1383,9 +1383,9 @@ int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
13831383}
13841384EXPORT_SYMBOL_GPL (pinctrl_select_state );
13851385
1386- static void devm_pinctrl_release (struct device * dev , void * res )
1386+ static void devm_pinctrl_release (void * p )
13871387{
1388- pinctrl_put (* ( struct pinctrl * * ) res );
1388+ pinctrl_put (p );
13891389}
13901390
13911391/**
@@ -1397,31 +1397,21 @@ static void devm_pinctrl_release(struct device *dev, void *res)
13971397 */
13981398struct pinctrl * devm_pinctrl_get (struct device * dev )
13991399{
1400- struct pinctrl * * ptr , * p ;
1401-
1402- ptr = devres_alloc (devm_pinctrl_release , sizeof (* ptr ), GFP_KERNEL );
1403- if (!ptr )
1404- return ERR_PTR (- ENOMEM );
1400+ struct pinctrl * p ;
1401+ int ret ;
14051402
14061403 p = pinctrl_get (dev );
1407- if (! IS_ERR (p )) {
1408- * ptr = p ;
1409- devres_add ( dev , ptr );
1410- } else {
1411- devres_free ( ptr );
1412- }
1404+ if (IS_ERR (p ))
1405+ return p ;
1406+
1407+ ret = devm_add_action_or_reset ( dev , devm_pinctrl_release , p );
1408+ if ( ret )
1409+ return ERR_PTR ( ret );
14131410
14141411 return p ;
14151412}
14161413EXPORT_SYMBOL_GPL (devm_pinctrl_get );
14171414
1418- static int devm_pinctrl_match (struct device * dev , void * res , void * data )
1419- {
1420- struct pinctrl * * p = res ;
1421-
1422- return * p == data ;
1423- }
1424-
14251415/**
14261416 * devm_pinctrl_put() - Resource managed pinctrl_put()
14271417 * @p: the pinctrl handle to release
@@ -1432,8 +1422,7 @@ static int devm_pinctrl_match(struct device *dev, void *res, void *data)
14321422 */
14331423void devm_pinctrl_put (struct pinctrl * p )
14341424{
1435- WARN_ON (devres_release (p -> dev , devm_pinctrl_release ,
1436- devm_pinctrl_match , p ));
1425+ devm_release_action (p -> dev , devm_pinctrl_release , p );
14371426}
14381427EXPORT_SYMBOL_GPL (devm_pinctrl_put );
14391428
@@ -2316,10 +2305,8 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev)
23162305}
23172306EXPORT_SYMBOL_GPL (pinctrl_unregister );
23182307
2319- static void devm_pinctrl_dev_release (struct device * dev , void * res )
2308+ static void devm_pinctrl_dev_release (void * pctldev )
23202309{
2321- struct pinctrl_dev * pctldev = * (struct pinctrl_dev * * )res ;
2322-
23232310 pinctrl_unregister (pctldev );
23242311}
23252312
@@ -2338,20 +2325,16 @@ struct pinctrl_dev *devm_pinctrl_register(struct device *dev,
23382325 const struct pinctrl_desc * pctldesc ,
23392326 void * driver_data )
23402327{
2341- struct pinctrl_dev * * ptr , * pctldev ;
2342-
2343- ptr = devres_alloc (devm_pinctrl_dev_release , sizeof (* ptr ), GFP_KERNEL );
2344- if (!ptr )
2345- return ERR_PTR (- ENOMEM );
2328+ struct pinctrl_dev * pctldev ;
2329+ int ret ;
23462330
23472331 pctldev = pinctrl_register (pctldesc , dev , driver_data );
2348- if (IS_ERR (pctldev )) {
2349- devres_free (ptr );
2332+ if (IS_ERR (pctldev ))
23502333 return pctldev ;
2351- }
23522334
2353- * ptr = pctldev ;
2354- devres_add (dev , ptr );
2335+ ret = devm_add_action_or_reset (dev , devm_pinctrl_dev_release , pctldev );
2336+ if (ret )
2337+ return ERR_PTR (ret );
23552338
23562339 return pctldev ;
23572340}
@@ -2373,23 +2356,13 @@ int devm_pinctrl_register_and_init(struct device *dev,
23732356 void * driver_data ,
23742357 struct pinctrl_dev * * pctldev )
23752358{
2376- struct pinctrl_dev * * ptr ;
23772359 int error ;
23782360
2379- ptr = devres_alloc (devm_pinctrl_dev_release , sizeof (* ptr ), GFP_KERNEL );
2380- if (!ptr )
2381- return - ENOMEM ;
2382-
23832361 error = pinctrl_register_and_init (pctldesc , dev , driver_data , pctldev );
2384- if (error ) {
2385- devres_free (ptr );
2362+ if (error )
23862363 return error ;
2387- }
2388-
2389- * ptr = * pctldev ;
2390- devres_add (dev , ptr );
23912364
2392- return 0 ;
2365+ return devm_add_action_or_reset ( dev , devm_pinctrl_dev_release , * pctldev ) ;
23932366}
23942367EXPORT_SYMBOL_GPL (devm_pinctrl_register_and_init );
23952368
0 commit comments