summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/mediatek
diff options
context:
space:
mode:
authorSean Wang <sean.wang@mediatek.com>2018-09-08 07:07:24 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-09-18 17:52:55 -0400
commit85430152ba468acbfc2d7bc81c57bb2f93a24641 (patch)
tree5a05e6648fafee814f14703fdd600d7411e7e5e1 /drivers/pinctrl/mediatek
parent3ad38a14e13c10f19d4a6ca9ed3d90b003e21a45 (diff)
pinctrl: mediatek: add pull related support to pinctrl-mtk-common-v2.c
Put pull control support related functions to pinctrl-mtk-common-v2.c as these operations might be different by chips and allow different type of driver to reuse them. Signed-off-by: Ryder.Lee <ryder.lee@mediatek.com> Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/mediatek')
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-moore.c76
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mt7622.c4
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c78
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h19
4 files changed, 148 insertions, 29 deletions
diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c
index 1f0cd306a940..d69f024c416d 100644
--- a/drivers/pinctrl/mediatek/pinctrl-moore.c
+++ b/drivers/pinctrl/mediatek/pinctrl-moore.c
@@ -88,27 +88,34 @@ static int mtk_pinconf_get(struct pinctrl_dev *pctldev,
88 88
89 switch (param) { 89 switch (param) {
90 case PIN_CONFIG_BIAS_DISABLE: 90 case PIN_CONFIG_BIAS_DISABLE:
91 err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_PU, &val); 91 if (hw->soc->bias_disable_get) {
92 if (err) 92 err = hw->soc->bias_disable_get(hw, desc, &ret);
93 return err; 93 if (err)
94 94 return err;
95 err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_PD, &val2); 95 } else {
96 if (err) 96 return -ENOTSUPP;
97 return err; 97 }
98
99 if (val || val2)
100 return -EINVAL;
101
102 break; 98 break;
103 case PIN_CONFIG_BIAS_PULL_UP: 99 case PIN_CONFIG_BIAS_PULL_UP:
100 if (hw->soc->bias_get) {
101 err = hw->soc->bias_get(hw, desc, 1, &ret);
102 if (err)
103 return err;
104 } else {
105 return -ENOTSUPP;
106 }
107 break;
104 case PIN_CONFIG_BIAS_PULL_DOWN: 108 case PIN_CONFIG_BIAS_PULL_DOWN:
109 if (hw->soc->bias_get) {
110 err = hw->soc->bias_get(hw, desc, 0, &ret);
111 if (err)
112 return err;
113 } else {
114 return -ENOTSUPP;
115 }
116 break;
105 case PIN_CONFIG_SLEW_RATE: 117 case PIN_CONFIG_SLEW_RATE:
106 reg = (param == PIN_CONFIG_BIAS_PULL_UP) ? 118 err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_SR, &val);
107 PINCTRL_PIN_REG_PU :
108 (param == PIN_CONFIG_BIAS_PULL_DOWN) ?
109 PINCTRL_PIN_REG_PD : PINCTRL_PIN_REG_SR;
110
111 err = mtk_hw_get_value(hw, pin, reg, &val);
112 if (err) 119 if (err)
113 return err; 120 return err;
114 121
@@ -187,20 +194,31 @@ static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
187 194
188 switch (param) { 195 switch (param) {
189 case PIN_CONFIG_BIAS_DISABLE: 196 case PIN_CONFIG_BIAS_DISABLE:
197 if (hw->soc->bias_disable_set) {
198 err = hw->soc->bias_disable_set(hw, desc);
199 if (err)
200 return err;
201 } else {
202 return -ENOTSUPP;
203 }
204 break;
190 case PIN_CONFIG_BIAS_PULL_UP: 205 case PIN_CONFIG_BIAS_PULL_UP:
206 if (hw->soc->bias_set) {
207 err = hw->soc->bias_set(hw, desc, 1);
208 if (err)
209 return err;
210 } else {
211 return -ENOTSUPP;
212 }
213 break;
191 case PIN_CONFIG_BIAS_PULL_DOWN: 214 case PIN_CONFIG_BIAS_PULL_DOWN:
192 arg = (param == PIN_CONFIG_BIAS_DISABLE) ? 0 : 215 if (hw->soc->bias_set) {
193 (param == PIN_CONFIG_BIAS_PULL_UP) ? 1 : 2; 216 err = hw->soc->bias_set(hw, desc, 0);
194 217 if (err)
195 err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_PU, 218 return err;
196 arg & 1); 219 } else {
197 if (err) 220 return -ENOTSUPP;
198 goto err; 221 }
199
200 err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_PD,
201 !!(arg & 2));
202 if (err)
203 goto err;
204 break; 222 break;
205 case PIN_CONFIG_OUTPUT_ENABLE: 223 case PIN_CONFIG_OUTPUT_ENABLE:
206 err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_SMT, 224 err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_SMT,
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7622.c b/drivers/pinctrl/mediatek/pinctrl-mt7622.c
index f6904a925755..9a5b13a2826e 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7622.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7622.c
@@ -767,6 +767,10 @@ static const struct mtk_pin_soc mt7622_data = {
767 .eint_hw = &mt7622_eint_hw, 767 .eint_hw = &mt7622_eint_hw,
768 .gpio_m = 1, 768 .gpio_m = 1,
769 .eint_m = 1, 769 .eint_m = 1,
770 .bias_disable_set = mtk_pinconf_bias_disable_set,
771 .bias_disable_get = mtk_pinconf_bias_disable_get,
772 .bias_set = mtk_pinconf_bias_set,
773 .bias_get = mtk_pinconf_bias_get,
770 .drive_set = mtk_pinconf_drive_set, 774 .drive_set = mtk_pinconf_drive_set,
771 .drive_get = mtk_pinconf_drive_get, 775 .drive_get = mtk_pinconf_drive_get,
772}; 776};
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
index 3f0917967f2a..67c95ef85ba9 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
@@ -190,6 +190,84 @@ int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field, int *value)
190 return 0; 190 return 0;
191} 191}
192 192
193int mtk_pinconf_bias_disable_set(struct mtk_pinctrl *hw,
194 const struct mtk_pin_desc *desc)
195{
196 int err;
197
198 err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PU,
199 MTK_DISABLE);
200 if (err)
201 return err;
202
203 err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PD,
204 MTK_DISABLE);
205 if (err)
206 return err;
207
208 return 0;
209}
210
211int mtk_pinconf_bias_disable_get(struct mtk_pinctrl *hw,
212 const struct mtk_pin_desc *desc, int *res)
213{
214 int v, v2;
215 int err;
216
217 err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_PU, &v);
218 if (err)
219 return err;
220
221 err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_PD, &v2);
222 if (err)
223 return err;
224
225 if (v == MTK_ENABLE || v2 == MTK_ENABLE)
226 return -EINVAL;
227
228 *res = 1;
229
230 return 0;
231}
232
233int mtk_pinconf_bias_set(struct mtk_pinctrl *hw,
234 const struct mtk_pin_desc *desc, bool pullup)
235{
236 int err, arg;
237
238 arg = pullup ? 1 : 2;
239
240 err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PU, arg & 1);
241 if (err)
242 return err;
243
244 err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PD,
245 !!(arg & 2));
246 if (err)
247 return err;
248
249 return 0;
250}
251
252int mtk_pinconf_bias_get(struct mtk_pinctrl *hw,
253 const struct mtk_pin_desc *desc, bool pullup, int *res)
254{
255 int reg, err, v;
256
257 reg = pullup ? PINCTRL_PIN_REG_PU : PINCTRL_PIN_REG_PD;
258
259 err = mtk_hw_get_value(hw, desc->number, reg, &v);
260 if (err)
261 return err;
262
263 if (!v)
264 return -EINVAL;
265
266 *res = 1;
267
268 return 0;
269}
270
193/* Revision 0 */ 271/* Revision 0 */
194int mtk_pinconf_drive_set(struct mtk_pinctrl *hw, 272int mtk_pinconf_drive_set(struct mtk_pinctrl *hw,
195 const struct mtk_pin_desc *desc, u32 arg) 273 const struct mtk_pin_desc *desc, u32 arg)
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h
index cbc9a720d516..3a55ef70e01b 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h
@@ -150,6 +150,15 @@ struct mtk_pin_soc {
150 u8 eint_m; 150 u8 eint_m;
151 151
152 /* Specific pinconfig operations */ 152 /* Specific pinconfig operations */
153 int (*bias_disable_set)(struct mtk_pinctrl *hw,
154 const struct mtk_pin_desc *desc);
155 int (*bias_disable_get)(struct mtk_pinctrl *hw,
156 const struct mtk_pin_desc *desc, int *res);
157 int (*bias_set)(struct mtk_pinctrl *hw,
158 const struct mtk_pin_desc *desc, bool pullup);
159 int (*bias_get)(struct mtk_pinctrl *hw,
160 const struct mtk_pin_desc *desc, bool pullup, int *res);
161
153 int (*drive_set)(struct mtk_pinctrl *hw, 162 int (*drive_set)(struct mtk_pinctrl *hw,
154 const struct mtk_pin_desc *desc, u32 arg); 163 const struct mtk_pin_desc *desc, u32 arg);
155 int (*drive_get)(struct mtk_pinctrl *hw, 164 int (*drive_get)(struct mtk_pinctrl *hw,
@@ -170,6 +179,16 @@ void mtk_rmw(struct mtk_pinctrl *pctl, u32 reg, u32 mask, u32 set);
170int mtk_hw_set_value(struct mtk_pinctrl *hw, int pin, int field, int value); 179int mtk_hw_set_value(struct mtk_pinctrl *hw, int pin, int field, int value);
171int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field, int *value); 180int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field, int *value);
172 181
182int mtk_pinconf_bias_disable_set(struct mtk_pinctrl *hw,
183 const struct mtk_pin_desc *desc);
184int mtk_pinconf_bias_disable_get(struct mtk_pinctrl *hw,
185 const struct mtk_pin_desc *desc, int *res);
186int mtk_pinconf_bias_set(struct mtk_pinctrl *hw,
187 const struct mtk_pin_desc *desc, bool pullup);
188int mtk_pinconf_bias_get(struct mtk_pinctrl *hw,
189 const struct mtk_pin_desc *desc, bool pullup,
190 int *res);
191
173int mtk_pinconf_drive_set(struct mtk_pinctrl *hw, 192int mtk_pinconf_drive_set(struct mtk_pinctrl *hw,
174 const struct mtk_pin_desc *desc, u32 arg); 193 const struct mtk_pin_desc *desc, u32 arg);
175int mtk_pinconf_drive_get(struct mtk_pinctrl *hw, 194int mtk_pinconf_drive_get(struct mtk_pinctrl *hw,