2009-09-23 03:46:35 +04:00
/*
* Philips UCB1400 GPIO driver
*
* Author : Marek Vasut < marek . vasut @ gmail . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
*/
# include <linux/module.h>
# include <linux/ucb1400.h>
static int ucb1400_gpio_dir_in ( struct gpio_chip * gc , unsigned off )
{
struct ucb1400_gpio * gpio ;
2015-12-07 17:01:14 +03:00
gpio = gpiochip_get_data ( gc ) ;
2009-09-23 03:46:35 +04:00
ucb1400_gpio_set_direction ( gpio - > ac97 , off , 0 ) ;
return 0 ;
}
static int ucb1400_gpio_dir_out ( struct gpio_chip * gc , unsigned off , int val )
{
struct ucb1400_gpio * gpio ;
2015-12-07 17:01:14 +03:00
gpio = gpiochip_get_data ( gc ) ;
2009-09-23 03:46:35 +04:00
ucb1400_gpio_set_direction ( gpio - > ac97 , off , 1 ) ;
ucb1400_gpio_set_value ( gpio - > ac97 , off , val ) ;
return 0 ;
}
static int ucb1400_gpio_get ( struct gpio_chip * gc , unsigned off )
{
struct ucb1400_gpio * gpio ;
2015-12-07 17:01:14 +03:00
gpio = gpiochip_get_data ( gc ) ;
2015-12-21 16:56:04 +03:00
return ! ! ucb1400_gpio_get_value ( gpio - > ac97 , off ) ;
2009-09-23 03:46:35 +04:00
}
static void ucb1400_gpio_set ( struct gpio_chip * gc , unsigned off , int val )
{
struct ucb1400_gpio * gpio ;
2015-12-07 17:01:14 +03:00
gpio = gpiochip_get_data ( gc ) ;
2009-09-23 03:46:35 +04:00
ucb1400_gpio_set_value ( gpio - > ac97 , off , val ) ;
}
static int ucb1400_gpio_probe ( struct platform_device * dev )
{
2013-07-30 12:08:05 +04:00
struct ucb1400_gpio * ucb = dev_get_platdata ( & dev - > dev ) ;
2009-09-23 03:46:35 +04:00
int err = 0 ;
2013-04-14 22:35:48 +04:00
if ( ! ( ucb & & ucb - > gpio_offset ) ) {
2009-09-23 03:46:35 +04:00
err = - EINVAL ;
goto err ;
}
platform_set_drvdata ( dev , ucb ) ;
ucb - > gc . label = " ucb1400_gpio " ;
2013-04-14 22:35:48 +04:00
ucb - > gc . base = ucb - > gpio_offset ;
2009-09-23 03:46:35 +04:00
ucb - > gc . ngpio = 10 ;
ucb - > gc . owner = THIS_MODULE ;
ucb - > gc . direction_input = ucb1400_gpio_dir_in ;
ucb - > gc . direction_output = ucb1400_gpio_dir_out ;
ucb - > gc . get = ucb1400_gpio_get ;
ucb - > gc . set = ucb1400_gpio_set ;
2013-12-04 17:42:46 +04:00
ucb - > gc . can_sleep = true ;
2009-09-23 03:46:35 +04:00
2016-02-22 15:13:28 +03:00
err = devm_gpiochip_add_data ( & dev - > dev , & ucb - > gc , ucb ) ;
2009-09-23 03:46:35 +04:00
if ( err )
goto err ;
2014-06-26 20:18:51 +04:00
if ( ucb - > gpio_setup )
2013-04-14 22:35:48 +04:00
err = ucb - > gpio_setup ( & dev - > dev , ucb - > gc . ngpio ) ;
2009-09-23 03:46:35 +04:00
err :
return err ;
}
static int ucb1400_gpio_remove ( struct platform_device * dev )
{
int err = 0 ;
struct ucb1400_gpio * ucb = platform_get_drvdata ( dev ) ;
2013-04-14 22:35:48 +04:00
if ( ucb & & ucb - > gpio_teardown ) {
err = ucb - > gpio_teardown ( & dev - > dev , ucb - > gc . ngpio ) ;
2009-09-23 03:46:35 +04:00
if ( err )
return err ;
}
return err ;
}
static struct platform_driver ucb1400_gpio_driver = {
. probe = ucb1400_gpio_probe ,
. remove = ucb1400_gpio_remove ,
. driver = {
. name = " ucb1400_gpio "
} ,
} ;
2011-12-07 20:24:00 +04:00
module_platform_driver ( ucb1400_gpio_driver ) ;
2009-09-23 03:46:35 +04:00
MODULE_DESCRIPTION ( " Philips UCB1400 GPIO driver " ) ;
MODULE_LICENSE ( " GPL " ) ;
2013-11-19 11:31:20 +04:00
MODULE_ALIAS ( " platform:ucb1400_gpio " ) ;