Skip to content

Commit 04931a5

Browse files
ArunmaniAlagarsamy2710nashif
authored andcommitted
drivers: pinctrl: pinctrl_gecko: Add support for using pinctrl api
This update integrates I2C support with the pinctrl_configure_pins api within the pinctrl_gecko driver. Signed-off-by: Arunmani Alagarsamy <[email protected]>
1 parent 919baf8 commit 04931a5

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

drivers/pinctrl/pinctrl_gecko.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
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
}

include/zephyr/dt-bindings/pinctrl/gecko-pinctrl-s1.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@
8585
#define GECKO_FUN_SPI_CS_LOC 20U
8686
#define GECKO_FUN_SPI_SCK_LOC 21U
8787

88+
#define GECKO_FUN_I2C_SDA 22U
89+
#define GECKO_FUN_I2C_SCL 23U
90+
#define GECKO_FUN_I2C_SDA_LOC 24U
91+
#define GECKO_FUN_I2C_SCL_LOC 25U
92+
8893

8994
/** @} */
9095

include/zephyr/dt-bindings/pinctrl/gecko-pinctrl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@
6666
#define GECKO_FUN_SPI_CSN 7U
6767
#define GECKO_FUN_SPI_SCK 8U
6868

69+
#define GECKO_FUN_I2C_SDA 9U
70+
#define GECKO_FUN_I2C_SCL 10U
71+
#define GECKO_FUN_I2C_SDA_LOC 11U
72+
#define GECKO_FUN_I2C_SCL_LOC 12U
73+
6974
/** @} */
7075

7176
/**

0 commit comments

Comments
 (0)