2023-07-24 19:13:19 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2008-11-07 17:15:42 +03:00
/*
2010-03-01 17:41:59 +03:00
* Driver for GE FPGA based GPIO
2008-11-07 17:15:42 +03:00
*
2010-03-01 17:41:59 +03:00
* Author : Martyn Welch < martyn . welch @ ge . com >
2008-11-07 17:15:42 +03:00
*
2010-03-01 17:41:59 +03:00
* 2008 ( c ) GE Intelligent Platforms Embedded Systems , Inc .
2008-11-07 17:15:42 +03:00
*/
2023-07-24 19:13:16 +03:00
/*
* TODO :
2008-11-07 17:15:42 +03:00
*
2023-07-24 19:13:16 +03:00
* Configuration of output modes ( totem - pole / open - drain ) .
* Interrupt configuration - interrupts are always generated , the FPGA relies
* on the I / O interrupt controllers mask to stop them from being propagated .
2008-11-07 17:15:42 +03:00
*/
2023-07-24 19:13:15 +03:00
# include <linux/gpio/driver.h>
2008-11-07 17:15:42 +03:00
# include <linux/io.h>
2023-07-24 19:13:15 +03:00
# include <linux/kernel.h>
2023-07-24 19:13:17 +03:00
# include <linux/mod_devicetable.h>
2011-05-27 21:23:32 +04:00
# include <linux/module.h>
2023-07-24 19:13:15 +03:00
# include <linux/platform_device.h>
2023-07-24 19:13:17 +03:00
# include <linux/property.h>
2023-07-24 19:13:15 +03:00
# include <linux/slab.h>
2008-11-07 17:15:42 +03:00
# define GEF_GPIO_DIRECT 0x00
# define GEF_GPIO_IN 0x04
# define GEF_GPIO_OUT 0x08
# define GEF_GPIO_TRIG 0x0C
# define GEF_GPIO_POLAR_A 0x10
# define GEF_GPIO_POLAR_B 0x14
# define GEF_GPIO_INT_STAT 0x18
# define GEF_GPIO_OVERRUN 0x1C
# define GEF_GPIO_MODE 0x20
2014-04-12 09:41:31 +04:00
static const struct of_device_id gef_gpio_ids [ ] = {
{
. compatible = " gef,sbc610-gpio " ,
. data = ( void * ) 19 ,
} , {
. compatible = " gef,sbc310-gpio " ,
. data = ( void * ) 6 ,
} , {
. compatible = " ge,imp3a-gpio " ,
. data = ( void * ) 16 ,
} ,
{ }
} ;
MODULE_DEVICE_TABLE ( of , gef_gpio_ids ) ;
2008-11-07 17:15:42 +03:00
2014-04-12 09:41:31 +04:00
static int __init gef_gpio_probe ( struct platform_device * pdev )
2008-11-07 17:15:42 +03:00
{
2023-07-24 19:13:17 +03:00
struct device * dev = & pdev - > dev ;
2015-12-04 16:02:58 +03:00
struct gpio_chip * gc ;
2014-12-01 15:09:37 +03:00
void __iomem * regs ;
int ret ;
2014-04-12 09:41:31 +04:00
2023-07-24 19:13:18 +03:00
gc = devm_kzalloc ( dev , sizeof ( * gc ) , GFP_KERNEL ) ;
2015-12-04 16:02:58 +03:00
if ( ! gc )
2014-04-12 09:41:31 +04:00
return - ENOMEM ;
2023-07-24 19:13:17 +03:00
regs = devm_platform_ioremap_resource ( pdev , 0 ) ;
if ( IS_ERR ( regs ) )
return PTR_ERR ( regs ) ;
2014-12-01 15:09:37 +03:00
2023-07-24 19:13:18 +03:00
ret = bgpio_init ( gc , dev , 4 , regs + GEF_GPIO_IN , regs + GEF_GPIO_OUT ,
NULL , NULL , regs + GEF_GPIO_DIRECT ,
BGPIOF_BIG_ENDIAN_BYTE_ORDER ) ;
2023-07-24 19:13:17 +03:00
if ( ret )
return dev_err_probe ( dev , ret , " bgpio_init failed \n " ) ;
2014-12-01 15:09:37 +03:00
2014-04-12 09:41:31 +04:00
/* Setup pointers to chip functions */
2023-07-24 19:13:17 +03:00
gc - > label = devm_kasprintf ( dev , GFP_KERNEL , " %pfw " , dev_fwnode ( dev ) ) ;
if ( ! gc - > label )
return - ENOMEM ;
2014-12-01 15:09:37 +03:00
2015-12-04 16:02:58 +03:00
gc - > base = - 1 ;
2023-07-24 19:13:17 +03:00
gc - > ngpio = ( uintptr_t ) device_get_match_data ( dev ) ;
2014-04-12 09:41:31 +04:00
/* This function adds a memory mapped GPIO chip */
2023-07-24 19:13:18 +03:00
ret = devm_gpiochip_add_data ( dev , gc , NULL ) ;
2014-12-01 15:09:37 +03:00
if ( ret )
2023-07-24 19:13:17 +03:00
return dev_err_probe ( dev , ret , " GPIO chip registration failed \n " ) ;
2014-12-01 15:09:37 +03:00
return 0 ;
2014-04-12 09:41:31 +04:00
} ;
2012-03-12 21:13:00 +04:00
2014-04-12 09:41:31 +04:00
static struct platform_driver gef_gpio_driver = {
. driver = {
. name = " gef-gpio " ,
. of_match_table = gef_gpio_ids ,
} ,
2008-11-07 17:15:42 +03:00
} ;
2014-04-12 09:41:31 +04:00
module_platform_driver_probe ( gef_gpio_driver , gef_gpio_probe ) ;
2008-11-07 17:15:42 +03:00
2010-03-01 17:41:59 +03:00
MODULE_DESCRIPTION ( " GE I/O FPGA GPIO driver " ) ;
2023-07-24 19:13:16 +03:00
MODULE_AUTHOR ( " Martyn Welch <martyn.welch@ge.com> " ) ;
2008-11-07 17:15:42 +03:00
MODULE_LICENSE ( " GPL " ) ;