[U-Boot] [PATCH 06/16] Blackfin: Bf609-ezkit: implement soft switch
Bob Liu
lliubbo at gmail.com
Tue Aug 7 10:07:45 CEST 2012
From: Sonic Zhang <sonic.zhang at analog.com>
Set up soft switch pins properly in board init code.
Signed-off-by: Sonic Zhang <sonic.zhang at analog.com>
Signed-off-by: Bob Liu <lliubbo at gmail.com>
---
board/bf609-ezkit/Makefile | 1 +
board/bf609-ezkit/bf609-ezkit.c | 22 +++--
board/bf609-ezkit/soft_switch.c | 173 +++++++++++++++++++++++++++++++++++++++
board/bf609-ezkit/soft_switch.h | 71 ++++++++++++++++
include/configs/bf609-ezkit.h | 6 +-
5 files changed, 260 insertions(+), 13 deletions(-)
create mode 100644 board/bf609-ezkit/soft_switch.c
create mode 100644 board/bf609-ezkit/soft_switch.h
diff --git a/board/bf609-ezkit/Makefile b/board/bf609-ezkit/Makefile
index cde8168..0bb8fe6 100644
--- a/board/bf609-ezkit/Makefile
+++ b/board/bf609-ezkit/Makefile
@@ -30,6 +30,7 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).o
COBJS-y := $(BOARD).o
+COBJS-$(CONFIG_BFIN_SOFT_SWITCH) += soft_switch.o
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
OBJS := $(addprefix $(obj),$(COBJS-y))
diff --git a/board/bf609-ezkit/bf609-ezkit.c b/board/bf609-ezkit/bf609-ezkit.c
index d701c36..d54906b 100644
--- a/board/bf609-ezkit/bf609-ezkit.c
+++ b/board/bf609-ezkit/bf609-ezkit.c
@@ -11,6 +11,7 @@
#include <asm/blackfin.h>
#include <asm/io.h>
#include <asm/portmux.h>
+#include "soft_switch.h"
int checkboard(void)
{
@@ -32,30 +33,20 @@ int board_early_init_f(void)
}
#ifdef CONFIG_DESIGNWARE_ETH
-#define TWI_ADDR 0x20
int board_eth_init(bd_t *bis)
{
int ret = 0;
- uchar idira = 0x0;
- uchar lata = 0xff;
if (CONFIG_DW_PORTS & 1) {
static const unsigned short pins[] = P_RMII0;
if (!peripheral_request_list(pins, "emac0")) {
- /* enable phy clk */
- ret = i2c_write(TWI_ADDR, 0x0, 1, &idira, 1);
- if (!ret) {
- ret = i2c_write(TWI_ADDR, 0x14, 1, &lata, 1);
- if (!ret)
- ret += designware_initialize(0, EMAC0_MACCFG, 1, 0);
- }
+ ret += designware_initialize(0, EMAC0_MACCFG, 1, 0);
}
}
-
if (CONFIG_DW_PORTS & 2) {
static const unsigned short pins[] = P_RMII1;
if (!peripheral_request_list(pins, "emac1"))
- ret += designware_initialize(1, EMAC1_MACCFG, 1, 0, 1);
+ ret += designware_initialize(1, EMAC1_MACCFG, 1, 0);
}
return ret;
@@ -68,3 +59,10 @@ int board_mmc_init(bd_t *bis)
return bfin_mmc_init(bis);
}
#endif
+
+/* miscellaneous platform dependent initialisations */
+int misc_init_r(void)
+{
+ printf("other init\n");
+ return setup_board_switches();
+}
diff --git a/board/bf609-ezkit/soft_switch.c b/board/bf609-ezkit/soft_switch.c
new file mode 100644
index 0000000..9e2265a
--- /dev/null
+++ b/board/bf609-ezkit/soft_switch.c
@@ -0,0 +1,173 @@
+/*
+ * U-boot - main board file
+ *
+ * Copyright (c) 2008-2011 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <common.h>
+#include <asm/blackfin.h>
+#include <asm/io.h>
+#include <i2c.h>
+#include "soft_switch.h"
+
+#ifdef CONFIG_BFIN_BOARD_VERSION_1_0
+#define SWITCH_ADDR 0x21
+#else
+#define SWITCH_ADDR 0x20
+#endif
+
+#define NUM_SWITCH 3
+#define IODIRA 0x0
+#define IODIRB 0x1
+#define OLATA 0x14
+#define OLATB 0x15
+
+struct switch_config {
+ uchar dir0; /* IODIRA */
+ uchar dir1; /* IODIRB */
+ uchar value0; /* OLATA */
+ uchar value1; /* OLATB */
+};
+
+static struct switch_config switch_config_array[NUM_SWITCH] = {
+ {
+/*
+ U45 Port A U45 Port B
+
+ 7--------------- RMII_CLK_EN | 7--------------- ~TEMP_THERM_EN
+ | 6------------- ~CNT0ZM_EN | | 6------------- ~TEMP_IRQ_EN
+ | | 5----------- ~CNT0DG_EN | | | 5----------- ~UART0CTS_146_EN
+ | | | 4--------- ~CNT0UD_EN | | | | 4--------- ~UART0CTS_RST_EN
+ | | | | 3------- ~CAN0RX_EN | | | | | 3------- ~UART0CTS_RTS_LPBK
+ | | | | | 2----- ~CAN0_ERR_EN | | | | | | 2----- ~UART0CTS_EN
+ | | | | | | 1--- ~CAN_STB | | | | | | | 1--- ~UART0RX_EN
+ | | | | | | | 0- CAN_EN | | | | | | | | 0- ~UART0RTS_EN
+ | | | | | | | | | | | | | | | | |
+ O O O O O O O O | O O O O O O O O ( I/O direction )
+ 1 0 0 0 0 0 1 1 | 1 1 1 1 1 0 0 0 ( value being set )
+*/
+ .dir0 = 0x0, /* all output */
+ .dir1 = 0x0, /* all output */
+ .value0 = RMII_CLK_EN | CAN_STB | CAN_EN,
+ .value1 = TEMP_THERM_EN | TEMP_IRQ_EN | UART0CTS_146_EN
+ | UART0CTS_RST_EN | UART0CTS_RTS_LPBK,
+ },
+ {
+/*
+ U46 Port A U46 Port B
+
+ 7--------------- ~LED4_GPIO_EN | 7--------------- EMPTY
+ | 6------------- ~LED3_GPIO_EN | | 6------------- ~SPI0D3_EN
+ | | 5----------- ~LED2_GPIO_EN | | | 5----------- ~SPI0D2_EN
+ | | | 4--------- ~LED1_GPIO_EN | | | | 4--------- ~SPIFLASH_CS_EN
+ | | | | 3------- SMC0_LP0_EN | | | | | 3------- ~SD_WP_EN
+ | | | | | 2----- EMPTY | | | | | | 2----- ~SD_CD_EN
+ | | | | | | 1--- SMC0_EPPI2_LP1_SWITCH | | | | | | | 1--- ~PUSHBUTTON2_EN
+ | | | | | | | 0- OVERRIDE_SMC0_LP0_BOOT| | | | | | | | 0- ~PUSHBUTTON1_EN
+ | | | | | | | | | | | | | | | | |
+ O O O O O O O O | O O O O O O O O ( I/O direction )
+ 0 0 0 0 0 X 0 1 | X 0 0 0 0 0 0 0 ( value being set )
+*/
+ .dir0 = 0x0, /* all output */
+ .dir1 = 0x0, /* all output */
+#ifdef CONFIG_BFIN_LINKPORT
+ .value0 = OVERRIDE_SMC0_LP0_BOOT,
+#else
+ .value0 = SMC0_EPPI2_LP1_SWITCH,
+#endif
+ .value1 = 0x0,
+ },
+ {
+/*
+ U47 Port A U47 Port B
+
+ 7--------------- ~PD2_SPI0MISO_EI3_EN | 7--------------- EMPTY
+ | 6------------- ~PD1_SPI0D3_EPPI1D17_SPI0SEL2_EI3_EN | | 6------------- EMPTY
+ | | 5----------- ~PD0_SPI0D2_EPPI1D16_SPI0SEL3_EI3_EN | | | 5----------- EMPTY
+ | | | 4--------- ~WAKE_PUSHBUTTON_EN | | | | 4--------- EMPTY
+ | | | | 3------- ~ETHERNET_EN | | | | | 3------- EMPTY
+ | | | | | 2----- PHYAD0 | | | | | | 2----- EMPTY
+ | | | | | | 1--- PHY_PWR_DWN_INT | | | | | | | 1--- ~PD4_SPI0CK_EI3_EN
+ | | | | | | | 0- ~PHYINT_EN | | | | | | | | 0- ~PD3_SPI0MOSI_EI3_EN
+ | | | | | | | | | | | | | | | | |
+ O O O O O I I O | O O O O O O O O ( I/O direction )
+ 1 1 1 0 0 0 0 0 | X X X X X X 1 1 ( value being set )
+*/
+ .dir0 = 0x6, /* bits 1 and 2 input, all others output */
+ .dir1 = 0x0, /* all output */
+ .value0 = PD1_SPI0D3_EN | PD0_SPI0D2_EN,
+ .value1 = 0,
+ },
+};
+
+static int setup_soft_switch(int addr, struct switch_config *config)
+{
+ int ret = 0;
+
+ ret = i2c_write(addr, OLATA, 1, &config->value0, 1);
+ if (ret)
+ return ret;
+ ret = i2c_write(addr, OLATB, 1, &config->value1, 1);
+ if (ret)
+ return ret;
+
+ ret = i2c_write(addr, IODIRA, 1, &config->dir0, 1);
+ if (ret)
+ return ret;
+ return i2c_write(addr, IODIRB, 1, &config->dir1, 1);
+}
+
+int config_switch_bit(int num, int port, int bit, int dir, uchar value)
+{
+ int addr = SWITCH_ADDR + num;
+ int ret, data_reg, dir_reg;
+ uchar tmp;
+
+ if (port == IO_PORT_A) {
+ data_reg = OLATA;
+ dir_reg = IODIRA;
+ } else {
+ data_reg = OLATB;
+ dir_reg = IODIRB;
+ }
+
+ if (dir == IO_PORT_INPUT) {
+ ret = i2c_read(addr, dir_reg, 1, &tmp, 1);
+ if (ret)
+ return ret;
+ tmp |= bit;
+ return i2c_write(addr, dir_reg, 1, &tmp, 1);
+ } else {
+ ret = i2c_read(addr, data_reg, 1, &tmp, 1);
+ if (ret)
+ return ret;
+ if (value)
+ tmp |= bit;
+ else
+ tmp &= ~bit;
+ ret = i2c_write(addr, data_reg, 1, &tmp, 1);
+ if (ret)
+ return ret;
+ ret = i2c_read(addr, dir_reg, 1, &tmp, 1);
+ if (ret)
+ return ret;
+ tmp &= ~bit;
+ return i2c_write(addr, dir_reg, 1, &tmp, 1);
+ }
+}
+
+int setup_board_switches(void)
+{
+ int ret;
+ int i;
+
+ for (i = 0; i < NUM_SWITCH; i++) {
+ ret = setup_soft_switch(SWITCH_ADDR + i,
+ &switch_config_array[i]);
+ if (ret)
+ return ret;
+ }
+ return 0;
+}
diff --git a/board/bf609-ezkit/soft_switch.h b/board/bf609-ezkit/soft_switch.h
new file mode 100644
index 0000000..8da0e44
--- /dev/null
+++ b/board/bf609-ezkit/soft_switch.h
@@ -0,0 +1,71 @@
+/*
+ * U-boot - main board file
+ *
+ * Copyright (c) 2008-2011 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#ifndef __SOFT_SWITCH_H__
+#define __SOFT_SWITCH_H__
+
+/* switch 0 port A */
+#define CAN_EN 0x1
+#define CAN_STB 0x2
+#define CAN0_ERR_EN 0x4
+#define CAN0RX_EN 0x8
+#define CNT0UD_EN 0x10
+#define CNT0DG_EN 0x20
+#define CNT0ZM_EN 0x40
+#define RMII_CLK_EN 0x80
+
+/* switch 0 port B */
+#define UART0RTS_EN 0x1
+#define UART0RX_EN 0x2
+#define UART0CTS_EN 0x4
+#define UART0CTS_RTS_LPBK 0x8
+#define UART0CTS_RST_EN 0x10
+#define UART0CTS_146_EN 0x20
+#define TEMP_IRQ_EN 0x40
+#define TEMP_THERM_EN 0x80
+
+/* switch 1 port A */
+#define OVERRIDE_SMC0_LP0_BOOT 0x1
+#define SMC0_EPPI2_LP1_SWITCH 0x2
+#define SMC0_LP0_EN 0x8
+#define LED1_GPIO_EN 0x10
+#define LED2_GPIO_EN 0x20
+#define LED3_GPIO_EN 0x40
+#define LED4_GPIO_EN 0x80
+
+/* switch 1 port B */
+#define PUSHBUTTON1_EN 0x1
+#define PUSHBUTTON2_EN 0x2
+#define SD_CD_EN 0x4
+#define SD_WP_EN 0x8
+#define SPIFLASH_CS_EN 0x10
+#define SPI0D2_EN 0x20
+#define SPI0D3_EN 0x40
+
+/* switch 2 port A */
+#define PHYINT_EN 0x1
+#define PHY_PWR_DWN_INT 0x2
+#define PHYAD0 0x4
+#define ETHERNET_EN 0x8
+#define WAKE_PUSHBUTTON_EN 0x10
+#define PD0_SPI0D2_EN 0x20
+#define PD1_SPI0D3_EN 0x40
+#define PD2_SPI0MISO_EN 0x80
+
+/* switch 2 port B */
+#define PD3_SPI0MOSI_EN 0x1
+#define PD4_SPI0CK_EN 0x2
+
+#define IO_PORT_A 0
+#define IO_PORT_B 1
+#define IO_PORT_INPUT 0
+#define IO_PORT_OUTPUT 1
+
+int config_switch_bit(int num, int port, int bit, int dir, uchar value);
+int setup_board_switches(void);
+#endif
diff --git a/include/configs/bf609-ezkit.h b/include/configs/bf609-ezkit.h
index 91b0cf3..e56916f 100644
--- a/include/configs/bf609-ezkit.h
+++ b/include/configs/bf609-ezkit.h
@@ -19,6 +19,9 @@
#define CONFIG_BFIN_BOOT_MODE BFIN_BOOT_PARA
+/* For ez-board version 1.0, else undef this */
+#define CONFIG_BFIN_BOARD_VERSION_1_0
+
/*
* Clock Settings
* CCLK = (CLKIN * VCO_MULT) / CCLK_DIV
@@ -44,7 +47,7 @@
#define CONFIG_SYSCLK_DIV 3
/* Values can range from 0-7 (where 0 means 8) */
#define CONFIG_SCLK0_DIV 1
-#define CONFIG_SCLK1_DIV 2
+#define CONFIG_SCLK1_DIV 1
/* DCLK_DIV controls the DDR clock divider */
/* Values can range from 0-31 (where 0 means 32) */
#define CONFIG_DCLK_DIV 2
@@ -157,6 +160,7 @@
#define CONFIG_CMD_MEMORY
#define CONFIG_SYS_MEMTEST_END (CONFIG_STACKBASE - 20*1024*1024 + 4)
+#define CONFIG_BFIN_SOFT_SWITCH
#if 0
#define CONFIG_UART_MEM 1024
--
1.7.9.5
More information about the U-Boot
mailing list