All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bob Liu <lliubbo@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 06/16] Blackfin: Bf609-ezkit: implement soft switch
Date: Tue, 7 Aug 2012 16:07:45 +0800	[thread overview]
Message-ID: <1344326875-348-6-git-send-email-lliubbo@gmail.com> (raw)
In-Reply-To: <1344326875-348-1-git-send-email-lliubbo@gmail.com>

From: Sonic Zhang <sonic.zhang@analog.com>

Set up soft switch pins properly in board init code.

Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Bob Liu <lliubbo@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

  parent reply	other threads:[~2012-08-07  8:07 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-07  8:07 [U-Boot] [PATCH 01/16] Blackfin: BF60x: new processor port Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 02/16] Blackfin: bf609-ezkit: new board port Bob Liu
2012-08-08  4:41   ` Mike Frysinger
2012-08-20  7:55     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 03/16] Blackfin: Bf60x: support big cplb page Bob Liu
2012-08-08  4:48   ` Mike Frysinger
2012-08-20  8:00     ` Bob Liu
2012-08-23  3:49       ` Mike Frysinger
2012-08-07  8:07 ` [U-Boot] [PATCH 04/16] Blackfin: Rsi: add support for bf609-ezkit Bob Liu
2012-08-08  4:52   ` Mike Frysinger
2012-08-20  8:01     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 05/16] Blackfin: Paraflash: " Bob Liu
2012-08-08  4:55   ` Mike Frysinger
2012-08-20  8:01     ` Bob Liu
2012-08-07  8:07 ` Bob Liu [this message]
2012-08-08  4:59   ` [U-Boot] [PATCH 06/16] Blackfin: Bf609-ezkit: implement soft switch Mike Frysinger
2012-08-20  8:11     ` Bob Liu
2012-08-23  3:53       ` Mike Frysinger
2012-08-07  8:07 ` [U-Boot] [PATCH 07/16] Blackfin: Spi: add bf6xx spi driver Bob Liu
2012-08-08  5:02   ` Mike Frysinger
2012-08-20  8:11     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 08/16] Blackfin: add more print info for Bf60x Bob Liu
2012-08-08  5:04   ` Mike Frysinger
2012-08-20  8:12     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 09/16] Blackfin: Bf60x: add reset support Bob Liu
2012-08-08  5:05   ` Mike Frysinger
2012-08-20  8:13     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 10/16] Blackfin: Bf60x: Check card ready for each RSI command Bob Liu
2012-08-08  5:05   ` Mike Frysinger
2012-08-20  8:13     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 11/16] Blackfin: Bf60x: support clock init Bob Liu
2012-08-08  5:06   ` Mike Frysinger
2012-08-07  8:07 ` [U-Boot] [PATCH 12/16] Blackfin: Bf60x: initcode: set up uart baud properly Bob Liu
2012-08-08  5:06   ` Mike Frysinger
2012-08-07  8:07 ` [U-Boot] [PATCH 13/16] Blackfin: Bf60x: add hw watchdog support Bob Liu
2012-08-08  5:11   ` Mike Frysinger
2012-08-20  8:25     ` Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 14/16] Blackfin: setup SMC if user desires it Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 15/16] Blackfin: Bf60x: add resume from hibernate Bob Liu
2012-08-07  8:07 ` [U-Boot] [PATCH 16/16] Blackfin: update license to Clear BSD license Bob Liu
2012-08-08  5:12   ` Mike Frysinger
2012-08-20  8:25     ` Bob Liu
2012-08-08  4:39 ` [U-Boot] [PATCH 01/16] Blackfin: BF60x: new processor port Mike Frysinger
2012-08-20  7:54   ` Bob Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1344326875-348-6-git-send-email-lliubbo@gmail.com \
    --to=lliubbo@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.