blob: 8055312882fdf6e9fa0f3d5398c1300db30ecd99 [file] [log] [blame]
/*
* Copyright (c) 2010-2012 Nest Labs, Inc.
*
* (C) Copyright 2004-2008
* Texas Instruments, <www.ti.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Description:
* This file is the board-specific set-up for the Nest Learning
* Thermostat board, based on the TI OMAP3 AM3703ACUS, focusing
* primarily on GPIO, RAM and flash initialization.
*
* This is inherited from the OMAP3 EVM equivalent file.
*/
#include <common.h>
#include <netdev.h>
#include <asm/gpio.h>
#include <asm/io.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/arch/gpio.h>
#include <asm/arch/mem.h>
#include <asm/arch/mmc_host_def.h>
#include <asm/arch/mux.h>
#include <asm/arch/omap_gpmc.h>
#include <asm/arch/sys_proto.h>
#include <linux/string.h>
#include <linux/mtd/nand.h>
#include <i2c.h>
#include <mmc.h>
#include "diamond.h"
#include "diamond-gpio.h"
#include "j49-gpio.h"
#include "nlmodel.h"
/*
* Preprocessor Definitions
*/
#if defined(CONFIG_DIAMOND_BOARD_MULTI)
#define DIAMOND_BOARD_DEVELOPMENT_MODEL_INDEX 0
#define DIAMOND_BOARD_PROTOTYPE_MODEL_INDEX 1
#define DIAMOND_BOARD_EVT_MODEL_INDEX 2
#define DIAMOND_BOARD_DVT_MODEL_INDEX 3
#define DIAMOND_BOARD_PVT_MODEL_INDEX 4
#define J49_BOARD_PROTOTYPE_MODEL_INDEX 5
#define J49_BOARD_EVT_MODEL_INDEX 6
#define J49_BOARD_DVT_MODEL_INDEX 7
#define J49_BOARD_PRE_PVT_MODEL_INDEX 8
#define J49_BOARD_PVT_MODEL_INDEX 9
#else
#define DIAMOND_BOARD_DEVELOPMENT_MODEL_INDEX 0
#define DIAMOND_BOARD_PROTOTYPE_MODEL_INDEX 0
#define DIAMOND_BOARD_EVT_MODEL_INDEX 0
#define DIAMOND_BOARD_DVT_MODEL_INDEX 0
#define DIAMOND_BOARD_PVT_MODEL_INDEX 0
#define J49_BOARD_PROTOTYPE_MODEL_INDEX 0
#define J49_BOARD_EVT_MODEL_INDEX 0
#define J49_BOARD_DVT_MODEL_INDEX 0
#define J49_BOARD_PRE_PVT_MODEL_INDEX 0
#define J49_BOARD_PVT_MODEL_INDEX 0
#endif /* defined(CONFIG_DIAMOND_BOARD_MULTI) */
#define DIAMOND_DEFAULT_MODEL_INDEX J49_BOARD_PROTOTYPE_MODEL_INDEX
#define DIAMOND_DEFAULT_MODEL_IDENTIFIER "Display-2.0"
/*
* Type Definitions
*/
struct diamond_model {
ulong machine;
const struct nlmodel *model;
const char *name;
void (*mux_init)(void);
void (*gpio_init)(void);
int (*misc_init)(void);
int (*eth_init)(bd_t *bis);
};
/*
* Function Prototypes
*/
#if defined(CONFIG_CMD_NET)
static void setup_net_chip(void);
#endif
#if defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_development_mux_init(void);
static void diamond_development_gpio_init(void);
static int diamond_development_misc_init(void);
static int diamond_development_eth_init(bd_t *bis);
#endif /* defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_prototype_mux_init(void);
static void diamond_prototype_gpio_init(void);
#endif /* defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_EVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_evt_mux_init(void);
static void diamond_evt_gpio_init(void);
#endif /* defined(CONFIG_DIAMOND_BOARD_EVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_DVT) || defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_dvt_mux_init(void);
static void diamond_dvt_gpio_init(void);
#endif /* defined(CONFIG_DIAMOND_BOARD_DVT) || defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_pvt_mux_init(void);
static void diamond_pvt_gpio_init(void);
#endif /* defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_PROTOTYPE) || defined(CONFIG_J49_BOARD_MULTI)
static void j49_prototype_mux_init(void);
static void j49_prototype_gpio_init(void);
#endif /* defined(CONFIG_J49_BOARD_PROTOTYPE) || defined(CONFIG_J49_BOARD_MULTI) */
#if defined (CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI)
static void j49_evt_mux_init(void);
static void j49_evt_gpio_init(void);
#endif /* defined (CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI) */
void add_brightness(void);
/*
* Global Variables
*/
const char *bootdelay_identifier_key = "bootdelay";
#if defined(CONFIG_DIAMOND_BOARD_MULTI)
static struct nlmodel model;
static const char *diamond_family = "Diamond";
static const char *j49_family = "Display";
static const int diamond_product = 1;
static const int j49_product = 2;
#endif /* defined(CONFIG_DIAMOND_BOARD_MULTI) */
/*
* Astue readers will ask, "Why is the machine type OMAP3EVM for Diamond boards?". Because that's
* the machine ID that such boards started life as and if a pairing of U-Boot that advertises DIAMOND
* with a Linux kernel that only knows OMAP3EVM, the system will not boot.
*/
static struct diamond_model diamond_models[] = {
#if defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
[DIAMOND_BOARD_DEVELOPMENT_MODEL_INDEX] = {
MACH_TYPE_OMAP3EVM,
NULL,
"Diamond Development",
diamond_development_mux_init,
diamond_development_gpio_init,
diamond_development_misc_init,
diamond_development_eth_init
},
#endif /* defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) || defined(CONFIG_DIAMOND_BOARD_MULTI)
[DIAMOND_BOARD_PROTOTYPE_MODEL_INDEX] = {
MACH_TYPE_OMAP3EVM,
NULL,
"Diamond Prototype",
diamond_prototype_mux_init,
diamond_prototype_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_EVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
[DIAMOND_BOARD_EVT_MODEL_INDEX] = {
MACH_TYPE_OMAP3EVM,
NULL,
"Diamond EVT",
diamond_evt_mux_init,
diamond_evt_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_DIAMOND_BOARD_EVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_DVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
[DIAMOND_BOARD_DVT_MODEL_INDEX] = {
MACH_TYPE_OMAP3EVM,
NULL,
"Diamond DVT",
diamond_dvt_mux_init,
diamond_dvt_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_DIAMOND_BOARD_DVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
[DIAMOND_BOARD_PVT_MODEL_INDEX] = {
MACH_TYPE_OMAP3EVM,
NULL,
"Diamond PVT",
diamond_pvt_mux_init,
diamond_pvt_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_PROTOTYPE) || defined(CONFIG_J49_BOARD_MULTI)
[J49_BOARD_PROTOTYPE_MODEL_INDEX] = {
MACH_TYPE_J49,
NULL,
"J49 Prototype",
j49_prototype_mux_init,
j49_prototype_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_J49_BOARD_PROTOTYPE) || defined(CONFIG_J49_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_MULTI)
[J49_BOARD_EVT_MODEL_INDEX] = {
MACH_TYPE_J49,
NULL,
"J49 EVT",
j49_evt_mux_init,
j49_evt_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_MULTI)
[J49_BOARD_DVT_MODEL_INDEX] = {
MACH_TYPE_J49,
NULL,
"J49 DVT",
j49_evt_mux_init,
j49_evt_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_MULTI)
[J49_BOARD_PRE_PVT_MODEL_INDEX] = {
MACH_TYPE_J49,
NULL,
"J49 Pre-PVT",
j49_evt_mux_init,
j49_evt_gpio_init,
NULL,
NULL
},
#endif /* defined(CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI)
[J49_BOARD_PVT_MODEL_INDEX] = {
MACH_TYPE_J49,
NULL,
"J49 PVT",
j49_evt_mux_init,
j49_evt_gpio_init,
NULL,
NULL
}
#endif /* defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI) */
};
const omap3_sysinfo sysinfo = {
DDR_DISCRETE,
"Diamond",
"NAND",
};
static struct diamond_model *diamond_model = NULL;
static const char *bootargs_key = "bootargs";
static const char *brightness_key = "brightness";
static const char *panic_key = "panic";
DECLARE_GLOBAL_DATA_PTR;
static void inline diamond_gpio_input(unsigned int gpio)
{
gpio_request(gpio, "");
gpio_direction_input(gpio);
}
static void inline diamond_gpio_output(unsigned int gpio, int value)
{
gpio_request(gpio, "");
gpio_direction_output(gpio, value);
}
static void diamond_generic_gpio_init(void)
{
/* Backplate GPIOs */
diamond_gpio_input(DIAMOND_GPIO_BACKPLATE_DETECT);
/* LCD GPIOs */
diamond_gpio_output(DIAMOND_GPIO_LCD_RESETB, 0);
/* WiFi GPIOs */
diamond_gpio_output(DIAMOND_GPIO_WIFI_ENABLE, 0);
diamond_gpio_input(DIAMOND_GPIO_WIFI_IRQ);
/* ZigBee GPIOs */
diamond_gpio_output(DIAMOND_GPIO_ZIGBEE_RESET_L, 0);
}
#if defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_development_mux_init(void)
{
// Assign GPMC_A10 to GPIO_43 used as push-pull, active low output
// LCD_nENBUFFER for the 1.8V to 3.3V LCD buffer enable.
MUX_VAL(CP(GPMC_A10), (IDIS | PTD | DIS | M4)); // GPIO_43
// Assign to GPMC_NCS3 for Samsung K9F4G08U0C 512 MiB SLC NAND
// Flash
MUX_VAL(CP(GPMC_NCS3), (IDIS | PTU | EN | M0)); // GPMC_nCS3
// Assign to GPMC_NCS5 for SMSC LAN9220 10/100 Mbit Ethernet MAC
// and PHY
MUX_VAL(CP(GPMC_NCS5), (IDIS | PTU | EN | M0)); // GPMC_nCS5
// Assign CAM_PCLK to GPIO_97 used as a push-pull, input from the
// PMU charger suspend signal.
MUX_VAL(CP(CAM_PCLK), (IEN | PTD | DIS | M4)); // GPIO_97
// Assign CAM_D0 to GPIO_99 used as a push-pull input from the
// active-low PMU charger charge signal.
MUX_VAL(CP(CAM_D0), (IEN | PTD | DIS | M4)); // GPIO_99
// Assign CAM_D2 to GPIO_101 used as a push-pull, active high
// LCD_ENVDD LCD Vdd enable.
MUX_VAL(CP(CAM_D2), (IDIS | PTD | DIS | M4)); // GPIO_101
// Assign CAM_D{6,7,8,9} to GPIO_{105,106,107,108} used as
// push-pull, active-high inputs ROTARY_{DIR,VALID,LAST_DIR,LAST_VALID}
// from the rotary input state storage.
MUX_VAL(CP(CAM_D6), (IEN | PTD | DIS | M4)); // GPIO_105
MUX_VAL(CP(CAM_D7), (IEN | PTD | DIS | M4)); // GPIO_106
MUX_VAL(CP(CAM_D8), (IEN | PTD | DIS | M4)); // GPIO_107
MUX_VAL(CP(CAM_D9), (IEN | PTD | DIS | M4)); // GPIO_108
// Assign CAM_D10 to GPIO_109 used as a push-pull, active low
// output LCD_nRESET for the Samsung LMS350DF03 LCD reset.
MUX_VAL(CP(CAM_D10), (IDIS | PTD | DIS | M4)); // GPIO_109
// Assign CAM_D11 to GPIO_110 used as a push-pull, active-low
// output ROTARY_CLEAR to the rotary input state storage.
MUX_VAL(CP(CAM_D11), (IDIS | PTD | DIS | M4)); // GPIO_110
// Assign CAM_STROBE to GPIO used as a push-pull input from the
// PMU double-current signal.
MUX_VAL(CP(CAM_STROBE), (IEN | PTD | DIS | M4)); // GPIO_126
// Assign UART3_CTS_RCTX to GPIO_163 used as a push-pull input
// from the ZigBee CPU.
MUX_VAL(CP(UART3_CTS_RCTX), (IEN | PTD | DIS | M4)); // GPIO_163
// The MCSPI1 interface is unused. Place the associated pins in
// safe mode (Mode 7).
MUX_VAL(CP(MCSPI1_CLK), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_SIMO), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_SOMI), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_CS0), (IDIS | PTD | DIS | M7)); // Unused
// Surprisingly, per http://e2e.ti.com/support/dsp/
// omap_applications_processors/f/447/p/54130/193260.aspx#193260,
// the SPI clock MUST be configured as an input for the SPI
// interface to work correctly.
MUX_VAL(CP(MCSPI2_CLK), (IEN | PTD | DIS | M0)); // MCSPI2_CLK
MUX_VAL(CP(MCSPI2_SIMO), (IEN | PTD | DIS | M0)); // MCSPI2_SIMO
MUX_VAL(CP(MCSPI2_CS0), (IEN | PTD | EN | M0)); // MCSPI2_CS0
// Assign MCBSP1_FSR to GPIO_157 used as a push-pull, active-low
// reset output to the SMSC9220 Ethernet.
MUX_VAL(CP(MCBSP1_FSR), (IDIS | PTD | DIS | M4)); // GPIO_157
// Assign MCBSP1_FSX to GPIO_161 used as a push-pull, active
// interrupt input from the Silicon Labs 143 Proximity / Ambient
// Light Sensor
MUX_VAL(CP(MCBSP1_FSX), (IEN | PTD | DIS | M4)); // GPIO_161
// Assign MCBSP1_CLKX to GPIO_162 used as an externally pulled-up
// interrupt input from the SMSC9220 Ethernet.
MUX_VAL(CP(MCBSP1_CLKX), (IEN | PTD | DIS | M4)); // GPIO_162
// Assign MCBSP1_DX to GPIO_158 used as a push-pull, active-high
// output to the ZigBee power supply.
MUX_VAL(CP(MCBSP1_DX), (IDIS | PTD | DIS | M4)); // GPIO_158
}
static void diamond_development_gpio_init(void)
{
diamond_generic_gpio_init();
/* Backplate GPIOs */
diamond_gpio_output(DIAMOND_GPIO_BACKPLATE_3V3_ENABLE, 0);
/* LCD GPIOs */
diamond_gpio_output(DIAMOND_GPIO_LCD_NENABLE_BUFFER, 1);
diamond_gpio_output(DIAMOND_GPIO_LCD_ENABLE_VDD, 0);
/* Rotary Control GPIOs */
diamond_gpio_input(DIAMOND_GPIO_ROTARY_DIR);
diamond_gpio_input(DIAMOND_GPIO_ROTARY_VALID);
diamond_gpio_input(DIAMOND_GPIO_ROTARY_LAST_DIR);
diamond_gpio_input(DIAMOND_GPIO_ROTARY_LAST_VALID);
diamond_gpio_output(DIAMOND_GPIO_ROTARY_CLEAR, 1);
/* Zigbee GPIOs */
diamond_gpio_output(DIAMOND_GPIO_ZIGBEE_PWR_ENABLE, 0);
/* Miscellaneous GPIOs */
diamond_gpio_input(DIAMOND_GPIO_PROX_ALS_IRQ);
}
static int diamond_development_misc_init(void)
{
int rc = 0;
#if defined(CONFIG_CMD_NET)
setup_net_chip();
#endif
return rc;
}
static int diamond_development_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_SMC911X
rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
#endif
return rc;
}
#endif /* defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_prototype_mux_init(void)
{
// Assign CAM_D6 to GPIO_105 used as a push-pull, active-low input
// LCD_ID from the LCD module flexible printed circuit.
MUX_VAL(CP(CAM_D6), (IEN | PTD | DIS | M4)); // GPIO_105
// Assign I2C3_SCL to GPIO_184 used as a push-pull active-low
// output OFN_RESET_L to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor NRST input.
MUX_VAL(CP(I2C3_SCL), (IDIS | PTD | DIS | M4)); // GPIO_184
// Assign I2C3_SDA to GPIO_185 used as a push-pull active-high
// output OFN_SHUTDOWN to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor SHTDWN input.
MUX_VAL(CP(I2C3_SDA), (IDIS | PTD | DIS | M4)); // GPIO_185
// Assign CAM_D9 to GPIO_108 used as a push-pull active-low
// input OFN_MOTION_L from the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor MOTION output.
MUX_VAL(CP(CAM_D9), (IEN | PTD | DIS | M4)); // GPIO_108
// Assign CAM_D10 to GPIO_109 used as a push-pull, active low
// output LCD_nRESET for the Tianma TM025ZDZ01 LCD reset.
MUX_VAL(CP(CAM_D10), (IDIS | PTD | DIS | M4)); // GPIO_109
// The MCSPI1 interface is unused. Place the associated pins in
// safe mode (Mode 7).
MUX_VAL(CP(MCSPI1_CLK), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_SIMO), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_SOMI), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_CS0), (IDIS | PTD | DIS | M7)); // Unused
// Surprisingly, per http://e2e.ti.com/support/dsp/
// omap_applications_processors/f/447/p/54130/193260.aspx#193260,
// the SPI clock MUST be configured as an input for the SPI
// interface to work correctly.
MUX_VAL(CP(MCSPI2_CLK), (IEN | PTD | DIS | M0)); // MCSPI2_CLK
MUX_VAL(CP(MCSPI2_SIMO), (IEN | PTD | DIS | M0)); // MCSPI2_SIMO
MUX_VAL(CP(MCSPI2_CS0), (IEN | PTD | EN | M0)); // MCSPI2_CS0
// Assign MCBSP1_DX to GPIO_158 used as a push-pull, active-high
// output to the ZigBee power supply.
MUX_VAL(CP(MCBSP1_DX), (IDIS | PTD | DIS | M4)); // GPIO_158
}
static void diamond_prototype_gpio_init(void)
{
diamond_generic_gpio_init();
/* Backplate GPIOs */
diamond_gpio_output(DIAMOND_GPIO_BACKPLATE_RESET, 0);
/* LCD GPIOs */
diamond_gpio_input(DIAMOND_GPIO_LCD_ID);
/* Optical Finger Navigation (OFN) Sensor GPIOs */
diamond_gpio_output(DIAMOND_PROTOTYPE_GPIO_OFN_SHUTDOWN, 1);
diamond_gpio_output(DIAMOND_PROTOTYPE_GPIO_OFN_RESET_L, 0);
diamond_gpio_input(DIAMOND_GPIO_OFN_MOTION_L);
/* Zigbee GPIOs */
diamond_gpio_output(DIAMOND_GPIO_ZIGBEE_PWR_ENABLE, 0);
/* Miscellaneous GPIOs */
diamond_gpio_output(DIAMOND_GPIO_PIEZO_NENABLE, 1);
}
#endif /* defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_EVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_evt_mux_init(void)
{
// Assign CAM_D6 to GPIO_105 used as a push-pull, active-low input
// LCD_ID from the LCD module flexible printed circuit.
MUX_VAL(CP(CAM_D6), (IEN | PTD | DIS | M4)); // GPIO_105
// Assign CAM_D11 to GPIO_110 used as a push-pull active-low
// output OFN_RESET_L to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor NRST input.
MUX_VAL(CP(CAM_D11), (IDIS | PTD | DIS | M4)); // GPIO_110
// Assign CAM_D2 to GPIO_101 used as a push-pull active-high
// output OFN_SHUTDOWN to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor SHTDWN input.
MUX_VAL(CP(CAM_D2), (IDIS | PTD | DIS | M4)); // GPIO_101
// Assign CAM_D9 to GPIO_108 used as a push-pull active-low
// input OFN_MOTION_L from the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor MOTION output.
MUX_VAL(CP(CAM_D9), (IEN | PTD | DIS | M4)); // GPIO_108
// Assign CAM_D10 to GPIO_109 used as a push-pull, active low
// output LCD_nRESET for the Tianma TM025ZDZ01 LCD reset.
MUX_VAL(CP(CAM_D10), (IDIS | PTD | DIS | M4)); // GPIO_109
// The MCSPI1 interface is unused. Place the associated pins in
// safe mode (Mode 7).
MUX_VAL(CP(MCSPI1_CLK), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_SIMO), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_SOMI), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_CS0), (IDIS | PTD | DIS | M7)); // Unused
// Surprisingly, per http://e2e.ti.com/support/dsp/
// omap_applications_processors/f/447/p/54130/193260.aspx#193260,
// the SPI clock MUST be configured as an input for the SPI
// interface to work correctly.
MUX_VAL(CP(MCSPI2_CLK), (IEN | PTD | DIS | M0)); // MCSPI2_CLK
MUX_VAL(CP(MCSPI2_SIMO), (IEN | PTD | DIS | M0)); // MCSPI2_SIMO
MUX_VAL(CP(MCSPI2_CS0), (IEN | PTD | EN | M0)); // MCSPI2_CS0
// Assign MCBSP1_FSX to GPIO_161 used as a push-pull, active high
// output BATT_DISCONNECT for the battery management circuit.
MUX_VAL(CP(MCBSP1_FSX), (IDIS | PTD | DIS | M4)); // GPIO_161
// Assign MCBSP1_DX to GPIO_158 used as a push-pull, active-high
// output to the ZigBee power supply.
MUX_VAL(CP(MCBSP1_DX), (IDIS | PTD | DIS | M4)); // GPIO_158
}
static void diamond_evt_gpio_init(void)
{
diamond_generic_gpio_init();
/* Backplate GPIOs */
diamond_gpio_output(DIAMOND_GPIO_BACKPLATE_RESET, 0);
/* LCD GPIOs */
diamond_gpio_input(DIAMOND_GPIO_LCD_ID);
/* Optical Finger Navigation (OFN) Sensor GPIOs */
diamond_gpio_output(DIAMOND_EVT_GPIO_OFN_SHUTDOWN, 1);
diamond_gpio_output(DIAMOND_EVT_GPIO_OFN_RESET_L, 0);
diamond_gpio_input(DIAMOND_GPIO_OFN_MOTION_L);
/* Zigbee GPIOs */
diamond_gpio_output(DIAMOND_GPIO_ZIGBEE_PWR_ENABLE, 0);
/* Miscellaneous GPIOs */
diamond_gpio_output(DIAMOND_GPIO_PIEZO_NENABLE, 1);
diamond_gpio_output(DIAMOND_GPIO_BATT_DISCONNECT, 0);
}
#endif /* defined(CONFIG_DIAMOND_BOARD_EVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_DVT) || defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_dvt_mux_init(void)
{
// Assign CAM_D6 to GPIO_105 used as a push-pull, active-low input
// LCD_ID from the LCD module flexible printed circuit.
MUX_VAL(CP(CAM_D6), (IEN | PTD | DIS | M4)); // GPIO_105
// Assign CAM_D11 to GPIO_110 used as a push-pull active-low
// output OFN_RESET_L to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor NRST input.
MUX_VAL(CP(CAM_D11), (IDIS | PTD | DIS | M4)); // GPIO_110
// Assign CAM_D2 to GPIO_101 used as a push-pull active-high
// output OFN_SHUTDOWN to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor SHTDWN input.
MUX_VAL(CP(CAM_D2), (IDIS | PTD | DIS | M4)); // GPIO_101
// Assign CAM_D9 to GPIO_108 used as a push-pull active-low
// input OFN_MOTION_L from the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor MOTION output.
MUX_VAL(CP(CAM_D9), (IEN | PTD | DIS | M4)); // GPIO_108
// Assign CAM_D10 to GPIO_109 used as a push-pull, active low
// output LCD_nRESET for the Tianma TM025ZDZ01 LCD reset.
MUX_VAL(CP(CAM_D10), (IDIS | PTD | DIS | M4)); // GPIO_109
// Surprisingly, per http://e2e.ti.com/support/dsp/
// omap_applications_processors/f/447/p/54130/193260.aspx#193260,
// the SPI clock MUST be configured as an input for the SPI
// interface to work correctly.
MUX_VAL(CP(MCSPI1_CLK), (IEN | PTD | DIS | M0)); // MCSPI1_CLK
MUX_VAL(CP(MCSPI1_SIMO), (IDIS | PTD | DIS | M0)); // MCSPI1_SIMO
MUX_VAL(CP(MCSPI1_SOMI), (IEN | PTD | DIS | M0)); // MCSPI1_SOMI
MUX_VAL(CP(MCSPI1_CS0), (IDIS | PTD | EN | M0)); // MCSPI1_CS0
MUX_VAL(CP(MCSPI2_CLK), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI2_SIMO), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI2_CS0), (IDIS | PTD | DIS | M7)); // Unused
// Assign MCBSP1_FSX to GPIO_161 used as a push-pull, active high
// output BATT_DISCONNECT for the battery management circuit.
MUX_VAL(CP(MCBSP1_FSX), (IDIS | PTD | DIS | M4)); // GPIO_161
// Assign MCBSP1_DX to GPIO_158 used as a push-pull, active-high
// output to the ZigBee power supply.
MUX_VAL(CP(MCBSP1_DX), (IDIS | PTD | DIS | M4)); // GPIO_158
}
static void diamond_dvt_gpio_init(void)
{
diamond_generic_gpio_init();
/* Backplate GPIOs */
diamond_gpio_output(DIAMOND_GPIO_BACKPLATE_RESET, 0);
/* LCD GPIOs */
diamond_gpio_input(DIAMOND_GPIO_LCD_ID);
/* Optical Finger Navigation (OFN) Sensor GPIOs */
diamond_gpio_output(DIAMOND_EVT_GPIO_OFN_SHUTDOWN, 1);
diamond_gpio_output(DIAMOND_EVT_GPIO_OFN_RESET_L, 0);
diamond_gpio_input(DIAMOND_GPIO_OFN_MOTION_L);
/* Zigbee GPIOs */
diamond_gpio_output(DIAMOND_GPIO_ZIGBEE_PWR_ENABLE, 0);
/* Miscellaneous GPIOs */
diamond_gpio_output(DIAMOND_GPIO_PIEZO_NENABLE, 1);
diamond_gpio_output(DIAMOND_GPIO_BATT_DISCONNECT, 0);
}
#endif /* defined(CONFIG_DIAMOND_BOARD_DVT) || defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI)
static void diamond_pvt_mux_init(void)
{
diamond_dvt_mux_init();
}
static void diamond_pvt_gpio_init(void)
{
diamond_dvt_gpio_init();
}
#endif /* defined(CONFIG_DIAMOND_BOARD_PVT) || defined(CONFIG_DIAMOND_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_PROTOTYPE) || defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI)
static void j49_prototype_mux_init(void)
{
MUX_VAL(CP(GPMC_A9), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCSPI1_CS3), (IEN | PTD | EN | M5)); // LCD_BL_HWEN
// Assign CAM_D6 to GPIO_105 used as a push-pull, active-low input
// LCD_ID from the LCD module flexible printed circuit.
MUX_VAL(CP(CAM_D6), (IEN | PTU | EN | M4)); // GPIO_105
// Assign CAM_D11 to GPIO_110 used as a push-pull active-low
// output OFN_RESET_L to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor NRST input.
MUX_VAL(CP(CAM_D11), (IDIS | PTD | DIS | M4)); // GPIO_110
// Assign CAM_D2 to GPIO_101 used as a push-pull active-high
// output OFN_SHUTDOWN to the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor SHTDWN input.
MUX_VAL(CP(CAM_D2), (IDIS | PTD | DIS | M4)); // GPIO_101
// Assign CAM_D9 to GPIO_108 used as a push-pull active-low
// input OFN_MOTION_L from the Avago ADBS A320 Optical Finger
// Navigation (OFN) sensor MOTION output.
MUX_VAL(CP(CAM_D9), (IEN | PTD | DIS | M4)); // GPIO_108
// Assign CAM_D10 to GPIO_109 used as a push-pull, active low
// output LCD_nRESET for the Tianma TM025ZDZ01 LCD reset.
MUX_VAL(CP(CAM_D10), (IDIS | PTD | DIS | M4)); // GPIO_109
MUX_VAL(CP(MCSPI1_CLK), (IDIS | PTD | DIS | M0)); // LCD_SPI_CLK
MUX_VAL(CP(MCSPI1_SIMO), (IDIS | PTD | DIS | M0)); // LCD_SPI_MOSI
MUX_VAL(CP(MCSPI1_SOMI), (IEN | PTD | DIS | M0)); // LCD_SPI_MISO
MUX_VAL(CP(MCSPI1_CS0), (IDIS | PTD | EN | M0)); // LCD_SPI_CS_L
MUX_VAL(CP(MCSPI2_CLK), (IEN | PTD | DIS | M0)); // ZIG_SPI_SCLK
MUX_VAL(CP(MCSPI2_SIMO), (IDIS | PTD | DIS | M0)); // ZIG_SPI_MOSI
MUX_VAL(CP(MCSPI2_SOMI), (IEN | PTD | EN | M0)); // ZIG_SPI_MISO
MUX_VAL(CP(MCSPI2_CS0), (IDIS | PTD | DIS | M0)); // ZIG_SPI_CS_L
MUX_VAL(CP(MCSPI2_CS1), (IEN | PTU | EN | M4)); // ZIG_INT_L
MUX_VAL(CP(MCBSP3_DX), (IEN | PTD | DIS | M4)); // ZIG_PTI_EN
MUX_VAL(CP(MCBSP3_DR), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCBSP3_CLKX), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(MCBSP3_FSX), (IEN | PTD | DIS | M1)); // ZIG_PIT_DATA
MUX_VAL(CP(MCBSP1_CLKR), (IDIS | PTD | EN | M7)); // BP_PRIMARY_LDO_DISABLE
MUX_VAL(CP(ETK_D14_ES2), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(ETK_D15_ES2), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(UART1_RTS), (IDIS | PTD | DIS | M7)); // Unused
MUX_VAL(CP(UART1_CTS), (IDIS | PTU | DIS | M7)); // Unused
// Assign MCBSP1_FSX to GPIO_161 used as a push-pull, active high
// output BATT_DISCONNECT for the battery management circuit.
MUX_VAL(CP(MCBSP1_FSX), (IDIS | PTD | DIS | M4)); // GPIO_161
// ZIG_PWR_EN set to high Z for now, Andrea to investigate further
MUX_VAL(CP(MCBSP2_DX), (IDIS | PTD | DIS | M7));
}
static void j49_prototype_gpio_init(void)
{
diamond_generic_gpio_init();
/* Backplate GPIOs */
diamond_gpio_output(DIAMOND_GPIO_BACKPLATE_RESET, 0);
/* LCD GPIOs */
diamond_gpio_input(DIAMOND_GPIO_LCD_ID);
/* Optical Finger Navigation (OFN) Sensor GPIOs */
diamond_gpio_output(DIAMOND_EVT_GPIO_OFN_SHUTDOWN, 1);
diamond_gpio_output(DIAMOND_EVT_GPIO_OFN_RESET_L, 0);
diamond_gpio_input(DIAMOND_GPIO_OFN_MOTION_L);
/* Miscellaneous GPIOs */
diamond_gpio_output(DIAMOND_GPIO_PIEZO_NENABLE, 1);
diamond_gpio_output(DIAMOND_GPIO_BATT_DISCONNECT, 0);
}
#endif /* defined(CONFIG_J49_BOARD_PROTOTYPE) || defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_DVT) || defined (CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI) */
#if defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_PRE_PVT)|| defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI)
static void j49_evt_gpio_init(void)
{
j49_prototype_gpio_init();
}
static void j49_evt_mux_init(void)
{
j49_prototype_mux_init();
}
#endif /* defined(CONFIG_J49_BOARD_EVT) || defined(CONFIG_J49_BOARD_DVT) || defined(CONFIG_J49_BOARD_PRE_PVT) || defined(CONFIG_J49_BOARD_PVT) || defined(CONFIG_J49_BOARD_MULTI) */
/*
* int board_init()
*
* Description:
* This routine performs very early hardware initialization.
*
* At the time of invocation, little to nothing has been
* initialized. Not interrupts, not the console, not the
* environment, not NAND...nothing.
*
* Input(s):
* N/A
*
* Output(s):
* N/A
*
* Returns:
* 0 if successful; otherwise, < 0.
*
*/
int board_init(void)
{
gpmc_init(); /* in SRAM or SDRAM, finish GPMC */
/* Default board ID for Linux, we'll fix this up later. */
gd->bd->bi_arch_number = MACH_TYPE_OMAP3EVM;
/* boot param addr */
gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
return 0;
}
/*
* init misc_init_r()
*
* Description:
* This routine performs later miscellaneous platform-dependent
* initializations after relocation to RAM has completed.
*
* At the time of invocation, most things, save interrupts and
* networking, have been initialized.
*
* Input(s):
* N/A
*
* Output(s):
* N/A
*
* Returns:
* 0 if successful; otherwise, < 0.
*
*/
int misc_init_r(void)
{
const char *serial;
const char *bootdelay_str;
int dirty = 0;
#if defined(CONFIG_PREBOOT) && defined(CONFIG_DFU)
char cmd[64] = { '\0' };
#endif /* defined(CONFIG_PREBOOT) && defined(CONFIG_DFU) */
#if defined(CONFIG_DIAMOND_BOARD_MULTI)
const char *identifier;
int status;
status = nlmodel_init(&model);
if (status != 0)
goto punt;
identifier = nlmodel_identifier();
if (identifier == NULL) {
setenv(nlmodel_identifier_key, DIAMOND_DEFAULT_MODEL_IDENTIFIER);
dirty = 1;
identifier = nlmodel_identifier();
}
status = nlmodel_parse(identifier, &model);
if (status != 0)
goto punt;
if ((strcmp(model.family, diamond_family) != 0) && (strcmp(model.family, j49_family) != 0)) {
printf("Unknown model family '%s'\n", model.family);
goto punt;
}
if (model.product == diamond_product) {
if (model.revision >= 0 && model.revision <= 3) {
diamond_model = &diamond_models[DIAMOND_BOARD_DEVELOPMENT_MODEL_INDEX];
} else if (model.revision == 4 || model.revision == 5) {
diamond_model = &diamond_models[DIAMOND_BOARD_PROTOTYPE_MODEL_INDEX];
} else if (model.revision == 6) {
diamond_model = &diamond_models[DIAMOND_BOARD_EVT_MODEL_INDEX];
} else if (model.revision == 7 || model.revision == 8) {
diamond_model = &diamond_models[DIAMOND_BOARD_DVT_MODEL_INDEX];
} else if (model.revision >= 9) {
diamond_model = &diamond_models[DIAMOND_BOARD_PVT_MODEL_INDEX];
}
} else if (model.product == j49_product) {
if (model.revision == 0) {
diamond_model = &diamond_models[J49_BOARD_PROTOTYPE_MODEL_INDEX];
} else if (model.revision == 1) {
diamond_model = &diamond_models[J49_BOARD_EVT_MODEL_INDEX];
} else if (model.revision == 2) {
diamond_model = &diamond_models[J49_BOARD_DVT_MODEL_INDEX];
} else if (model.revision == 3) {
diamond_model = &diamond_models[J49_BOARD_PRE_PVT_MODEL_INDEX];
} else if (model.revision >= 4) {
diamond_model = &diamond_models[J49_BOARD_PVT_MODEL_INDEX];
} else {
printf("Unknown model revision '%d'\n", model.revision);
goto punt;
}
} else {
printf("Unknown model product '%d'\n", model.product);
goto punt;
}
punt:
if (diamond_model == NULL)
diamond_model = &diamond_models[DIAMOND_DEFAULT_MODEL_INDEX];
diamond_model->model = &model;
#elif defined(CONFIG_DIAMOND_BOARD_DEVELOPMENT) && !defined(CONFIG_DIAMOND_BOARD_MULTI)
diamond_model = &diamond_models[DIAMOND_BOARD_DEVELOPMENT_MODEL_INDEX];
#elif defined(CONFIG_DIAMOND_BOARD_PROTOTYPE) && !defined(CONFIG_DIAMOND_BOARD_MULTI)
diamond_model = &diamond_models[DIAMOND_BOARD_PROTOTYPE_MODEL_INDEX];
#elif defined(CONFIG_DIAMOND_BOARD_EVT) && !defined(CONFIG_DIAMOND_BOARD_MULTI)
diamond_model = &diamond_models[DIAMOND_BOARD_EVT_MODEL_INDEX];
#elif defined(CONFIG_DIAMOND_BOARD_DVT) && !defined(CONFIG_DIAMOND_BOARD_MULTI)
diamond_model = &diamond_models[DIAMOND_BOARD_DVT_MODEL_INDEX];
#elif defined(CONFIG_DIAMOND_BOARD_PVT) && !defined(CONFIG_DIAMOND_BOARD_MULTI)
diamond_model = &diamond_models[DIAMOND_BOARD_PVT_MODEL_INDEX];
#elif defined(CONFIG_J49_BOARD_PROTOTYPE) && !defined(CONFIG_J49_BOARD_MULTI)
diamond_model = &diamond_models[J49_BOARD_PROTOTYPE_MODEL_INDEX];
#elif defined(CONFIG_J49_BOARD_EVT) && !defined(CONFIG_J49_BOARD_MULTI)
diamond_model = &diamond_models[J49_BOARD_EVT_MODEL_INDEX];
#elif defined(CONFIG_J49_BOARD_DVT) && !defined(CONFIG_J49_BOARD_MULTI)
diamond_model = &diamond_models[J49_BOARD_DVT_MODEL_INDEX];
#elif defined(CONFIG_J49_BOARD_PRE_PVT) && !defined(CONFIG_J49_BOARD_MULTI)
diamond_model = &diamond_models[J49_BOARD_PRE_PVT_MODEL_INDEX];
#elif defined(CONFIG_J49_BOARD_PVT) && !defined(CONFIG_J49_BOARD_MULTI)
diamond_model = &diamond_models[J49_BOARD_PVT_MODEL_INDEX];
#else
#error "A specific Nest Diamond board type has not been configured!"
#endif /* defined(CONFIG_DIAMOND_BOARD_MULTI) */
/* Fix bootdelay if necessary */
bootdelay_str = getenv(bootdelay_identifier_key);
if ( (bootdelay_str == NULL) ||
(strcmp(bootdelay_str, CONFIG_BOOTDELAY_STR) != 0) ) {
setenv(bootdelay_identifier_key, CONFIG_BOOTDELAY_STR);
dirty = 1;
}
if (diamond_model != NULL) {
if (diamond_model->mux_init) {
diamond_model->mux_init();
}
if (diamond_model->gpio_init) {
diamond_model->gpio_init();
}
if (diamond_model->misc_init) {
diamond_model->misc_init();
}
gd->bd->bi_arch_number = diamond_model->machine;
}
printf("Board: Nest %s", diamond_model->name);
#if defined(CONFIG_DIAMOND_BOARD_MULTI)
printf(", Revision %d", diamond_model->model->revision);
#endif /* defined(CONFIG_DIAMOND_BOARD_MULTI) */
serial = getenv("serial#");
if (serial) {
puts(", Serial ");
puts(serial);
}
putc('\n');
#if !defined(NEST_BUILD_CONFIG_RELEASE)
printf("Build: " NEST_BUILD_CONFIG "\n");
#endif
#ifdef CONFIG_DRIVER_OMAP34XX_I2C
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
#endif
dieid_num_r();
if (dirty) {
saveenv();
}
#if defined(CONFIG_PREBOOT)
#if defined(CONFIG_DFU)
sprintf( cmd, "source 0x%08x", AUPD_LOAD_ADDRESS );
#endif /* defined(CONFIG_DFU) */
setenv("preboot", cmd);
#endif /* defined(CONFIG_PREBOOT) */
return 0;
}
#if defined(CONFIG_REVISION_TAG)
/*
* u32 get_board_rev()
*
* Description:
* This routine returns, if available, the BCD-encoded
* board/platform/model revision.
*
* While this routine returns a 32-bit value, the U-Boot and Linux
* kernel tag/value pair only allow for 16-bits of data. So, we
* encode the model product as the upper (or integer) 8-bits and
* the model revision as the lower (or fractional) 8-bits.
*
* Input(s):
* N/A
*
* Output(s):
* N/A
*
* Returns:
* The BCD-encoded board/platform revision number.
*
*/
u32 get_board_rev(void)
{
u32 rev = 0;
int product, revision;
if (diamond_model && diamond_model->model) {
product = diamond_model->model->product;
revision = diamond_model->model->revision;
} else {
product = NL_MODEL_UNKNOWN;
revision = NL_MODEL_UNKNOWN;
}
rev = ((product & 0xff) << 8 |
(revision & 0xff) << 0);
return rev;
}
#endif
#if defined(CONFIG_SERIAL_TAG)
/*
* void get_board_serial()
*
* Description:
* This routine attempts to encode the board serial number,
* available from the u-boot 'serial#' key/value pair, into the
* 64-bit structure provided for passing, in memory, serial numbers
* from u-boot to the kernel.
*
* Successful implementation of this relies on the fact that
* manufacturing is restricting the serial number format to 15
* decimal digits which we represent as a zero-padded,
* right-aligned hexadecimal number. Were that not the case, we'd
* have to pass the serial number through on the kernel command
* line or have a u-boot environment driver in the kernel.
*
* NOTE: For diagnostic build configurations, simply set the serial
* number passed to the kernel as all 0s such to facilitate USB
* device enumeration and driver installation during manufacturing.
*
* Input(s):
* serialnr - A pointer to the structure in which to encode the board
* serial number.
*
* Output(s):
* serialnr - A pointer to the encoded board serial number.
*
* Returns:
* N/A
*
*/
void get_board_serial(struct tag_serialnr *serialnr)
{
uint32_t high = 0, low = 0;
#if !defined(NEST_BUILD_CONFIG_DIAGNOSTICS)
const int base = 16;
uint64_t value;
const char *serial;
char *endp;
serial = getenv("serial#");
if (serial) {
value = simple_strtoull(serial, &endp, base);
if ((endp > (serial + 1)) && (*endp == '\0')) {
high = (value >> 32) & 0xFFFFFFFF;
low = (value >> 0) & 0xFFFFFFFF;
}
}
#endif /* !defined(NEST_BUILD_CONFIG_DIAGNOSTICS) */
serialnr->high = high;
serialnr->low = low;
}
#endif /* defined(CONFIG_SERIAL_TAG) */
#if defined(CONFIG_CMD_NET)
/*
* Routine: setup_net_chip
* Description: Setting up the configuration GPMC registers specific to the
* Ethernet hardware.
*/
static void setup_net_chip(void)
{
struct gpio *gpio1_base = (struct gpio *)OMAP34XX_GPIO1_BASE;
struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
/* Configure GPMC registers */
writel(NET_GPMC_CONFIG1, &gpmc_cfg->cs[5].config1);
writel(NET_GPMC_CONFIG2, &gpmc_cfg->cs[5].config2);
writel(NET_GPMC_CONFIG3, &gpmc_cfg->cs[5].config3);
writel(NET_GPMC_CONFIG4, &gpmc_cfg->cs[5].config4);
writel(NET_GPMC_CONFIG5, &gpmc_cfg->cs[5].config5);
writel(NET_GPMC_CONFIG6, &gpmc_cfg->cs[5].config6);
writel(NET_GPMC_CONFIG7, &gpmc_cfg->cs[5].config7);
/* Enable off mode for NWE in PADCONF_GPMC_NWE register */
writew(readw(&ctrl_base ->gpmc_nwe) | 0x0E00, &ctrl_base->gpmc_nwe);
/* Enable off mode for NOE in PADCONF_GPMC_NADV_ALE register */
writew(readw(&ctrl_base->gpmc_noe) | 0x0E00, &ctrl_base->gpmc_noe);
/* Enable off mode for ALE in PADCONF_GPMC_NADV_ALE register */
writew(readw(&ctrl_base->gpmc_nadv_ale) | 0x0E00,
&ctrl_base->gpmc_nadv_ale);
/* Make GPIO 07 as output pin */
writel(readl(&gpio1_base->oe) & ~(GPIO7), &gpio1_base->oe);
/* Now send a pulse on the GPIO pin */
writel(GPIO7, &gpio1_base->setdataout);
udelay(1);
writel(GPIO7, &gpio1_base->cleardataout);
udelay(1);
writel(GPIO7, &gpio1_base->setdataout);
}
#endif /* defined(CONFIG_CMD_NET) */
int board_eth_init(bd_t *bis)
{
int rc = 0;
if (diamond_model && diamond_model->eth_init) {
rc = diamond_model->eth_init(bis);
}
return rc;
}
#if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
int board_mmc_init(bd_t *bis)
{
omap_mmc_init(0, MMC_MODE_HS_52MHz, 0);
return 0;
}
#endif
extern int omap_gpmc_nand_init(struct nand_chip *nand);
int board_nand_init(struct nand_chip *nand)
{
int rc;
rc = omap_gpmc_nand_init(nand);
if (rc < 0)
goto done;
nand->ecc.mode = NAND_ECC_4BIT_SOFT;
done:
return rc;
}
void add_bootarg(const char *name, const char *val)
{
char buf[256];
char *cmdline;
cmdline = getenv (bootargs_key);
if (cmdline) {
sprintf(buf, "%s %s=%s",
cmdline, name, val);
} else {
sprintf(buf, "%s=%s",
name, val);
}
setenv (bootargs_key, buf);
}
void add_brightness(void)
{
const char *brightness_val;
brightness_val = getenv(brightness_key);
if (brightness_val != NULL)
{
add_bootarg(brightness_key, brightness_val);
}
}
void add_panic(const char *panic_val)
{
add_bootarg(panic_key, panic_val);
}
/*
* This is where we can do board specific things right before booting
* the image.
*/
void arch_preboot_os(void)
{
add_brightness();
#ifdef CONFIG_PANIC
add_panic(CONFIG_PANIC);
#endif
}