Commit ba90139c authored by Tomasz Bursztyka's avatar Tomasz Bursztyka Committed by Jukka Rissanen
Browse files

ieee802154: cc2520: Externalize how GPIOs are configured



Currently it's only possible to configure those GPIOs through
boards.<h/c> files and thus it's not relevant for board that do not
embed cc2520 but might get one wired to it, unlike
quark_se_c1000_devboard which directly embeds one cc2520.

Change-Id: I819bc1d2de707ea12eb70dc60a40b28f92666e51
Signed-off-by: default avatarTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
parent a1dc687b
Loading
Loading
Loading
Loading
+30 −17
Original line number Diff line number Diff line
@@ -24,38 +24,51 @@
	defined(CONFIG_TI_CC2520) || \
	defined(CONFIG_TI_CC2520_RAW)

#include <ieee802154/cc2520.h>
#include <gpio.h>

static struct device *cc2520_gpio_config[CC2520_GPIO_IDX_LAST_ENTRY];
static struct cc2520_gpio_configuration cc2520_gpios[CC2520_GPIO_IDX_MAX] = {
	{ .dev = NULL, .pin = CC2520_GPIO_VREG_EN, },
	{ .dev = NULL, .pin = CC2520_GPIO_RESET, },
	{ .dev = NULL, .pin = CC2520_GPIO_FIFO, },
	{ .dev = NULL, .pin = CC2520_GPIO_CCA, },
	{ .dev = NULL, .pin = CC2520_GPIO_SFD, },
	{ .dev = NULL, .pin = CC2520_GPIO_FIFOP, },
};

struct device **cc2520_configure_gpios(void)
struct cc2520_gpio_configuration *cc2520_configure_gpios(void)
{
	struct device *gpio;

	const int flags_noint_out = GPIO_DIR_OUT;
	const int flags_noint_in = GPIO_DIR_IN;
	const int flags_int_in = (GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE |
				  GPIO_INT_ACTIVE_HIGH | GPIO_INT_DEBOUNCE);
	struct device *gpio;

	gpio = device_get_binding(CONFIG_TI_CC2520_GPIO_1_NAME);
	gpio_pin_configure(gpio, CONFIG_CC2520_GPIO_VREG_EN, flags_noint_out);
	gpio_pin_configure(gpio, CONFIG_CC2520_GPIO_RESET, flags_noint_out);
	gpio_pin_configure(gpio, cc2520_gpios[CC2520_GPIO_IDX_VREG_EN].pin,
			   flags_noint_out);
	gpio_pin_configure(gpio, cc2520_gpios[CC2520_GPIO_IDX_RESET].pin,
			   flags_noint_out);

	cc2520_gpio_config[CC2520_GPIO_IDX_VREG_EN] = gpio;
	cc2520_gpio_config[CC2520_GPIO_IDX_RESET] = gpio;
	cc2520_gpios[CC2520_GPIO_IDX_VREG_EN].dev = gpio;
	cc2520_gpios[CC2520_GPIO_IDX_RESET].dev = gpio;

	gpio = device_get_binding(CONFIG_TI_CC2520_GPIO_0_NAME);
	gpio_pin_configure(gpio, CONFIG_CC2520_GPIO_SFD, flags_int_in);
	gpio_pin_configure(gpio, CONFIG_CC2520_GPIO_FIFOP, flags_int_in);
	gpio_pin_configure(gpio, CONFIG_CC2520_GPIO_FIFO, flags_noint_in);
	gpio_pin_configure(gpio, CONFIG_CC2520_GPIO_CCA, flags_noint_in);
	gpio_pin_configure(gpio, cc2520_gpios[CC2520_GPIO_IDX_SFD].pin,
			   flags_int_in);
	gpio_pin_configure(gpio, cc2520_gpios[CC2520_GPIO_IDX_FIFOP].pin,
			   flags_int_in);
	gpio_pin_configure(gpio, cc2520_gpios[CC2520_GPIO_IDX_FIFO].pin,
			   flags_noint_in);
	gpio_pin_configure(gpio, cc2520_gpios[CC2520_GPIO_IDX_CCA].pin,
			   flags_noint_in);

