diff options
author | Patrice Chotard <patrice.chotard@st.com> | 2016-08-10 03:39:07 -0400 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2016-08-10 04:23:33 -0400 |
commit | c4dd1ba355aae2bc3d1213da6c66c53e3c31e028 (patch) | |
tree | 5d6175b5371a9010f5736c5c5ed84f95548f60cc | |
parent | 0f4be8cf637ea4637faba8a0e4bf2270287c6ba0 (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.c | 23 | ||||
-rw-r--r-- | drivers/mfd/stmpe.h | 7 |
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 | ||
759 | static int stmpe1801_reset(struct stmpe *stmpe) | 759 | static 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 | ||