| /* |
| * Copyright (c) 2019 Interay Solutions B.V. |
| * Copyright (c) 2019 Oane Kingma |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/init.h> |
| #include "board.h" |
| #include <zephyr/drivers/gpio.h> |
| #include <zephyr/sys/printk.h> |
| #include "em_cmu.h" |
| |
| static int efm32gg_stk3701a_init(void) |
| { |
| const struct device *cur_dev; |
| |
| |
| /* Enable the board controller to be able to use the serial port */ |
| cur_dev = DEVICE_DT_GET(BC_ENABLE_GPIO_NODE); |
| if (!device_is_ready(cur_dev)) { |
| printk("Board controller gpio port is not ready!\n"); |
| return -ENODEV; |
| } |
| |
| gpio_pin_configure(cur_dev, BC_ENABLE_GPIO_PIN, GPIO_OUTPUT); |
| gpio_pin_set(cur_dev, BC_ENABLE_GPIO_PIN, 1); |
| |
| #ifdef CONFIG_ETH_GECKO |
| /* Enable the ethernet PHY power */ |
| cur_dev = DEVICE_DT_GET(ETH_PWR_ENABLE_GPIO_NODE); |
| if (!device_is_ready(cur_dev)) { |
| printk("Ethernet PHY power gpio port is not ready!\n"); |
| return -ENODEV; |
| } |
| |
| gpio_pin_configure(cur_dev, ETH_PWR_ENABLE_GPIO_PIN, GPIO_OUTPUT); |
| gpio_pin_set(cur_dev, ETH_PWR_ENABLE_GPIO_PIN, 1); |
| |
| /* Configure ethernet reference clock */ |
| cur_dev = DEVICE_DT_GET(ETH_REF_CLK_GPIO_NODE); |
| if (!device_is_ready(cur_dev)) { |
| printk("Ethernet reference clock gpio port is not ready!\n"); |
| return -ENODEV; |
| } |
| |
| gpio_pin_configure(cur_dev, ETH_REF_CLK_GPIO_PIN, GPIO_OUTPUT); |
| gpio_pin_set(cur_dev, ETH_REF_CLK_GPIO_PIN, 0); |
| |
| CMU_OscillatorEnable(cmuOsc_HFXO, true, true); |
| |
| /* enable CMU_CLK2 as RMII reference clock */ |
| CMU->CTRL |= CMU_CTRL_CLKOUTSEL2_HFXO; |
| CMU->ROUTELOC0 = (CMU->ROUTELOC0 & ~_CMU_ROUTELOC0_CLKOUT2LOC_MASK) | |
| (ETH_REF_CLK_LOCATION << _CMU_ROUTELOC0_CLKOUT2LOC_SHIFT); |
| CMU->ROUTEPEN |= CMU_ROUTEPEN_CLKOUT2PEN; |
| |
| /* Release the ethernet PHY reset */ |
| cur_dev = DEVICE_DT_GET(ETH_RESET_GPIO_NODE); |
| if (!device_is_ready(cur_dev)) { |
| printk("Ethernet PHY reset gpio port is not ready!\n"); |
| return -ENODEV; |
| } |
| |
| gpio_pin_configure(cur_dev, ETH_RESET_GPIO_PIN, GPIO_OUTPUT); |
| gpio_pin_set(cur_dev, ETH_RESET_GPIO_PIN, 1); |
| #endif /* CONFIG_ETH_GECKO */ |
| |
| return 0; |
| } |
| |
| /* needs to be done after GPIO driver init */ |
| SYS_INIT(efm32gg_stk3701a_init, POST_KERNEL, |
| CONFIG_KERNEL_INIT_PRIORITY_DEVICE); |