1*5dc5a8caSNikita Kiryanov /* 2*5dc5a8caSNikita Kiryanov * Copyright (C) 2015 Compulab, Ltd. 3*5dc5a8caSNikita Kiryanov * 4*5dc5a8caSNikita Kiryanov * SPDX-License-Identifier: GPL-2.0+ 5*5dc5a8caSNikita Kiryanov */ 6*5dc5a8caSNikita Kiryanov 7*5dc5a8caSNikita Kiryanov #include <common.h> 8*5dc5a8caSNikita Kiryanov #include <i2c.h> 9*5dc5a8caSNikita Kiryanov #include <miiphy.h> 10*5dc5a8caSNikita Kiryanov #include <cpsw.h> 11*5dc5a8caSNikita Kiryanov #include <asm/gpio.h> 12*5dc5a8caSNikita Kiryanov #include <asm/arch/sys_proto.h> 13*5dc5a8caSNikita Kiryanov #include <asm/emif.h> 14*5dc5a8caSNikita Kiryanov #include <power/pmic.h> 15*5dc5a8caSNikita Kiryanov #include <power/tps65218.h> 16*5dc5a8caSNikita Kiryanov #include "board.h" 17*5dc5a8caSNikita Kiryanov 18*5dc5a8caSNikita Kiryanov DECLARE_GLOBAL_DATA_PTR; 19*5dc5a8caSNikita Kiryanov 20*5dc5a8caSNikita Kiryanov static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; 21*5dc5a8caSNikita Kiryanov 22*5dc5a8caSNikita Kiryanov /* setup board specific PMIC */ 23*5dc5a8caSNikita Kiryanov int power_init_board(void) 24*5dc5a8caSNikita Kiryanov { 25*5dc5a8caSNikita Kiryanov struct pmic *p; 26*5dc5a8caSNikita Kiryanov 27*5dc5a8caSNikita Kiryanov power_tps65218_init(I2C_PMIC); 28*5dc5a8caSNikita Kiryanov p = pmic_get("TPS65218_PMIC"); 29*5dc5a8caSNikita Kiryanov if (p && !pmic_probe(p)) 30*5dc5a8caSNikita Kiryanov puts("PMIC: TPS65218\n"); 31*5dc5a8caSNikita Kiryanov 32*5dc5a8caSNikita Kiryanov return 0; 33*5dc5a8caSNikita Kiryanov } 34*5dc5a8caSNikita Kiryanov 35*5dc5a8caSNikita Kiryanov int board_init(void) 36*5dc5a8caSNikita Kiryanov { 37*5dc5a8caSNikita Kiryanov gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; 38*5dc5a8caSNikita Kiryanov gpmc_init(); 39*5dc5a8caSNikita Kiryanov set_i2c_pin_mux(); 40*5dc5a8caSNikita Kiryanov i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); 41*5dc5a8caSNikita Kiryanov i2c_probe(TPS65218_CHIP_PM); 42*5dc5a8caSNikita Kiryanov 43*5dc5a8caSNikita Kiryanov return 0; 44*5dc5a8caSNikita Kiryanov } 45*5dc5a8caSNikita Kiryanov 46*5dc5a8caSNikita Kiryanov #ifdef CONFIG_DRIVER_TI_CPSW 47*5dc5a8caSNikita Kiryanov 48*5dc5a8caSNikita Kiryanov static void cpsw_control(int enabled) 49*5dc5a8caSNikita Kiryanov { 50*5dc5a8caSNikita Kiryanov return; 51*5dc5a8caSNikita Kiryanov } 52*5dc5a8caSNikita Kiryanov 53*5dc5a8caSNikita Kiryanov static struct cpsw_slave_data cpsw_slaves[] = { 54*5dc5a8caSNikita Kiryanov { 55*5dc5a8caSNikita Kiryanov .slave_reg_ofs = 0x208, 56*5dc5a8caSNikita Kiryanov .sliver_reg_ofs = 0xd80, 57*5dc5a8caSNikita Kiryanov .phy_addr = 0, 58*5dc5a8caSNikita Kiryanov .phy_if = PHY_INTERFACE_MODE_RGMII, 59*5dc5a8caSNikita Kiryanov }, 60*5dc5a8caSNikita Kiryanov { 61*5dc5a8caSNikita Kiryanov .slave_reg_ofs = 0x308, 62*5dc5a8caSNikita Kiryanov .sliver_reg_ofs = 0xdc0, 63*5dc5a8caSNikita Kiryanov .phy_addr = 1, 64*5dc5a8caSNikita Kiryanov .phy_if = PHY_INTERFACE_MODE_RGMII, 65*5dc5a8caSNikita Kiryanov }, 66*5dc5a8caSNikita Kiryanov }; 67*5dc5a8caSNikita Kiryanov 68*5dc5a8caSNikita Kiryanov static struct cpsw_platform_data cpsw_data = { 69*5dc5a8caSNikita Kiryanov .mdio_base = CPSW_MDIO_BASE, 70*5dc5a8caSNikita Kiryanov .cpsw_base = CPSW_BASE, 71*5dc5a8caSNikita Kiryanov .mdio_div = 0xff, 72*5dc5a8caSNikita Kiryanov .channels = 8, 73*5dc5a8caSNikita Kiryanov .cpdma_reg_ofs = 0x800, 74*5dc5a8caSNikita Kiryanov .slaves = 2, 75*5dc5a8caSNikita Kiryanov .slave_data = cpsw_slaves, 76*5dc5a8caSNikita Kiryanov .ale_reg_ofs = 0xd00, 77*5dc5a8caSNikita Kiryanov .ale_entries = 1024, 78*5dc5a8caSNikita Kiryanov .host_port_reg_ofs = 0x108, 79*5dc5a8caSNikita Kiryanov .hw_stats_reg_ofs = 0x900, 80*5dc5a8caSNikita Kiryanov .bd_ram_ofs = 0x2000, 81*5dc5a8caSNikita Kiryanov .mac_control = (1 << 5), 82*5dc5a8caSNikita Kiryanov .control = cpsw_control, 83*5dc5a8caSNikita Kiryanov .host_port_num = 0, 84*5dc5a8caSNikita Kiryanov .version = CPSW_CTRL_VERSION_2, 85*5dc5a8caSNikita Kiryanov }; 86*5dc5a8caSNikita Kiryanov 87*5dc5a8caSNikita Kiryanov #define GPIO_PHY1_RST 170 88*5dc5a8caSNikita Kiryanov #define GPIO_PHY2_RST 168 89*5dc5a8caSNikita Kiryanov 90*5dc5a8caSNikita Kiryanov int board_phy_config(struct phy_device *phydev) 91*5dc5a8caSNikita Kiryanov { 92*5dc5a8caSNikita Kiryanov unsigned short val; 93*5dc5a8caSNikita Kiryanov 94*5dc5a8caSNikita Kiryanov /* introduce tx clock delay */ 95*5dc5a8caSNikita Kiryanov phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); 96*5dc5a8caSNikita Kiryanov val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); 97*5dc5a8caSNikita Kiryanov val |= 0x0100; 98*5dc5a8caSNikita Kiryanov phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val); 99*5dc5a8caSNikita Kiryanov 100*5dc5a8caSNikita Kiryanov if (phydev->drv->config) 101*5dc5a8caSNikita Kiryanov return phydev->drv->config(phydev); 102*5dc5a8caSNikita Kiryanov 103*5dc5a8caSNikita Kiryanov return 0; 104*5dc5a8caSNikita Kiryanov } 105*5dc5a8caSNikita Kiryanov 106*5dc5a8caSNikita Kiryanov static void board_phy_init(void) 107*5dc5a8caSNikita Kiryanov { 108*5dc5a8caSNikita Kiryanov set_mdio_pin_mux(); 109*5dc5a8caSNikita Kiryanov writel(0x40003, 0x44e10a74); /* Mux pin as clkout2 */ 110*5dc5a8caSNikita Kiryanov writel(0x10006, 0x44df4108); /* Select EXTDEV as clock source */ 111*5dc5a8caSNikita Kiryanov writel(0x4, 0x44df2e60); /* Set EXTDEV as MNbypass */ 112*5dc5a8caSNikita Kiryanov 113*5dc5a8caSNikita Kiryanov /* For revision A */ 114*5dc5a8caSNikita Kiryanov writel(0x2000009, 0x44df2e6c); 115*5dc5a8caSNikita Kiryanov writel(0x38a, 0x44df2e70); 116*5dc5a8caSNikita Kiryanov 117*5dc5a8caSNikita Kiryanov mdelay(10); 118*5dc5a8caSNikita Kiryanov 119*5dc5a8caSNikita Kiryanov gpio_request(GPIO_PHY1_RST, "phy1_rst"); 120*5dc5a8caSNikita Kiryanov gpio_request(GPIO_PHY2_RST, "phy2_rst"); 121*5dc5a8caSNikita Kiryanov gpio_direction_output(GPIO_PHY1_RST, 0); 122*5dc5a8caSNikita Kiryanov gpio_direction_output(GPIO_PHY2_RST, 0); 123*5dc5a8caSNikita Kiryanov mdelay(2); 124*5dc5a8caSNikita Kiryanov 125*5dc5a8caSNikita Kiryanov gpio_set_value(GPIO_PHY1_RST, 1); 126*5dc5a8caSNikita Kiryanov gpio_set_value(GPIO_PHY2_RST, 1); 127*5dc5a8caSNikita Kiryanov mdelay(2); 128*5dc5a8caSNikita Kiryanov } 129*5dc5a8caSNikita Kiryanov 130*5dc5a8caSNikita Kiryanov int board_eth_init(bd_t *bis) 131*5dc5a8caSNikita Kiryanov { 132*5dc5a8caSNikita Kiryanov int rv; 133*5dc5a8caSNikita Kiryanov 134*5dc5a8caSNikita Kiryanov set_rgmii_pin_mux(); 135*5dc5a8caSNikita Kiryanov writel(RGMII_MODE_ENABLE | RGMII_INT_DELAY, &cdev->miisel); 136*5dc5a8caSNikita Kiryanov board_phy_init(); 137*5dc5a8caSNikita Kiryanov 138*5dc5a8caSNikita Kiryanov rv = cpsw_register(&cpsw_data); 139*5dc5a8caSNikita Kiryanov if (rv < 0) 140*5dc5a8caSNikita Kiryanov printf("Error %d registering CPSW switch\n", rv); 141*5dc5a8caSNikita Kiryanov 142*5dc5a8caSNikita Kiryanov return rv; 143*5dc5a8caSNikita Kiryanov } 144*5dc5a8caSNikita Kiryanov #endif 145