2016-01-13 19:57:43 +03:00
/*
* GPIO driver for the TS - 4800 board
*
* Copyright ( c ) 2016 - Savoir - faire Linux
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*/
# include <linux/gpio/driver.h>
2016-09-13 01:16:26 +03:00
# include <linux/module.h>
2016-01-13 19:57:43 +03:00
# include <linux/of_address.h>
# include <linux/of_device.h>
# include <linux/platform_device.h>
# define DEFAULT_PIN_NUMBER 16
# define INPUT_REG_OFFSET 0x00
# define OUTPUT_REG_OFFSET 0x02
# define DIRECTION_REG_OFFSET 0x04
static int ts4800_gpio_probe ( struct platform_device * pdev )
{
struct device_node * node ;
struct gpio_chip * chip ;
struct resource * res ;
void __iomem * base_addr ;
int retval ;
u32 ngpios ;
chip = devm_kzalloc ( & pdev - > dev , sizeof ( struct gpio_chip ) , GFP_KERNEL ) ;
if ( ! chip )
return - ENOMEM ;
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
base_addr = devm_ioremap_resource ( & pdev - > dev , res ) ;
if ( IS_ERR ( base_addr ) )
return PTR_ERR ( base_addr ) ;
node = pdev - > dev . of_node ;
if ( ! node )
return - EINVAL ;
retval = of_property_read_u32 ( node , " ngpios " , & ngpios ) ;
if ( retval = = - EINVAL )
ngpios = DEFAULT_PIN_NUMBER ;
else if ( retval )
return retval ;
retval = bgpio_init ( chip , & pdev - > dev , 2 , base_addr + INPUT_REG_OFFSET ,
base_addr + OUTPUT_REG_OFFSET , NULL ,
2016-02-10 20:20:34 +03:00
base_addr + DIRECTION_REG_OFFSET , NULL , 0 ) ;
2016-01-13 19:57:43 +03:00
if ( retval ) {
dev_err ( & pdev - > dev , " bgpio_init failed \n " ) ;
return retval ;
}
chip - > ngpio = ngpios ;
platform_set_drvdata ( pdev , chip ) ;
2016-02-22 15:13:28 +03:00
return devm_gpiochip_add_data ( & pdev - > dev , chip , NULL ) ;
2016-01-13 19:57:43 +03:00
}
static const struct of_device_id ts4800_gpio_of_match [ ] = {
{ . compatible = " technologic,ts4800-gpio " , } ,
{ } ,
} ;
2016-10-18 23:44:02 +03:00
MODULE_DEVICE_TABLE ( of , ts4800_gpio_of_match ) ;
2016-01-13 19:57:43 +03:00
static struct platform_driver ts4800_gpio_driver = {
. driver = {
. name = " ts4800-gpio " ,
. of_match_table = ts4800_gpio_of_match ,
} ,
. probe = ts4800_gpio_probe ,
} ;
module_platform_driver_probe ( ts4800_gpio_driver , ts4800_gpio_probe ) ;
MODULE_AUTHOR ( " Julien Grossholtz <julien.grossholtz@savoirfairelinux.com> " ) ;
MODULE_DESCRIPTION ( " TS4800 FPGA GPIO driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;