Immutable branch between MFD and GPIO due for the v4.9 merge window
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJXquWFAAoJEFGvii+H/HdhEKsQAIsl4EG/3QNtrO2oLvnkCZ4z MzmcSFq3c/IKTmK9vUCimw1wQRC1lxLAqdkfKQYCw1lQwzuBc433XTlIV3NvO+65 iW56kUpeX8uyyaq/LCJi8mVYAVt0QPp7NActMXfiOSlnCo8lOR7p33WfT+jUczWe tsRyzrFwwQB38RTtxxco8am34Ffp9ouYVKEGz7jt4cEJmZdbaL0mTpBW92LqzI8K hw0ue7HywFrXs2hnfwuDnjpog94mHCvf4S42ucVu5NOeNWIN37qKsDBgwIAErQEs 5CTKalVDCWJlXGZwgAXwRCzL90FK9SotbOqabITJDjykIozJO3spBTA9D5zprYqS c8EUtN42ZjVNCzwfbCbpu/j1mjpkbb1B0OfS7TjP4nFzc7W9CPvJciy7UAVBjcPR PqRrzxVY5ToMoO+CUGUIaZvRci4mKtwrf80MNvmgYV9sf3COOq2omuZp/TutabGj W2Zb7Hn9fU72RCNRR6ONgsEUJEePUebc5a35QKzbxc6F5O8QGZPPy9zKaeUBlYPZ npHusPvc6jyLTpnzu24V+cRztYAJQwYpGAhA7KJIxx5oeNdyPC+qUgqaxH0OhH8q NqfJzhgnE9AQ+dUvn2teZAXp2jwZL8HQdTqWar4Zi/HawkZodcjpiN8Str1n2kQz 8uoDPQQAQDf+CCrlgv/5 =Gv5o -----END PGP SIGNATURE----- Merge tag 'ib-mfd-gpio-v4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd into devel Immutable branch between MFD and GPIO due for the v4.9 merge window
This commit is contained in:
commit
de4b894182
|
@ -4,7 +4,7 @@ STMPE is an MFD device which may expose the following inbuilt devices: gpio,
|
|||
keypad, touchscreen, adc, pwm, rotator.
|
||||
|
||||
Required properties:
|
||||
- compatible : "st,stmpe[610|801|811|1601|2401|2403]"
|
||||
- compatible : "st,stmpe[610|801|811|1600|1601|2401|2403]"
|
||||
- reg : I2C/SPI address of the device
|
||||
|
||||
Optional properties:
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
*/
|
||||
enum { REG_RE, REG_FE, REG_IE };
|
||||
|
||||
enum { LSB, CSB, MSB };
|
||||
|
||||
#define CACHE_NR_REGS 3
|
||||
/* No variant has more than 24 GPIOs */
|
||||
#define CACHE_NR_BANKS (24 / 8)
|
||||
|
@ -39,7 +41,7 @@ static int stmpe_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|||
{
|
||||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
u8 reg = stmpe->regs[STMPE_IDX_GPMR_LSB] - (offset / 8);
|
||||
u8 reg = stmpe->regs[STMPE_IDX_GPMR_LSB + (offset / 8)];
|
||||
u8 mask = 1 << (offset % 8);
|
||||
int ret;
|
||||
|
||||
|
@ -55,7 +57,7 @@ static void stmpe_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
|
|||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
int which = val ? STMPE_IDX_GPSR_LSB : STMPE_IDX_GPCR_LSB;
|
||||
u8 reg = stmpe->regs[which] - (offset / 8);
|
||||
u8 reg = stmpe->regs[which + (offset / 8)];
|
||||
u8 mask = 1 << (offset % 8);
|
||||
|
||||
/*
|
||||
|
@ -89,7 +91,7 @@ static int stmpe_gpio_direction_output(struct gpio_chip *chip,
|
|||
{
|
||||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
|
||||
u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB + (offset / 8)];
|
||||
u8 mask = 1 << (offset % 8);
|
||||
|
||||
stmpe_gpio_set(chip, offset, val);
|
||||
|
@ -102,7 +104,7 @@ static int stmpe_gpio_direction_input(struct gpio_chip *chip,
|
|||
{
|
||||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(chip);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
|
||||
u8 reg = stmpe->regs[STMPE_IDX_GPDR_LSB + (offset / 8)];
|
||||
u8 mask = 1 << (offset % 8);
|
||||
|
||||
return stmpe_set_bits(stmpe, reg, mask, 0);
|
||||
|
@ -142,8 +144,9 @@ static int stmpe_gpio_irq_set_type(struct irq_data *d, unsigned int type)
|
|||
if (type & IRQ_TYPE_LEVEL_LOW || type & IRQ_TYPE_LEVEL_HIGH)
|
||||
return -EINVAL;
|
||||
|
||||
/* STMPE801 doesn't have RE and FE registers */
|
||||
if (stmpe_gpio->stmpe->partnum == STMPE801)
|
||||
/* STMPE801 and STMPE 1600 don't have RE and FE registers */
|
||||
if (stmpe_gpio->stmpe->partnum == STMPE801 ||
|
||||
stmpe_gpio->stmpe->partnum == STMPE1600)
|
||||
return 0;
|
||||
|
||||
if (type & IRQ_TYPE_EDGE_RISING)
|
||||
|
@ -173,17 +176,24 @@ static void stmpe_gpio_irq_sync_unlock(struct irq_data *d)
|
|||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(gc);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
int num_banks = DIV_ROUND_UP(stmpe->num_gpios, 8);
|
||||
static const u8 regmap[] = {
|
||||
[REG_RE] = STMPE_IDX_GPRER_LSB,
|
||||
[REG_FE] = STMPE_IDX_GPFER_LSB,
|
||||
[REG_IE] = STMPE_IDX_IEGPIOR_LSB,
|
||||
static const u8 regmap[CACHE_NR_REGS][CACHE_NR_BANKS] = {
|
||||
[REG_RE][LSB] = STMPE_IDX_GPRER_LSB,
|
||||
[REG_RE][CSB] = STMPE_IDX_GPRER_CSB,
|
||||
[REG_RE][MSB] = STMPE_IDX_GPRER_MSB,
|
||||
[REG_FE][LSB] = STMPE_IDX_GPFER_LSB,
|
||||
[REG_FE][CSB] = STMPE_IDX_GPFER_CSB,
|
||||
[REG_FE][MSB] = STMPE_IDX_GPFER_MSB,
|
||||
[REG_IE][LSB] = STMPE_IDX_IEGPIOR_LSB,
|
||||
[REG_IE][CSB] = STMPE_IDX_IEGPIOR_CSB,
|
||||
[REG_IE][MSB] = STMPE_IDX_IEGPIOR_MSB,
|
||||
};
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < CACHE_NR_REGS; i++) {
|
||||
/* STMPE801 doesn't have RE and FE registers */
|
||||
if ((stmpe->partnum == STMPE801) &&
|
||||
(i != REG_IE))
|
||||
/* STMPE801 and STMPE1600 don't have RE and FE registers */
|
||||
if ((stmpe->partnum == STMPE801 ||
|
||||
stmpe->partnum == STMPE1600) &&
|
||||
(i != REG_IE))
|
||||
continue;
|
||||
|
||||
for (j = 0; j < num_banks; j++) {
|
||||
|
@ -194,7 +204,7 @@ static void stmpe_gpio_irq_sync_unlock(struct irq_data *d)
|
|||
continue;
|
||||
|
||||
stmpe_gpio->oldregs[i][j] = new;
|
||||
stmpe_reg_write(stmpe, stmpe->regs[regmap[i]] - j, new);
|
||||
stmpe_reg_write(stmpe, stmpe->regs[regmap[i][j]], new);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -216,11 +226,21 @@ static void stmpe_gpio_irq_unmask(struct irq_data *d)
|
|||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(gc);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
int offset = d->hwirq;
|
||||
int regoffset = offset / 8;
|
||||
int mask = 1 << (offset % 8);
|
||||
|
||||
stmpe_gpio->regs[REG_IE][regoffset] |= mask;
|
||||
|
||||
/*
|
||||
* STMPE1600 workaround: to be able to get IRQ from pins,
|
||||
* a read must be done on GPMR register, or a write in
|
||||
* GPSR or GPCR registers
|
||||
*/
|
||||
if (stmpe->partnum == STMPE1600)
|
||||
stmpe_reg_read(stmpe,
|
||||
stmpe->regs[STMPE_IDX_GPMR_LSB + regoffset]);
|
||||
}
|
||||
|
||||
static void stmpe_dbg_show_one(struct seq_file *s,
|
||||
|
@ -230,9 +250,9 @@ static void stmpe_dbg_show_one(struct seq_file *s,
|
|||
struct stmpe_gpio *stmpe_gpio = gpiochip_get_data(gc);
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
const char *label = gpiochip_is_requested(gc, offset);
|
||||
int num_banks = DIV_ROUND_UP(stmpe->num_gpios, 8);
|
||||
bool val = !!stmpe_gpio_get(gc, offset);
|
||||
u8 dir_reg = stmpe->regs[STMPE_IDX_GPDR_LSB] - (offset / 8);
|
||||
u8 bank = offset / 8;
|
||||
u8 dir_reg = stmpe->regs[STMPE_IDX_GPDR_LSB + bank];
|
||||
u8 mask = 1 << (offset % 8);
|
||||
int ret;
|
||||
u8 dir;
|
||||
|
@ -247,39 +267,72 @@ static void stmpe_dbg_show_one(struct seq_file *s,
|
|||
gpio, label ?: "(none)",
|
||||
val ? "hi" : "lo");
|
||||
} else {
|
||||
u8 edge_det_reg = stmpe->regs[STMPE_IDX_GPEDR_MSB] + num_banks - 1 - (offset / 8);
|
||||
u8 rise_reg = stmpe->regs[STMPE_IDX_GPRER_LSB] - (offset / 8);
|
||||
u8 fall_reg = stmpe->regs[STMPE_IDX_GPFER_LSB] - (offset / 8);
|
||||
u8 irqen_reg = stmpe->regs[STMPE_IDX_IEGPIOR_LSB] - (offset / 8);
|
||||
bool edge_det;
|
||||
bool rise;
|
||||
bool fall;
|
||||
u8 edge_det_reg;
|
||||
u8 rise_reg;
|
||||
u8 fall_reg;
|
||||
u8 irqen_reg;
|
||||
|
||||
char *edge_det_values[] = {"edge-inactive",
|
||||
"edge-asserted",
|
||||
"not-supported"};
|
||||
char *rise_values[] = {"no-rising-edge-detection",
|
||||
"rising-edge-detection",
|
||||
"not-supported"};
|
||||
char *fall_values[] = {"no-falling-edge-detection",
|
||||
"falling-edge-detection",
|
||||
"not-supported"};
|
||||
#define NOT_SUPPORTED_IDX 2
|
||||
u8 edge_det = NOT_SUPPORTED_IDX;
|
||||
u8 rise = NOT_SUPPORTED_IDX;
|
||||
u8 fall = NOT_SUPPORTED_IDX;
|
||||
bool irqen;
|
||||
|
||||
ret = stmpe_reg_read(stmpe, edge_det_reg);
|
||||
if (ret < 0)
|
||||
switch (stmpe->partnum) {
|
||||
case STMPE610:
|
||||
case STMPE811:
|
||||
case STMPE1601:
|
||||
case STMPE2401:
|
||||
case STMPE2403:
|
||||
edge_det_reg = stmpe->regs[STMPE_IDX_GPEDR_LSB + bank];
|
||||
ret = stmpe_reg_read(stmpe, edge_det_reg);
|
||||
if (ret < 0)
|
||||
return;
|
||||
edge_det = !!(ret & mask);
|
||||
|
||||
case STMPE1801:
|
||||
rise_reg = stmpe->regs[STMPE_IDX_GPRER_LSB + bank];
|
||||
fall_reg = stmpe->regs[STMPE_IDX_GPFER_LSB + bank];
|
||||
|
||||
ret = stmpe_reg_read(stmpe, rise_reg);
|
||||
if (ret < 0)
|
||||
return;
|
||||
rise = !!(ret & mask);
|
||||
ret = stmpe_reg_read(stmpe, fall_reg);
|
||||
if (ret < 0)
|
||||
return;
|
||||
fall = !!(ret & mask);
|
||||
|
||||
case STMPE801:
|
||||
case STMPE1600:
|
||||
irqen_reg = stmpe->regs[STMPE_IDX_IEGPIOR_LSB + bank];
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
edge_det = !!(ret & mask);
|
||||
ret = stmpe_reg_read(stmpe, rise_reg);
|
||||
if (ret < 0)
|
||||
return;
|
||||
rise = !!(ret & mask);
|
||||
ret = stmpe_reg_read(stmpe, fall_reg);
|
||||
if (ret < 0)
|
||||
return;
|
||||
fall = !!(ret & mask);
|
||||
}
|
||||
|
||||
ret = stmpe_reg_read(stmpe, irqen_reg);
|
||||
if (ret < 0)
|
||||
return;
|
||||
irqen = !!(ret & mask);
|
||||
|
||||
seq_printf(s, " gpio-%-3d (%-20.20s) in %s %s %s%s%s",
|
||||
seq_printf(s, " gpio-%-3d (%-20.20s) in %s %13s %13s %25s %25s",
|
||||
gpio, label ?: "(none)",
|
||||
val ? "hi" : "lo",
|
||||
edge_det ? "edge-asserted" : "edge-inactive",
|
||||
irqen ? "IRQ-enabled" : "",
|
||||
rise ? " rising-edge-detection" : "",
|
||||
fall ? " falling-edge-detection" : "");
|
||||
edge_det_values[edge_det],
|
||||
irqen ? "IRQ-enabled" : "IRQ-disabled",
|
||||
rise_values[rise],
|
||||
fall_values[fall]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -307,18 +360,32 @@ static irqreturn_t stmpe_gpio_irq(int irq, void *dev)
|
|||
{
|
||||
struct stmpe_gpio *stmpe_gpio = dev;
|
||||
struct stmpe *stmpe = stmpe_gpio->stmpe;
|
||||
u8 statmsbreg = stmpe->regs[STMPE_IDX_ISGPIOR_MSB];
|
||||
u8 statmsbreg;
|
||||
int num_banks = DIV_ROUND_UP(stmpe->num_gpios, 8);
|
||||
u8 status[num_banks];
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* the stmpe_block_read() call below, imposes to set statmsbreg
|
||||
* with the register located at the lowest address. As STMPE1600
|
||||
* variant is the only one which respect registers address's order
|
||||
* (LSB regs located at lowest address than MSB ones) whereas all
|
||||
* the others have a registers layout with MSB located before the
|
||||
* LSB regs.
|
||||
*/
|
||||
if (stmpe->partnum == STMPE1600)
|
||||
statmsbreg = stmpe->regs[STMPE_IDX_ISGPIOR_LSB];
|
||||
else
|
||||
statmsbreg = stmpe->regs[STMPE_IDX_ISGPIOR_MSB];
|
||||
|
||||
ret = stmpe_block_read(stmpe, statmsbreg, num_banks, status);
|
||||
if (ret < 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
for (i = 0; i < num_banks; i++) {
|
||||
int bank = num_banks - i - 1;
|
||||
int bank = (stmpe_gpio->stmpe->partnum == STMPE1600) ? i :
|
||||
num_banks - i - 1;
|
||||
unsigned int enabled = stmpe_gpio->regs[REG_IE][bank];
|
||||
unsigned int stat = status[i];
|
||||
|
||||
|
@ -336,12 +403,18 @@ static irqreturn_t stmpe_gpio_irq(int irq, void *dev)
|
|||
stat &= ~(1 << bit);
|
||||
}
|
||||
|
||||
stmpe_reg_write(stmpe, statmsbreg + i, status[i]);
|
||||
|
||||
/* Edge detect register is not present on 801 */
|
||||
if (stmpe->partnum != STMPE801)
|
||||
stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_GPEDR_MSB]
|
||||
+ i, status[i]);
|
||||
/*
|
||||
* interrupt status register write has no effect on
|
||||
* 801/1801/1600, bits are cleared when read.
|
||||
* Edge detect register is not present on 801/1600/1801
|
||||
*/
|
||||
if (stmpe->partnum != STMPE801 || stmpe->partnum != STMPE1600 ||
|
||||
stmpe->partnum != STMPE1801) {
|
||||
stmpe_reg_write(stmpe, statmsbreg + i, status[i]);
|
||||
stmpe_reg_write(stmpe,
|
||||
stmpe->regs[STMPE_IDX_GPEDR_LSB + i],
|
||||
status[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
|
|
@ -57,6 +57,7 @@ static const struct of_device_id stmpe_of_match[] = {
|
|||
{ .compatible = "st,stmpe610", .data = (void *)STMPE610, },
|
||||
{ .compatible = "st,stmpe801", .data = (void *)STMPE801, },
|
||||
{ .compatible = "st,stmpe811", .data = (void *)STMPE811, },
|
||||
{ .compatible = "st,stmpe1600", .data = (void *)STMPE1600, },
|
||||
{ .compatible = "st,stmpe1601", .data = (void *)STMPE1601, },
|
||||
{ .compatible = "st,stmpe1801", .data = (void *)STMPE1801, },
|
||||
{ .compatible = "st,stmpe2401", .data = (void *)STMPE2401, },
|
||||
|
@ -101,6 +102,7 @@ static const struct i2c_device_id stmpe_i2c_id[] = {
|
|||
{ "stmpe610", STMPE610 },
|
||||
{ "stmpe801", STMPE801 },
|
||||
{ "stmpe811", STMPE811 },
|
||||
{ "stmpe1600", STMPE1600 },
|
||||
{ "stmpe1601", STMPE1601 },
|
||||
{ "stmpe1801", STMPE1801 },
|
||||
{ "stmpe2401", STMPE2401 },
|
||||
|
|
|
@ -469,6 +469,8 @@ static const struct mfd_cell stmpe_ts_cell = {
|
|||
|
||||
static const u8 stmpe811_regs[] = {
|
||||
[STMPE_IDX_CHIP_ID] = STMPE811_REG_CHIP_ID,
|
||||
[STMPE_IDX_SYS_CTRL] = STMPE811_REG_SYS_CTRL,
|
||||
[STMPE_IDX_SYS_CTRL2] = STMPE811_REG_SYS_CTRL2,
|
||||
[STMPE_IDX_ICR_LSB] = STMPE811_REG_INT_CTRL,
|
||||
[STMPE_IDX_IER_LSB] = STMPE811_REG_INT_EN,
|
||||
[STMPE_IDX_ISR_MSB] = STMPE811_REG_INT_STA,
|
||||
|
@ -481,7 +483,7 @@ static const u8 stmpe811_regs[] = {
|
|||
[STMPE_IDX_GPAFR_U_MSB] = STMPE811_REG_GPIO_AF,
|
||||
[STMPE_IDX_IEGPIOR_LSB] = STMPE811_REG_GPIO_INT_EN,
|
||||
[STMPE_IDX_ISGPIOR_MSB] = STMPE811_REG_GPIO_INT_STA,
|
||||
[STMPE_IDX_GPEDR_MSB] = STMPE811_REG_GPIO_ED,
|
||||
[STMPE_IDX_GPEDR_LSB] = STMPE811_REG_GPIO_ED,
|
||||
};
|
||||
|
||||
static struct stmpe_variant_block stmpe811_blocks[] = {
|
||||
|
@ -511,7 +513,7 @@ static int stmpe811_enable(struct stmpe *stmpe, unsigned int blocks,
|
|||
if (blocks & STMPE_BLOCK_TOUCHSCREEN)
|
||||
mask |= STMPE811_SYS_CTRL2_TSC_OFF;
|
||||
|
||||
return __stmpe_set_bits(stmpe, STMPE811_REG_SYS_CTRL2, mask,
|
||||
return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2], mask,
|
||||
enable ? 0 : mask);
|
||||
}
|
||||
|
||||
|
@ -550,26 +552,90 @@ static struct stmpe_variant_info stmpe610 = {
|
|||
.get_altfunc = stmpe811_get_altfunc,
|
||||
};
|
||||
|
||||
/*
|
||||
* STMPE1600
|
||||
* Compared to all others STMPE variant, LSB and MSB regs are located in this
|
||||
* order : LSB addr
|
||||
* MSB addr + 1
|
||||
* As there is only 2 * 8bits registers for GPMR/GPSR/IEGPIOPR, CSB index is MSB registers
|
||||
*/
|
||||
|
||||
static const u8 stmpe1600_regs[] = {
|
||||
[STMPE_IDX_CHIP_ID] = STMPE1600_REG_CHIP_ID,
|
||||
[STMPE_IDX_SYS_CTRL] = STMPE1600_REG_SYS_CTRL,
|
||||
[STMPE_IDX_ICR_LSB] = STMPE1600_REG_SYS_CTRL,
|
||||
[STMPE_IDX_GPMR_LSB] = STMPE1600_REG_GPMR_LSB,
|
||||
[STMPE_IDX_GPMR_CSB] = STMPE1600_REG_GPMR_MSB,
|
||||
[STMPE_IDX_GPSR_LSB] = STMPE1600_REG_GPSR_LSB,
|
||||
[STMPE_IDX_GPSR_CSB] = STMPE1600_REG_GPSR_MSB,
|
||||
[STMPE_IDX_GPDR_LSB] = STMPE1600_REG_GPDR_LSB,
|
||||
[STMPE_IDX_GPDR_CSB] = STMPE1600_REG_GPDR_MSB,
|
||||
[STMPE_IDX_IEGPIOR_LSB] = STMPE1600_REG_IEGPIOR_LSB,
|
||||
[STMPE_IDX_IEGPIOR_CSB] = STMPE1600_REG_IEGPIOR_MSB,
|
||||
[STMPE_IDX_ISGPIOR_LSB] = STMPE1600_REG_ISGPIOR_LSB,
|
||||
};
|
||||
|
||||
static struct stmpe_variant_block stmpe1600_blocks[] = {
|
||||
{
|
||||
.cell = &stmpe_gpio_cell,
|
||||
.irq = 0,
|
||||
.block = STMPE_BLOCK_GPIO,
|
||||
},
|
||||
};
|
||||
|
||||
static int stmpe1600_enable(struct stmpe *stmpe, unsigned int blocks,
|
||||
bool enable)
|
||||
{
|
||||
if (blocks & STMPE_BLOCK_GPIO)
|
||||
return 0;
|
||||
else
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct stmpe_variant_info stmpe1600 = {
|
||||
.name = "stmpe1600",
|
||||
.id_val = STMPE1600_ID,
|
||||
.id_mask = 0xffff,
|
||||
.num_gpios = 16,
|
||||
.af_bits = 0,
|
||||
.regs = stmpe1600_regs,
|
||||
.blocks = stmpe1600_blocks,
|
||||
.num_blocks = ARRAY_SIZE(stmpe1600_blocks),
|
||||
.num_irqs = STMPE1600_NR_INTERNAL_IRQS,
|
||||
.enable = stmpe1600_enable,
|
||||
};
|
||||
|
||||
/*
|
||||
* STMPE1601
|
||||
*/
|
||||
|
||||
static const u8 stmpe1601_regs[] = {
|
||||
[STMPE_IDX_CHIP_ID] = STMPE1601_REG_CHIP_ID,
|
||||
[STMPE_IDX_SYS_CTRL] = STMPE1601_REG_SYS_CTRL,
|
||||
[STMPE_IDX_SYS_CTRL2] = STMPE1601_REG_SYS_CTRL2,
|
||||
[STMPE_IDX_ICR_LSB] = STMPE1601_REG_ICR_LSB,
|
||||
[STMPE_IDX_IER_MSB] = STMPE1601_REG_IER_MSB,
|
||||
[STMPE_IDX_IER_LSB] = STMPE1601_REG_IER_LSB,
|
||||
[STMPE_IDX_ISR_MSB] = STMPE1601_REG_ISR_MSB,
|
||||
[STMPE_IDX_GPMR_LSB] = STMPE1601_REG_GPIO_MP_LSB,
|
||||
[STMPE_IDX_GPMR_CSB] = STMPE1601_REG_GPIO_MP_MSB,
|
||||
[STMPE_IDX_GPSR_LSB] = STMPE1601_REG_GPIO_SET_LSB,
|
||||
[STMPE_IDX_GPSR_CSB] = STMPE1601_REG_GPIO_SET_MSB,
|
||||
[STMPE_IDX_GPCR_LSB] = STMPE1601_REG_GPIO_CLR_LSB,
|
||||
[STMPE_IDX_GPCR_CSB] = STMPE1601_REG_GPIO_CLR_MSB,
|
||||
[STMPE_IDX_GPDR_LSB] = STMPE1601_REG_GPIO_SET_DIR_LSB,
|
||||
[STMPE_IDX_GPDR_CSB] = STMPE1601_REG_GPIO_SET_DIR_MSB,
|
||||
[STMPE_IDX_GPEDR_LSB] = STMPE1601_REG_GPIO_ED_LSB,
|
||||
[STMPE_IDX_GPEDR_CSB] = STMPE1601_REG_GPIO_ED_MSB,
|
||||
[STMPE_IDX_GPRER_LSB] = STMPE1601_REG_GPIO_RE_LSB,
|
||||
[STMPE_IDX_GPRER_CSB] = STMPE1601_REG_GPIO_RE_MSB,
|
||||
[STMPE_IDX_GPFER_LSB] = STMPE1601_REG_GPIO_FE_LSB,
|
||||
[STMPE_IDX_GPFER_CSB] = STMPE1601_REG_GPIO_FE_MSB,
|
||||
[STMPE_IDX_GPPUR_LSB] = STMPE1601_REG_GPIO_PU_LSB,
|
||||
[STMPE_IDX_GPAFR_U_MSB] = STMPE1601_REG_GPIO_AF_U_MSB,
|
||||
[STMPE_IDX_IEGPIOR_LSB] = STMPE1601_REG_INT_EN_GPIO_MASK_LSB,
|
||||
[STMPE_IDX_IEGPIOR_CSB] = STMPE1601_REG_INT_EN_GPIO_MASK_MSB,
|
||||
[STMPE_IDX_ISGPIOR_MSB] = STMPE1601_REG_INT_STA_GPIO_MSB,
|
||||
[STMPE_IDX_GPEDR_MSB] = STMPE1601_REG_GPIO_ED_MSB,
|
||||
};
|
||||
|
||||
static struct stmpe_variant_block stmpe1601_blocks[] = {
|
||||
|
@ -640,13 +706,13 @@ static int stmpe1601_autosleep(struct stmpe *stmpe,
|
|||
return timeout;
|
||||
}
|
||||
|
||||
ret = __stmpe_set_bits(stmpe, STMPE1601_REG_SYS_CTRL2,
|
||||
ret = __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2],
|
||||
STMPE1601_AUTOSLEEP_TIMEOUT_MASK,
|
||||
timeout);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return __stmpe_set_bits(stmpe, STMPE1601_REG_SYS_CTRL2,
|
||||
return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2],
|
||||
STPME1601_AUTOSLEEP_ENABLE,
|
||||
STPME1601_AUTOSLEEP_ENABLE);
|
||||
}
|
||||
|
@ -671,7 +737,7 @@ static int stmpe1601_enable(struct stmpe *stmpe, unsigned int blocks,
|
|||
else
|
||||
mask &= ~STMPE1601_SYS_CTRL_ENABLE_SPWM;
|
||||
|
||||
return __stmpe_set_bits(stmpe, STMPE1601_REG_SYS_CTRL, mask,
|
||||
return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL], mask,
|
||||
enable ? mask : 0);
|
||||
}
|
||||
|
||||
|
@ -710,18 +776,33 @@ static struct stmpe_variant_info stmpe1601 = {
|
|||
*/
|
||||
static const u8 stmpe1801_regs[] = {
|
||||
[STMPE_IDX_CHIP_ID] = STMPE1801_REG_CHIP_ID,
|
||||
[STMPE_IDX_SYS_CTRL] = STMPE1801_REG_SYS_CTRL,
|
||||
[STMPE_IDX_ICR_LSB] = STMPE1801_REG_INT_CTRL_LOW,
|
||||
[STMPE_IDX_IER_LSB] = STMPE1801_REG_INT_EN_MASK_LOW,
|
||||
[STMPE_IDX_ISR_LSB] = STMPE1801_REG_INT_STA_LOW,
|
||||
[STMPE_IDX_GPMR_LSB] = STMPE1801_REG_GPIO_MP_LOW,
|
||||
[STMPE_IDX_GPMR_CSB] = STMPE1801_REG_GPIO_MP_MID,
|
||||
[STMPE_IDX_GPMR_MSB] = STMPE1801_REG_GPIO_MP_HIGH,
|
||||
[STMPE_IDX_GPSR_LSB] = STMPE1801_REG_GPIO_SET_LOW,
|
||||
[STMPE_IDX_GPSR_CSB] = STMPE1801_REG_GPIO_SET_MID,
|
||||
[STMPE_IDX_GPSR_MSB] = STMPE1801_REG_GPIO_SET_HIGH,
|
||||
[STMPE_IDX_GPCR_LSB] = STMPE1801_REG_GPIO_CLR_LOW,
|
||||
[STMPE_IDX_GPCR_CSB] = STMPE1801_REG_GPIO_CLR_MID,
|
||||
[STMPE_IDX_GPCR_MSB] = STMPE1801_REG_GPIO_CLR_HIGH,
|
||||
[STMPE_IDX_GPDR_LSB] = STMPE1801_REG_GPIO_SET_DIR_LOW,
|
||||
[STMPE_IDX_GPDR_CSB] = STMPE1801_REG_GPIO_SET_DIR_MID,
|
||||
[STMPE_IDX_GPDR_MSB] = STMPE1801_REG_GPIO_SET_DIR_HIGH,
|
||||
[STMPE_IDX_GPRER_LSB] = STMPE1801_REG_GPIO_RE_LOW,
|
||||
[STMPE_IDX_GPRER_CSB] = STMPE1801_REG_GPIO_RE_MID,
|
||||
[STMPE_IDX_GPRER_MSB] = STMPE1801_REG_GPIO_RE_HIGH,
|
||||
[STMPE_IDX_GPFER_LSB] = STMPE1801_REG_GPIO_FE_LOW,
|
||||
[STMPE_IDX_GPFER_CSB] = STMPE1801_REG_GPIO_FE_MID,
|
||||
[STMPE_IDX_GPFER_MSB] = STMPE1801_REG_GPIO_FE_HIGH,
|
||||
[STMPE_IDX_GPPUR_LSB] = STMPE1801_REG_GPIO_PULL_UP_LOW,
|
||||
[STMPE_IDX_IEGPIOR_LSB] = STMPE1801_REG_INT_EN_GPIO_MASK_LOW,
|
||||
[STMPE_IDX_ISGPIOR_LSB] = STMPE1801_REG_INT_STA_GPIO_LOW,
|
||||
[STMPE_IDX_IEGPIOR_CSB] = STMPE1801_REG_INT_EN_GPIO_MASK_MID,
|
||||
[STMPE_IDX_IEGPIOR_MSB] = STMPE1801_REG_INT_EN_GPIO_MASK_HIGH,
|
||||
[STMPE_IDX_ISGPIOR_MSB] = STMPE1801_REG_INT_STA_GPIO_HIGH,
|
||||
};
|
||||
|
||||
static struct stmpe_variant_block stmpe1801_blocks[] = {
|
||||
|
@ -751,22 +832,31 @@ static int stmpe1801_enable(struct stmpe *stmpe, unsigned int blocks,
|
|||
enable ? mask : 0);
|
||||
}
|
||||
|
||||
static int stmpe1801_reset(struct stmpe *stmpe)
|
||||
static int stmpe_reset(struct stmpe *stmpe)
|
||||
{
|
||||
u16 id_val = stmpe->variant->id_val;
|
||||
unsigned long timeout;
|
||||
int ret = 0;
|
||||
u8 reset_bit;
|
||||
|
||||
ret = __stmpe_set_bits(stmpe, STMPE1801_REG_SYS_CTRL,
|
||||
STMPE1801_MSK_SYS_CTRL_RESET, STMPE1801_MSK_SYS_CTRL_RESET);
|
||||
if (id_val == STMPE811_ID)
|
||||
/* STMPE801 and STMPE610 use bit 1 of SYS_CTRL register */
|
||||
reset_bit = STMPE811_SYS_CTRL_RESET;
|
||||
else
|
||||
/* all other STMPE variant use bit 7 of SYS_CTRL register */
|
||||
reset_bit = STMPE_SYS_CTRL_RESET;
|
||||
|
||||
ret = __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL],
|
||||
reset_bit, reset_bit);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
timeout = jiffies + msecs_to_jiffies(100);
|
||||
while (time_before(jiffies, timeout)) {
|
||||
ret = __stmpe_reg_read(stmpe, STMPE1801_REG_SYS_CTRL);
|
||||
ret = __stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (!(ret & STMPE1801_MSK_SYS_CTRL_RESET))
|
||||
if (!(ret & reset_bit))
|
||||
return 0;
|
||||
usleep_range(100, 200);
|
||||
}
|
||||
|
@ -794,20 +884,39 @@ static struct stmpe_variant_info stmpe1801 = {
|
|||
|
||||
static const u8 stmpe24xx_regs[] = {
|
||||
[STMPE_IDX_CHIP_ID] = STMPE24XX_REG_CHIP_ID,
|
||||
[STMPE_IDX_SYS_CTRL] = STMPE24XX_REG_SYS_CTRL,
|
||||
[STMPE_IDX_SYS_CTRL2] = STMPE24XX_REG_SYS_CTRL2,
|
||||
[STMPE_IDX_ICR_LSB] = STMPE24XX_REG_ICR_LSB,
|
||||
[STMPE_IDX_IER_MSB] = STMPE24XX_REG_IER_MSB,
|
||||
[STMPE_IDX_IER_LSB] = STMPE24XX_REG_IER_LSB,
|
||||
[STMPE_IDX_ISR_MSB] = STMPE24XX_REG_ISR_MSB,
|
||||
[STMPE_IDX_GPMR_LSB] = STMPE24XX_REG_GPMR_LSB,
|
||||
[STMPE_IDX_GPMR_CSB] = STMPE24XX_REG_GPMR_CSB,
|
||||
[STMPE_IDX_GPMR_MSB] = STMPE24XX_REG_GPMR_MSB,
|
||||
[STMPE_IDX_GPSR_LSB] = STMPE24XX_REG_GPSR_LSB,
|
||||
[STMPE_IDX_GPSR_CSB] = STMPE24XX_REG_GPSR_CSB,
|
||||
[STMPE_IDX_GPSR_MSB] = STMPE24XX_REG_GPSR_MSB,
|
||||
[STMPE_IDX_GPCR_LSB] = STMPE24XX_REG_GPCR_LSB,
|
||||
[STMPE_IDX_GPCR_CSB] = STMPE24XX_REG_GPCR_CSB,
|
||||
[STMPE_IDX_GPCR_MSB] = STMPE24XX_REG_GPCR_MSB,
|
||||
[STMPE_IDX_GPDR_LSB] = STMPE24XX_REG_GPDR_LSB,
|
||||
[STMPE_IDX_GPDR_CSB] = STMPE24XX_REG_GPDR_CSB,
|
||||
[STMPE_IDX_GPDR_MSB] = STMPE24XX_REG_GPDR_MSB,
|
||||
[STMPE_IDX_GPRER_LSB] = STMPE24XX_REG_GPRER_LSB,
|
||||
[STMPE_IDX_GPRER_CSB] = STMPE24XX_REG_GPRER_CSB,
|
||||
[STMPE_IDX_GPRER_MSB] = STMPE24XX_REG_GPRER_MSB,
|
||||
[STMPE_IDX_GPFER_LSB] = STMPE24XX_REG_GPFER_LSB,
|
||||
[STMPE_IDX_GPFER_CSB] = STMPE24XX_REG_GPFER_CSB,
|
||||
[STMPE_IDX_GPFER_MSB] = STMPE24XX_REG_GPFER_MSB,
|
||||
[STMPE_IDX_GPPUR_LSB] = STMPE24XX_REG_GPPUR_LSB,
|
||||
[STMPE_IDX_GPPDR_LSB] = STMPE24XX_REG_GPPDR_LSB,
|
||||
[STMPE_IDX_GPAFR_U_MSB] = STMPE24XX_REG_GPAFR_U_MSB,
|
||||
[STMPE_IDX_IEGPIOR_LSB] = STMPE24XX_REG_IEGPIOR_LSB,
|
||||
[STMPE_IDX_IEGPIOR_CSB] = STMPE24XX_REG_IEGPIOR_CSB,
|
||||
[STMPE_IDX_IEGPIOR_MSB] = STMPE24XX_REG_IEGPIOR_MSB,
|
||||
[STMPE_IDX_ISGPIOR_MSB] = STMPE24XX_REG_ISGPIOR_MSB,
|
||||
[STMPE_IDX_GPEDR_LSB] = STMPE24XX_REG_GPEDR_LSB,
|
||||
[STMPE_IDX_GPEDR_CSB] = STMPE24XX_REG_GPEDR_CSB,
|
||||
[STMPE_IDX_GPEDR_MSB] = STMPE24XX_REG_GPEDR_MSB,
|
||||
};
|
||||
|
||||
|
@ -840,7 +949,7 @@ static int stmpe24xx_enable(struct stmpe *stmpe, unsigned int blocks,
|
|||
if (blocks & STMPE_BLOCK_KEYPAD)
|
||||
mask |= STMPE24XX_SYS_CTRL_ENABLE_KPC;
|
||||
|
||||
return __stmpe_set_bits(stmpe, STMPE24XX_REG_SYS_CTRL, mask,
|
||||
return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL], mask,
|
||||
enable ? mask : 0);
|
||||
}
|
||||
|
||||
|
@ -893,6 +1002,7 @@ static struct stmpe_variant_info *stmpe_variant_info[STMPE_NBR_PARTS] = {
|
|||
[STMPE610] = &stmpe610,
|
||||
[STMPE801] = &stmpe801,
|
||||
[STMPE811] = &stmpe811,
|
||||
[STMPE1600] = &stmpe1600,
|
||||
[STMPE1601] = &stmpe1601,
|
||||
[STMPE1801] = &stmpe1801,
|
||||
[STMPE2401] = &stmpe2401,
|
||||
|
@ -919,7 +1029,8 @@ static irqreturn_t stmpe_irq(int irq, void *data)
|
|||
int ret;
|
||||
int i;
|
||||
|
||||
if (variant->id_val == STMPE801_ID) {
|
||||
if (variant->id_val == STMPE801_ID ||
|
||||
variant->id_val == STMPE1600_ID) {
|
||||
int base = irq_create_mapping(stmpe->domain, 0);
|
||||
|
||||
handle_nested_irq(base);
|
||||
|
@ -982,7 +1093,7 @@ static void stmpe_irq_sync_unlock(struct irq_data *data)
|
|||
continue;
|
||||
|
||||
stmpe->oldier[i] = new;
|
||||
stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_IER_LSB] - i, new);
|
||||
stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_IER_LSB + i], new);
|
||||
}
|
||||
|
||||
mutex_unlock(&stmpe->irq_lock);
|
||||
|
@ -1088,20 +1199,18 @@ static int stmpe_chip_init(struct stmpe *stmpe)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (id == STMPE1801_ID) {
|
||||
ret = stmpe1801_reset(stmpe);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
ret = stmpe_reset(stmpe);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (stmpe->irq >= 0) {
|
||||
if (id == STMPE801_ID)
|
||||
icr = STMPE801_REG_SYS_CTRL_INT_EN;
|
||||
if (id == STMPE801_ID || id == STMPE1600_ID)
|
||||
icr = STMPE_SYS_CTRL_INT_EN;
|
||||
else
|
||||
icr = STMPE_ICR_LSB_GIM;
|
||||
|
||||
/* STMPE801 doesn't support Edge interrupts */
|
||||
if (id != STMPE801_ID) {
|
||||
/* STMPE801 and STMPE1600 don't support Edge interrupts */
|
||||
if (id != STMPE801_ID && id != STMPE1600_ID) {
|
||||
if (irq_trigger == IRQF_TRIGGER_FALLING ||
|
||||
irq_trigger == IRQF_TRIGGER_RISING)
|
||||
icr |= STMPE_ICR_LSB_EDGE;
|
||||
|
@ -1109,8 +1218,8 @@ static int stmpe_chip_init(struct stmpe *stmpe)
|
|||
|
||||
if (irq_trigger == IRQF_TRIGGER_RISING ||
|
||||
irq_trigger == IRQF_TRIGGER_HIGH) {
|
||||
if (id == STMPE801_ID)
|
||||
icr |= STMPE801_REG_SYS_CTRL_INT_HI;
|
||||
if (id == STMPE801_ID || id == STMPE1600_ID)
|
||||
icr |= STMPE_SYS_CTRL_INT_HI;
|
||||
else
|
||||
icr |= STMPE_ICR_LSB_HIGH;
|
||||
}
|
||||
|
|
|
@ -104,6 +104,10 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
#define STMPE_ICR_LSB_EDGE (1 << 1)
|
||||
#define STMPE_ICR_LSB_GIM (1 << 0)
|
||||
|
||||
#define STMPE_SYS_CTRL_RESET (1 << 7)
|
||||
#define STMPE_SYS_CTRL_INT_EN (1 << 2)
|
||||
#define STMPE_SYS_CTRL_INT_HI (1 << 0)
|
||||
|
||||
/*
|
||||
* STMPE801
|
||||
*/
|
||||
|
@ -119,13 +123,10 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
#define STMPE801_REG_GPIO_SET_PIN 0x11
|
||||
#define STMPE801_REG_GPIO_DIR 0x12
|
||||
|
||||
#define STMPE801_REG_SYS_CTRL_RESET (1 << 7)
|
||||
#define STMPE801_REG_SYS_CTRL_INT_EN (1 << 2)
|
||||
#define STMPE801_REG_SYS_CTRL_INT_HI (1 << 0)
|
||||
|
||||
/*
|
||||
* STMPE811
|
||||
*/
|
||||
#define STMPE811_ID 0x0811
|
||||
|
||||
#define STMPE811_IRQ_TOUCH_DET 0
|
||||
#define STMPE811_IRQ_FIFO_TH 1
|
||||
|
@ -138,6 +139,7 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
#define STMPE811_NR_INTERNAL_IRQS 8
|
||||
|
||||
#define STMPE811_REG_CHIP_ID 0x00
|
||||
#define STMPE811_REG_SYS_CTRL 0x03
|
||||
#define STMPE811_REG_SYS_CTRL2 0x04
|
||||
#define STMPE811_REG_SPI_CFG 0x08
|
||||
#define STMPE811_REG_INT_CTRL 0x09
|
||||
|
@ -154,11 +156,34 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
#define STMPE811_REG_GPIO_FE 0x16
|
||||
#define STMPE811_REG_GPIO_AF 0x17
|
||||
|
||||
#define STMPE811_SYS_CTRL_RESET (1 << 1)
|
||||
|
||||
#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)
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
/*
|
||||
* STMPE1601
|
||||
*/
|
||||
|
@ -175,19 +200,32 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
|
||||
#define STMPE1601_REG_SYS_CTRL 0x02
|
||||
#define STMPE1601_REG_SYS_CTRL2 0x03
|
||||
#define STMPE1601_REG_ICR_MSB 0x10
|
||||
#define STMPE1601_REG_ICR_LSB 0x11
|
||||
#define STMPE1601_REG_IER_MSB 0x12
|
||||
#define STMPE1601_REG_IER_LSB 0x13
|
||||
#define STMPE1601_REG_ISR_MSB 0x14
|
||||
#define STMPE1601_REG_CHIP_ID 0x80
|
||||
#define STMPE1601_REG_ISR_LSB 0x15
|
||||
#define STMPE1601_REG_INT_EN_GPIO_MASK_MSB 0x16
|
||||
#define STMPE1601_REG_INT_EN_GPIO_MASK_LSB 0x17
|
||||
#define STMPE1601_REG_INT_STA_GPIO_MSB 0x18
|
||||
#define STMPE1601_REG_GPIO_MP_LSB 0x87
|
||||
#define STMPE1601_REG_INT_STA_GPIO_LSB 0x19
|
||||
#define STMPE1601_REG_CHIP_ID 0x80
|
||||
#define STMPE1601_REG_GPIO_SET_MSB 0x82
|
||||
#define STMPE1601_REG_GPIO_SET_LSB 0x83
|
||||
#define STMPE1601_REG_GPIO_CLR_MSB 0x84
|
||||
#define STMPE1601_REG_GPIO_CLR_LSB 0x85
|
||||
#define STMPE1601_REG_GPIO_MP_MSB 0x86
|
||||
#define STMPE1601_REG_GPIO_MP_LSB 0x87
|
||||
#define STMPE1601_REG_GPIO_SET_DIR_MSB 0x88
|
||||
#define STMPE1601_REG_GPIO_SET_DIR_LSB 0x89
|
||||
#define STMPE1601_REG_GPIO_ED_MSB 0x8A
|
||||
#define STMPE1601_REG_GPIO_ED_LSB 0x8B
|
||||
#define STMPE1601_REG_GPIO_RE_MSB 0x8C
|
||||
#define STMPE1601_REG_GPIO_RE_LSB 0x8D
|
||||
#define STMPE1601_REG_GPIO_FE_MSB 0x8E
|
||||
#define STMPE1601_REG_GPIO_FE_LSB 0x8F
|
||||
#define STMPE1601_REG_GPIO_PU_MSB 0x90
|
||||
#define STMPE1601_REG_GPIO_PU_LSB 0x91
|
||||
#define STMPE1601_REG_GPIO_AF_U_MSB 0x92
|
||||
|
||||
|
@ -243,8 +281,6 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
#define STMPE1801_REG_GPIO_PULL_UP_MID 0x23
|
||||
#define STMPE1801_REG_GPIO_PULL_UP_HIGH 0x24
|
||||
|
||||
#define STMPE1801_MSK_SYS_CTRL_RESET (1 << 7)
|
||||
|
||||
#define STMPE1801_MSK_INT_EN_KPC (1 << 1)
|
||||
#define STMPE1801_MSK_INT_EN_GPIO (1 << 3)
|
||||
|
||||
|
@ -264,23 +300,48 @@ int stmpe_remove(struct stmpe *stmpe);
|
|||
#define STMPE24XX_NR_INTERNAL_IRQS 9
|
||||
|
||||
#define STMPE24XX_REG_SYS_CTRL 0x02
|
||||
#define STMPE24XX_REG_SYS_CTRL2 0x03
|
||||
#define STMPE24XX_REG_ICR_MSB 0x10
|
||||
#define STMPE24XX_REG_ICR_LSB 0x11
|
||||
#define STMPE24XX_REG_IER_MSB 0x12
|
||||
#define STMPE24XX_REG_IER_LSB 0x13
|
||||
#define STMPE24XX_REG_ISR_MSB 0x14
|
||||
#define STMPE24XX_REG_CHIP_ID 0x80
|
||||
#define STMPE24XX_REG_ISR_LSB 0x15
|
||||
#define STMPE24XX_REG_IEGPIOR_MSB 0x16
|
||||
#define STMPE24XX_REG_IEGPIOR_CSB 0x17
|
||||
#define STMPE24XX_REG_IEGPIOR_LSB 0x18
|
||||
#define STMPE24XX_REG_ISGPIOR_MSB 0x19
|
||||
#define STMPE24XX_REG_GPMR_LSB 0xA4
|
||||
#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
|
||||
#define STMPE24XX_REG_GPSR_LSB 0x85
|
||||
#define STMPE24XX_REG_GPCR_MSB 0x86
|
||||
#define STMPE24XX_REG_GPCR_CSB 0x87
|
||||
#define STMPE24XX_REG_GPCR_LSB 0x88
|
||||
#define STMPE24XX_REG_GPDR_MSB 0x89
|
||||
#define STMPE24XX_REG_GPDR_CSB 0x8A
|
||||
#define STMPE24XX_REG_GPDR_LSB 0x8B
|
||||
#define STMPE24XX_REG_GPEDR_MSB 0x8C
|
||||
#define STMPE24XX_REG_GPEDR_CSB 0x8D
|
||||
#define STMPE24XX_REG_GPEDR_LSB 0x8E
|
||||
#define STMPE24XX_REG_GPRER_MSB 0x8F
|
||||
#define STMPE24XX_REG_GPRER_CSB 0x90
|
||||
#define STMPE24XX_REG_GPRER_LSB 0x91
|
||||
#define STMPE24XX_REG_GPFER_MSB 0x92
|
||||
#define STMPE24XX_REG_GPFER_CSB 0x93
|
||||
#define STMPE24XX_REG_GPFER_LSB 0x94
|
||||
#define STMPE24XX_REG_GPPUR_MSB 0x95
|
||||
#define STMPE24XX_REG_GPPUR_CSB 0x96
|
||||
#define STMPE24XX_REG_GPPUR_LSB 0x97
|
||||
#define STMPE24XX_REG_GPPDR_LSB 0x9a
|
||||
#define STMPE24XX_REG_GPPDR_MSB 0x98
|
||||
#define STMPE24XX_REG_GPPDR_CSB 0x99
|
||||
#define STMPE24XX_REG_GPPDR_LSB 0x9A
|
||||
#define STMPE24XX_REG_GPAFR_U_MSB 0x9B
|
||||
|
||||
#define STMPE24XX_REG_GPMR_MSB 0xA2
|
||||
#define STMPE24XX_REG_GPMR_CSB 0xA3
|
||||
#define STMPE24XX_REG_GPMR_LSB 0xA4
|
||||
#define STMPE24XX_SYS_CTRL_ENABLE_GPIO (1 << 3)
|
||||
#define STMPE24XX_SYSCON_ENABLE_PWM (1 << 2)
|
||||
#define STMPE24XX_SYS_CTRL_ENABLE_KPC (1 << 1)
|
||||
|
|
|
@ -26,6 +26,7 @@ enum stmpe_partnum {
|
|||
STMPE610,
|
||||
STMPE801,
|
||||
STMPE811,
|
||||
STMPE1600,
|
||||
STMPE1601,
|
||||
STMPE1801,
|
||||
STMPE2401,
|
||||
|
@ -39,22 +40,42 @@ enum stmpe_partnum {
|
|||
*/
|
||||
enum {
|
||||
STMPE_IDX_CHIP_ID,
|
||||
STMPE_IDX_SYS_CTRL,
|
||||
STMPE_IDX_SYS_CTRL2,
|
||||
STMPE_IDX_ICR_LSB,
|
||||
STMPE_IDX_IER_LSB,
|
||||
STMPE_IDX_IER_MSB,
|
||||
STMPE_IDX_ISR_LSB,
|
||||
STMPE_IDX_ISR_MSB,
|
||||
STMPE_IDX_GPMR_LSB,
|
||||
STMPE_IDX_GPMR_CSB,
|
||||
STMPE_IDX_GPMR_MSB,
|
||||
STMPE_IDX_GPSR_LSB,
|
||||
STMPE_IDX_GPSR_CSB,
|
||||
STMPE_IDX_GPSR_MSB,
|
||||
STMPE_IDX_GPCR_LSB,
|
||||
STMPE_IDX_GPCR_CSB,
|
||||
STMPE_IDX_GPCR_MSB,
|
||||
STMPE_IDX_GPDR_LSB,
|
||||
STMPE_IDX_GPDR_CSB,
|
||||
STMPE_IDX_GPDR_MSB,
|
||||
STMPE_IDX_GPEDR_LSB,
|
||||
STMPE_IDX_GPEDR_CSB,
|
||||
STMPE_IDX_GPEDR_MSB,
|
||||
STMPE_IDX_GPRER_LSB,
|
||||
STMPE_IDX_GPRER_CSB,
|
||||
STMPE_IDX_GPRER_MSB,
|
||||
STMPE_IDX_GPFER_LSB,
|
||||
STMPE_IDX_GPFER_CSB,
|
||||
STMPE_IDX_GPFER_MSB,
|
||||
STMPE_IDX_GPPUR_LSB,
|
||||
STMPE_IDX_GPPDR_LSB,
|
||||
STMPE_IDX_GPAFR_U_MSB,
|
||||
STMPE_IDX_IEGPIOR_LSB,
|
||||
STMPE_IDX_IEGPIOR_CSB,
|
||||
STMPE_IDX_IEGPIOR_MSB,
|
||||
STMPE_IDX_ISGPIOR_LSB,
|
||||
STMPE_IDX_ISGPIOR_CSB,
|
||||
STMPE_IDX_ISGPIOR_MSB,
|
||||
STMPE_IDX_MAX,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue