1 /*
2  * Copyright (C) 2011 Simon Guinot <sguinot@lacie.com>
3  *
4  * Based on Kirkwood support:
5  * (C) Copyright 2009
6  * Marvell Semiconductor <www.marvell.com>
7  * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
8  *
9  * SPDX-License-Identifier:	GPL-2.0+
10  */
11 
12 #include <common.h>
13 #include <command.h>
14 #include <environment.h>
15 #include <i2c.h>
16 #include <asm/mach-types.h>
17 #include <asm/arch/cpu.h>
18 #include <asm/arch/soc.h>
19 #include <asm/arch/mpp.h>
20 #include <asm/arch/gpio.h>
21 
22 #include "net2big_v2.h"
23 #include "../common/common.h"
24 #include "../common/cpld-gpio-bus.h"
25 
26 DECLARE_GLOBAL_DATA_PTR;
27 
28 int board_early_init_f(void)
29 {
30 	/* GPIO configuration */
31 	mvebu_config_gpio(NET2BIG_V2_OE_VAL_LOW, NET2BIG_V2_OE_VAL_HIGH,
32 			  NET2BIG_V2_OE_LOW, NET2BIG_V2_OE_HIGH);
33 
34 	/* Multi-Purpose Pins Functionality configuration */
35 	static const u32 kwmpp_config[] = {
36 		MPP0_SPI_SCn,
37 		MPP1_SPI_MOSI,
38 		MPP2_SPI_SCK,
39 		MPP3_SPI_MISO,
40 		MPP6_SYSRST_OUTn,
41 		MPP7_GPO,		/* Request power-off */
42 		MPP8_TW_SDA,
43 		MPP9_TW_SCK,
44 		MPP10_UART0_TXD,
45 		MPP11_UART0_RXD,
46 		MPP13_GPIO,		/* Rear power switch (on|auto) */
47 		MPP14_GPIO,		/* USB fuse alarm */
48 		MPP15_GPIO,		/* Rear power switch (auto|off) */
49 		MPP16_GPIO,		/* SATA HDD1 power */
50 		MPP17_GPIO,		/* SATA HDD2 power */
51 		MPP20_SATA1_ACTn,
52 		MPP21_SATA0_ACTn,
53 		MPP24_GPIO,		/* USB mode select */
54 		MPP26_GPIO,		/* USB device vbus */
55 		MPP28_GPIO,		/* USB enable host vbus */
56 		MPP29_GPIO,		/* CPLD GPIO bus ALE */
57 		MPP34_GPIO,		/* Rear Push button 0=on 1=off */
58 		MPP35_GPIO,		/* Inhibit switch power-off */
59 		MPP36_GPIO,		/* SATA HDD1 presence */
60 		MPP37_GPIO,		/* SATA HDD2 presence */
61 		MPP40_GPIO,		/* eSATA presence */
62 		MPP44_GPIO,		/* CPLD GPIO bus (data 0) */
63 		MPP45_GPIO,		/* CPLD GPIO bus (data 1) */
64 		MPP46_GPIO,		/* CPLD GPIO bus (data 2) */
65 		MPP47_GPIO,		/* CPLD GPIO bus (addr 0) */
66 		MPP48_GPIO,		/* CPLD GPIO bus (addr 1) */
67 		MPP49_GPIO,		/* CPLD GPIO bus (addr 2) */
68 		0
69 	};
70 
71 	kirkwood_mpp_conf(kwmpp_config, NULL);
72 
73 	return 0;
74 }
75 
76 int board_init(void)
77 {
78 	/* Machine number */
79 	gd->bd->bi_arch_number = MACH_TYPE_NET2BIG_V2;
80 
81 	/* Boot parameters address */
82 	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
83 
84 	return 0;
85 }
86 
87 #if defined(CONFIG_MISC_INIT_R)
88 
89 #if defined(CONFIG_CMD_I2C) && defined(CONFIG_SYS_I2C_G762_ADDR)
90 /*
91  * Start I2C fan (GMT G762 controller)
92  */
93 static void init_fan(void)
94 {
95 	u8 data;
96 
97 	i2c_set_bus_num(0);
98 
99 	/* Enable open-loop and PWM modes */
100 	data = 0x20;
101 	if (i2c_write(CONFIG_SYS_I2C_G762_ADDR,
102 		      G762_REG_FAN_CMD1, 1, &data, 1) != 0)
103 		goto err;
104 	data = 0;
105 	if (i2c_write(CONFIG_SYS_I2C_G762_ADDR,
106 		      G762_REG_SET_CNT, 1, &data, 1) != 0)
107 		goto err;
108 	/*
109 	 * RPM to PWM (set_out register) fan speed conversion array:
110 	 * 0    0x00
111 	 * 1500	0x04
112 	 * 2800	0x08
113 	 * 3400	0x0C
114 	 * 3700	0x10
115 	 * 4400	0x20
116 	 * 4700	0x30
117 	 * 4800	0x50
118 	 * 5200	0x80
119 	 * 5400	0xC0
120 	 * 5500	0xFF
121 	 *
122 	 * Start fan at low speed (2800 RPM):
123 	 */
124 	data = 0x08;
125 	if (i2c_write(CONFIG_SYS_I2C_G762_ADDR,
126 		      G762_REG_SET_OUT, 1, &data, 1) != 0)
127 		goto err;
128 
129 	return;
130 err:
131 	printf("Error: failed to start I2C fan @%02x\n",
132 	       CONFIG_SYS_I2C_G762_ADDR);
133 }
134 #else
135 static void init_fan(void) {}
136 #endif /* CONFIG_CMD_I2C && CONFIG_SYS_I2C_G762_ADDR */
137 
138 #if defined(CONFIG_NET2BIG_V2) && defined(CONFIG_KIRKWOOD_GPIO)
139 /*
140  * CPLD GPIO bus:
141  *
142  * - address register : bit [0-2] -> GPIO [47-49]
143  * - data register    : bit [0-2] -> GPIO [44-46]
144  * - enable register  : GPIO 29
145  */
146 static unsigned cpld_gpio_bus_addr[] = { 47, 48, 49 };
147 static unsigned cpld_gpio_bus_data[] = { 44, 45, 46 };
148 
149 static struct cpld_gpio_bus cpld_gpio_bus = {
150 	.addr		= cpld_gpio_bus_addr,
151 	.num_addr	= ARRAY_SIZE(cpld_gpio_bus_addr),
152 	.data		= cpld_gpio_bus_data,
153 	.num_data	= ARRAY_SIZE(cpld_gpio_bus_data),
154 	.enable		= 29,
155 };
156 
157 /*
158  * LEDs configuration:
159  *
160  * The LEDs are controlled by a CPLD and can be configured through
161  * the CPLD GPIO bus.
162  *
163  * Address register selection:
164  *
165  * addr | register
166  * ----------------------------
167  *   0  | front LED
168  *   1  | front LED brightness
169  *   2  | SATA LED brightness
170  *   3  | SATA0 LED
171  *   4  | SATA1 LED
172  *   5  | SATA2 LED
173  *   6  | SATA3 LED
174  *   7  | SATA4 LED
175  *
176  * Data register configuration:
177  *
178  * data | LED brightness
179  * -------------------------------------------------
180  *   0  | min (off)
181  *   -  | -
182  *   7  | max
183  *
184  * data | front LED mode
185  * -------------------------------------------------
186  *   0  | fix off
187  *   1  | fix blue on
188  *   2  | fix red on
189  *   3  | blink blue on=1 sec and blue off=1 sec
190  *   4  | blink red on=1 sec and red off=1 sec
191  *   5  | blink blue on=2.5 sec and red on=0.5 sec
192  *   6  | blink blue on=1 sec and red on=1 sec
193  *   7  | blink blue on=0.5 sec and blue off=2.5 sec
194  *
195  * data | SATA LED mode
196  * -------------------------------------------------
197  *   0  | fix off
198  *   1  | SATA activity blink
199  *   2  | fix red on
200  *   3  | blink blue on=1 sec and blue off=1 sec
201  *   4  | blink red on=1 sec and red off=1 sec
202  *   5  | blink blue on=2.5 sec and red on=0.5 sec
203  *   6  | blink blue on=1 sec and red on=1 sec
204  *   7  | fix blue on
205  */
206 static void init_leds(void)
207 {
208 	/* Enable the front blue LED */
209 	cpld_gpio_bus_write(&cpld_gpio_bus, 0, 1);
210 	cpld_gpio_bus_write(&cpld_gpio_bus, 1, 3);
211 
212 	/* Configure SATA LEDs to blink in relation with the SATA activity */
213 	cpld_gpio_bus_write(&cpld_gpio_bus, 3, 1);
214 	cpld_gpio_bus_write(&cpld_gpio_bus, 4, 1);
215 	cpld_gpio_bus_write(&cpld_gpio_bus, 2, 3);
216 }
217 #else
218 static void init_leds(void) {}
219 #endif /* CONFIG_NET2BIG_V2 && CONFIG_KIRKWOOD_GPIO */
220 
221 int misc_init_r(void)
222 {
223 	init_fan();
224 #if defined(CONFIG_CMD_I2C) && defined(CONFIG_SYS_I2C_EEPROM_ADDR)
225 	if (!env_get("ethaddr")) {
226 		uchar mac[6];
227 		if (lacie_read_mac_address(mac) == 0)
228 			eth_env_set_enetaddr("ethaddr", mac);
229 	}
230 #endif
231 	init_leds();
232 
233 	return 0;
234 }
235 #endif /* CONFIG_MISC_INIT_R */
236 
237 #if defined(CONFIG_CMD_NET) && defined(CONFIG_RESET_PHY_R)
238 /* Configure and initialize PHY */
239 void reset_phy(void)
240 {
241 	mv_phy_88e1116_init("egiga0", 8);
242 }
243 #endif
244 
245 #if defined(CONFIG_KIRKWOOD_GPIO)
246 /* Return GPIO push button status */
247 static int
248 do_read_push_button(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
249 {
250 	return !kw_gpio_get_value(NET2BIG_V2_GPIO_PUSH_BUTTON);
251 }
252 
253 U_BOOT_CMD(button, 1, 1, do_read_push_button,
254 	   "Return GPIO push button status 0=off 1=on", "");
255 #endif
256