1893c04e1SHannes Petermaier /* 2893c04e1SHannes Petermaier * common.c 3893c04e1SHannes Petermaier * 4893c04e1SHannes Petermaier * common board functions for B&R boards 5893c04e1SHannes Petermaier * 6893c04e1SHannes Petermaier * Copyright (C) 2013 Hannes Petermaier <oe5hpm@oevsv.at> 7893c04e1SHannes Petermaier * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com 8893c04e1SHannes Petermaier * 9893c04e1SHannes Petermaier * SPDX-License-Identifier: GPL-2.0+ 10893c04e1SHannes Petermaier * 11893c04e1SHannes Petermaier */ 12893c04e1SHannes Petermaier 13893c04e1SHannes Petermaier #include <common.h> 14893c04e1SHannes Petermaier #include <errno.h> 15893c04e1SHannes Petermaier #include <spl.h> 16893c04e1SHannes Petermaier #include <asm/arch/cpu.h> 17893c04e1SHannes Petermaier #include <asm/arch/hardware.h> 18893c04e1SHannes Petermaier #include <asm/arch/omap.h> 19893c04e1SHannes Petermaier #include <asm/arch/clock.h> 20893c04e1SHannes Petermaier #include <asm/arch/gpio.h> 21893c04e1SHannes Petermaier #include <asm/arch/sys_proto.h> 22*46c8ebc8SHannes Petermaier #include <asm/arch/mmc_host_def.h> 23893c04e1SHannes Petermaier #include <asm/io.h> 24893c04e1SHannes Petermaier #include <asm/gpio.h> 25893c04e1SHannes Petermaier #include <i2c.h> 26893c04e1SHannes Petermaier #include <miiphy.h> 27893c04e1SHannes Petermaier #include <cpsw.h> 28893c04e1SHannes Petermaier #include <power/tps65217.h> 29893c04e1SHannes Petermaier #include "bur_common.h" 30893c04e1SHannes Petermaier 31893c04e1SHannes Petermaier static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; 32893c04e1SHannes Petermaier /* --------------------------------------------------------------------------*/ 33893c04e1SHannes Petermaier void blink(u32 blinks, u32 intervall, u32 pin) 34893c04e1SHannes Petermaier { 35893c04e1SHannes Petermaier gpio_direction_output(pin, 0); 36893c04e1SHannes Petermaier int val = 0; 37893c04e1SHannes Petermaier 38893c04e1SHannes Petermaier do { 39893c04e1SHannes Petermaier val ^= 0x01; 40893c04e1SHannes Petermaier gpio_set_value(pin, val); 41893c04e1SHannes Petermaier mdelay(intervall); 42893c04e1SHannes Petermaier } while (blinks--); 43893c04e1SHannes Petermaier 44893c04e1SHannes Petermaier gpio_set_value(pin, 0); 45893c04e1SHannes Petermaier } 46893c04e1SHannes Petermaier #ifdef CONFIG_SPL_BUILD 47893c04e1SHannes Petermaier void pmicsetup(u32 mpupll) 48893c04e1SHannes Petermaier { 49893c04e1SHannes Petermaier int mpu_vdd; 50893c04e1SHannes Petermaier int usb_cur_lim; 51893c04e1SHannes Petermaier 52893c04e1SHannes Petermaier /* setup I2C */ 53893c04e1SHannes Petermaier enable_i2c0_pin_mux(); 54893c04e1SHannes Petermaier i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); 55893c04e1SHannes Petermaier 56893c04e1SHannes Petermaier if (i2c_probe(TPS65217_CHIP_PM)) { 57893c04e1SHannes Petermaier puts("PMIC (0x24) not found! skip further initalization.\n"); 58893c04e1SHannes Petermaier return; 59893c04e1SHannes Petermaier } 60893c04e1SHannes Petermaier 61893c04e1SHannes Petermaier /* Get the frequency which is defined by device fuses */ 62893c04e1SHannes Petermaier dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); 63893c04e1SHannes Petermaier printf("detected max. frequency: %d - ", dpll_mpu_opp100.m); 64893c04e1SHannes Petermaier 65893c04e1SHannes Petermaier if (0 != mpupll) { 66893c04e1SHannes Petermaier dpll_mpu_opp100.m = MPUPLL_M_1000; 67893c04e1SHannes Petermaier printf("retuning MPU-PLL to: %d MHz.\n", dpll_mpu_opp100.m); 68893c04e1SHannes Petermaier } else { 69893c04e1SHannes Petermaier puts("ok.\n"); 70893c04e1SHannes Petermaier } 71893c04e1SHannes Petermaier /* 72893c04e1SHannes Petermaier * Increase USB current limit to 1300mA or 1800mA and set 73893c04e1SHannes Petermaier * the MPU voltage controller as needed. 74893c04e1SHannes Petermaier */ 75893c04e1SHannes Petermaier if (dpll_mpu_opp100.m == MPUPLL_M_1000) { 76893c04e1SHannes Petermaier usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA; 77893c04e1SHannes Petermaier mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV; 78893c04e1SHannes Petermaier } else { 79893c04e1SHannes Petermaier usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA; 80893c04e1SHannes Petermaier mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV; 81893c04e1SHannes Petermaier } 82893c04e1SHannes Petermaier 83893c04e1SHannes Petermaier if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_POWER_PATH, 84893c04e1SHannes Petermaier usb_cur_lim, TPS65217_USB_INPUT_CUR_LIMIT_MASK)) 85893c04e1SHannes Petermaier puts("tps65217_reg_write failure\n"); 86893c04e1SHannes Petermaier 87893c04e1SHannes Petermaier /* Set DCDC3 (CORE) voltage to 1.125V */ 88893c04e1SHannes Petermaier if (tps65217_voltage_update(TPS65217_DEFDCDC3, 89893c04e1SHannes Petermaier TPS65217_DCDC_VOLT_SEL_1125MV)) { 90893c04e1SHannes Petermaier puts("tps65217_voltage_update failure\n"); 91893c04e1SHannes Petermaier return; 92893c04e1SHannes Petermaier } 93893c04e1SHannes Petermaier 94893c04e1SHannes Petermaier /* Set CORE Frequencies to OPP100 */ 95893c04e1SHannes Petermaier do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); 96893c04e1SHannes Petermaier 97893c04e1SHannes Petermaier /* Set DCDC2 (MPU) voltage */ 98893c04e1SHannes Petermaier if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) { 99893c04e1SHannes Petermaier puts("tps65217_voltage_update failure\n"); 100893c04e1SHannes Petermaier return; 101893c04e1SHannes Petermaier } 102893c04e1SHannes Petermaier 103893c04e1SHannes Petermaier /* Set LDO3 to 1.8V */ 104893c04e1SHannes Petermaier if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, 105893c04e1SHannes Petermaier TPS65217_DEFLS1, 106893c04e1SHannes Petermaier TPS65217_LDO_VOLTAGE_OUT_1_8, 107893c04e1SHannes Petermaier TPS65217_LDO_MASK)) 108893c04e1SHannes Petermaier puts("tps65217_reg_write failure\n"); 109893c04e1SHannes Petermaier /* Set LDO4 to 3.3V */ 110893c04e1SHannes Petermaier if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, 111893c04e1SHannes Petermaier TPS65217_DEFLS2, 112893c04e1SHannes Petermaier TPS65217_LDO_VOLTAGE_OUT_3_3, 113893c04e1SHannes Petermaier TPS65217_LDO_MASK)) 114893c04e1SHannes Petermaier puts("tps65217_reg_write failure\n"); 115893c04e1SHannes Petermaier 116893c04e1SHannes Petermaier /* Set MPU Frequency to what we detected now that voltages are set */ 117893c04e1SHannes Petermaier do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100); 118893c04e1SHannes Petermaier } 119893c04e1SHannes Petermaier 120893c04e1SHannes Petermaier void set_uart_mux_conf(void) 121893c04e1SHannes Petermaier { 122893c04e1SHannes Petermaier enable_uart0_pin_mux(); 123893c04e1SHannes Petermaier } 124893c04e1SHannes Petermaier 125893c04e1SHannes Petermaier void set_mux_conf_regs(void) 126893c04e1SHannes Petermaier { 127893c04e1SHannes Petermaier enable_board_pin_mux(); 128893c04e1SHannes Petermaier } 129893c04e1SHannes Petermaier 130893c04e1SHannes Petermaier #endif /* CONFIG_SPL_BUILD */ 131893c04e1SHannes Petermaier 132893c04e1SHannes Petermaier #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 133893c04e1SHannes Petermaier (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 134893c04e1SHannes Petermaier static void cpsw_control(int enabled) 135893c04e1SHannes Petermaier { 136893c04e1SHannes Petermaier /* VTP can be added here */ 137893c04e1SHannes Petermaier return; 138893c04e1SHannes Petermaier } 139893c04e1SHannes Petermaier 140893c04e1SHannes Petermaier /* describing port offsets of TI's CPSW block */ 141893c04e1SHannes Petermaier static struct cpsw_slave_data cpsw_slaves[] = { 142893c04e1SHannes Petermaier { 143893c04e1SHannes Petermaier .slave_reg_ofs = 0x208, 144893c04e1SHannes Petermaier .sliver_reg_ofs = 0xd80, 1454b75fd51SHannes Petermaier .phy_addr = 1, 146893c04e1SHannes Petermaier }, 147893c04e1SHannes Petermaier { 148893c04e1SHannes Petermaier .slave_reg_ofs = 0x308, 149893c04e1SHannes Petermaier .sliver_reg_ofs = 0xdc0, 1504b75fd51SHannes Petermaier .phy_addr = 2, 151893c04e1SHannes Petermaier }, 152893c04e1SHannes Petermaier }; 153893c04e1SHannes Petermaier 154893c04e1SHannes Petermaier static struct cpsw_platform_data cpsw_data = { 155893c04e1SHannes Petermaier .mdio_base = CPSW_MDIO_BASE, 156893c04e1SHannes Petermaier .cpsw_base = CPSW_BASE, 157893c04e1SHannes Petermaier .mdio_div = 0xff, 158893c04e1SHannes Petermaier .channels = 8, 159893c04e1SHannes Petermaier .cpdma_reg_ofs = 0x800, 160893c04e1SHannes Petermaier .slaves = 1, 161893c04e1SHannes Petermaier .slave_data = cpsw_slaves, 162893c04e1SHannes Petermaier .ale_reg_ofs = 0xd00, 163893c04e1SHannes Petermaier .ale_entries = 1024, 164893c04e1SHannes Petermaier .host_port_reg_ofs = 0x108, 165893c04e1SHannes Petermaier .hw_stats_reg_ofs = 0x900, 166893c04e1SHannes Petermaier .bd_ram_ofs = 0x2000, 167893c04e1SHannes Petermaier .mac_control = (1 << 5), 168893c04e1SHannes Petermaier .control = cpsw_control, 169893c04e1SHannes Petermaier .host_port_num = 0, 170893c04e1SHannes Petermaier .version = CPSW_CTRL_VERSION_2, 171893c04e1SHannes Petermaier }; 172893c04e1SHannes Petermaier #endif /* CONFIG_DRIVER_TI_CPSW, ... */ 173893c04e1SHannes Petermaier 174893c04e1SHannes Petermaier #if defined(CONFIG_DRIVER_TI_CPSW) 175893c04e1SHannes Petermaier 176893c04e1SHannes Petermaier int board_eth_init(bd_t *bis) 177893c04e1SHannes Petermaier { 178893c04e1SHannes Petermaier int rv = 0; 179893c04e1SHannes Petermaier uint8_t mac_addr[6]; 180893c04e1SHannes Petermaier uint32_t mac_hi, mac_lo; 181893c04e1SHannes Petermaier 182893c04e1SHannes Petermaier /* try reading mac address from efuse */ 183893c04e1SHannes Petermaier mac_lo = readl(&cdev->macid0l); 184893c04e1SHannes Petermaier mac_hi = readl(&cdev->macid0h); 185893c04e1SHannes Petermaier mac_addr[0] = mac_hi & 0xFF; 186893c04e1SHannes Petermaier mac_addr[1] = (mac_hi & 0xFF00) >> 8; 187893c04e1SHannes Petermaier mac_addr[2] = (mac_hi & 0xFF0000) >> 16; 188893c04e1SHannes Petermaier mac_addr[3] = (mac_hi & 0xFF000000) >> 24; 189893c04e1SHannes Petermaier mac_addr[4] = mac_lo & 0xFF; 190893c04e1SHannes Petermaier mac_addr[5] = (mac_lo & 0xFF00) >> 8; 191893c04e1SHannes Petermaier 192893c04e1SHannes Petermaier #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ 193893c04e1SHannes Petermaier (defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) 194893c04e1SHannes Petermaier if (!getenv("ethaddr")) { 195893c04e1SHannes Petermaier printf("<ethaddr> not set. Validating first E-fuse MAC ... "); 196893c04e1SHannes Petermaier 197893c04e1SHannes Petermaier if (is_valid_ether_addr(mac_addr)) { 198893c04e1SHannes Petermaier printf("using: %02X:%02X:%02X:%02X:%02X:%02X.\n", 199893c04e1SHannes Petermaier mac_addr[0], mac_addr[1], mac_addr[2], 200893c04e1SHannes Petermaier mac_addr[3], mac_addr[4], mac_addr[5] 201893c04e1SHannes Petermaier ); 202893c04e1SHannes Petermaier eth_setenv_enetaddr("ethaddr", mac_addr); 203893c04e1SHannes Petermaier } 204893c04e1SHannes Petermaier } 205893c04e1SHannes Petermaier writel(MII_MODE_ENABLE, &cdev->miisel); 206893c04e1SHannes Petermaier cpsw_slaves[0].phy_if = PHY_INTERFACE_MODE_MII; 207893c04e1SHannes Petermaier cpsw_slaves[1].phy_if = PHY_INTERFACE_MODE_MII; 208893c04e1SHannes Petermaier 209893c04e1SHannes Petermaier rv = cpsw_register(&cpsw_data); 210893c04e1SHannes Petermaier if (rv < 0) { 211893c04e1SHannes Petermaier printf("Error %d registering CPSW switch\n", rv); 212893c04e1SHannes Petermaier return 0; 213893c04e1SHannes Petermaier } 214893c04e1SHannes Petermaier #endif /* CONFIG_DRIVER_TI_CPSW, ... */ 215893c04e1SHannes Petermaier return rv; 216893c04e1SHannes Petermaier } 217893c04e1SHannes Petermaier #endif /* CONFIG_DRIVER_TI_CPSW */ 218*46c8ebc8SHannes Petermaier #if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD) 219*46c8ebc8SHannes Petermaier int board_mmc_init(bd_t *bis) 220*46c8ebc8SHannes Petermaier { 221*46c8ebc8SHannes Petermaier return omap_mmc_init(1, 0, 0, -1, -1); 222*46c8ebc8SHannes Petermaier } 223*46c8ebc8SHannes Petermaier #endif 224