xref: /openbmc/u-boot/board/compulab/cm_t43/cm_t43.c (revision 5dc5a8ca)
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