xref: /openbmc/u-boot/board/tplink/wdr4300/wdr4300.c (revision 3ce88cd7)
1 /*
2  * Copyright (C) 2016 Marek Vasut <marex@denx.de>
3  *
4  * SPDX-License-Identifier: GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <asm/io.h>
9 #include <asm/addrspace.h>
10 #include <asm/types.h>
11 #include <mach/ath79.h>
12 #include <mach/ar71xx_regs.h>
13 #include <mach/ddr.h>
14 #include <debug_uart.h>
15 
16 #ifdef CONFIG_USB
17 static void wdr4300_usb_start(void)
18 {
19 	void __iomem *gpio_regs = map_physmem(AR71XX_GPIO_BASE,
20 					      AR71XX_GPIO_SIZE, MAP_NOCACHE);
21 	if (!gpio_regs)
22 		return;
23 
24 	/* Power up the USB HUB. */
25 	clrbits_be32(gpio_regs + AR71XX_GPIO_REG_OE, BIT(21) | BIT(22));
26 	writel(BIT(21) | BIT(22), gpio_regs + AR71XX_GPIO_REG_SET);
27 	mdelay(1);
28 
29 	ath79_usb_reset();
30 }
31 #else
32 static inline void wdr4300_usb_start(void) {}
33 #endif
34 
35 void wdr4300_pinmux_config(void)
36 {
37 	void __iomem *regs;
38 
39 	regs = map_physmem(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE,
40 			   MAP_NOCACHE);
41 
42 	/* Assure JTAG is not disconnected. */
43 	writel(0x40, regs + AR934X_GPIO_REG_FUNC);
44 
45 	/* Configure default GPIO input/output regs. */
46 	writel(0x3031b, regs + AR71XX_GPIO_REG_OE);
47 	writel(0x0f804, regs + AR71XX_GPIO_REG_OUT);
48 
49 	/* Configure pin multiplexing. */
50 	writel(0x00000000, regs + AR934X_GPIO_REG_OUT_FUNC0);
51 	writel(0x0b0a0980, regs + AR934X_GPIO_REG_OUT_FUNC1);
52 	writel(0x00180000, regs + AR934X_GPIO_REG_OUT_FUNC2);
53 	writel(0x00000000, regs + AR934X_GPIO_REG_OUT_FUNC3);
54 	writel(0x0000004d, regs + AR934X_GPIO_REG_OUT_FUNC4);
55 	writel(0x00000000, regs + AR934X_GPIO_REG_OUT_FUNC5);
56 }
57 
58 #ifdef CONFIG_DEBUG_UART_BOARD_INIT
59 void board_debug_uart_init(void)
60 {
61 	wdr4300_pinmux_config();
62 }
63 #endif
64 
65 #ifdef CONFIG_BOARD_EARLY_INIT_F
66 int board_early_init_f(void)
67 {
68 #ifndef CONFIG_DEBUG_UART_BOARD_INIT
69 	wdr4300_pinmux_config();
70 #endif
71 
72 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
73 	ar934x_pll_init(560, 480, 240);
74 	ar934x_ddr_init(560, 480, 240);
75 #endif
76 
77 	wdr4300_usb_start();
78 	ath79_eth_reset();
79 
80 	return 0;
81 }
82 #endif
83