diff --git a/drivers/ieee802154/ieee802154_cc2520.c b/drivers/ieee802154/ieee802154_cc2520.c index 14adacec4e1..19d040d6c57 100644 --- a/drivers/ieee802154/ieee802154_cc2520.c +++ b/drivers/ieee802154/ieee802154_cc2520.c @@ -354,24 +354,24 @@ static inline void set_reset(struct device *dev, u32_t value) { struct cc2520_context *cc2520 = dev->driver_data; - gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_RESET].dev, - cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, value); + gpio_pin_set_raw(cc2520->gpios[CC2520_GPIO_IDX_RESET].dev, + cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, value); } static inline void set_vreg_en(struct device *dev, u32_t value) { struct cc2520_context *cc2520 = dev->driver_data; - gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev, - cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, value); + gpio_pin_set_raw(cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev, + cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, value); } static inline u32_t get_fifo(struct cc2520_context *cc2520) { u32_t pin_value; - gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin, &pin_value); + pin_value = gpio_pin_get_raw(cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev, + cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin); return pin_value; } @@ -380,8 +380,8 @@ static inline u32_t get_fifop(struct cc2520_context *cc2520) { u32_t pin_value; - gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, &pin_value); + pin_value = gpio_pin_get_raw(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin); return pin_value; } @@ -390,8 +390,8 @@ static inline u32_t get_cca(struct cc2520_context *cc2520) { u32_t pin_value; - gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_CCA].dev, - cc2520->gpios[CC2520_GPIO_IDX_CCA].pin, &pin_value); + pin_value = gpio_pin_get_raw(cc2520->gpios[CC2520_GPIO_IDX_CCA].dev, + cc2520->gpios[CC2520_GPIO_IDX_CCA].pin); return pin_value; } @@ -429,29 +429,19 @@ static inline void fifop_int_handler(struct device *port, static void enable_fifop_interrupt(struct cc2520_context *cc2520, bool enable) { - if (enable) { - gpio_pin_enable_callback( - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin); - } else { - gpio_pin_disable_callback( - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, - cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin); - } + gpio_pin_interrupt_configure( + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev, + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, + enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE); } static void enable_sfd_interrupt(struct cc2520_context *cc2520, bool enable) { - if (enable) { - gpio_pin_enable_callback( - cc2520->gpios[CC2520_GPIO_IDX_SFD].dev, - cc2520->gpios[CC2520_GPIO_IDX_SFD].pin); - } else { - gpio_pin_disable_callback( - cc2520->gpios[CC2520_GPIO_IDX_SFD].dev, - cc2520->gpios[CC2520_GPIO_IDX_SFD].pin); - } + gpio_pin_interrupt_configure( + cc2520->gpios[CC2520_GPIO_IDX_SFD].dev, + cc2520->gpios[CC2520_GPIO_IDX_SFD].pin, + enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE); } static inline void setup_gpio_callbacks(struct device *dev) @@ -973,6 +963,81 @@ static int power_on_and_setup(struct device *dev) return 0; } +static struct cc2520_gpio_configuration *configure_gpios(struct device *dev) +{ + struct cc2520_context *cc2520 = dev->driver_data; + struct device *gpio; + + /* VREG_EN */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_VREG_EN_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin = DT_INST_0_TI_CC2520_VREG_EN_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, + GPIO_OUTPUT_LOW | DT_INST_0_TI_CC2520_VREG_EN_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev = gpio; + + /* RESET */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_RESET_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_RESET].pin = DT_INST_0_TI_CC2520_RESET_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, + GPIO_OUTPUT_LOW | DT_INST_0_TI_CC2520_RESET_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_RESET].dev = gpio; + + /*FIFO */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_FIFO_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin = DT_INST_0_TI_CC2520_FIFO_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_FIFO_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev = gpio; + + /* CCA */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_CCA_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_CCA].pin = DT_INST_0_TI_CC2520_CCA_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_CCA].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_CCA_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_CCA].dev = gpio; + + /* SFD */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_SFD_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_SFD].pin = DT_INST_0_TI_CC2520_SFD_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_SFD].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_SFD_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_SFD].dev = gpio; + + /* FIFOP */ + gpio = device_get_binding(DT_INST_0_TI_CC2520_FIFOP_GPIOS_CONTROLLER); + if (!gpio) { + return NULL; + } + + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin = DT_INST_0_TI_CC2520_FIFOP_GPIOS_PIN; + gpio_pin_configure(gpio, cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, + GPIO_INPUT | DT_INST_0_TI_CC2520_SFD_GPIOS_FLAGS); + cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev = gpio; + + return cc2520->gpios; +} + + static inline int configure_spi(struct device *dev) { struct cc2520_context *cc2520 = dev->driver_data; @@ -1019,8 +1084,7 @@ static int cc2520_init(struct device *dev) k_sem_init(&cc2520->access_lock, 1, 1); #endif - cc2520->gpios = cc2520_configure_gpios(); - if (!cc2520->gpios) { + if (!configure_gpios(dev)) { LOG_ERR("Configuring GPIOS failed"); return -EIO; } diff --git a/drivers/ieee802154/ieee802154_cc2520.h b/drivers/ieee802154/ieee802154_cc2520.h index 7e56bb02db2..dd3d3eaf2ff 100644 --- a/drivers/ieee802154/ieee802154_cc2520.h +++ b/drivers/ieee802154/ieee802154_cc2520.h @@ -13,7 +13,21 @@ #include #include -#include +enum cc2520_gpio_index { + CC2520_GPIO_IDX_VREG_EN = 0, + CC2520_GPIO_IDX_RESET, + CC2520_GPIO_IDX_FIFO, + CC2520_GPIO_IDX_CCA, + CC2520_GPIO_IDX_SFD, + CC2520_GPIO_IDX_FIFOP, + + CC2520_GPIO_IDX_MAX, +}; + +struct cc2520_gpio_configuration { + struct device *dev; + u32_t pin; +}; /* Runtime context structure *************************** @@ -21,7 +35,7 @@ struct cc2520_context { struct net_if *iface; /**************************/ - struct cc2520_gpio_configuration *gpios; + struct cc2520_gpio_configuration gpios[CC2520_GPIO_IDX_MAX]; struct gpio_callback sfd_cb; struct gpio_callback fifop_cb; struct device *spi; diff --git a/dts/bindings/ieee802154/ti,cc2520.yaml b/dts/bindings/ieee802154/ti,cc2520.yaml index 1e00e223ad4..c310add544d 100644 --- a/dts/bindings/ieee802154/ti,cc2520.yaml +++ b/dts/bindings/ieee802154/ti,cc2520.yaml @@ -10,24 +10,24 @@ include: spi-device.yaml properties: vreg-en-gpios: type: phandle-array - required: false + required: true reset-gpios: type: phandle-array - required: false + required: true fifo-gpios: type: phandle-array - required: false + required: true cca-gpios: type: phandle-array - required: false + required: true sfd-gpios: type: phandle-array - required: false + required: true fifop-gpios: type: phandle-array - required: false + required: true diff --git a/include/drivers/ieee802154/cc2520.h b/include/drivers/ieee802154/cc2520.h deleted file mode 100644 index 59135135240..00000000000 --- a/include/drivers/ieee802154/cc2520.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC2520_H_ -#define ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC2520_H_ - -#include - -enum cc2520_gpio_index { - CC2520_GPIO_IDX_VREG_EN = 0, - CC2520_GPIO_IDX_RESET, - CC2520_GPIO_IDX_FIFO, - CC2520_GPIO_IDX_CCA, - CC2520_GPIO_IDX_SFD, - CC2520_GPIO_IDX_FIFOP, - - CC2520_GPIO_IDX_MAX, -}; - -struct cc2520_gpio_configuration { - struct device *dev; - u32_t pin; -}; - -struct cc2520_gpio_configuration *cc2520_configure_gpios(void); - -#endif /* ZEPHYR_INCLUDE_DRIVERS_IEEE802154_CC2520_H_ */