11/*
22 * Copyright (c) 2023 Silicon Labs
3+ * Copyright (c) 2024 Capgemini
34 *
45 * SPDX-License-Identifier: Apache-2.0
56 */
@@ -18,6 +19,10 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
1819 int usart_num = USART_NUM (base );
1920#endif
2021
22+ #ifdef CONFIG_I2C_GECKO
23+ I2C_TypeDef * i2c_base = (I2C_TypeDef * )reg ;
24+ #endif
25+
2126#ifdef CONFIG_UART_GECKO
2227 struct soc_gpio_pin rxpin = {0 , 0 , 0 , 0 };
2328 struct soc_gpio_pin txpin = {0 , 0 , 0 , 0 };
@@ -277,6 +282,54 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
277282#endif /* CONFIG_SOC_FAMILY_SILABS_S1 */
278283#endif /* CONFIG_SPI_GECKO */
279284
285+ #ifdef CONFIG_I2C_GECKO
286+ case GECKO_FUN_I2C_SDA :
287+ pin_config .mode = gpioModeWiredAnd ;
288+ pin_config .out = 1 ;
289+ GPIO_PinModeSet (pin_config .port , pin_config .pin , pin_config .mode ,
290+ pin_config .out );
291+
292+ break ;
293+
294+ case GECKO_FUN_I2C_SCL :
295+ pin_config .mode = gpioModeWiredAnd ;
296+ pin_config .out = 1 ;
297+ GPIO_PinModeSet (pin_config .port , pin_config .pin , pin_config .mode ,
298+ pin_config .out );
299+ break ;
300+
301+ case GECKO_FUN_I2C_SDA_LOC :
302+ #ifdef CONFIG_SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION
303+ i2c_base -> ROUTEPEN |= I2C_ROUTEPEN_SDAPEN ;
304+ i2c_base -> ROUTELOC0 &= ~_I2C_ROUTELOC0_SDALOC_MASK ;
305+ 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
312+ i2c_base -> ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << 8 );
313+ #endif
314+ break ;
315+
316+ case GECKO_FUN_I2C_SCL_LOC :
317+ #ifdef CONFIG_SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION
318+ i2c_base -> ROUTEPEN |= I2C_ROUTEPEN_SCLPEN ;
319+ i2c_base -> ROUTELOC0 &= ~_I2C_ROUTEPEN_SCLPEN_MASK ;
320+ 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
327+ i2c_base -> ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << 8 );
328+ #endif
329+ break ;
330+
331+ #endif /* CONFIG_I2C_GECKO */
332+
280333 default :
281334 return - ENOTSUP ;
282335 }
0 commit comments