aboutsummaryrefslogtreecommitdiff
path: root/board/purism/librem5/librem5.h
blob: 0d24edea9b1f8170b382b2a0f3398fc1b7a6fa5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright 2021 Purism
 */

#ifndef __LIBREM5_H__
#define __LIBREM5_H__

#define CAMERA_EN IMX_GPIO_NR(1, 0)
#define SD_EN IMX_GPIO_NR(1, 3)
#define AUDIO_EN IMX_GPIO_NR(1, 4)
#define DSI_EN IMX_GPIO_NR(1, 5)
#define SMC_EN IMX_GPIO_NR(1, 6)
#define TYPEC_MUX_EN IMX_GPIO_NR(1, 11)
#define HUB_NRESET IMX_GPIO_NR(1, 12)
#define HUB_EN IMX_GPIO_NR(1, 14)
#define VOL_UP IMX_GPIO_NR(1, 16)
#define VOL_DOWN IMX_GPIO_NR(1, 17)
#define DSI_BIAS_EN IMX_GPIO_NR(1, 20)
#define FLASH_EN IMX_GPIO_NR(1, 23)
#define WWAN_NRESET IMX_GPIO_NR(3, 1)
#define CHG_EN IMX_GPIO_NR(3, 2)
#define CHG_OTG_OUT_EN IMX_GPIO_NR(3, 4)
#define WIFI_EN IMX_GPIO_NR(3, 10)
#define GPS_EN IMX_GPIO_NR(3, 12)
#define BL_EN IMX_GPIO_NR(3, 14)
#define WWAN_EN IMX_GPIO_NR(3, 18)
#define NFC_EN IMX_GPIO_NR(4, 28)
#define LED_G IMX_GPIO_NR(5, 2)
#define LED_R IMX_GPIO_NR(5, 3)
#define LED_B IMX_GPIO_NR(1, 13)
#define MOTO IMX_GPIO_NR(5, 5)
#define SPI1_SCLK IMX_GPIO_NR(5, 6)
#define SPI1_MOSI IMX_GPIO_NR(5, 7)
#define SPI1_MISO IMX_GPIO_NR(5, 8)
#define SPI1_SS0 IMX_GPIO_NR(5, 9)

#define UART1_TX IMX_GPIO_NR(5, 23)
#define UART1_RX IMX_GPIO_NR(5, 22)
#define UART2_TX IMX_GPIO_NR(5, 25)
#define UART2_RX IMX_GPIO_NR(5, 24)
#define UART3_TX IMX_GPIO_NR(5, 27)
#define UART3_RX IMX_GPIO_NR(5, 26)
#define UART4_TX IMX_GPIO_NR(5, 11)
#define UART4_RX IMX_GPIO_NR(5, 10)

#define TPS_RESET IMX_GPIO_NR(3, 24)

#define PURISM_VID	0x316d
#define PURISM_PID	0x4c05

#define BOARD_REV_ERROR		"unknown"
#define BOARD_REV_BIRCH		"1"
#define BOARD_REV_CHESTNUT	"2"
#define BOARD_REV_DOGWOOD	"3"
#define BOARD_REV_EVERGREEN	"4"
/* Could be ASPEN, BIRCH or CHESTNUT. assume CHESTNUT */
#define BOARD_REV_UNKNOWN	BOARD_REV_CHESTNUT

#ifdef CONFIG_SPL_BUILD
static const iomux_v3_cfg_t configure_pads[] = {
	IMX8MQ_PAD_GPIO1_IO00__GPIO1_IO0 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_GPIO1_IO03__GPIO1_IO3 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_GPIO1_IO04__GPIO1_IO4 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_GPIO1_IO05__GPIO1_IO5 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_GPIO1_IO06__GPIO1_IO6 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_GPIO1_IO11__GPIO1_IO11 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_GPIO1_IO12__GPIO1_IO12 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_GPIO1_IO13__GPIO1_IO13 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_GPIO1_IO14__GPIO1_IO14 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_ENET_MDC__GPIO1_IO16 | MUX_PAD_CTRL(PAD_CTL_PUE),
	IMX8MQ_PAD_ENET_MDIO__GPIO1_IO17 | MUX_PAD_CTRL(PAD_CTL_PUE),
	IMX8MQ_PAD_ENET_TD1__GPIO1_IO20 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_ENET_TXC__GPIO1_IO23 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_CE0_B__GPIO3_IO1 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_CE1_B__GPIO3_IO2 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_CE3_B__GPIO3_IO4 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_DATA04__GPIO3_IO10 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_DATA06__GPIO3_IO12 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_DQS__GPIO3_IO14 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_NAND_WP_B__GPIO3_IO18 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_SAI3_RXFS__GPIO4_IO28 | MUX_PAD_CTRL(PAD_CTL_DSE6),
	IMX8MQ_PAD_SAI3_MCLK__GPIO5_IO2 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_SPDIF_TX__GPIO5_IO3 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
	IMX8MQ_PAD_SAI5_RXD3__GPIO3_IO24 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
};

