@ -35,6 +35,20 @@ static int devm_gpiod_match(struct device *dev, void *res, void *data)
return * this = = * gpio ;
}
static void devm_gpiod_release_array ( struct device * dev , void * res )
{
struct gpio_descs * * descs = res ;
gpiod_put_array ( * descs ) ;
}
static int devm_gpiod_match_array ( struct device * dev , void * res , void * data )
{
struct gpio_descs * * this = res , * * gpios = data ;
return * this = = * gpios ;
}
/**
* devm_gpiod_get - Resource - managed gpiod_get ( )
* @ dev : GPIO consumer
@ -185,6 +199,66 @@ struct gpio_desc *__must_check __devm_gpiod_get_index_optional(struct device *de
}
EXPORT_SYMBOL ( __devm_gpiod_get_index_optional ) ;
/**
* devm_gpiod_get_array - Resource - managed gpiod_get_array ( )
* @ dev : GPIO consumer
* @ con_id : function within the GPIO consumer
* @ flags : optional GPIO initialization flags
*
* Managed gpiod_get_array ( ) . GPIO descriptors returned from this function are
* automatically disposed on driver detach . See gpiod_get_array ( ) for detailed
* information about behavior and return values .
*/
struct gpio_descs * __must_check devm_gpiod_get_array ( struct device * dev ,
const char * con_id ,
enum gpiod_flags flags )
{
struct gpio_descs * * dr ;
struct gpio_descs * descs ;
dr = devres_alloc ( devm_gpiod_release_array ,
sizeof ( struct gpio_descs * ) , GFP_KERNEL ) ;
if ( ! dr )
return ERR_PTR ( - ENOMEM ) ;
descs = gpiod_get_array ( dev , con_id , flags ) ;
if ( IS_ERR ( descs ) ) {
devres_free ( dr ) ;
return descs ;
}
* dr = descs ;
devres_add ( dev , dr ) ;
return descs ;
}
EXPORT_SYMBOL ( devm_gpiod_get_array ) ;
/**
* devm_gpiod_get_array_optional - Resource - managed gpiod_get_array_optional ( )
* @ dev : GPIO consumer
* @ con_id : function within the GPIO consumer
* @ flags : optional GPIO initialization flags
*
* Managed gpiod_get_array_optional ( ) . GPIO descriptors returned from this
* function are automatically disposed on driver detach .
* See gpiod_get_array_optional ( ) for detailed information about behavior and
* return values .
*/
struct gpio_descs * __must_check
devm_gpiod_get_array_optional ( struct device * dev , const char * con_id ,
enum gpiod_flags flags )
{
struct gpio_descs * descs ;
descs = devm_gpiod_get_array ( dev , con_id , flags ) ;
if ( IS_ERR ( descs ) & & ( PTR_ERR ( descs ) = = - ENOENT ) )
return NULL ;
return descs ;
}
EXPORT_SYMBOL ( devm_gpiod_get_array_optional ) ;
/**
* devm_gpiod_put - Resource - managed gpiod_put ( )
* @ desc : GPIO descriptor to dispose of
@ -200,6 +274,21 @@ void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
}
EXPORT_SYMBOL ( devm_gpiod_put ) ;
/**
* devm_gpiod_put_array - Resource - managed gpiod_put_array ( )
* @ descs : GPIO descriptor array to dispose of
*
* Dispose of an array of GPIO descriptors obtained with devm_gpiod_get_array ( ) .
* Normally this function will not be called as the GPIOs will be disposed of
* by the resource management code .
*/
void devm_gpiod_put_array ( struct device * dev , struct gpio_descs * descs )
{
WARN_ON ( devres_release ( dev , devm_gpiod_release_array ,
devm_gpiod_match_array , & descs ) ) ;
}
EXPORT_SYMBOL ( devm_gpiod_put_array ) ;