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