summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpio/Makefile1
-rw-r--r--drivers/gpio/sx151x.c242
-rw-r--r--drivers/hwmon/ds1722.c1
-rw-r--r--drivers/net/netconsole.c2
-rw-r--r--drivers/net/npe/include/IxAtmdAcc.h1
-rw-r--r--drivers/net/npe/include/IxAtmdAccCtrl.h1
-rw-r--r--drivers/serial/mxs_auart.c10
-rw-r--r--drivers/serial/serial_s5p.c24
-rw-r--r--drivers/serial/serial_xuartlite.c20
9 files changed, 272 insertions, 30 deletions
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 1165793b5e..b903c45c52 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -30,3 +30,4 @@ obj-$(CONFIG_S3C2440_GPIO) += s3c2440_gpio.o
obj-$(CONFIG_XILINX_GPIO) += xilinx_gpio.o
obj-$(CONFIG_ADI_GPIO2) += adi_gpio2.o
obj-$(CONFIG_TCA642X) += tca642x.o
+oby-$(CONFIG_SX151X) += sx151x.o
diff --git a/drivers/gpio/sx151x.c b/drivers/gpio/sx151x.c
new file mode 100644
index 0000000000..167cf40c71
--- /dev/null
+++ b/drivers/gpio/sx151x.c
@@ -0,0 +1,242 @@
+/*
+ * (C) Copyright 2013
+ * Viktar Palstsiuk, Promwad, viktar.palstsiuk@promwad.com
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+/*
+ * Driver for Semtech SX151x SPI GPIO Expanders
+ */
+
+#include <common.h>
+#include <spi.h>
+#include <sx151x.h>
+
+#ifndef CONFIG_SX151X_SPI_BUS
+#define CONFIG_SX151X_SPI_BUS 0
+#endif
+
+/*
+ * The SX151x registers
+ */
+
+#ifdef CONFIG_SX151X_GPIO_COUNT_8
+/* 8bit: SX1511 */
+#define SX151X_REG_DIR 0x07
+#define SX151X_REG_DATA 0x08
+#else
+/* 16bit: SX1512 */
+#define SX151X_REG_DIR 0x0F
+#define SX151X_REG_DATA 0x11
+#endif
+#define SX151X_REG_RESET 0x7D
+
+static int sx151x_spi_write(int chip, unsigned char reg, unsigned char val)
+{
+ struct spi_slave *slave;
+ unsigned char buf[2];
+ int ret;
+
+ slave = spi_setup_slave(CONFIG_SX151X_SPI_BUS, chip, 1000000,
+ SPI_MODE_0);
+ if (!slave)
+ return 0;
+
+ spi_claim_bus(slave);
+
+ buf[0] = reg;
+ buf[1] = val;
+
+ ret = spi_xfer(slave, 16, buf, NULL, SPI_XFER_BEGIN | SPI_XFER_END);
+ if (ret < 0)
+ printf("spi%d.%d write fail: can't write %02x to %02x: %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, val, reg, ret);
+ else
+ printf("spi%d.%d write 0x%02x to register 0x%02x\n",
+ CONFIG_SX151X_SPI_BUS, chip, val, reg);
+ spi_release_bus(slave);
+ spi_free_slave(slave);
+
+ return ret;
+}
+
+static int sx151x_spi_read(int chip, unsigned char reg)
+{
+ struct spi_slave *slave;
+ int ret;
+
+ slave = spi_setup_slave(CONFIG_SX151X_SPI_BUS, chip, 1000000,
+ SPI_MODE_0);
+ if (!slave)
+ return 0;
+
+ spi_claim_bus(slave);
+
+ ret = spi_w8r8(slave, reg | 0x80);
+ if (ret < 0)
+ printf("spi%d.%d read fail: can't read %02x: %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, reg, ret);
+ else
+ printf("spi%d.%d read register 0x%02x: 0x%02x\n",
+ CONFIG_SX151X_SPI_BUS, chip, reg, ret);
+
+ spi_release_bus(slave);
+ spi_free_slave(slave);
+
+ return ret;
+}
+
+static inline void sx151x_find_cfg(int gpio, unsigned char *reg, unsigned char *mask)
+{
+ *reg -= gpio / 8;
+ *mask = 1 << (gpio % 8);
+}
+
+static int sx151x_write_cfg(int chip, unsigned char gpio, unsigned char reg, int val)
+{
+ unsigned char mask;
+ unsigned char data;
+ int ret;
+
+ sx151x_find_cfg(gpio, &reg, &mask);
+ ret = sx151x_spi_read(chip, reg);
+ if (ret < 0)
+ return ret;
+ else
+ data = ret;
+ data &= ~mask;
+ data |= (val << (gpio % 8)) & mask;
+ return sx151x_spi_write(chip, reg, data);
+}
+
+int sx151x_get_value(int chip, int gpio)
+{
+ unsigned char reg = SX151X_REG_DATA;
+ unsigned char mask;
+ int ret;
+
+ sx151x_find_cfg(gpio, &reg, &mask);
+ ret = sx151x_spi_read(chip, reg);
+ if (ret >= 0)
+ ret = (ret & mask) != 0 ? 1 : 0;
+
+ return ret;
+}
+
+int sx151x_set_value(int chip, int gpio, int val)
+{
+ return sx151x_write_cfg(chip, gpio, SX151X_REG_DATA, (val ? 1 : 0));
+}
+
+int sx151x_direction_input(int chip, int gpio)
+{
+ return sx151x_write_cfg(chip, gpio, SX151X_REG_DIR, 1);
+}
+
+int sx151x_direction_output(int chip, int gpio)
+{
+ return sx151x_write_cfg(chip, gpio, SX151X_REG_DIR, 0);
+}
+
+int sx151x_reset(int chip)
+{
+ int err;
+
+ err = sx151x_spi_write(chip, SX151X_REG_RESET, 0x12);
+ if (err < 0)
+ return err;
+
+ err = sx151x_spi_write(chip, SX151X_REG_RESET, 0x34);
+ return err;
+}
+
+#ifdef CONFIG_CMD_SX151X
+
+int do_sx151x(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ int ret = CMD_RET_USAGE, chip = 0, gpio = 0, val = 0;
+
+ if (argc < 3)
+ return CMD_RET_USAGE;
+
+ /* arg2 used as chip number */
+ chip = simple_strtoul(argv[2], NULL, 10);
+
+ if (strcmp(argv[1], "reset") == 0) {
+ ret = sx151x_reset(chip);
+ if (!ret) {
+ printf("Device at spi%d.%d was reset\n",
+ CONFIG_SX151X_SPI_BUS, chip);
+ }
+ return ret;
+ }
+
+ if (argc < 4)
+ return CMD_RET_USAGE;
+
+ /* arg3 used as gpio number */
+ gpio = simple_strtoul(argv[3], NULL, 10);
+
+ if (strcmp(argv[1], "get") == 0) {
+ ret = sx151x_get_value(chip, gpio);
+ if (ret < 0)
+ printf("Failed to get value at spi%d.%d gpio %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, gpio);
+ else {
+ printf("Value at spi%d.%d gpio %d is %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, gpio, ret);
+ ret = 0;
+ }
+ return ret;
+ }
+
+ if (argc < 5)
+ return CMD_RET_USAGE;
+
+ /* arg4 used as value or direction */
+ val = simple_strtoul(argv[4], NULL, 10);
+
+ if (strcmp(argv[1], "set") == 0) {
+ ret = sx151x_set_value(chip, gpio, val);
+ if (ret < 0)
+ printf("Failed to set value at spi%d.%d gpio %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, gpio);
+ else
+ printf("New value at spi%d.%d gpio %d is %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, gpio, val);
+ return ret;
+ } else if (strcmp(argv[1], "dir") == 0) {
+ if (val == 0)
+ ret = sx151x_direction_output(chip, gpio);
+ else
+ ret = sx151x_direction_input(chip, gpio);
+
+ if (ret < 0)
+ printf("Failed to set direction of spi%d.%d gpio %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, gpio);
+ else
+ printf("New direction of spi%d.%d gpio %d is %d\n",
+ CONFIG_SX151X_SPI_BUS, chip, gpio, val);
+ return ret;
+ }
+
+ printf("Please see usage\n");
+
+ return ret;
+}
+
+U_BOOT_CMD(
+ sx151x, 5, 1, do_sx151x,
+ "sx151x gpio access",
+ "dir chip gpio 0|1\n"
+ " - set gpio direction (0 for output, 1 for input)\n"
+ "sx151x get chip gpio\n"
+ " - get gpio value\n"
+ "sx151x set chip gpio 0|1\n"
+ " - set gpio value\n"
+ "sx151x reset chip\n"
+ " - reset chip"
+);
+
+#endif /* CONFIG_CMD_SX151X */
diff --git a/drivers/hwmon/ds1722.c b/drivers/hwmon/ds1722.c
index a46cd4dfb5..c46958846c 100644
--- a/drivers/hwmon/ds1722.c
+++ b/drivers/hwmon/ds1722.c
@@ -1,4 +1,3 @@
-
#include <common.h>
#include <asm/ic/ssi.h>
#include <ds1722.h>
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index df8ab07b94..65c747e14b 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -184,7 +184,9 @@ static void nc_send_packet(const char *buf, int len)
return; /* inside net loop */
output_packet = buf;
output_packet_len = len;
+ input_recursion = 1;
NetLoop(NETCONS); /* wait for arp reply and send packet */
+ input_recursion = 0;
output_packet_len = 0;
return;
}
diff --git a/drivers/net/npe/include/IxAtmdAcc.h b/drivers/net/npe/include/IxAtmdAcc.h
index 291b662151..b37c615029 100644
--- a/drivers/net/npe/include/IxAtmdAcc.h
+++ b/drivers/net/npe/include/IxAtmdAcc.h
@@ -1,4 +1,3 @@
-
/**
* @file IxAtmdAcc.h
*
diff --git a/drivers/net/npe/include/IxAtmdAccCtrl.h b/drivers/net/npe/include/IxAtmdAccCtrl.h
index 1a696b0e66..ecbb0059f5 100644
--- a/drivers/net/npe/include/IxAtmdAccCtrl.h
+++ b/drivers/net/npe/include/IxAtmdAccCtrl.h
@@ -1,4 +1,3 @@
-
/**
* @file IxAtmdAccCtrl.h
*
diff --git a/drivers/serial/mxs_auart.c b/drivers/serial/mxs_auart.c
index 7cfe5bccf7..fc0fa96a0e 100644
--- a/drivers/serial/mxs_auart.c
+++ b/drivers/serial/mxs_auart.c
@@ -40,7 +40,7 @@ static struct mxs_uartapp_regs *get_uartapp_registers(void)
* Sets the baud rate and settings.
* The settings are: 8 data bits, no parit and 1 stop bit.
*/
-void mxs_auart_setbrg(void)
+static void mxs_auart_setbrg(void)
{
u32 div;
u32 linectrl = 0;
@@ -77,7 +77,7 @@ void mxs_auart_setbrg(void)
writel(linectrl, &regs->hw_uartapp_linectrl);
}
-int mxs_auart_init(void)
+static int mxs_auart_init(void)
{
struct mxs_uartapp_regs *regs = get_uartapp_registers();
/* Reset everything */
@@ -99,7 +99,7 @@ int mxs_auart_init(void)
return 0;
}
-void mxs_auart_putc(const char c)
+static void mxs_auart_putc(const char c)
{
struct mxs_uartapp_regs *regs = get_uartapp_registers();
/* Wait in loop while the transmit FIFO is full */
@@ -112,14 +112,14 @@ void mxs_auart_putc(const char c)
mxs_auart_putc('\r');
}
-int mxs_auart_tstc(void)
+static int mxs_auart_tstc(void)
{
struct mxs_uartapp_regs *regs = get_uartapp_registers();
/* Checks if receive FIFO is empty */
return !(readl(&regs->hw_uartapp_stat) & UARTAPP_STAT_RXFE_MASK);
}
-int mxs_auart_getc(void)
+static int mxs_auart_getc(void)
{
struct mxs_uartapp_regs *regs = get_uartapp_registers();
/* Wait until a character is available to read */
diff --git a/drivers/serial/serial_s5p.c b/drivers/serial/serial_s5p.c
index f98b422632..89f5d68dd0 100644
--- a/drivers/serial/serial_s5p.c
+++ b/drivers/serial/serial_s5p.c
@@ -65,7 +65,7 @@ static const int udivslot[] = {
0xffdf,
};
-void serial_setbrg_dev(const int dev_index)
+static void serial_setbrg_dev(const int dev_index)
{
struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
u32 uclk = get_uart_clk(dev_index);
@@ -96,7 +96,7 @@ void serial_setbrg_dev(const int dev_index)
* Initialise the serial port with the given baudrate. The settings
* are always 8 data bits, no parity, 1 stop bit, no start bits.
*/
-int serial_init_dev(const int dev_index)
+static int serial_init_dev(const int dev_index)
{
struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
@@ -138,7 +138,7 @@ static int serial_err_check(const int dev_index, int op)
* otherwise. When the function is succesfull, the character read is
* written into its argument c.
*/
-int serial_getc_dev(const int dev_index)
+static int serial_getc_dev(const int dev_index)
{
struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
@@ -158,7 +158,7 @@ int serial_getc_dev(const int dev_index)
/*
* Output a single byte to the serial port.
*/
-void serial_putc_dev(const char c, const int dev_index)
+static void serial_putc_dev(const char c, const int dev_index)
{
struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
@@ -181,7 +181,7 @@ void serial_putc_dev(const char c, const int dev_index)
/*
* Test whether a character is in the RX buffer
*/
-int serial_tstc_dev(const int dev_index)
+static int serial_tstc_dev(const int dev_index)
{
struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
@@ -191,7 +191,7 @@ int serial_tstc_dev(const int dev_index)
return (int)(readl(&uart->utrstat) & 0x1);
}
-void serial_puts_dev(const char *s, const int dev_index)
+static void serial_puts_dev(const char *s, const int dev_index)
{
while (*s)
serial_putc_dev(*s++, dev_index);
@@ -199,12 +199,12 @@ void serial_puts_dev(const char *s, const int dev_index)
/* Multi serial device functions */
#define DECLARE_S5P_SERIAL_FUNCTIONS(port) \
-int s5p_serial##port##_init(void) { return serial_init_dev(port); } \
-void s5p_serial##port##_setbrg(void) { serial_setbrg_dev(port); } \
-int s5p_serial##port##_getc(void) { return serial_getc_dev(port); } \
-int s5p_serial##port##_tstc(void) { return serial_tstc_dev(port); } \
-void s5p_serial##port##_putc(const char c) { serial_putc_dev(c, port); } \
-void s5p_serial##port##_puts(const char *s) { serial_puts_dev(s, port); }
+static int s5p_serial##port##_init(void) { return serial_init_dev(port); } \
+static void s5p_serial##port##_setbrg(void) { serial_setbrg_dev(port); } \
+static int s5p_serial##port##_getc(void) { return serial_getc_dev(port); } \
+static int s5p_serial##port##_tstc(void) { return serial_tstc_dev(port); } \
+static void s5p_serial##port##_putc(const char c) { serial_putc_dev(c, port); } \
+static void s5p_serial##port##_puts(const char *s) { serial_puts_dev(s, port); }
#define INIT_S5P_SERIAL_STRUCTURE(port, __name) { \
.name = __name, \
diff --git a/drivers/serial/serial_xuartlite.c b/drivers/serial/serial_xuartlite.c
index 9c1d025c40..e6139943ba 100644
--- a/drivers/serial/serial_xuartlite.c
+++ b/drivers/serial/serial_xuartlite.c
@@ -39,7 +39,7 @@ static struct uartlite *userial_ports[4] = {
#endif
};
-void uartlite_serial_putc(const char c, const int port)
+static void uartlite_serial_putc(const char c, const int port)
{
struct uartlite *regs = userial_ports[port];
@@ -51,13 +51,13 @@ void uartlite_serial_putc(const char c, const int port)
out_be32(&regs->tx_fifo, c & 0xff);
}
-void uartlite_serial_puts(const char *s, const int port)
+static void uartlite_serial_puts(const char *s, const int port)
{
while (*s)
uartlite_serial_putc(*s++, port);
}
-int uartlite_serial_getc(const int port)
+static int uartlite_serial_getc(const int port)
{
struct uartlite *regs = userial_ports[port];
@@ -66,7 +66,7 @@ int uartlite_serial_getc(const int port)
return in_be32(&regs->rx_fifo) & 0xff;
}
-int uartlite_serial_tstc(const int port)
+static int uartlite_serial_tstc(const int port)
{
struct uartlite *regs = userial_ports[port];
@@ -82,16 +82,16 @@ static int uartlite_serial_init(const int port)
/* Multi serial device functions */
#define DECLARE_ESERIAL_FUNCTIONS(port) \
- int userial##port##_init(void) \
+ static int userial##port##_init(void) \
{ return uartlite_serial_init(port); } \
- void userial##port##_setbrg(void) {} \
- int userial##port##_getc(void) \
+ static void userial##port##_setbrg(void) {} \
+ static int userial##port##_getc(void) \
{ return uartlite_serial_getc(port); } \
- int userial##port##_tstc(void) \
+ static int userial##port##_tstc(void) \
{ return uartlite_serial_tstc(port); } \
- void userial##port##_putc(const char c) \
+ static void userial##port##_putc(const char c) \
{ uartlite_serial_putc(c, port); } \
- void userial##port##_puts(const char *s) \
+ static void userial##port##_puts(const char *s) \
{ uartlite_serial_puts(s, port); }
/* Serial device descriptor */
OpenPOWER on IntegriCloud