blob: 4acff18b89e2ec1f916a8fa051c6c520855846f6 [file] [log] [blame]
Prabhu Jayakumarc4c01222016-05-03 18:19:18 +05301/*
2 * Copyright (c) 2016 The Linux Foundation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
15#ifndef _ATHEROS_H
16#define _ATHEROS_H
17
18/*
19 * Set everything to zero. The corresponding header will
20 * undef and re-define the appropriate ones
21 */
22#define is_ar7100() (0)
23
24#define is_ar7240() (0)
25#define is_ar7241() (0)
26#define is_ar7242() (0)
27
28#define is_ar9330() (0)
29#define is_ar933x() (0)
30#define is_hornet() (0)
31
32#define is_ar934x() (0)
33#define is_wasp() (0)
34
35#define is_qca955x() (0)
36#define is_sco() (0)
37
38#define is_qca953x() (0)
39#define is_hb() (0)
40
41#define is_qca956x() (0)
42
43#define ATH_CONSOLE_BAUD 115200
44
45#define AR7240_REV_1_2 0xc2
46
47#ifdef CONFIG_ATH_EMULATION
48#define is_emu() (1)
49#else
50#define is_emu() (0)
51#endif
52
53#ifdef CONFIG_F1E_PHY
54#define is_f1e() 1
55#else
56#define is_f1e() 0
57#endif
58#ifdef CONFIG_F2E_PHY
59#define is_f2e() 1
60#else
61#define is_f2e() 0
62#endif
63#ifdef CONFIG_ATHRS16_PHY
64#define is_s16() 1
65#else
66#define is_s16() 0
67#endif
68
69#ifdef CONFIG_ATHRS17_PHY
70#define is_s17() 1
71#else
72#define is_s17() 0
73#endif
74
75#ifdef CONFIG_ATHR_8033_PHY
76#define is_ar8033() 1
77#else
78#define is_ar8033() 0
79#endif
80
81#ifdef CONFIG_VIR_PHY
82#define is_vir_phy() 1
83#else
84#define is_vir_phy() 0
85#endif
86
87#ifdef CFG_ATHRS27_PHY
88#define is_s27() 1
89#else
90#define is_s27() 0
91#endif
92
93#define ath_arch_init_irq() /* nothing */
94
95#ifndef __ASSEMBLY__
96
97int ath_uart_freq(void);
98
99typedef unsigned int ath_reg_t;
100
101#ifdef COMPRESSED_UBOOT
102# define prmsg(...)
103#else
104# define prmsg printf
105#endif
106
107#endif /* __ASSEMBLY__ */
108
109#define ath_reg_rd(_phys) (*(volatile ath_reg_t *)KSEG1ADDR(_phys))
110
111#define ath_reg_wr_nf(_phys, _val) \
112 ((*(volatile ath_reg_t *)KSEG1ADDR(_phys)) = (_val))
113
114#define ath_reg_wr(_phys, _val) do { \
115 ath_reg_wr_nf(_phys, _val); \
116 ath_reg_rd(_phys); \
117} while(0)
118
119#define ath_reg_rmw_set(_reg, _mask) do { \
120 ath_reg_wr((_reg), (ath_reg_rd((_reg)) | (_mask))); \
121 ath_reg_rd((_reg)); \
122} while(0)
123
124#define ath_reg_rmw_clear(_reg, _mask) do { \
125 ath_reg_wr((_reg), (ath_reg_rd((_reg)) & ~(_mask))); \
126 ath_reg_rd((_reg)); \
127} while(0)
128
129#define ath_uart_rd(y) ath_reg_rd((ATH_UART_BASE+y))
130#define ath_uart_wr(x, z) ath_reg_wr((ATH_UART_BASE+x), z)
131
132#define REG_OFFSET 4
133
134#define OFS_RCV_BUFFER (0 * REG_OFFSET)
135#define OFS_TRANS_HOLD (0 * REG_OFFSET)
136#define OFS_SEND_BUFFER (0 * REG_OFFSET)
137#define OFS_INTR_ENABLE (1 * REG_OFFSET)
138#define OFS_INTR_ID (2 * REG_OFFSET)
139#define OFS_DATA_FORMAT (3 * REG_OFFSET)
140#define OFS_LINE_CONTROL (3 * REG_OFFSET)
141#define OFS_MODEM_CONTROL (4 * REG_OFFSET)
142#define OFS_RS232_OUTPUT (4 * REG_OFFSET)
143#define OFS_LINE_STATUS (5 * REG_OFFSET)
144#define OFS_MODEM_STATUS (6 * REG_OFFSET)
145#define OFS_RS232_INPUT (6 * REG_OFFSET)
146#define OFS_SCRATCH_PAD (7 * REG_OFFSET)
147
148#define OFS_DIVISOR_LSB (0 * REG_OFFSET)
149#define OFS_DIVISOR_MSB (1 * REG_OFFSET)
150
151/*
152 * PLL Config for different CPU/DDR/AHB frequencies
153 */
154#define CFG_PLL_720_600_200 0x01
155#define CFG_PLL_720_680_240 0x02
156#define CFG_PLL_720_600_240 0x03
157#define CFG_PLL_680_680_226 0x04
158#define CFG_PLL_720_600_300 0x05
159#define CFG_PLL_400_400_200 0x06
160#define CFG_PLL_560_450_220 0x07
161#define CFG_PLL_550_400_200 0x08
162#define CFG_PLL_550_600_200 0x09
163#define CFG_PLL_600_600_200 0x0a
164#define CFG_PLL_750_400_250 0x0b
165#define CFG_PLL_800_400_266 0x0c
166#define CFG_PLL_750_667_250 0x0d
167#define CFG_PLL_800_600_266 0x0e
168#define CFG_PLL_800_667_266 0x0f
169#define CFG_PLL_810_700_270 0x10
170#define CFG_PLL_810_666_270 0x11
171#define CFG_PLL_775_650_258 0x12
172#define CFG_PLL_650_400_200 0x13
173#define CFG_PLL_650_600_200 0x14
174
175#define UBOOT_SIZE (256 * 1024)
176#define PLL_FLASH_ADDR (CFG_FLASH_BASE + UBOOT_SIZE)
177#define PLL_CONFIG_VAL_F (PLL_FLASH_ADDR + CFG_FLASH_SECTOR_SIZE - 0x20)
178#define PLL_MAGIC 0xaabbccdd
179#define SRIF_PLL_CONFIG_VAL_F (PLL_CONFIG_VAL_F - 12)
180#define SRIF_PLL_MAGIC 0x73726966 /* srif */
181
182#include <config.h>
183
184#if defined(CONFIG_MACH_AR724x)
185# include <724x.h>
186#elif defined(CONFIG_MACH_AR933x)
187# include <933x.h>
188#elif defined(CONFIG_MACH_AR934x)
189# include <934x.h>
190#elif defined(CONFIG_MACH_QCA955x)
191# include <955x.h>
192#elif defined(CONFIG_MACH_QCA953x)
193# include <953x.h>
194#elif defined(CONFIG_MACH_QCA956x)
195# include <956x.h>
196#else
197# error "Building U-Boot for unknown device"
198#endif
199
200#ifndef __ASSEMBLY__
201
202#define ATH_MEM_SDRAM 1
203#define ATH_MEM_DDR1 2
204#define ATH_MEM_DDR2 3
205/*
206 * GPIO Access & Control
207 */
208void ath_gpio_init(void);
209void ath_gpio_down(void);
210void ath_gpio_up(void);
211
212void ath_gpio_irq_init(int);
213/*
214 * GPIO Helper Functions
215 */
216void ath_gpio_enable_slic(void);
217
218/* enable UART block, takes away GPIO 10 and 9 */
219void ath_gpio_enable_uart(void);
220
221/* enable STEREO block, takes away GPIO 11,8,7, and 6 */
222void ath_gpio_enable_stereo(void);
223
224/* allow CS0/CS1 to be controlled via SPI register, takes away GPIO0/GPIO1 */
225void ath_gpio_enable_spi_cs1_cs0(void);
226
227/* allow GPIO0/GPIO1 to be used as SCL/SDA for software based i2c */
228void ath_gpio_enable_i2c_on_gpio_0_1(void);
229
230/*
231 * GPIO General Functions
232 */
233void ath_gpio_drive_low(unsigned int mask);
234void ath_gpio_drive_high(unsigned int mask);
235
236unsigned int ath_gpio_float_high_test(unsigned int mask);
237
238/* Functions to access SPI through software. Example:
239 *
240 * ath_spi_down(); ---------------------- disable others from accessing SPI bus taking semaphore
241 * ath_spi_enable_soft_access(); -------- disable HW control of SPI
242 *
243 * <board specific chip select routine>
244 *
245 * <read/write SPI using using custom routine or general purposeflash routines
246 * Custom routine may use:
247 *
248 * ath_spi_raw_output_u8(unsigned char)
249 * ath_spi_raw_output_u32(unsigned int)
250 * ath_spi_raw_input_u32()
251 *
252 * General purpose flash routines:
253 * ath_spi_flash_read_page(unsigned int addr, unsigned char *data, int len);
254 * ath_spi_flash_write_page(unsigned int addr, unsigned char *data, int len);
255 * ath_spi_flash_sector_erase(unsigned int addr);
256 * >
257 *
258 * <board specific chip deselect routine>
259 *
260 * ath_spi_disable_soft_acess(); ------- enable HW control of SPI bus
261 * ath_spi_up(); ----------------------- enable others to access SPI bus releasing semaphore
262 */
263void ath_spi_init(void);
264void ath_spi_down(void);
265void ath_spi_up(void);
266
267static inline void
268ath_spi_enable_soft_access(void)
269{
270 ath_reg_wr_nf(ATH_SPI_FS, 1);
271}
272
273static inline void
274ath_spi_disable_soft_access(void)
275{
276 ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_DIS);
277 ath_reg_wr_nf(ATH_SPI_FS, 0);
278}
279
280void ath_spi_raw_output_u8(unsigned char val);
281void ath_spi_raw_output_u32(unsigned int val);
282unsigned int ath_spi_raw_input_u8(void);
283unsigned int ath_spi_raw_input_u32(void);
284
285void ath_spi_flash_read_page(unsigned int addr, unsigned char *data, int len);
286void ath_spi_flash_write_page(unsigned int addr, unsigned char *data, int len);
287void ath_spi_flash_sector_erase(unsigned int addr);
288
289/*
290 * Allow access to cs0-2 when GPIO Function enables cs0-2 through SPI register.
291 */
292static inline void
293ath_spi_enable_cs0(void)
294{
295 unsigned int cs;
296 ath_spi_down();
297 ath_spi_enable_soft_access();
298 cs = ath_reg_rd(ATH_SPI_WRITE) & ~ATH_SPI_CS_DIS;
299 ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_ENABLE_0 | cs);
300}
301
302static inline void
303ath_spi_enable_cs1(void)
304{
305 unsigned int cs;
306#if defined(CONFIG_MACH_AR934x) || \
307 defined(CONFIG_MACH_QCA955x)
308 ath_spi_down();
309 ath_spi_init();
310 ath_spi_enable_soft_access();
311 cs = ath_reg_rd(ATH_SPI_WRITE) & ATH_SPI_CS_DIS;
312 ath_reg_wr_nf(ATH_SPI_WRITE, cs | ATH_SPI_CLK_HIGH);
313 cs = ath_reg_rd(ATH_SPI_WRITE) & ~ATH_SPI_CS_DIS;
314 ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_ENABLE_1 | cs | ATH_SPI_CLK_HIGH);
315 ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_ENABLE_1 | cs);
316#else
317 ath_spi_down();
318 ath_spi_enable_soft_access();
319 cs = ath_reg_rd(ATH_SPI_WRITE) & ~ATH_SPI_CS_DIS;
320 ath_reg_wr_nf(ATH_SPI_WRITE, ATH_SPI_CS_ENABLE_1 | cs);
321#endif
322}
323
324static inline void
325ath_spi_disable_cs(void)
326{
327 unsigned int cs = ath_reg_rd(ATH_SPI_WRITE) | ATH_SPI_CS_DIS;
328 ath_reg_wr_nf(ATH_SPI_WRITE, cs);
329 ath_spi_disable_soft_access();
330 ath_spi_up();
331}
332
333/*
334 * Example usage to access BOOT flash
335 */
336static inline void
337ath_spi_flash_cs0_sector_erase(unsigned int addr)
338{
339 ath_spi_enable_cs0();
340 ath_spi_flash_sector_erase(addr);
341 ath_spi_disable_cs();
342}
343
344static inline void
345ath_spi_flash_cs0_write_page(unsigned int addr, unsigned char *data, int len)
346{
347 ath_spi_enable_cs0();
348 ath_spi_flash_write_page(addr, data, len);
349 ath_spi_disable_cs();
350}
351
352#endif /* __ASSEMBLY__ */
353
354
355#endif /* _ATHEROS_H */