Skip to content

Commit 35d95f9

Browse files
asmellbynashif
authored andcommitted
drivers: pinctrl: gecko: Fix Series 2 I2C location config
Series 2 uses DBUS for alternate function control, which directly uses port and pin numbers for location selection. Configure pinout as part of the I2C_SDA/I2C_SCL case, rather than the separate _LOC case, as the port and pin are not available at this point. Configure route register prior to enabling the route, to ensure that the wrong pin is not temporarily claimed. Fixes an issue where DBUS was always configured to port A and pin given by the GECKO_LOC() macro, rather than the correct port/pin pair. Signed-off-by: Aksel Skauge Mellbye <[email protected]>
1 parent a9efb1d commit 35d95f9

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

drivers/pinctrl/pinctrl_gecko.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -289,26 +289,34 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
289289
GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
290290
pin_config.out);
291291

292+
#if defined(GPIO_I2C_ROUTEEN_SDAPEN)
293+
GPIO->I2CROUTE[I2C_NUM(i2c_base)].SDAROUTE =
294+
(pin_config.pin << _GPIO_I2C_SDAROUTE_PIN_SHIFT) |
295+
(pin_config.port << _GPIO_I2C_SDAROUTE_PORT_SHIFT);
296+
GPIO->I2CROUTE[I2C_NUM(i2c_base)].ROUTEEN |= GPIO_I2C_ROUTEEN_SDAPEN;
297+
#endif
292298
break;
293299

294300
case GECKO_FUN_I2C_SCL:
295301
pin_config.mode = gpioModeWiredAnd;
296302
pin_config.out = 1;
297303
GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
298304
pin_config.out);
305+
306+
#if defined(GPIO_I2C_ROUTEEN_SCLPEN)
307+
GPIO->I2CROUTE[I2C_NUM(i2c_base)].SCLROUTE =
308+
(pin_config.pin << _GPIO_I2C_SCLROUTE_PIN_SHIFT) |
309+
(pin_config.port << _GPIO_I2C_SCLROUTE_PORT_SHIFT);
310+
GPIO->I2CROUTE[I2C_NUM(i2c_base)].ROUTEEN |= GPIO_I2C_ROUTEEN_SCLPEN;
311+
#endif
299312
break;
300313

301314
case GECKO_FUN_I2C_SDA_LOC:
302315
#ifdef CONFIG_SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION
303316
i2c_base->ROUTEPEN |= I2C_ROUTEPEN_SDAPEN;
304317
i2c_base->ROUTELOC0 &= ~_I2C_ROUTELOC0_SDALOC_MASK;
305318
i2c_base->ROUTELOC0 |= (loc << _I2C_ROUTELOC0_SDALOC_SHIFT);
306-
#elif defined(GPIO_I2C_ROUTEEN_SCLPEN) && defined(GPIO_I2C_ROUTEEN_SDAPEN)
307-
GPIO->I2CROUTE[I2C_NUM(i2c_base)].ROUTEEN |= GPIO_I2C_ROUTEEN_SDAPEN;
308-
GPIO->I2CROUTE[I2C_NUM(i2c_base)].SDAROUTE =
309-
(pin_config.pin << _GPIO_I2C_SDAROUTE_PIN_SHIFT) |
310-
(pin_config.port << _GPIO_I2C_SDAROUTE_PORT_SHIFT);
311-
#else
319+
#elif defined(I2C_ROUTE_SDAPEN)
312320
i2c_base->ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << 8);
313321
#endif
314322
break;
@@ -318,12 +326,7 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
318326
i2c_base->ROUTEPEN |= I2C_ROUTEPEN_SCLPEN;
319327
i2c_base->ROUTELOC0 &= ~_I2C_ROUTEPEN_SCLPEN_MASK;
320328
i2c_base->ROUTELOC0 |= (loc << _I2C_ROUTELOC0_SCLLOC_SHIFT);
321-
#elif defined(GPIO_I2C_ROUTEEN_SCLPEN) && defined(GPIO_I2C_ROUTEEN_SDAPEN)
322-
GPIO->I2CROUTE[I2C_NUM(i2c_base)].ROUTEEN |= GPIO_I2C_ROUTEEN_SCLPEN;
323-
GPIO->I2CROUTE[I2C_NUM(i2c_base)].SCLROUTE =
324-
(pin_config.pin << _GPIO_I2C_SCLROUTE_PIN_SHIFT) |
325-
(pin_config.port << _GPIO_I2C_SCLROUTE_PORT_SHIFT);
326-
#else
329+
#elif defined(I2C_ROUTE_SCLPEN)
327330
i2c_base->ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << 8);
328331
#endif
329332
break;

0 commit comments

Comments
 (0)