	cc2520_gpio_config[CC2520_GPIO_IDX_FIFOP] = gpio;
	cc2520_gpio_config[CC2520_GPIO_IDX_FIFO] = gpio;
	cc2520_gpio_config[CC2520_GPIO_IDX_SFD] = gpio;
	cc2520_gpio_config[CC2520_GPIO_IDX_CCA] = gpio;
	cc2520_gpios[CC2520_GPIO_IDX_FIFOP].dev = gpio;
	cc2520_gpios[CC2520_GPIO_IDX_FIFO].dev = gpio;
	cc2520_gpios[CC2520_GPIO_IDX_SFD].dev = gpio;
	cc2520_gpios[CC2520_GPIO_IDX_CCA].dev = gpio;

	return cc2520_gpio_config;
	return cc2520_gpios;
}

#endif /* CONFIG_TI_CC2520_LEGACY || CONFIG_TI_CC2520 || CONFIG_TI_CC2520_RAW */
+6 −21
Original line number Diff line number Diff line
@@ -36,27 +36,12 @@
	defined(CONFIG_TI_CC2520_RAW)

/* GPIO numbers where the TI cc2520 chip is connected to */
#define CONFIG_CC2520_GPIO_VREG_EN	0  /* PIN ?, ATP_AON_INT0 (out) */
#define CONFIG_CC2520_GPIO_RESET	1  /* PIN ?, ATP_AON_INT1 (out) */
#define CONFIG_CC2520_GPIO_FIFO		4  /* PIN 4, GPIO4 (in) */
#define CONFIG_CC2520_GPIO_FIFOP	5  /* PIN 5, GPIO5 (in) */
#define CONFIG_CC2520_GPIO_CCA		6  /* PIN 6, GPIO6 (in) */
#define CONFIG_CC2520_GPIO_SFD		29 /* PIN 33, GPIO29 (in) */

enum cc2520_gpio_index {
	/* If all the GPIOs can be served by same driver, then you
	 * can set the values to be the same. The first enum should
	 * always have a value of 0.
	 */
	CC2520_GPIO_IDX_RESET	= 0,
	CC2520_GPIO_IDX_VREG_EN	= 0,
	CC2520_GPIO_IDX_SFD	= 1,
	CC2520_GPIO_IDX_CCA	= 1,
	CC2520_GPIO_IDX_FIFOP	= 1,
	CC2520_GPIO_IDX_FIFO	= 1,

	CC2520_GPIO_IDX_LAST_ENTRY
};
#define CC2520_GPIO_VREG_EN	0  /* PIN ?, ATP_AON_INT0 (out) */
#define CC2520_GPIO_RESET	1  /* PIN ?, ATP_AON_INT1 (out) */
#define CC2520_GPIO_FIFO	4  /* PIN 4, GPIO4 (in) */
#define CC2520_GPIO_FIFOP	5  /* PIN 5, GPIO5 (in) */
#define CC2520_GPIO_CCA		6  /* PIN 6, GPIO6 (in) */
#define CC2520_GPIO_SFD		29 /* PIN 33, GPIO29 (in) */

#endif /* CONFIG_TI_CC2520_LEGACY || CONFIG_TI_CC2520 || CONFIG_TI_CC2520_RAW */

+29 −24
Original line number Diff line number Diff line
@@ -279,24 +279,24 @@ static inline void set_reset(struct device *dev, uint32_t value)
{
	struct cc2520_context *cc2520 = dev->driver_data;

	gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_RESET],
		       CONFIG_CC2520_GPIO_RESET, value);
	gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_RESET].dev,
		       cc2520->gpios[CC2520_GPIO_IDX_RESET].pin, value);
}

static inline void set_vreg_en(struct device *dev, uint32_t value)
{
	struct cc2520_context *cc2520 = dev->driver_data;

	gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_VREG_EN],
		       CONFIG_CC2520_GPIO_VREG_EN, value);
	gpio_pin_write(cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].dev,
		       cc2520->gpios[CC2520_GPIO_IDX_VREG_EN].pin, value);
}

