1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (C) 2016 David Lechner <david@lechnology.com> 4 * 5 * Based on da850evm.c 6 * 7 * Copyright (C) 2010 Texas Instruments Incorporated - https://www.ti.com/ 8 * 9 * Based on da830evm.c. Original Copyrights follow: 10 * 11 * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com> 12 * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> 13 */ 14 15#include <common.h> 16#include <env.h> 17#include <i2c.h> 18#include <init.h> 19#include <spi.h> 20#include <spi_flash.h> 21#include <asm/arch/hardware.h> 22#include <asm/arch/pinmux_defs.h> 23#include <asm/global_data.h> 24#include <asm/io.h> 25#include <asm/arch/davinci_misc.h> 26#include <linux/errno.h> 27#include <hwconfig.h> 28#include <asm/mach-types.h> 29#include <asm/setup.h> 30#include <dm/uclass.h> 31 32DECLARE_GLOBAL_DATA_PTR; 33 34#define EEPROM_I2C_ADDR 0x50 35#define EEPROM_REV_OFFSET 0x3F00 36#define EEPROM_BDADDR_OFFSET 0x3F06 37 38const struct pinmux_resource pinmuxes[] = { 39 PINMUX_ITEM(spi0_pins_base), 40 PINMUX_ITEM(spi0_pins_scs0), 41 PINMUX_ITEM(uart1_pins_txrx), 42 PINMUX_ITEM(i2c0_pins), 43 PINMUX_ITEM(mmc0_pins), 44}; 45 46const int pinmuxes_size = ARRAY_SIZE(pinmuxes); 47 48const struct lpsc_resource lpsc[] = { 49 { DAVINCI_LPSC_SPI0 }, /* Serial Flash */ 50 { DAVINCI_LPSC_UART1 }, /* console */ 51 { DAVINCI_LPSC_MMC_SD }, 52}; 53 54const int lpsc_size = ARRAY_SIZE(lpsc); 55 56/* 57 * The Bluetooth address serves as the board serial number. 58 */ 59static void setup_serial_number(void) 60{ 61 struct udevice *idev, *ibus; 62 int ret; 63 u32 offset; 64 char serial_number[13]; 65 u8 buf[6]; 66 u8 eeprom_rev; 67 68 if (env_get("serial#")) 69 return; 70 71 ret = uclass_get_device_by_seq(UCLASS_I2C, 0, &ibus); 72 if (ret) 73 return; 74 75 ret = dm_i2c_probe(ibus, EEPROM_I2C_ADDR, 0, &idev); 76 if (ret) 77 return; 78 79 if (dm_i2c_read(idev, EEPROM_REV_OFFSET, buf, 2)) { 80 printf("\nEEPROM revision read failed!\n"); 81 return; 82 } 83 84 /* 85 * EEPROM rev 3 has Bluetooth address at EEPROM_REV_OFFSET. 86 * Other revisions have checksum at EEPROM_REV_OFFSET+1 87 * to detect this. 88 */ 89 if ((buf[0] ^ buf[1]) == 0xFF) 90 eeprom_rev = buf[0]; 91 else 92 eeprom_rev = 3; 93 94 /* EEPROM rev 3 has Bluetooth address where rev should be */ 95 offset = (eeprom_rev == 3) ? EEPROM_REV_OFFSET : EEPROM_BDADDR_OFFSET; 96 97 if (dm_i2c_read(idev, offset, buf, 6)) { 98 printf("\nEEPROM serial read failed!\n"); 99 return; 100 } 101 102 sprintf(serial_number, "%02X%02X%02X%02X%02X%02X", 103 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); 104 105 env_set("serial#", serial_number); 106} 107 108int board_early_init_f(void) 109{ 110 /* enable the console UART */ 111 writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST | 112 DAVINCI_UART_PWREMU_MGMT_UTRST), 113 &davinci_uart1_ctrl_regs->pwremu_mgmt); 114 115 /* 116 * Power on required peripherals 117 * ARM does not have access by default to PSC0 and PSC1 118 * assuming here that the DSP bootloader has set the IOPU 119 * such that PSC access is available to ARM 120 */ 121 if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc))) 122 return 1; 123 124 return 0; 125} 126 127int board_init(void) 128{ 129 irq_init(); 130 131 /* address of boot parameters */ 132 gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR; 133 134 /* setup the SUSPSRC for ARM to control emulation suspend */ 135 writel(readl(&davinci_syscfg_regs->suspsrc) & 136 ~(DAVINCI_SYSCFG_SUSPSRC_I2C | 137 DAVINCI_SYSCFG_SUSPSRC_SPI0 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 | 138 DAVINCI_SYSCFG_SUSPSRC_UART1), 139 &davinci_syscfg_regs->suspsrc); 140 141 /* configure pinmux settings */ 142 if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes))) 143 return 1; 144 145 return 0; 146} 147 148int board_late_init(void) 149{ 150 setup_serial_number(); 151 152 return 0; 153} 154