diff mbox

[U-Boot,06/16] Blackfin: Bf609-ezkit: implement soft switch

Message ID 1344326875-348-6-git-send-email-lliubbo@gmail.com
State Superseded
Delegated to: Mike Frysinger
Headers show

Commit Message

Bob Liu Aug. 7, 2012, 8:07 a.m. UTC
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

Comments

Mike Frysinger Aug. 8, 2012, 4:59 a.m. UTC | #1
On Tuesday 07 August 2012 04:07:45 Bob Liu wrote:
> --- a/board/bf609-ezkit/Makefile
> +++ b/board/bf609-ezkit/Makefile
>
> +COBJS-$(CONFIG_BFIN_SOFT_SWITCH)   += soft_switch.o

is there any reason we *wouldn't* want to build this ?  i would just skip 
making this an option and always enable it.

also, any reason for not just squashing into the initial bf609-ezkit board 
port ?  there's quite a bit of rudimentary code in bf609-ezkit.c before to 
support this.

> --- a/board/bf609-ezkit/bf609-ezkit.c
> +++ b/board/bf609-ezkit/bf609-ezkit.c
>
> +/* miscellaneous platform dependent initialisations */
> +int misc_init_r(void)
> +{
> +	printf("other init\n");

useless display -> delete

> --- /dev/null
> +++ b/board/bf609-ezkit/soft_switch.c
>
> +#ifdef CONFIG_BFIN_BOARD_VERSION_1_0
> +#define SWITCH_ADDR     0x21
> +#else
> +#define SWITCH_ADDR     0x20
> +#endif

must this be a runtime define ?  can't you probe the slave address at runtime 
to figure out which one to use ?

start with the address that the newest boards are using, and then fallback to 
the older ones.  this way there's no runtime penalty on newer boards, but 
older ones continue to work.

shouldn't there be a new u-boot command here so people can toggle peripherals 
themselves ?  i thought that was the intention when we first discussed this 
idea with the firmware team.
-mike
Bob Liu Aug. 20, 2012, 8:11 a.m. UTC | #2
On Wed, Aug 8, 2012 at 12:59 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Tuesday 07 August 2012 04:07:45 Bob Liu wrote:
>> --- a/board/bf609-ezkit/Makefile
>> +++ b/board/bf609-ezkit/Makefile
>>
>> +COBJS-$(CONFIG_BFIN_SOFT_SWITCH)   += soft_switch.o
>
> is there any reason we *wouldn't* want to build this ?  i would just skip
> making this an option and always enable it.
>
> also, any reason for not just squashing into the initial bf609-ezkit board
> port ?  there's quite a bit of rudimentary code in bf609-ezkit.c before to
> support this.

Okay.

>
>> --- a/board/bf609-ezkit/bf609-ezkit.c
>> +++ b/board/bf609-ezkit/bf609-ezkit.c
>>
>> +/* miscellaneous platform dependent initialisations */
>> +int misc_init_r(void)
>> +{
>> +     printf("other init\n");
>
> useless display -> delete

Will be deleted.

>
>> --- /dev/null
>> +++ b/board/bf609-ezkit/soft_switch.c
>>
>> +#ifdef CONFIG_BFIN_BOARD_VERSION_1_0
>> +#define SWITCH_ADDR     0x21
>> +#else
>> +#define SWITCH_ADDR     0x20
>> +#endif
>
> must this be a runtime define ?  can't you probe the slave address at runtime
> to figure out which one to use ?
>
This will be removed. We only support board version above 1.0.

> start with the address that the newest boards are using, and then fallback to
> the older ones.  this way there's no runtime penalty on newer boards, but
> older ones continue to work.
>
> shouldn't there be a new u-boot command here so people can toggle peripherals
> themselves ?  i thought that was the intention when we first discussed this
> idea with the firmware team.

I don't know whether a blackfin specific u-boot command can be accepted.
What about merge these series with the default setting first?
Because it's already a little big, let's make it simple at first.

And then we can consider to add a new command in a separated patch in future.
Thank you.
Mike Frysinger Aug. 23, 2012, 3:53 a.m. UTC | #3
On Monday 20 August 2012 04:11:17 Bob Liu wrote:
> On Wed, Aug 8, 2012 at 12:59 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> > start with the address that the newest boards are using, and then
> > fallback to the older ones.  this way there's no runtime penalty on
> > newer boards, but older ones continue to work.
> > 
> > shouldn't there be a new u-boot command here so people can toggle
> > peripherals themselves ?  i thought that was the intention when we first
> > discussed this idea with the firmware team.
> 
> I don't know whether a blackfin specific u-boot command can be accepted.

sure it will.  we've got some already (like "bootldr" and "otp" and "cplbinfo" 
and "ldrinfo").  if it's board specific (i suspect it will be), then just add 
it to the bf609-ezkit board dir.  you can add u-boot commands in there just as 
easily as the common/ directory.

common/cmd_cplbinfo.c is probably the easiest example to get you up and 
running

> What about merge these series with the default setting first?
> Because it's already a little big, let's make it simple at first.

sure, setting up sane defaults is OK, but we'll still want the command :)
-mike
diff mbox

Patch

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