static inline void init_pinmux(void)
{
	imx_iomux_v3_setup_multiple_pads(configure_pads, ARRAY_SIZE(configure_pads));

	gpio_request(LED_R, "LED_R");
	gpio_request(LED_G, "LED_G");
	gpio_request(LED_B, "LED_B");
	gpio_request(VOL_UP, "VOL_UP");
	gpio_request(VOL_DOWN, "VOL_DOWN");

	gpio_request(NFC_EN, "NFC_EN");
	gpio_request(CHG_EN, "CHG_EN");
	gpio_request(CHG_OTG_OUT_EN, "CHG_OTG_OUT_EN");

	gpio_request(TYPEC_MUX_EN, "TYPEC_MUX_EN");

	gpio_request(TPS_RESET, "TPS_RESET");

	gpio_request(WWAN_EN, "WWAN_EN");
	gpio_request(WWAN_NRESET, "WWAN_NRESET");

	gpio_request(HUB_EN, "HUB_EN");
	gpio_request(HUB_NRESET, "HUB_NRESET");
	gpio_request(SD_EN, "SD_EN");
	gpio_request(AUDIO_EN, "AUDIO_EN");
	gpio_request(DSI_EN, "DSI_EN");
	gpio_request(SMC_EN, "SMC_EN");
	gpio_request(CAMERA_EN, "CAMERA_EN");
	gpio_request(FLASH_EN, "FLASH_EN");
	gpio_request(DSI_BIAS_EN, "DSI_BIAS_EN");
	gpio_request(GPS_EN, "GPS_EN");
	gpio_request(BL_EN, "BL_EN");
#ifndef CONSOLE_ON_UART4
	gpio_request(WIFI_EN, "WIFI_EN");
	gpio_direction_output(WIFI_EN, 0);
#endif /* CONSOLE_ON_UART4 */
	gpio_direction_input(VOL_UP);
	gpio_direction_input(VOL_DOWN);

	/* ensure charger is in the automated mode */
	gpio_direction_output(NFC_EN, 0);
	gpio_direction_output(CHG_EN, 0);
	gpio_direction_output(CHG_OTG_OUT_EN, 0);

	gpio_direction_input(TYPEC_MUX_EN);

	gpio_direction_output(TPS_RESET, 0);

	gpio_direction_output(WWAN_EN, 0);
	gpio_direction_output(WWAN_NRESET, 1);

	gpio_direction_output(HUB_EN, 1);
	gpio_direction_output(HUB_NRESET, 1);
	mdelay(10);
	gpio_direction_output(SD_EN, 1);
	gpio_direction_output(SMC_EN, 0);
	gpio_direction_output(CAMERA_EN, 0);
	gpio_direction_output(FLASH_EN, 0);
	gpio_direction_output(DSI_BIAS_EN, 0);
	gpio_direction_output(GPS_EN, 0);
	gpio_direction_output(BL_EN, 0);

	/* turn these on for i2c busses */
	gpio_direction_output(AUDIO_EN, 1);
	gpio_direction_output(DSI_EN, 1);
}
#endif /* CONFIG_SPL_BUILD */

#define USB1_BASE_ADDR         0x38100000
#define USB2_BASE_ADDR         0x38200000
#define USB1_PHY_BASE_ADDR     0x381F0000
#define USB2_PHY_BASE_ADDR     0x382F0000

#define USB_PHY_CTRL0			0xF0040
#define USB_PHY_CTRL0_REF_SSP_EN	BIT(2)
#define USB_PHY_CTRL0_SSC_RANGE_MASK	GENMASK(23, 21)
#define USB_PHY_CTRL0_SSC_RANGE_4003PPM	(0x2 << 21)

#define USB_PHY_CTRL1			0xF0044
#define USB_PHY_CTRL1_RESET		BIT(0)
#define USB_PHY_CTRL1_COMMONONN		BIT(1)
#define USB_PHY_CTRL1_ATERESET		BIT(3)
#define USB_PHY_CTRL1_VDATSRCENB0	BIT(19)
#define USB_PHY_CTRL1_VDATDETENB0	BIT(20)

#define USB_PHY_CTRL2			0xF0048
#define USB_PHY_CTRL2_TXENABLEN0	BIT(8)

#define USB_PHY_CTRL6			0x18
#define USB_PHY_CTRL6_RXTERM_OVERRIDE_SEL	BIT(29)

extern struct dram_timing_info dram_timing_b0;

#endif