xref: /openbmc/u-boot/board/ti/omap5_uevm/evm.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22c2a9f3aSSRICHARAN R /*
32c2a9f3aSSRICHARAN R  * (C) Copyright 2010
42c2a9f3aSSRICHARAN R  * Texas Instruments Incorporated, <www.ti.com>
52c2a9f3aSSRICHARAN R  * Aneesh V       <aneesh@ti.com>
62c2a9f3aSSRICHARAN R  * Steve Sakoman  <steve@sakoman.com>
72c2a9f3aSSRICHARAN R  */
82c2a9f3aSSRICHARAN R #include <common.h>
9cb199102SNishanth Menon #include <palmas.h>
107ba792c0SKishon Vijay Abraham I #include <asm/arch/omap.h>
112c2a9f3aSSRICHARAN R #include <asm/arch/sys_proto.h>
122c2a9f3aSSRICHARAN R #include <asm/arch/mmc_host_def.h>
13fdce7b63SDan Murphy #include <tca642x.h>
147ba792c0SKishon Vijay Abraham I #include <usb.h>
157ba792c0SKishon Vijay Abraham I #include <linux/usb/gadget.h>
167ba792c0SKishon Vijay Abraham I #include <dwc3-uboot.h>
177ba792c0SKishon Vijay Abraham I #include <dwc3-omap-uboot.h>
187ba792c0SKishon Vijay Abraham I #include <ti-usb-phy-uboot.h>
192c2a9f3aSSRICHARAN R 
202c2a9f3aSSRICHARAN R #include "mux_data.h"
212c2a9f3aSSRICHARAN R 
228850c5d5STom Rini #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_XHCI_OMAP)
23e9024ef2SDan Murphy #include <sata.h>
245e5cfaf9SDan Murphy #include <usb.h>
251572eadfSDan Murphy #include <asm/gpio.h>
26c62db35dSSimon Glass #include <asm/mach-types.h>
275e5cfaf9SDan Murphy #include <asm/arch/clock.h>
285e5cfaf9SDan Murphy #include <asm/arch/ehci.h>
295e5cfaf9SDan Murphy #include <asm/ehci-omap.h>
30afdc6321SRoger Quadros #include <asm/arch/sata.h>
3104025b42SDan Murphy 
3204025b42SDan Murphy #define DIE_ID_REG_BASE     (OMAP54XX_L4_CORE_BASE + 0x2000)
3304025b42SDan Murphy #define DIE_ID_REG_OFFSET	0x200
3404025b42SDan Murphy 
355e5cfaf9SDan Murphy #endif
365e5cfaf9SDan Murphy 
372c2a9f3aSSRICHARAN R DECLARE_GLOBAL_DATA_PTR;
382c2a9f3aSSRICHARAN R 
392c2a9f3aSSRICHARAN R const struct omap_sysinfo sysinfo = {
405a7bd384SDan Murphy 	"Board: OMAP5432 uEVM\n"
412c2a9f3aSSRICHARAN R };
422c2a9f3aSSRICHARAN R 
432c2a9f3aSSRICHARAN R /**
44fdce7b63SDan Murphy  * @brief tca642x_init - uEVM default values for the GPIO expander
45fdce7b63SDan Murphy  * input reg, output reg, polarity reg, configuration reg
46fdce7b63SDan Murphy  */
47fdce7b63SDan Murphy struct tca642x_bank_info tca642x_init[] = {
48fdce7b63SDan Murphy 	{ .input_reg = 0x00,
49fdce7b63SDan Murphy 	  .output_reg = 0x04,
50fdce7b63SDan Murphy 	  .polarity_reg = 0x00,
51fdce7b63SDan Murphy 	  .configuration_reg = 0x80 },
52fdce7b63SDan Murphy 	{ .input_reg = 0x00,
53fdce7b63SDan Murphy 	  .output_reg = 0x00,
54fdce7b63SDan Murphy 	  .polarity_reg = 0x00,
55fdce7b63SDan Murphy 	  .configuration_reg = 0xff },
56fdce7b63SDan Murphy 	{ .input_reg = 0x00,
57fdce7b63SDan Murphy 	  .output_reg = 0x00,
58fdce7b63SDan Murphy 	  .polarity_reg = 0x00,
59fdce7b63SDan Murphy 	  .configuration_reg = 0x40 },
60fdce7b63SDan Murphy };
61fdce7b63SDan Murphy 
627ba792c0SKishon Vijay Abraham I #ifdef CONFIG_USB_DWC3
637ba792c0SKishon Vijay Abraham I static struct dwc3_device usb_otg_ss = {
647ba792c0SKishon Vijay Abraham I 	.maximum_speed = USB_SPEED_SUPER,
657ba792c0SKishon Vijay Abraham I 	.base = OMAP5XX_USB_OTG_SS_BASE,
667ba792c0SKishon Vijay Abraham I 	.tx_fifo_resize = false,
677ba792c0SKishon Vijay Abraham I 	.index = 0,
687ba792c0SKishon Vijay Abraham I };
697ba792c0SKishon Vijay Abraham I 
707ba792c0SKishon Vijay Abraham I static struct dwc3_omap_device usb_otg_ss_glue = {
717ba792c0SKishon Vijay Abraham I 	.base = (void *)OMAP5XX_USB_OTG_SS_GLUE_BASE,
727ba792c0SKishon Vijay Abraham I 	.utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
737ba792c0SKishon Vijay Abraham I 	.index = 0,
747ba792c0SKishon Vijay Abraham I };
757ba792c0SKishon Vijay Abraham I 
767ba792c0SKishon Vijay Abraham I static struct ti_usb_phy_device usb_phy_device = {
777ba792c0SKishon Vijay Abraham I 	.pll_ctrl_base = (void *)OMAP5XX_USB3_PHY_PLL_CTRL,
787ba792c0SKishon Vijay Abraham I 	.usb2_phy_power = (void *)OMAP5XX_USB2_PHY_POWER,
797ba792c0SKishon Vijay Abraham I 	.usb3_phy_power = (void *)OMAP5XX_USB3_PHY_POWER,
807ba792c0SKishon Vijay Abraham I 	.index = 0,
817ba792c0SKishon Vijay Abraham I };
827ba792c0SKishon Vijay Abraham I 
board_usb_init(int index,enum usb_init_type init)837ba792c0SKishon Vijay Abraham I int board_usb_init(int index, enum usb_init_type init)
847ba792c0SKishon Vijay Abraham I {
857ba792c0SKishon Vijay Abraham I 	if (index) {
867ba792c0SKishon Vijay Abraham I 		printf("Invalid Controller Index\n");
877ba792c0SKishon Vijay Abraham I 		return -EINVAL;
887ba792c0SKishon Vijay Abraham I 	}
897ba792c0SKishon Vijay Abraham I 
907ba792c0SKishon Vijay Abraham I 	if (init == USB_INIT_DEVICE) {
917ba792c0SKishon Vijay Abraham I 		usb_otg_ss.dr_mode = USB_DR_MODE_PERIPHERAL;
927ba792c0SKishon Vijay Abraham I 		usb_otg_ss_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
937ba792c0SKishon Vijay Abraham I 	} else {
947ba792c0SKishon Vijay Abraham I 		usb_otg_ss.dr_mode = USB_DR_MODE_HOST;
957ba792c0SKishon Vijay Abraham I 		usb_otg_ss_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
967ba792c0SKishon Vijay Abraham I 	}
977ba792c0SKishon Vijay Abraham I 
986f1af1e3SKishon Vijay Abraham I 	enable_usb_clocks(index);
997ba792c0SKishon Vijay Abraham I 	ti_usb_phy_uboot_init(&usb_phy_device);
1007ba792c0SKishon Vijay Abraham I 	dwc3_omap_uboot_init(&usb_otg_ss_glue);
1017ba792c0SKishon Vijay Abraham I 	dwc3_uboot_init(&usb_otg_ss);
1027ba792c0SKishon Vijay Abraham I 
1037ba792c0SKishon Vijay Abraham I 	return 0;
1047ba792c0SKishon Vijay Abraham I }
1057ba792c0SKishon Vijay Abraham I 
board_usb_cleanup(int index,enum usb_init_type init)1067ba792c0SKishon Vijay Abraham I int board_usb_cleanup(int index, enum usb_init_type init)
1077ba792c0SKishon Vijay Abraham I {
1087ba792c0SKishon Vijay Abraham I 	if (index) {
1097ba792c0SKishon Vijay Abraham I 		printf("Invalid Controller Index\n");
1107ba792c0SKishon Vijay Abraham I 		return -EINVAL;
1117ba792c0SKishon Vijay Abraham I 	}
1127ba792c0SKishon Vijay Abraham I 
1137ba792c0SKishon Vijay Abraham I 	ti_usb_phy_uboot_exit(index);
1147ba792c0SKishon Vijay Abraham I 	dwc3_uboot_exit(index);
1157ba792c0SKishon Vijay Abraham I 	dwc3_omap_uboot_exit(index);
1166f1af1e3SKishon Vijay Abraham I 	disable_usb_clocks(index);
1177ba792c0SKishon Vijay Abraham I 
1187ba792c0SKishon Vijay Abraham I 	return 0;
1197ba792c0SKishon Vijay Abraham I }
1207ba792c0SKishon Vijay Abraham I 
usb_gadget_handle_interrupts(int index)1217ba792c0SKishon Vijay Abraham I int usb_gadget_handle_interrupts(int index)
1227ba792c0SKishon Vijay Abraham I {
1237ba792c0SKishon Vijay Abraham I 	u32 status;
1247ba792c0SKishon Vijay Abraham I 
1257ba792c0SKishon Vijay Abraham I 	status = dwc3_omap_uboot_interrupt_status(index);
1267ba792c0SKishon Vijay Abraham I 	if (status)
1277ba792c0SKishon Vijay Abraham I 		dwc3_uboot_handle_interrupt(index);
1287ba792c0SKishon Vijay Abraham I 
1297ba792c0SKishon Vijay Abraham I 	return 0;
1307ba792c0SKishon Vijay Abraham I }
1317ba792c0SKishon Vijay Abraham I #endif
1327ba792c0SKishon Vijay Abraham I 
133fdce7b63SDan Murphy /**
1342c2a9f3aSSRICHARAN R  * @brief board_init
1352c2a9f3aSSRICHARAN R  *
1362c2a9f3aSSRICHARAN R  * @return 0
1372c2a9f3aSSRICHARAN R  */
board_init(void)1382c2a9f3aSSRICHARAN R int board_init(void)
1392c2a9f3aSSRICHARAN R {
1402c2a9f3aSSRICHARAN R 	gpmc_init();
14194ba26f2STom Rini 	gd->bd->bi_arch_number = MACH_TYPE_OMAP5_SEVM;
1422c2a9f3aSSRICHARAN R 	gd->bd->bi_boot_params = (0x80000000 + 0x100); /* boot param addr */
1432c2a9f3aSSRICHARAN R 
144fdce7b63SDan Murphy 	tca642x_set_inital_state(CONFIG_SYS_I2C_TCA642X_ADDR, tca642x_init);
145fdce7b63SDan Murphy 
1462c2a9f3aSSRICHARAN R 	return 0;
1472c2a9f3aSSRICHARAN R }
1482c2a9f3aSSRICHARAN R 
board_eth_init(bd_t * bis)1492c2a9f3aSSRICHARAN R int board_eth_init(bd_t *bis)
1502c2a9f3aSSRICHARAN R {
1512c2a9f3aSSRICHARAN R 	return 0;
1522c2a9f3aSSRICHARAN R }
1532c2a9f3aSSRICHARAN R 
1548850c5d5STom Rini #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_XHCI_OMAP)
enable_host_clocks(void)15596805532SDan Murphy static void enable_host_clocks(void)
15696805532SDan Murphy {
15796805532SDan Murphy 	int auxclk;
15896805532SDan Murphy 	int hs_clk_ctrl_val = (OPTFCLKEN_HSIC60M_P3_CLK |
15996805532SDan Murphy 				OPTFCLKEN_HSIC480M_P3_CLK |
16096805532SDan Murphy 				OPTFCLKEN_HSIC60M_P2_CLK |
16196805532SDan Murphy 				OPTFCLKEN_HSIC480M_P2_CLK |
16296805532SDan Murphy 				OPTFCLKEN_UTMI_P3_CLK | OPTFCLKEN_UTMI_P2_CLK);
16396805532SDan Murphy 
16496805532SDan Murphy 	/* Enable port 2 and 3 clocks*/
16596805532SDan Murphy 	setbits_le32((*prcm)->cm_l3init_hsusbhost_clkctrl, hs_clk_ctrl_val);
16696805532SDan Murphy 
16796805532SDan Murphy 	/* Enable port 2 and 3 usb host ports tll clocks*/
16896805532SDan Murphy 	setbits_le32((*prcm)->cm_l3init_hsusbtll_clkctrl,
16996805532SDan Murphy 			(OPTFCLKEN_USB_CH1_CLK_ENABLE | OPTFCLKEN_USB_CH2_CLK_ENABLE));
17096805532SDan Murphy #ifdef CONFIG_USB_XHCI_OMAP
17196805532SDan Murphy 	/* Enable the USB OTG Super speed clocks */
17296805532SDan Murphy 	setbits_le32((*prcm)->cm_l3init_usb_otg_ss_clkctrl,
17396805532SDan Murphy 			(OPTFCLKEN_REFCLK960M | OTG_SS_CLKCTRL_MODULEMODE_HW));
17496805532SDan Murphy #endif
17596805532SDan Murphy 
17696805532SDan Murphy 	auxclk = readl((*prcm)->scrm_auxclk1);
17796805532SDan Murphy 	/* Request auxilary clock */
17896805532SDan Murphy 	auxclk |= AUXCLK_ENABLE_MASK;
17996805532SDan Murphy 	writel(auxclk, (*prcm)->scrm_auxclk1);
18096805532SDan Murphy }
18196805532SDan Murphy #endif
18296805532SDan Murphy 
1832c2a9f3aSSRICHARAN R /**
1842c2a9f3aSSRICHARAN R  * @brief misc_init_r - Configure EVM board specific configurations
1852c2a9f3aSSRICHARAN R  * such as power configurations, ethernet initialization as phase2 of
1862c2a9f3aSSRICHARAN R  * boot sequence
1872c2a9f3aSSRICHARAN R  *
1882c2a9f3aSSRICHARAN R  * @return 0
1892c2a9f3aSSRICHARAN R  */
misc_init_r(void)1902c2a9f3aSSRICHARAN R int misc_init_r(void)
1912c2a9f3aSSRICHARAN R {
192cb199102SNishanth Menon #ifdef CONFIG_PALMAS_POWER
19312733881SNishanth Menon 	palmas_init_settings();
1942c2a9f3aSSRICHARAN R #endif
19596805532SDan Murphy 
19607815eb9SPaul Kocialkowski 	omap_die_id_usbethaddr();
197ea02b653SDan Murphy 
1982c2a9f3aSSRICHARAN R 	return 0;
1992c2a9f3aSSRICHARAN R }
2002c2a9f3aSSRICHARAN R 
set_muxconf_regs(void)2013ef56e61SPaul Kocialkowski void set_muxconf_regs(void)
2022c2a9f3aSSRICHARAN R {
2039239f5b6SLokesh Vutla 	do_set_mux((*ctrl)->control_padconf_core_base,
2049239f5b6SLokesh Vutla 		   core_padconf_array_essential,
2052c2a9f3aSSRICHARAN R 		   sizeof(core_padconf_array_essential) /
2062c2a9f3aSSRICHARAN R 		   sizeof(struct pad_conf_entry));
2072c2a9f3aSSRICHARAN R 
2089239f5b6SLokesh Vutla 	do_set_mux((*ctrl)->control_padconf_wkup_base,
2099239f5b6SLokesh Vutla 		   wkup_padconf_array_essential,
2102c2a9f3aSSRICHARAN R 		   sizeof(wkup_padconf_array_essential) /
2112c2a9f3aSSRICHARAN R 		   sizeof(struct pad_conf_entry));
2122c2a9f3aSSRICHARAN R }
2132c2a9f3aSSRICHARAN R 
2144aa2ba3aSMasahiro Yamada #if defined(CONFIG_MMC)
board_mmc_init(bd_t * bis)2152c2a9f3aSSRICHARAN R int board_mmc_init(bd_t *bis)
2162c2a9f3aSSRICHARAN R {
2172c2a9f3aSSRICHARAN R 	omap_mmc_init(0, 0, 0, -1, -1);
2182c2a9f3aSSRICHARAN R 	omap_mmc_init(1, 0, 0, -1, -1);
2192c2a9f3aSSRICHARAN R 	return 0;
2202c2a9f3aSSRICHARAN R }
2212c2a9f3aSSRICHARAN R #endif
2225e5cfaf9SDan Murphy 
2238850c5d5STom Rini #ifdef CONFIG_USB_EHCI_HCD
2245e5cfaf9SDan Murphy static struct omap_usbhs_board_data usbhs_bdata = {
2255e5cfaf9SDan Murphy 	.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
2265e5cfaf9SDan Murphy 	.port_mode[1] = OMAP_EHCI_PORT_MODE_HSIC,
2275e5cfaf9SDan Murphy 	.port_mode[2] = OMAP_EHCI_PORT_MODE_HSIC,
2285e5cfaf9SDan Murphy };
2295e5cfaf9SDan Murphy 
ehci_hcd_init(int index,enum usb_init_type init,struct ehci_hccr ** hccr,struct ehci_hcor ** hcor)230127efc4fSTroy Kisky int ehci_hcd_init(int index, enum usb_init_type init,
231127efc4fSTroy Kisky 		struct ehci_hccr **hccr, struct ehci_hcor **hcor)
2325e5cfaf9SDan Murphy {
2335e5cfaf9SDan Murphy 	int ret;
2345e5cfaf9SDan Murphy 
2355e5cfaf9SDan Murphy 	enable_host_clocks();
2365e5cfaf9SDan Murphy 
23716297cfbSMateusz Zalega 	ret = omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
2385e5cfaf9SDan Murphy 	if (ret < 0) {
2395e5cfaf9SDan Murphy 		puts("Failed to initialize ehci\n");
2405e5cfaf9SDan Murphy 		return ret;
2415e5cfaf9SDan Murphy 	}
2425e5cfaf9SDan Murphy 
2435e5cfaf9SDan Murphy 	return 0;
2445e5cfaf9SDan Murphy }
2455e5cfaf9SDan Murphy 
ehci_hcd_stop(void)2465e5cfaf9SDan Murphy int ehci_hcd_stop(void)
2475e5cfaf9SDan Murphy {
24863a7578eSMasahiro Yamada 	return omap_ehci_hcd_stop();
2495e5cfaf9SDan Murphy }
2501572eadfSDan Murphy 
usb_hub_reset_devices(struct usb_hub_device * hub,int port)251883946e8SPhilipp Tomsich void usb_hub_reset_devices(struct usb_hub_device *hub, int port)
2521572eadfSDan Murphy {
2531572eadfSDan Murphy 	/* The LAN9730 needs to be reset after the port power has been set. */
2541572eadfSDan Murphy 	if (port == 3) {
2551572eadfSDan Murphy 		gpio_direction_output(CONFIG_OMAP_EHCI_PHY3_RESET_GPIO, 0);
2561572eadfSDan Murphy 		udelay(10);
2571572eadfSDan Murphy 		gpio_direction_output(CONFIG_OMAP_EHCI_PHY3_RESET_GPIO, 1);
2581572eadfSDan Murphy 	}
2591572eadfSDan Murphy }
2605e5cfaf9SDan Murphy #endif
26196805532SDan Murphy 
26296805532SDan Murphy #ifdef CONFIG_USB_XHCI_OMAP
26396805532SDan Murphy /**
26496805532SDan Murphy  * @brief board_usb_init - Configure EVM board specific configurations
26596805532SDan Murphy  * for the LDO's and clocks for the USB blocks.
26696805532SDan Murphy  *
26796805532SDan Murphy  * @return 0
26896805532SDan Murphy  */
board_usb_init(int index,enum usb_init_type init)2697e575c46STroy Kisky int board_usb_init(int index, enum usb_init_type init)
27096805532SDan Murphy {
27196805532SDan Murphy 	int ret;
27296805532SDan Murphy #ifdef CONFIG_PALMAS_USB_SS_PWR
27396805532SDan Murphy 	ret = palmas_enable_ss_ldo();
27496805532SDan Murphy #endif
27596805532SDan Murphy 
27696805532SDan Murphy 	enable_host_clocks();
27796805532SDan Murphy 
27896805532SDan Murphy 	return 0;
27996805532SDan Murphy }
28096805532SDan Murphy #endif
281