@@ -86,7 +86,8 @@ BUILD_ASSERT(((NRF_DRIVE_S0S1 == NRF_GPIO_PIN_S0S1) &&
86
86
*/
87
87
__unused static void nrf_pin_configure (pinctrl_soc_pin_t pin ,
88
88
nrf_gpio_pin_dir_t dir ,
89
- nrf_gpio_pin_input_t input )
89
+ nrf_gpio_pin_input_t input ,
90
+ nrf_gpio_pin_drive_t drive )
90
91
{
91
92
/* force input direction and disconnected buffer for low power */
92
93
if (NRF_GET_LP (pin ) == NRF_LP_ENABLE ) {
@@ -102,136 +103,150 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt,
102
103
uintptr_t reg )
103
104
{
104
105
for (uint8_t i = 0U ; i < pin_cnt ; i ++ ) {
106
+ __unused nrf_gpio_pin_drive_t drive = NRF_GET_DRIVE (pins [i ]);
107
+
105
108
switch (NRF_GET_FUN (pins [i ])) {
106
109
#if defined(NRF_PSEL_UART )
107
110
case NRF_FUN_UART_TX :
108
111
NRF_PSEL_UART (reg , TXD ) = NRF_GET_PIN (pins [i ]);
109
112
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 1 );
110
113
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
111
- NRF_GPIO_PIN_INPUT_DISCONNECT );
114
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
112
115
break ;
113
116
case NRF_FUN_UART_RX :
114
117
NRF_PSEL_UART (reg , RXD ) = NRF_GET_PIN (pins [i ]);
115
118
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
116
- NRF_GPIO_PIN_INPUT_CONNECT );
119
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
117
120
break ;
118
121
case NRF_FUN_UART_RTS :
119
122
NRF_PSEL_UART (reg , RTS ) = NRF_GET_PIN (pins [i ]);
120
123
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 1 );
121
124
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
122
- NRF_GPIO_PIN_INPUT_DISCONNECT );
125
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
123
126
break ;
124
127
case NRF_FUN_UART_CTS :
125
128
NRF_PSEL_UART (reg , CTS ) = NRF_GET_PIN (pins [i ]);
126
129
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
127
- NRF_GPIO_PIN_INPUT_CONNECT );
130
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
128
131
break ;
129
132
#endif /* defined(NRF_PSEL_UART) */
130
133
#if defined(NRF_PSEL_SPIM )
131
134
case NRF_FUN_SPIM_SCK :
132
135
NRF_PSEL_SPIM (reg , SCK ) = NRF_GET_PIN (pins [i ]);
133
136
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
134
137
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
135
- NRF_GPIO_PIN_INPUT_CONNECT );
138
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
136
139
break ;
137
140
case NRF_FUN_SPIM_MOSI :
138
141
NRF_PSEL_SPIM (reg , MOSI ) = NRF_GET_PIN (pins [i ]);
139
142
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
140
143
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
141
- NRF_GPIO_PIN_INPUT_DISCONNECT );
144
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
142
145
break ;
143
146
case NRF_FUN_SPIM_MISO :
144
147
NRF_PSEL_SPIM (reg , MISO ) = NRF_GET_PIN (pins [i ]);
145
148
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
146
- NRF_GPIO_PIN_INPUT_CONNECT );
149
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
147
150
break ;
148
151
#endif /* defined(NRF_PSEL_SPIM) */
149
152
#if defined(NRF_PSEL_SPIS )
150
153
case NRF_FUN_SPIS_SCK :
151
154
NRF_PSEL_SPIS (reg , SCK ) = NRF_GET_PIN (pins [i ]);
152
155
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
153
- NRF_GPIO_PIN_INPUT_CONNECT );
156
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
154
157
break ;
155
158
case NRF_FUN_SPIS_MOSI :
156
159
NRF_PSEL_SPIS (reg , MOSI ) = NRF_GET_PIN (pins [i ]);
157
160
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
158
- NRF_GPIO_PIN_INPUT_CONNECT );
161
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
159
162
break ;
160
163
case NRF_FUN_SPIS_MISO :
161
164
NRF_PSEL_SPIS (reg , MISO ) = NRF_GET_PIN (pins [i ]);
162
165
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
163
- NRF_GPIO_PIN_INPUT_DISCONNECT );
166
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
164
167
break ;
165
168
case NRF_FUN_SPIS_CSN :
166
169
NRF_PSEL_SPIS (reg , CSN ) = NRF_GET_PIN (pins [i ]);
167
170
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
168
- NRF_GPIO_PIN_INPUT_CONNECT );
171
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
169
172
break ;
170
173
#endif /* defined(NRF_PSEL_SPIS) */
171
174
#if defined(NRF_PSEL_TWIM )
172
175
case NRF_FUN_TWIM_SCL :
173
176
NRF_PSEL_TWIM (reg , SCL ) = NRF_GET_PIN (pins [i ]);
177
+ if (drive == NRF_DRIVE_S0S1 ) {
178
+ /* Override the default drive setting with one
179
+ * suitable for TWI/TWIM peripherals (S0D1).
180
+ * This drive cannot be used always so that
181
+ * users are able to select e.g. H0D1 or E0E1
182
+ * in devicetree.
183
+ */
184
+ drive = NRF_DRIVE_S0D1 ;
185
+ }
174
186
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
175
- NRF_GPIO_PIN_INPUT_CONNECT );
187
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
176
188
break ;
177
189
case NRF_FUN_TWIM_SDA :
178
190
NRF_PSEL_TWIM (reg , SDA ) = NRF_GET_PIN (pins [i ]);
191
+ if (drive == NRF_DRIVE_S0S1 ) {
192
+ drive = NRF_DRIVE_S0D1 ;
193
+ }
179
194
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
180
- NRF_GPIO_PIN_INPUT_CONNECT );
195
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
181
196
break ;
182
197
#endif /* defined(NRF_PSEL_TWIM) */
183
198
#if defined(NRF_PSEL_I2S )
184
199
case NRF_FUN_I2S_SCK_M :
185
200
NRF_PSEL_I2S (reg , SCK ) = NRF_GET_PIN (pins [i ]);
186
201
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
187
202
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
188
- NRF_GPIO_PIN_INPUT_DISCONNECT );
203
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
189
204
break ;
190
205
case NRF_FUN_I2S_SCK_S :
191
206
NRF_PSEL_I2S (reg , SCK ) = NRF_GET_PIN (pins [i ]);
192
207
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
193
- NRF_GPIO_PIN_INPUT_CONNECT );
208
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
194
209
break ;
195
210
case NRF_FUN_I2S_LRCK_M :
196
211
NRF_PSEL_I2S (reg , LRCK ) = NRF_GET_PIN (pins [i ]);
197
212
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
198
213
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
199
- NRF_GPIO_PIN_INPUT_DISCONNECT );
214
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
200
215
break ;
201
216
case NRF_FUN_I2S_LRCK_S :
202
217
NRF_PSEL_I2S (reg , LRCK ) = NRF_GET_PIN (pins [i ]);
203
218
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
204
- NRF_GPIO_PIN_INPUT_CONNECT );
219
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
205
220
break ;
206
221
case NRF_FUN_I2S_SDIN :
207
222
NRF_PSEL_I2S (reg , SDIN ) = NRF_GET_PIN (pins [i ]);
208
223
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
209
- NRF_GPIO_PIN_INPUT_CONNECT );
224
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
210
225
break ;
211
226
case NRF_FUN_I2S_SDOUT :
212
227
NRF_PSEL_I2S (reg , SDOUT ) = NRF_GET_PIN (pins [i ]);
213
228
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
214
229
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
215
- NRF_GPIO_PIN_INPUT_DISCONNECT );
230
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
216
231
break ;
217
232
case NRF_FUN_I2S_MCK :
218
233
NRF_PSEL_I2S (reg , MCK ) = NRF_GET_PIN (pins [i ]);
219
234
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
220
235
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
221
- NRF_GPIO_PIN_INPUT_DISCONNECT );
236
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
222
237
break ;
223
238
#endif /* defined(NRF_PSEL_I2S) */
224
239
#if defined(NRF_PSEL_PDM )
225
240
case NRF_FUN_PDM_CLK :
226
241
NRF_PSEL_PDM (reg , CLK ) = NRF_GET_PIN (pins [i ]);
227
242
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]), 0 );
228
243
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
229
- NRF_GPIO_PIN_INPUT_DISCONNECT );
244
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
230
245
break ;
231
246
case NRF_FUN_PDM_DIN :
232
247
NRF_PSEL_PDM (reg , DIN ) = NRF_GET_PIN (pins [i ]);
233
248
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
234
- NRF_GPIO_PIN_INPUT_CONNECT );
249
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
235
250
break ;
236
251
#endif /* defined(NRF_PSEL_PDM) */
237
252
#if defined(NRF_PSEL_PWM )
@@ -240,77 +255,77 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt,
240
255
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]),
241
256
NRF_GET_INVERT (pins [i ]));
242
257
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
243
- NRF_GPIO_PIN_INPUT_DISCONNECT );
258
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
244
259
break ;
245
260
case NRF_FUN_PWM_OUT1 :
246
261
NRF_PSEL_PWM (reg , OUT [1 ]) = NRF_GET_PIN (pins [i ]);
247
262
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]),
248
263
NRF_GET_INVERT (pins [i ]));
249
264
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
250
- NRF_GPIO_PIN_INPUT_DISCONNECT );
265
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
251
266
break ;
252
267
case NRF_FUN_PWM_OUT2 :
253
268
NRF_PSEL_PWM (reg , OUT [2 ]) = NRF_GET_PIN (pins [i ]);
254
269
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]),
255
270
NRF_GET_INVERT (pins [i ]));
256
271
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
257
- NRF_GPIO_PIN_INPUT_DISCONNECT );
272
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
258
273
break ;
259
274
case NRF_FUN_PWM_OUT3 :
260
275
NRF_PSEL_PWM (reg , OUT [3 ]) = NRF_GET_PIN (pins [i ]);
261
276
nrf_gpio_pin_write (NRF_GET_PIN (pins [i ]),
262
277
NRF_GET_INVERT (pins [i ]));
263
278
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_OUTPUT ,
264
- NRF_GPIO_PIN_INPUT_DISCONNECT );
279
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
265
280
break ;
266
281
#endif /* defined(NRF_PSEL_PWM) */
267
282
#if defined(NRF_PSEL_QDEC )
268
283
case NRF_FUN_QDEC_A :
269
284
NRF_PSEL_QDEC (reg , A ) = NRF_GET_PIN (pins [i ]);
270
285
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
271
- NRF_GPIO_PIN_INPUT_CONNECT );
286
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
272
287
break ;
273
288
case NRF_FUN_QDEC_B :
274
289
NRF_PSEL_QDEC (reg , B ) = NRF_GET_PIN (pins [i ]);
275
290
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
276
- NRF_GPIO_PIN_INPUT_CONNECT );
291
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
277
292
break ;
278
293
case NRF_FUN_QDEC_LED :
279
294
NRF_PSEL_QDEC (reg , LED ) = NRF_GET_PIN (pins [i ]);
280
295
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
281
- NRF_GPIO_PIN_INPUT_CONNECT );
296
+ NRF_GPIO_PIN_INPUT_CONNECT , drive );
282
297
break ;
283
298
#endif /* defined(NRF_PSEL_QDEC) */
284
299
#if defined(NRF_PSEL_QSPI )
285
300
case NRF_FUN_QSPI_SCK :
286
301
NRF_PSEL_QSPI (reg , SCK ) = NRF_GET_PIN (pins [i ]);
287
302
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
288
- NRF_GPIO_PIN_INPUT_DISCONNECT );
303
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
289
304
break ;
290
305
case NRF_FUN_QSPI_CSN :
291
306
NRF_PSEL_QSPI (reg , CSN ) = NRF_GET_PIN (pins [i ]);
292
307
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
293
- NRF_GPIO_PIN_INPUT_DISCONNECT );
308
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
294
309
break ;
295
310
case NRF_FUN_QSPI_IO0 :
296
311
NRF_PSEL_QSPI (reg , IO0 ) = NRF_GET_PIN (pins [i ]);
297
312
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
298
- NRF_GPIO_PIN_INPUT_DISCONNECT );
313
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
299
314
break ;
300
315
case NRF_FUN_QSPI_IO1 :
301
316
NRF_PSEL_QSPI (reg , IO1 ) = NRF_GET_PIN (pins [i ]);
302
317
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
303
- NRF_GPIO_PIN_INPUT_DISCONNECT );
318
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
304
319
break ;
305
320
case NRF_FUN_QSPI_IO2 :
306
321
NRF_PSEL_QSPI (reg , IO2 ) = NRF_GET_PIN (pins [i ]);
307
322
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
308
- NRF_GPIO_PIN_INPUT_DISCONNECT );
323
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
309
324
break ;
310
325
case NRF_FUN_QSPI_IO3 :
311
326
NRF_PSEL_QSPI (reg , IO3 ) = NRF_GET_PIN (pins [i ]);
312
327
nrf_pin_configure (pins [i ], NRF_GPIO_PIN_DIR_INPUT ,
313
- NRF_GPIO_PIN_INPUT_DISCONNECT );
328
+ NRF_GPIO_PIN_INPUT_DISCONNECT , drive );
314
329
break ;
315
330
#endif /* defined(NRF_PSEL_QSPI) */
316
331
default :
0 commit comments