aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrice Chotard <patrice.chotard@st.com>2016-08-10 03:39:07 -0400
committerLee Jones <lee.jones@linaro.org>2016-08-10 04:23:33 -0400
commitc4dd1ba355aae2bc3d1213da6c66c53e3c31e028 (patch)
tree5d6175b5371a9010f5736c5c5ed84f95548f60cc
parent0f4be8cf637ea4637faba8a0e4bf2270287c6ba0 (diff)
mfd: stmpe: Add reset support for all STMPE variant
Reset was only implemented for STMPE1801 variant despite all variant have a SOFT_RESET bit. For STMPE2401/2403/801/1601/1801 SOFT_RESET bit is bit 7 of SYS_CTRL register. For STMPE610/811 (which have the same variant id) SOFT_RESET bit is bit 1 of SYS_CTRL register. Signed-off-by: Patrice Chotard <patrice.chotard@st.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/mfd/stmpe.c23
-rw-r--r--drivers/mfd/stmpe.h7
2 files changed, 20 insertions, 10 deletions
diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c
index c053b2b67bad..85005253663d 100644
--- a/drivers/mfd/stmpe.c
+++ b/drivers/mfd/stmpe.c
@@ -756,13 +756,22 @@ static int stmpe1801_enable(struct stmpe *stmpe, unsigned int blocks,
756 enable ? mask : 0); 756 enable ? mask : 0);
757} 757}
758 758
759static int stmpe1801_reset(struct stmpe *stmpe) 759static int stmpe_reset(struct stmpe *stmpe)
760{ 760{
761 u16 id_val = stmpe->variant->id_val;
761 unsigned long timeout; 762 unsigned long timeout;
762 int ret = 0; 763 int ret = 0;
764 u8 reset_bit;
765
766 if (id_val == STMPE811_ID)
767 /* STMPE801 and STMPE610 use bit 1 of SYS_CTRL register */
768 reset_bit = STMPE811_SYS_CTRL_RESET;
769 else
770 /* all other STMPE variant use bit 7 of SYS_CTRL register */
771 reset_bit = STMPE_SYS_CTRL_RESET;
763 772
764 ret = __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL], 773 ret = __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL],
765 STMPE1801_MSK_SYS_CTRL_RESET, STMPE1801_MSK_SYS_CTRL_RESET); 774 reset_bit, reset_bit);
766 if (ret < 0) 775 if (ret < 0)
767 return ret; 776 return ret;
768 777
@@ -771,7 +780,7 @@ static int stmpe1801_reset(struct stmpe *stmpe)
771 ret = __stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL]); 780 ret = __stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL]);
772 if (ret < 0) 781 if (ret < 0)
773 return ret; 782 return ret;
774 if (!(ret & STMPE1801_MSK_SYS_CTRL_RESET)) 783 if (!(ret & reset_bit))
775 return 0; 784 return 0;
776 usleep_range(100, 200); 785 usleep_range(100, 200);
777 } 786 }
@@ -1095,11 +1104,9 @@ static int stmpe_chip_init(struct stmpe *stmpe)
1095 if (ret) 1104 if (ret)
1096 return ret; 1105 return ret;
1097 1106
1098 if (id == STMPE1801_ID) { 1107 ret = stmpe_reset(stmpe);
1099 ret = stmpe1801_reset(stmpe); 1108 if (ret < 0)
1100 if (ret < 0) 1109 return ret;
1101 return ret;
1102 }
1103 1110
1104 if (stmpe->irq >= 0) { 1111 if (stmpe->irq >= 0) {
1105 if (id == STMPE801_ID) 1112 if (id == STMPE801_ID)
diff --git a/drivers/mfd/stmpe.h b/drivers/mfd/stmpe.h
index 406f9f2d8935..4ae343de71eb 100644
--- a/drivers/mfd/stmpe.h
+++ b/drivers/mfd/stmpe.h
@@ -104,6 +104,8 @@ int stmpe_remove(struct stmpe *stmpe);
104#define STMPE_ICR_LSB_EDGE (1 << 1) 104#define STMPE_ICR_LSB_EDGE (1 << 1)
105#define STMPE_ICR_LSB_GIM (1 << 0) 105#define STMPE_ICR_LSB_GIM (1 << 0)
106 106
107#define STMPE_SYS_CTRL_RESET (1 << 7)
108
107/* 109/*
108 * STMPE801 110 * STMPE801
109 */ 111 */
@@ -126,6 +128,7 @@ int stmpe_remove(struct stmpe *stmpe);
126/* 128/*
127 * STMPE811 129 * STMPE811
128 */ 130 */
131#define STMPE811_ID 0x0811
129 132
130#define STMPE811_IRQ_TOUCH_DET 0 133#define STMPE811_IRQ_TOUCH_DET 0
131#define STMPE811_IRQ_FIFO_TH 1 134#define STMPE811_IRQ_FIFO_TH 1
@@ -155,6 +158,8 @@ int stmpe_remove(struct stmpe *stmpe);
155#define STMPE811_REG_GPIO_FE 0x16 158#define STMPE811_REG_GPIO_FE 0x16
156#define STMPE811_REG_GPIO_AF 0x17 159#define STMPE811_REG_GPIO_AF 0x17
157 160
161#define STMPE811_SYS_CTRL_RESET (1 << 1)
162
158#define STMPE811_SYS_CTRL2_ADC_OFF (1 << 0) 163#define STMPE811_SYS_CTRL2_ADC_OFF (1 << 0)
159#define STMPE811_SYS_CTRL2_TSC_OFF (1 << 1) 164#define STMPE811_SYS_CTRL2_TSC_OFF (1 << 1)
160#define STMPE811_SYS_CTRL2_GPIO_OFF (1 << 2) 165#define STMPE811_SYS_CTRL2_GPIO_OFF (1 << 2)
@@ -244,8 +249,6 @@ int stmpe_remove(struct stmpe *stmpe);
244#define STMPE1801_REG_GPIO_PULL_UP_MID 0x23 249#define STMPE1801_REG_GPIO_PULL_UP_MID 0x23
245#define STMPE1801_REG_GPIO_PULL_UP_HIGH 0x24 250#define STMPE1801_REG_GPIO_PULL_UP_HIGH 0x24
246 251
247#define STMPE1801_MSK_SYS_CTRL_RESET (1 << 7)
248
249#define STMPE1801_MSK_INT_EN_KPC (1 << 1) 252#define STMPE1801_MSK_INT_EN_KPC (1 << 1)
250#define STMPE1801_MSK_INT_EN_GPIO (1 << 3) 253#define STMPE1801_MSK_INT_EN_GPIO (1 << 3)
251 254