static inline uint32_t get_fifo(struct cc2520_context *cc2520)
{
	uint32_t pin_value;

	gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFO],
		      CONFIG_CC2520_GPIO_FIFO, &pin_value);
	gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFO].dev,
		      cc2520->gpios[CC2520_GPIO_IDX_FIFO].pin, &pin_value);

	return pin_value;
}
@@ -305,8 +305,8 @@ static inline uint32_t get_fifop(struct cc2520_context *cc2520)
{
	uint32_t pin_value;

	gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFOP],
		      CONFIG_CC2520_GPIO_FIFOP, &pin_value);
	gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev,
		      cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin, &pin_value);

	return pin_value;
}
@@ -315,8 +315,8 @@ static inline uint32_t get_cca(struct cc2520_context *cc2520)
{
	uint32_t pin_value;

	gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_CCA],
		      CONFIG_CC2520_GPIO_CCA, &pin_value);
	gpio_pin_read(cc2520->gpios[CC2520_GPIO_IDX_CCA].dev,
		      cc2520->gpios[CC2520_GPIO_IDX_CCA].pin, &pin_value);

	return pin_value;
}
@@ -355,11 +355,13 @@ static void enable_fifop_interrupt(struct cc2520_context *cc2520,
				   bool enable)
{
	if (enable) {
		gpio_pin_enable_callback(cc2520->gpios[CC2520_GPIO_IDX_FIFOP],
					 CONFIG_CC2520_GPIO_FIFOP);
		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],
					  CONFIG_CC2520_GPIO_FIFOP);
		gpio_pin_disable_callback(
			cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev,
			cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin);
	}
}

@@ -367,11 +369,13 @@ static void enable_sfd_interrupt(struct cc2520_context *cc2520,
				 bool enable)
{
	if (enable) {
		gpio_pin_enable_callback(cc2520->gpios[CC2520_GPIO_IDX_SFD],
					 CONFIG_CC2520_GPIO_SFD);
		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],
					  CONFIG_CC2520_GPIO_SFD);
		gpio_pin_disable_callback(
			cc2520->gpios[CC2520_GPIO_IDX_SFD].dev,
			cc2520->gpios[CC2520_GPIO_IDX_SFD].pin);
	}
}

@@ -379,14 +383,14 @@ static inline void setup_gpio_callbacks(struct device *dev)
{
	struct cc2520_context *cc2520 = dev->driver_data;

	gpio_init_callback(&cc2520->sfd_cb,
			   sfd_int_handler, BIT(CONFIG_CC2520_GPIO_SFD));
	gpio_add_callback(cc2520->gpios[CC2520_GPIO_IDX_SFD],
	gpio_init_callback(&cc2520->sfd_cb, sfd_int_handler,
			   BIT(cc2520->gpios[CC2520_GPIO_IDX_SFD].pin));
	gpio_add_callback(cc2520->gpios[CC2520_GPIO_IDX_SFD].dev,
			  &cc2520->sfd_cb);

	gpio_init_callback(&cc2520->fifop_cb,
			   fifop_int_handler, BIT(CONFIG_CC2520_GPIO_FIFOP));
	gpio_add_callback(cc2520->gpios[CC2520_GPIO_IDX_FIFOP],
	gpio_init_callback(&cc2520->fifop_cb, fifop_int_handler,
			   BIT(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].pin));
	gpio_add_callback(cc2520->gpios[CC2520_GPIO_IDX_FIFOP].dev,
			  &cc2520->fifop_cb);
}

@@ -714,6 +718,7 @@ static int cc2520_cca(struct device *dev)
	struct cc2520_context *cc2520 = dev->driver_data;

	if (!get_cca(cc2520)) {
		SYS_LOG_DBG("BUSY\n");
		return -EBUSY;
	}

+3 −3
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <atomic.h>
#include <spi.h>

#include <ieee802154/cc2520.h>

#define CONFIG_CC2520_RX_STACK_SIZE CONFIG_TI_CC2520_FIBER_STACK_SIZE

/* Runtime context structure
@@ -41,7 +43,7 @@ struct cc2520_spi {
struct cc2520_context {
	struct net_if *iface;
	/**************************/
	struct device **gpios;
	struct cc2520_gpio_configuration *gpios;
	struct gpio_callback sfd_cb;
	struct gpio_callback fifop_cb;
	struct cc2520_spi spi;
@@ -56,8 +58,6 @@ struct cc2520_context {
	uint8_t lqi;
};

extern struct device **cc2520_configure_gpios(void);

#include "ieee802154_cc2520_regs.h"


+35 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016 Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#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;
	uint32_t pin;
};

struct cc2520_gpio_configuration *cc2520_configure_gpios(void);