blob: 88f56edc54ed06c0a8caf8650dd5d0cc4f5bf160 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Sricharan508a58f2011-11-15 09:49:55 -05002/*
3 * (C) Copyright 2010
4 * Texas Instruments Incorporated, <www.ti.com>
5 * Aneesh V <aneesh@ti.com>
6 * Steve Sakoman <steve@sakoman.com>
Sricharan508a58f2011-11-15 09:49:55 -05007 */
8#include <common.h>
Simon Glass691d7192020-05-10 11:40:02 -06009#include <init.h>
Simon Glass90526e92020-05-10 11:39:56 -060010#include <net.h>
Nishanth Menoncb199102013-03-26 05:20:54 +000011#include <palmas.h>
Kishon Vijay Abraham I7ba792c2015-08-19 14:13:20 +053012#include <asm/arch/omap.h>
Sricharan508a58f2011-11-15 09:49:55 -050013#include <asm/arch/sys_proto.h>
14#include <asm/arch/mmc_host_def.h>
Tero Kristo803e9a12020-06-16 11:03:10 +030015#include <serial.h>
Dan Murphyfdce7b62013-07-11 13:10:28 -050016#include <tca642x.h>
Kishon Vijay Abraham I7ba792c2015-08-19 14:13:20 +053017#include <usb.h>
Simon Glassc05ed002020-05-10 11:40:11 -060018#include <linux/delay.h>
Kishon Vijay Abraham I7ba792c2015-08-19 14:13:20 +053019#include <linux/usb/gadget.h>
20#include <dwc3-uboot.h>
21#include <dwc3-omap-uboot.h>
22#include <ti-usb-phy-uboot.h>
Sricharan508a58f2011-11-15 09:49:55 -050023
24#include "mux_data.h"
25
Tom Rini8850c5d2017-05-12 22:33:27 -040026#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_XHCI_OMAP)
Dan Murphye9024ef2014-02-03 06:59:02 -060027#include <sata.h>
Dan Murphy5e5cfaf2013-08-01 14:05:59 -050028#include <usb.h>
Dan Murphy1572ead2013-08-01 14:06:02 -050029#include <asm/gpio.h>
Simon Glassc62db352017-05-31 19:47:48 -060030#include <asm/mach-types.h>
Dan Murphy5e5cfaf2013-08-01 14:05:59 -050031#include <asm/arch/clock.h>
32#include <asm/arch/ehci.h>
33#include <asm/ehci-omap.h>
Roger Quadrosafdc6322013-11-11 16:56:42 +020034#include <asm/arch/sata.h>
Dan Murphy04025b42013-08-01 14:06:00 -050035
36#define DIE_ID_REG_BASE (OMAP54XX_L4_CORE_BASE + 0x2000)
37#define DIE_ID_REG_OFFSET 0x200
38
Dan Murphy5e5cfaf2013-08-01 14:05:59 -050039#endif
40
Sricharan508a58f2011-11-15 09:49:55 -050041DECLARE_GLOBAL_DATA_PTR;
42
43const struct omap_sysinfo sysinfo = {
Dan Murphy5a7bd382013-08-01 14:05:56 -050044 "Board: OMAP5432 uEVM\n"
Sricharan508a58f2011-11-15 09:49:55 -050045};
46
47/**
Dan Murphyfdce7b62013-07-11 13:10:28 -050048 * @brief tca642x_init - uEVM default values for the GPIO expander
49 * input reg, output reg, polarity reg, configuration reg
50 */
51struct tca642x_bank_info tca642x_init[] = {
52 { .input_reg = 0x00,
53 .output_reg = 0x04,
54 .polarity_reg = 0x00,
55 .configuration_reg = 0x80 },
56 { .input_reg = 0x00,
57 .output_reg = 0x00,
58 .polarity_reg = 0x00,
59 .configuration_reg = 0xff },
60 { .input_reg = 0x00,
61 .output_reg = 0x00,
62 .polarity_reg = 0x00,
63 .configuration_reg = 0x40 },
64};
65
Kishon Vijay Abraham I7ba792c2015-08-19 14:13:20 +053066#ifdef CONFIG_USB_DWC3
67static struct dwc3_device usb_otg_ss = {
68 .maximum_speed = USB_SPEED_SUPER,
69 .base = OMAP5XX_USB_OTG_SS_BASE,
70 .tx_fifo_resize = false,
71 .index = 0,
72};
73
74static struct dwc3_omap_device usb_otg_ss_glue = {
75 .base = (void *)OMAP5XX_USB_OTG_SS_GLUE_BASE,
76 .utmi_mode = DWC3_OMAP_UTMI_MODE_SW,
77 .index = 0,
78};
79
80static struct ti_usb_phy_device usb_phy_device = {
81 .pll_ctrl_base = (void *)OMAP5XX_USB3_PHY_PLL_CTRL,
82 .usb2_phy_power = (void *)OMAP5XX_USB2_PHY_POWER,
83 .usb3_phy_power = (void *)OMAP5XX_USB3_PHY_POWER,
84 .index = 0,
85};
86
87int board_usb_init(int index, enum usb_init_type init)
88{
89 if (index) {
90 printf("Invalid Controller Index\n");
91 return -EINVAL;
92 }
93
94 if (init == USB_INIT_DEVICE) {
95 usb_otg_ss.dr_mode = USB_DR_MODE_PERIPHERAL;
96 usb_otg_ss_glue.vbus_id_status = OMAP_DWC3_VBUS_VALID;
97 } else {
98 usb_otg_ss.dr_mode = USB_DR_MODE_HOST;
99 usb_otg_ss_glue.vbus_id_status = OMAP_DWC3_ID_GROUND;
100 }
101
Kishon Vijay Abraham I6f1af1e2015-08-19 16:16:27 +0530102 enable_usb_clocks(index);
Kishon Vijay Abraham I7ba792c2015-08-19 14:13:20 +0530103 ti_usb_phy_uboot_init(&usb_phy_device);
104 dwc3_omap_uboot_init(&usb_otg_ss_glue);
105 dwc3_uboot_init(&usb_otg_ss);
106
107 return 0;
108}
109
110int board_usb_cleanup(int index, enum usb_init_type init)
111{
112 if (index) {
113 printf("Invalid Controller Index\n");
114 return -EINVAL;
115 }
116
117 ti_usb_phy_uboot_exit(index);
118 dwc3_uboot_exit(index);
119 dwc3_omap_uboot_exit(index);
Kishon Vijay Abraham I6f1af1e2015-08-19 16:16:27 +0530120 disable_usb_clocks(index);
Kishon Vijay Abraham I7ba792c2015-08-19 14:13:20 +0530121
122 return 0;
123}
124
125int usb_gadget_handle_interrupts(int index)
126{
127 u32 status;
128
129 status = dwc3_omap_uboot_interrupt_status(index);
130 if (status)
131 dwc3_uboot_handle_interrupt(index);
132
133 return 0;
134}
135#endif
136
Dan Murphyfdce7b62013-07-11 13:10:28 -0500137/**
Sricharan508a58f2011-11-15 09:49:55 -0500138 * @brief board_init
139 *
140 * @return 0
141 */
142int board_init(void)
143{
144 gpmc_init();
Tom Rini94ba26f2017-01-25 20:42:35 -0500145 gd->bd->bi_arch_number = MACH_TYPE_OMAP5_SEVM;
Sricharan508a58f2011-11-15 09:49:55 -0500146 gd->bd->bi_boot_params = (0x80000000 + 0x100); /* boot param addr */
147
Dan Murphyfdce7b62013-07-11 13:10:28 -0500148 tca642x_set_inital_state(CONFIG_SYS_I2C_TCA642X_ADDR, tca642x_init);
149
Sricharan508a58f2011-11-15 09:49:55 -0500150 return 0;
151}
152
Tero Kristo803e9a12020-06-16 11:03:10 +0300153#if defined(CONFIG_SPL_OS_BOOT)
154int spl_start_uboot(void)
155{
156 /* break into full u-boot on 'c' */
157 if (serial_tstc() && serial_getc() == 'c')
158 return 1;
159
160 return 0;
161}
162#endif /* CONFIG_SPL_OS_BOOT */
163
Masahiro Yamadab75d8dc2020-06-26 15:13:33 +0900164int board_eth_init(struct bd_info *bis)
Sricharan508a58f2011-11-15 09:49:55 -0500165{
166 return 0;
167}
168
169/**
170 * @brief misc_init_r - Configure EVM board specific configurations
171 * such as power configurations, ethernet initialization as phase2 of
172 * boot sequence
173 *
174 * @return 0
175 */
176int misc_init_r(void)
177{
Nishanth Menoncb199102013-03-26 05:20:54 +0000178#ifdef CONFIG_PALMAS_POWER
Nishanth Menon12733882013-03-26 05:20:55 +0000179 palmas_init_settings();
Sricharan508a58f2011-11-15 09:49:55 -0500180#endif
Dan Murphy96805532013-08-26 08:54:53 -0500181
Paul Kocialkowski07815eb2015-08-27 19:37:12 +0200182 omap_die_id_usbethaddr();
Dan Murphyea02b652013-10-11 12:28:19 -0500183
Sricharan508a58f2011-11-15 09:49:55 -0500184 return 0;
185}
186
Paul Kocialkowski3ef56e62016-02-27 19:18:56 +0100187void set_muxconf_regs(void)
Sricharan508a58f2011-11-15 09:49:55 -0500188{
Lokesh Vutla9239f5b2013-05-30 02:54:30 +0000189 do_set_mux((*ctrl)->control_padconf_core_base,
190 core_padconf_array_essential,
Sricharan508a58f2011-11-15 09:49:55 -0500191 sizeof(core_padconf_array_essential) /
192 sizeof(struct pad_conf_entry));
193
Lokesh Vutla9239f5b2013-05-30 02:54:30 +0000194 do_set_mux((*ctrl)->control_padconf_wkup_base,
195 wkup_padconf_array_essential,
Sricharan508a58f2011-11-15 09:49:55 -0500196 sizeof(wkup_padconf_array_essential) /
197 sizeof(struct pad_conf_entry));
198}
199
Masahiro Yamada4aa2ba32017-05-09 20:31:39 +0900200#if defined(CONFIG_MMC)
Masahiro Yamadab75d8dc2020-06-26 15:13:33 +0900201int board_mmc_init(struct bd_info *bis)
Sricharan508a58f2011-11-15 09:49:55 -0500202{
Nikita Kiryanove3913f52012-12-03 02:19:47 +0000203 omap_mmc_init(0, 0, 0, -1, -1);
204 omap_mmc_init(1, 0, 0, -1, -1);
Sricharan508a58f2011-11-15 09:49:55 -0500205 return 0;
206}
207#endif
Dan Murphy5e5cfaf2013-08-01 14:05:59 -0500208
Dan Murphy96805532013-08-26 08:54:53 -0500209#ifdef CONFIG_USB_XHCI_OMAP
210/**
211 * @brief board_usb_init - Configure EVM board specific configurations
212 * for the LDO's and clocks for the USB blocks.
213 *
214 * @return 0
215 */
Troy Kisky7e575c42013-10-22 14:27:17 -0700216int board_usb_init(int index, enum usb_init_type init)
Dan Murphy96805532013-08-26 08:54:53 -0500217{
218 int ret;
219#ifdef CONFIG_PALMAS_USB_SS_PWR
220 ret = palmas_enable_ss_ldo();
221#endif
222
Dan Murphy96805532013-08-26 08:54:53 -0500223 return 0;
224}
225#endif