blob: 5def6eda43e5eece84d9c7ad3668ae363936c999 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Vanessa Maegima1541d7a2017-05-08 13:17:28 -03002/*
3 * Copyright (C) 2017 NXP Semiconductors
Vanessa Maegima1541d7a2017-05-08 13:17:28 -03004 */
5
Simon Glass52559322019-11-14 12:57:46 -07006#include <init.h>
Simon Glass90526e92020-05-10 11:39:56 -06007#include <net.h>
Vanessa Maegima1541d7a2017-05-08 13:17:28 -03008#include <asm/arch/clock.h>
9#include <asm/arch/crm_regs.h>
10#include <asm/arch/imx-regs.h>
11#include <asm/arch/mx7-pins.h>
12#include <asm/arch/sys_proto.h>
Simon Glass401d1c42020-10-30 21:38:53 -060013#include <asm/global_data.h>
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030014#include <asm/gpio.h>
Stefano Babic552a8482017-06-29 10:16:06 +020015#include <asm/mach-imx/iomux-v3.h>
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030016#include <asm/io.h>
17#include <common.h>
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030018#include <miiphy.h>
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030019#include <power/pmic.h>
20#include <power/pfuze3000_pmic.h>
21#include "../../freescale/common/pfuze.h"
22
23DECLARE_GLOBAL_DATA_PTR;
24
25#define UART_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | \
26 PAD_CTL_PUS_PU100KOHM | PAD_CTL_HYS)
27
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030028int dram_init(void)
29{
Fabio Estevamd5b71772018-06-29 15:19:11 -030030 gd->ram_size = imx_ddr_size();
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030031
Jun Nie1d3b8522019-05-08 14:38:32 +080032 /* Subtract the defined OPTEE runtime firmware length */
33#ifdef CONFIG_OPTEE_TZDRAM_SIZE
34 gd->ram_size -= CONFIG_OPTEE_TZDRAM_SIZE;
35#endif
36
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030037 return 0;
38}
39
Fabio Estevamab798112023-01-03 10:19:40 -030040#if CONFIG_IS_ENABLED(DM_PMIC)
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030041int power_init_board(void)
42{
Fabio Estevamab798112023-01-03 10:19:40 -030043 struct udevice *dev;
44 int reg, rev_id;
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030045 int ret;
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030046
Fabio Estevamab798112023-01-03 10:19:40 -030047 ret = pmic_get("pfuze3000@8", &dev);
48 if (ret == -ENODEV)
49 return 0;
50 if (ret != 0)
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030051 return ret;
52
Fabio Estevamab798112023-01-03 10:19:40 -030053 reg = pmic_reg_read(dev, PFUZE3000_DEVICEID);
54 rev_id = pmic_reg_read(dev, PFUZE3000_REVID);
55 printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x\n", reg, rev_id);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030056
57 /* disable Low Power Mode during standby mode */
Fabio Estevamab798112023-01-03 10:19:40 -030058 reg = pmic_reg_read(dev, PFUZE3000_LDOGCTL);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030059 reg |= 0x1;
Fabio Estevamab798112023-01-03 10:19:40 -030060 pmic_reg_write(dev, PFUZE3000_LDOGCTL, reg);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030061
62 /* SW1A/1B mode set to APS/APS */
63 reg = 0x8;
Fabio Estevamab798112023-01-03 10:19:40 -030064 pmic_reg_write(dev, PFUZE3000_SW1AMODE, reg);
65 pmic_reg_write(dev, PFUZE3000_SW1BMODE, reg);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030066
67 /* SW1A/1B standby voltage set to 1.025V */
68 reg = 0xd;
Fabio Estevamab798112023-01-03 10:19:40 -030069 pmic_reg_write(dev, PFUZE3000_SW1ASTBY, reg);
70 pmic_reg_write(dev, PFUZE3000_SW1BSTBY, reg);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030071
72 /* decrease SW1B normal voltage to 0.975V */
Fabio Estevamab798112023-01-03 10:19:40 -030073 reg = pmic_reg_read(dev, PFUZE3000_SW1BVOLT);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030074 reg &= ~0x1f;
75 reg |= PFUZE3000_SW1AB_SETP(975);
Fabio Estevamab798112023-01-03 10:19:40 -030076 pmic_reg_write(dev, PFUZE3000_SW1BVOLT, reg);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030077
78 return 0;
79}
80#endif
81
82static iomux_v3_cfg_t const wdog_pads[] = {
83 MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL),
84};
85
86static iomux_v3_cfg_t const uart5_pads[] = {
87 MX7D_PAD_I2C4_SCL__UART5_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
88 MX7D_PAD_I2C4_SDA__UART5_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
89};
90
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030091#ifdef CONFIG_FEC_MXC
Vanessa Maegima1541d7a2017-05-08 13:17:28 -030092static int setup_fec(void)
93{
94 struct iomuxc_gpr_base_regs *const iomuxc_gpr_regs
95 = (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
96
97 /* Use 125M anatop REF_CLK1 for ENET1, clear gpr1[13], gpr1[17] */
98 clrsetbits_le32(&iomuxc_gpr_regs->gpr[1],
99 (IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK |
100 IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0);
101
Eric Nelson85907862017-08-31 08:34:23 -0700102 return set_clk_enet(ENET_125MHZ);
Vanessa Maegima1541d7a2017-05-08 13:17:28 -0300103}
Vanessa Maegima1541d7a2017-05-08 13:17:28 -0300104#endif
105
106static void setup_iomux_uart(void)
107{
108 imx_iomux_v3_setup_multiple_pads(uart5_pads, ARRAY_SIZE(uart5_pads));
109}
110
Vanessa Maegima1541d7a2017-05-08 13:17:28 -0300111int board_early_init_f(void)
112{
113 setup_iomux_uart();
114
Vanessa Maegima1541d7a2017-05-08 13:17:28 -0300115 return 0;
116}
117
Simon Glassb86986c2022-10-18 07:46:31 -0600118#ifdef CONFIG_VIDEO
Fabio Estevam9e3c0172018-12-11 16:40:38 -0200119void setup_lcd(void)
120{
Joris Offougad5f3a472019-04-04 14:00:54 +0200121 gpio_request(IMX_GPIO_NR(1, 11), "lcd_brightness");
122 gpio_request(IMX_GPIO_NR(1, 6), "lcd_enable");
Fabio Estevam9e3c0172018-12-11 16:40:38 -0200123 /* Set Brightness to high */
124 gpio_direction_output(IMX_GPIO_NR(1, 11) , 1);
125 /* Set LCD enable to high */
126 gpio_direction_output(IMX_GPIO_NR(1, 6) , 1);
127}
128#endif
129
Vanessa Maegima1541d7a2017-05-08 13:17:28 -0300130int board_init(void)
131{
132 /* address of boot parameters */
133 gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
134
Simon Glassb86986c2022-10-18 07:46:31 -0600135#ifdef CONFIG_VIDEO
Fabio Estevam9e3c0172018-12-11 16:40:38 -0200136 setup_lcd();
137#endif
Vanessa Maegima1541d7a2017-05-08 13:17:28 -0300138#ifdef CONFIG_FEC_MXC
139 setup_fec();
140#endif
141
142 return 0;
143}
144
145int board_late_init(void)
146{
147 struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
148
149 imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
150
151 set_wdog_reset(wdog);
152
153 /*
154 * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4),
155 * since we use PMIC_PWRON to reset the board.
156 */
157 clrsetbits_le16(&wdog->wcr, 0, 0x10);
158
159 return 0;
160}
161
162int checkboard(void)
163{
164 puts("Board: i.MX7D PICOSOM\n");
165
166 return 0;
167}
168
Fabio Estevam780e31e2018-09-28 11:22:39 -0300169static iomux_v3_cfg_t const usb_otg2_pads[] = {
170 MX7D_PAD_UART3_CTS_B__USB_OTG2_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
171};
172
173int board_ehci_hcd_init(int port)
174{
175 switch (port) {
176 case 0:
177 break;
178 case 1:
179 imx_iomux_v3_setup_multiple_pads(usb_otg2_pads,
180 ARRAY_SIZE(usb_otg2_pads));
181 break;
182 default:
183 return -EINVAL;
184 }
185 return 0;
186}