2019-06-04 11:10:57 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2010-07-02 15:22:08 +04:00
/*
* Copyright ( C ) ST - Ericsson SA 2010
*
* Author : Rabin Vincent < rabin . vincent @ stericsson . com > for ST - Ericsson
*/
# ifndef __STMPE_H
# define __STMPE_H
2011-11-17 09:32:20 +04:00
# include <linux/device.h>
# include <linux/mfd/core.h>
# include <linux/mfd/stmpe.h>
# include <linux/printk.h>
# include <linux/types.h>
extern const struct dev_pm_ops stmpe_dev_pm_ops ;
2010-07-02 15:22:08 +04:00
# ifdef STMPE_DUMP_BYTES
static inline void stmpe_dump_bytes ( const char * str , const void * buf ,
size_t len )
{
print_hex_dump_bytes ( str , DUMP_PREFIX_OFFSET , buf , len ) ;
}
# else
static inline void stmpe_dump_bytes ( const char * str , const void * buf ,
size_t len )
{
}
# endif
/**
* struct stmpe_variant_block - information about block
* @ cell : base mfd cell
* @ irq : interrupt number to be added to each IORESOURCE_IRQ
* in the cell
* @ block : block id ; used for identification with platform data and for
* enable and altfunc callbacks
*/
struct stmpe_variant_block {
2013-11-18 17:33:01 +04:00
const struct mfd_cell * cell ;
2010-07-02 15:22:08 +04:00
int irq ;
enum stmpe_block block ;
} ;
/**
* struct stmpe_variant_info - variant - specific information
* @ name : part name
* @ id_val : content of CHIPID register
* @ id_mask : bits valid in CHIPID register for comparison with id_val
* @ num_gpios : number of GPIOS
* @ af_bits : number of bits used to specify the alternate function
2011-06-27 11:54:22 +04:00
* @ regs : variant specific registers .
2010-07-02 15:22:08 +04:00
* @ blocks : list of blocks present on this device
* @ num_blocks : number of blocks present on this device
* @ num_irqs : number of internal IRQs available on this device
* @ enable : callback to enable the specified blocks .
* Called with the I / O lock held .
* @ get_altfunc : callback to get the alternate function number for the
* specific block
2010-07-21 10:11:07 +04:00
* @ enable_autosleep : callback to configure autosleep with specified timeout
2010-07-02 15:22:08 +04:00
*/
struct stmpe_variant_info {
const char * name ;
u16 id_val ;
u16 id_mask ;
int num_gpios ;
int af_bits ;
const u8 * regs ;
struct stmpe_variant_block * blocks ;
int num_blocks ;
int num_irqs ;
int ( * enable ) ( struct stmpe * stmpe , unsigned int blocks , bool enable ) ;
int ( * get_altfunc ) ( struct stmpe * stmpe , enum stmpe_block block ) ;
2010-07-21 10:11:07 +04:00
int ( * enable_autosleep ) ( struct stmpe * stmpe , int autosleep_timeout ) ;
2010-07-02 15:22:08 +04:00
} ;
2011-11-17 09:32:20 +04:00
/**
* struct stmpe_client_info - i2c or spi specific routines / info
* @ data : client specific data
* @ read_byte : read single byte
* @ write_byte : write single byte
* @ read_block : read block or multiple bytes
* @ write_block : write block or multiple bytes
* @ init : client init routine , called during probe
*/
struct stmpe_client_info {
void * data ;
int irq ;
void * client ;
struct device * dev ;
int ( * read_byte ) ( struct stmpe * stmpe , u8 reg ) ;
int ( * write_byte ) ( struct stmpe * stmpe , u8 reg , u8 val ) ;
int ( * read_block ) ( struct stmpe * stmpe , u8 reg , u8 len , u8 * values ) ;
int ( * write_block ) ( struct stmpe * stmpe , u8 reg , u8 len ,
const u8 * values ) ;
void ( * init ) ( struct stmpe * stmpe ) ;
} ;
2014-07-02 14:54:32 +04:00
int stmpe_probe ( struct stmpe_client_info * ci , enum stmpe_partnum partnum ) ;
2021-10-12 18:39:34 +03:00
void stmpe_remove ( struct stmpe * stmpe ) ;
2011-11-17 09:32:20 +04:00
2010-07-02 15:22:08 +04:00
# define STMPE_ICR_LSB_HIGH (1 << 2)
# define STMPE_ICR_LSB_EDGE (1 << 1)
# define STMPE_ICR_LSB_GIM (1 << 0)
2016-08-10 10:39:07 +03:00
# define STMPE_SYS_CTRL_RESET (1 << 7)
2016-08-10 10:39:10 +03:00
# define STMPE_SYS_CTRL_INT_EN (1 << 2)
# define STMPE_SYS_CTRL_INT_HI (1 << 0)
2016-08-10 10:39:07 +03:00
2011-11-17 09:32:23 +04:00
/*
* STMPE801
*/
# define STMPE801_ID 0x0108
# define STMPE801_NR_INTERNAL_IRQS 1
# define STMPE801_REG_CHIP_ID 0x00
# define STMPE801_REG_VERSION_ID 0x02
# define STMPE801_REG_SYS_CTRL 0x04
# define STMPE801_REG_GPIO_INT_EN 0x08
# define STMPE801_REG_GPIO_INT_STA 0x09
# define STMPE801_REG_GPIO_MP_STA 0x10
# define STMPE801_REG_GPIO_SET_PIN 0x11
# define STMPE801_REG_GPIO_DIR 0x12
2010-07-02 15:22:08 +04:00
/*
* STMPE811
*/
2016-08-10 10:39:07 +03:00
# define STMPE811_ID 0x0811
2010-07-02 15:22:08 +04:00
# define STMPE811_IRQ_TOUCH_DET 0
# define STMPE811_IRQ_FIFO_TH 1
# define STMPE811_IRQ_FIFO_OFLOW 2
# define STMPE811_IRQ_FIFO_FULL 3
# define STMPE811_IRQ_FIFO_EMPTY 4
# define STMPE811_IRQ_TEMP_SENS 5
# define STMPE811_IRQ_ADC 6
# define STMPE811_IRQ_GPIOC 7
# define STMPE811_NR_INTERNAL_IRQS 8
# define STMPE811_REG_CHIP_ID 0x00
2016-08-10 10:39:06 +03:00
# define STMPE811_REG_SYS_CTRL 0x03
2010-07-02 15:22:08 +04:00
# define STMPE811_REG_SYS_CTRL2 0x04
2011-11-17 09:32:21 +04:00
# define STMPE811_REG_SPI_CFG 0x08
2010-07-02 15:22:08 +04:00
# define STMPE811_REG_INT_CTRL 0x09
# define STMPE811_REG_INT_EN 0x0A
# define STMPE811_REG_INT_STA 0x0B
# define STMPE811_REG_GPIO_INT_EN 0x0C
# define STMPE811_REG_GPIO_INT_STA 0x0D
# define STMPE811_REG_GPIO_SET_PIN 0x10
# define STMPE811_REG_GPIO_CLR_PIN 0x11
# define STMPE811_REG_GPIO_MP_STA 0x12
# define STMPE811_REG_GPIO_DIR 0x13
# define STMPE811_REG_GPIO_ED 0x14
# define STMPE811_REG_GPIO_RE 0x15
# define STMPE811_REG_GPIO_FE 0x16
# define STMPE811_REG_GPIO_AF 0x17
2016-08-10 10:39:07 +03:00
# define STMPE811_SYS_CTRL_RESET (1 << 1)
2010-07-02 15:22:08 +04:00
# define STMPE811_SYS_CTRL2_ADC_OFF (1 << 0)
# define STMPE811_SYS_CTRL2_TSC_OFF (1 << 1)
# define STMPE811_SYS_CTRL2_GPIO_OFF (1 << 2)
# define STMPE811_SYS_CTRL2_TS_OFF (1 << 3)
2016-08-10 10:39:14 +03:00
/*
* STMPE1600
*/
# define STMPE1600_ID 0x0016
# define STMPE1600_NR_INTERNAL_IRQS 16
# define STMPE1600_REG_CHIP_ID 0x00
# define STMPE1600_REG_SYS_CTRL 0x03
# define STMPE1600_REG_IEGPIOR_LSB 0x08
# define STMPE1600_REG_IEGPIOR_MSB 0x09
# define STMPE1600_REG_ISGPIOR_LSB 0x0A
# define STMPE1600_REG_ISGPIOR_MSB 0x0B
# define STMPE1600_REG_GPMR_LSB 0x10
# define STMPE1600_REG_GPMR_MSB 0x11
# define STMPE1600_REG_GPSR_LSB 0x12
# define STMPE1600_REG_GPSR_MSB 0x13
# define STMPE1600_REG_GPDR_LSB 0x14
# define STMPE1600_REG_GPDR_MSB 0x15
# define STMPE1600_REG_GPPIR_LSB 0x16
# define STMPE1600_REG_GPPIR_MSB 0x17
2010-07-02 15:22:08 +04:00
/*
* STMPE1601
*/
# define STMPE1601_IRQ_GPIOC 8
# define STMPE1601_IRQ_PWM3 7
# define STMPE1601_IRQ_PWM2 6
# define STMPE1601_IRQ_PWM1 5
# define STMPE1601_IRQ_PWM0 4
# define STMPE1601_IRQ_KEYPAD_OVER 2
# define STMPE1601_IRQ_KEYPAD 1
# define STMPE1601_IRQ_WAKEUP 0
# define STMPE1601_NR_INTERNAL_IRQS 9
# define STMPE1601_REG_SYS_CTRL 0x02
2010-07-21 10:11:07 +04:00
# define STMPE1601_REG_SYS_CTRL2 0x03
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_ICR_MSB 0x10
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_ICR_LSB 0x11
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_IER_MSB 0x12
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_IER_LSB 0x13
# define STMPE1601_REG_ISR_MSB 0x14
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_ISR_LSB 0x15
# define STMPE1601_REG_INT_EN_GPIO_MASK_MSB 0x16
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_INT_EN_GPIO_MASK_LSB 0x17
# define STMPE1601_REG_INT_STA_GPIO_MSB 0x18
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_INT_STA_GPIO_LSB 0x19
# define STMPE1601_REG_CHIP_ID 0x80
# define STMPE1601_REG_GPIO_SET_MSB 0x82
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_GPIO_SET_LSB 0x83
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_GPIO_CLR_MSB 0x84
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_GPIO_CLR_LSB 0x85
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_GPIO_MP_MSB 0x86
# define STMPE1601_REG_GPIO_MP_LSB 0x87
# define STMPE1601_REG_GPIO_SET_DIR_MSB 0x88
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_GPIO_SET_DIR_LSB 0x89
# define STMPE1601_REG_GPIO_ED_MSB 0x8A
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_GPIO_ED_LSB 0x8B
# define STMPE1601_REG_GPIO_RE_MSB 0x8C
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_GPIO_RE_LSB 0x8D
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_GPIO_FE_MSB 0x8E
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_GPIO_FE_LSB 0x8F
2016-08-10 10:39:11 +03:00
# define STMPE1601_REG_GPIO_PU_MSB 0x90
2014-11-04 03:48:47 +03:00
# define STMPE1601_REG_GPIO_PU_LSB 0x91
2010-07-02 15:22:08 +04:00
# define STMPE1601_REG_GPIO_AF_U_MSB 0x92
# define STMPE1601_SYS_CTRL_ENABLE_GPIO (1 << 3)
# define STMPE1601_SYS_CTRL_ENABLE_KPC (1 << 1)
2014-05-09 01:16:37 +04:00
# define STMPE1601_SYS_CTRL_ENABLE_SPWM (1 << 0)
2010-07-02 15:22:08 +04:00
2010-07-21 10:11:07 +04:00
/* The 1601/2403 share the same masks */
# define STMPE1601_AUTOSLEEP_TIMEOUT_MASK (0x7)
# define STPME1601_AUTOSLEEP_ENABLE (1 << 3)
2013-04-09 12:35:19 +04:00
/*
* STMPE1801
*/
# define STMPE1801_ID 0xc110
# define STMPE1801_NR_INTERNAL_IRQS 5
# define STMPE1801_IRQ_KEYPAD_COMBI 4
# define STMPE1801_IRQ_GPIOC 3
# define STMPE1801_IRQ_KEYPAD_OVER 2
# define STMPE1801_IRQ_KEYPAD 1
# define STMPE1801_IRQ_WAKEUP 0
# define STMPE1801_REG_CHIP_ID 0x00
# define STMPE1801_REG_SYS_CTRL 0x02
# define STMPE1801_REG_INT_CTRL_LOW 0x04
# define STMPE1801_REG_INT_EN_MASK_LOW 0x06
# define STMPE1801_REG_INT_STA_LOW 0x08
# define STMPE1801_REG_INT_EN_GPIO_MASK_LOW 0x0A
# define STMPE1801_REG_INT_EN_GPIO_MASK_MID 0x0B
# define STMPE1801_REG_INT_EN_GPIO_MASK_HIGH 0x0C
# define STMPE1801_REG_INT_STA_GPIO_LOW 0x0D
# define STMPE1801_REG_INT_STA_GPIO_MID 0x0E
# define STMPE1801_REG_INT_STA_GPIO_HIGH 0x0F
# define STMPE1801_REG_GPIO_SET_LOW 0x10
# define STMPE1801_REG_GPIO_SET_MID 0x11
# define STMPE1801_REG_GPIO_SET_HIGH 0x12
# define STMPE1801_REG_GPIO_CLR_LOW 0x13
# define STMPE1801_REG_GPIO_CLR_MID 0x14
# define STMPE1801_REG_GPIO_CLR_HIGH 0x15
# define STMPE1801_REG_GPIO_MP_LOW 0x16
# define STMPE1801_REG_GPIO_MP_MID 0x17
# define STMPE1801_REG_GPIO_MP_HIGH 0x18
# define STMPE1801_REG_GPIO_SET_DIR_LOW 0x19
# define STMPE1801_REG_GPIO_SET_DIR_MID 0x1A
# define STMPE1801_REG_GPIO_SET_DIR_HIGH 0x1B
# define STMPE1801_REG_GPIO_RE_LOW 0x1C
# define STMPE1801_REG_GPIO_RE_MID 0x1D
# define STMPE1801_REG_GPIO_RE_HIGH 0x1E
# define STMPE1801_REG_GPIO_FE_LOW 0x1F
# define STMPE1801_REG_GPIO_FE_MID 0x20
# define STMPE1801_REG_GPIO_FE_HIGH 0x21
# define STMPE1801_REG_GPIO_PULL_UP_LOW 0x22
# define STMPE1801_REG_GPIO_PULL_UP_MID 0x23
# define STMPE1801_REG_GPIO_PULL_UP_HIGH 0x24
# define STMPE1801_MSK_INT_EN_KPC (1 << 1)
# define STMPE1801_MSK_INT_EN_GPIO (1 << 3)
2010-07-02 15:22:08 +04:00
/*
* STMPE24xx
*/
# define STMPE24XX_IRQ_GPIOC 8
# define STMPE24XX_IRQ_PWM2 7
# define STMPE24XX_IRQ_PWM1 6
# define STMPE24XX_IRQ_PWM0 5
# define STMPE24XX_IRQ_ROT_OVER 4
# define STMPE24XX_IRQ_ROT 3
# define STMPE24XX_IRQ_KEYPAD_OVER 2
# define STMPE24XX_IRQ_KEYPAD 1
# define STMPE24XX_IRQ_WAKEUP 0
# define STMPE24XX_NR_INTERNAL_IRQS 9
# define STMPE24XX_REG_SYS_CTRL 0x02
2016-08-10 10:39:06 +03:00
# define STMPE24XX_REG_SYS_CTRL2 0x03
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_ICR_MSB 0x10
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_ICR_LSB 0x11
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_IER_MSB 0x12
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_IER_LSB 0x13
# define STMPE24XX_REG_ISR_MSB 0x14
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_ISR_LSB 0x15
# define STMPE24XX_REG_IEGPIOR_MSB 0x16
# define STMPE24XX_REG_IEGPIOR_CSB 0x17
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_IEGPIOR_LSB 0x18
# define STMPE24XX_REG_ISGPIOR_MSB 0x19
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_ISGPIOR_CSB 0x1A
# define STMPE24XX_REG_ISGPIOR_LSB 0x1B
# define STMPE24XX_REG_CHIP_ID 0x80
# define STMPE24XX_REG_GPSR_MSB 0x83
# define STMPE24XX_REG_GPSR_CSB 0x84
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_GPSR_LSB 0x85
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPCR_MSB 0x86
# define STMPE24XX_REG_GPCR_CSB 0x87
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_GPCR_LSB 0x88
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPDR_MSB 0x89
# define STMPE24XX_REG_GPDR_CSB 0x8A
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_GPDR_LSB 0x8B
# define STMPE24XX_REG_GPEDR_MSB 0x8C
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPEDR_CSB 0x8D
# define STMPE24XX_REG_GPEDR_LSB 0x8E
# define STMPE24XX_REG_GPRER_MSB 0x8F
# define STMPE24XX_REG_GPRER_CSB 0x90
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_GPRER_LSB 0x91
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPFER_MSB 0x92
# define STMPE24XX_REG_GPFER_CSB 0x93
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_GPFER_LSB 0x94
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPPUR_MSB 0x95
# define STMPE24XX_REG_GPPUR_CSB 0x96
2014-11-04 03:48:47 +03:00
# define STMPE24XX_REG_GPPUR_LSB 0x97
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPPDR_MSB 0x98
# define STMPE24XX_REG_GPPDR_CSB 0x99
# define STMPE24XX_REG_GPPDR_LSB 0x9A
2010-07-02 15:22:08 +04:00
# define STMPE24XX_REG_GPAFR_U_MSB 0x9B
2016-08-10 10:39:11 +03:00
# define STMPE24XX_REG_GPMR_MSB 0xA2
# define STMPE24XX_REG_GPMR_CSB 0xA3
# define STMPE24XX_REG_GPMR_LSB 0xA4
2010-07-02 15:22:08 +04:00
# define STMPE24XX_SYS_CTRL_ENABLE_GPIO (1 << 3)
# define STMPE24XX_SYSCON_ENABLE_PWM (1 << 2)
# define STMPE24XX_SYS_CTRL_ENABLE_KPC (1 << 1)
# define STMPE24XX_SYSCON_ENABLE_ROT (1 << 0)
# endif