| /* |
| * 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 |
| } |