drivers/ieee802154: Adapt cc2520 driver to new GPIO API

Update to use new API for GPIO pin configuration and operation.  Fix
invalid arithmetic on void pointer.  Mark all CC2520 GPIOs as required
in binding.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
This commit is contained in:
Tomasz Bursztyka 2020-01-27 15:10:48 +01:00 committed by Carles Cufí
commit 3587fe2fe3
4 changed files with 116 additions and 68 deletions

View file

@ -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;
}

View file

@ -13,7 +13,21 @@
#include <sys/atomic.h>
#include <drivers/spi.h>
#include <drivers/ieee802154/cc2520.h>
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;

View file

@ -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

View file

@ -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 <device.h>
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_ */