Commit 6773f334 authored by Teresa Zepeda Ventura's avatar Teresa Zepeda Ventura Committed by Henrik Brix Andersen
Browse files

drivers: spi: gecko: add new driver for SPI communication via EUSART



Added a new driver to support SPI communication via EUSART. Since the
Silabs EFR32MG24 family SoCs have only one USART, EUSART support is
necessary for implementing SPI functionality.

Signed-off-by: default avatarTeresa Zepeda Ventura <teresa.zvent@gmail.com>
parent 33594595
Loading
Loading
Loading
Loading
+53 −2
Original line number Diff line number Diff line
@@ -24,6 +24,11 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
	(void)base;
#endif /*USART_COUNT > 1*/

#ifdef CONFIG_SPI_GECKO_EUSART
	EUSART_TypeDef *ebase = (EUSART_TypeDef *)reg;
	int eusart_num = EUSART_NUM(ebase);
#endif

#endif

#ifdef CONFIG_I2C_GECKO
@@ -171,7 +176,53 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
#endif /* CONFIG_SOC_FAMILY_SILABS_S1 */
#endif /* CONFIG_UART_GECKO */

#ifdef CONFIG_SPI_GECKO
#ifdef CONFIG_SPI_GECKO_EUSART
		case GECKO_FUN_SPI_SCK:
			pin_config.mode = gpioModePushPull;
			pin_config.out = 1;
			GPIO->EUSARTROUTE[eusart_num].SCLKROUTE =
				(pin_config.port << _GPIO_EUSART_SCLKROUTE_PORT_SHIFT) |
				(pin_config.pin << _GPIO_EUSART_SCLKROUTE_PIN_SHIFT);
			GPIO->EUSARTROUTE[eusart_num].ROUTEEN |= GPIO_EUSART_ROUTEEN_SCLKPEN;
			GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
					pin_config.out);
			break;

		case GECKO_FUN_SPI_CSN:
			pin_config.mode = gpioModePushPull;
			pin_config.out = 1;
			GPIO->EUSARTROUTE[eusart_num].CSROUTE =
				(pin_config.port << _GPIO_EUSART_CSROUTE_PORT_SHIFT) |
				(pin_config.pin << _GPIO_EUSART_CSROUTE_PIN_SHIFT);
			GPIO->EUSARTROUTE[eusart_num].ROUTEEN |= GPIO_EUSART_ROUTEEN_CSPEN;
			GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
					pin_config.out);
			break;

		case GECKO_FUN_SPI_MOSI:
			pin_config.mode = gpioModePushPull;
			pin_config.out = 1;
			GPIO->EUSARTROUTE[eusart_num].TXROUTE =
				(pin_config.port << _GPIO_EUSART_TXROUTE_PORT_SHIFT) |
				(pin_config.pin << _GPIO_EUSART_TXROUTE_PIN_SHIFT);
			GPIO->EUSARTROUTE[eusart_num].ROUTEEN |= GPIO_EUSART_ROUTEEN_TXPEN;
			GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
					pin_config.out);
			break;

		case GECKO_FUN_SPI_MISO:
			pin_config.mode = gpioModeInput;
			pin_config.out = 1;
			GPIO->EUSARTROUTE[eusart_num].RXROUTE =
				(pin_config.port << _GPIO_EUSART_RXROUTE_PORT_SHIFT) |
				(pin_config.pin << _GPIO_EUSART_RXROUTE_PIN_SHIFT);
			GPIO->EUSARTROUTE[EUSART_NUM(EUSART1)].ROUTEEN |= GPIO_EUSART_ROUTEEN_RXPEN;
			GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
					pin_config.out);
			break;
#endif /*CONFIG_SPI_GECKO_EUSART*/

#ifdef CONFIG_SPI_GECKO_USART
#ifdef CONFIG_SOC_FAMILY_SILABS_S1
		case GECKO_FUN_SPIM_SCK:
			pin_config.mode = gpioModePushPull;
@@ -287,7 +338,7 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
					pin_config.out);
			break;
#endif /* CONFIG_SOC_FAMILY_SILABS_S1 */
#endif /* CONFIG_SPI_GECKO */
#endif /* CONFIG_SPI_GECKO_USART */

#ifdef CONFIG_I2C_GECKO
		case GECKO_FUN_I2C_SDA:
+2 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ zephyr_library_sources_ifdef(CONFIG_SPI_LITEX spi_litex.c)
zephyr_library_sources_ifdef(CONFIG_SPI_LITEX_LITESPI	spi_litex_litespi.c)
zephyr_library_sources_ifdef(CONFIG_SPI_OC_SIMPLE	spi_oc_simple.c)
zephyr_library_sources_ifdef(CONFIG_SPI_XEC_QMSPI	spi_xec_qmspi.c)
zephyr_library_sources_ifdef(CONFIG_SPI_GECKO		spi_gecko.c)
zephyr_library_sources_ifdef(CONFIG_SPI_GECKO_USART		spi_gecko_usart.c)
zephyr_library_sources_ifdef(CONFIG_SPI_GECKO_EUSART	spi_gecko_eusart.c)
zephyr_library_sources_ifdef(CONFIG_SPI_XLNX_AXI_QUADSPI spi_xlnx_axi_quadspi.c)
zephyr_library_sources_ifdef(CONFIG_ESP32_SPIM		spi_esp32_spim.c)
zephyr_library_sources_ifdef(CONFIG_SPI_TEST		spi_test.c)
+3 −1
Original line number Diff line number Diff line
@@ -111,7 +111,9 @@ source "drivers/spi/Kconfig.oc_simple"

source "drivers/spi/Kconfig.xec_qmspi"

source "drivers/spi/Kconfig.gecko"
source "drivers/spi/Kconfig.gecko_usart"

source "drivers/spi/Kconfig.gecko_eusart"

source "drivers/spi/Kconfig.xlnx"

+13 −0
Original line number Diff line number Diff line
# Gecko SPI configuration option

# Copyright (c) 2024 Daikin Comfort Technologies North America, Inc.
# SPDX-License-Identifier: Apache-2.0

config SPI_GECKO_EUSART
	bool "Gecko EUSART SPI controller driver"
	default y
	depends on DT_HAS_SILABS_GECKO_SPI_EUSART_ENABLED
	depends on GPIO
	select SOC_GECKO_EUSART
	help
	  Enable the EUSART SPI peripherals on Gecko
+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
# Copyright (c) 2019 Christian Taedcke <hacking@taedcke.com>
# SPDX-License-Identifier: Apache-2.0

config SPI_GECKO
config SPI_GECKO_USART
	bool "Gecko SPI controller driver"
	default y
	depends on DT_HAS_SILABS_GECKO_SPI_USART_ENABLED
Loading