1bfacf466SStefan /*
2bfacf466SStefan * Copyright (C) 2011
3*16437a19SStefan Herbrechtsmeier * Stefan Herbrechtsmeier <stefan@herbrechtsmeier.net>
4bfacf466SStefan *
5bfacf466SStefan * Based on Kirkwood support:
6bfacf466SStefan * (C) Copyright 2009
7bfacf466SStefan * Marvell Semiconductor <www.marvell.com>
8bfacf466SStefan * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
9bfacf466SStefan *
101a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
11bfacf466SStefan */
12bfacf466SStefan
13bfacf466SStefan #include <common.h>
14bfacf466SStefan #include <miiphy.h>
15bfacf466SStefan #include <netdev.h>
16bfacf466SStefan #include <asm/arch/cpu.h>
173dc23f78SStefan Roese #include <asm/arch/soc.h>
18bfacf466SStefan #include <asm/arch/mpp.h>
19bfacf466SStefan #include <asm/arch/gpio.h>
20bfacf466SStefan #include "dns325.h"
21bfacf466SStefan
22bfacf466SStefan DECLARE_GLOBAL_DATA_PTR;
23bfacf466SStefan
board_early_init_f(void)24bfacf466SStefan int board_early_init_f(void)
25bfacf466SStefan {
26bfacf466SStefan /* Gpio configuration */
27d5c5132fSStefan Roese mvebu_config_gpio(DNS325_OE_VAL_LOW, DNS325_OE_VAL_HIGH,
28bfacf466SStefan DNS325_OE_LOW, DNS325_OE_HIGH);
29bfacf466SStefan
30bfacf466SStefan /* Multi-Purpose Pins Functionality configuration */
319d86f0c3SAlbert ARIBAUD static const u32 kwmpp_config[] = {
32bfacf466SStefan MPP0_NF_IO2,
33bfacf466SStefan MPP1_NF_IO3,
34bfacf466SStefan MPP2_NF_IO4,
35bfacf466SStefan MPP3_NF_IO5,
36bfacf466SStefan MPP4_NF_IO6,
37bfacf466SStefan MPP5_NF_IO7,
38bfacf466SStefan MPP6_SYSRST_OUTn,
39bfacf466SStefan MPP7_GPO,
40bfacf466SStefan MPP8_TW_SDA,
41bfacf466SStefan MPP9_TW_SCK,
42bfacf466SStefan MPP10_UART0_TXD,
43bfacf466SStefan MPP11_UART0_RXD,
44bfacf466SStefan MPP12_SD_CLK,
45bfacf466SStefan MPP13_SD_CMD,
46bfacf466SStefan MPP14_SD_D0,
47bfacf466SStefan MPP15_SD_D1,
48bfacf466SStefan MPP16_SD_D2,
49bfacf466SStefan MPP17_SD_D3,
50bfacf466SStefan MPP18_NF_IO0,
51bfacf466SStefan MPP19_NF_IO1,
52bfacf466SStefan MPP20_SATA1_ACTn, /* sata1(left) status led */
53bfacf466SStefan MPP21_SATA0_ACTn, /* sata0(right) status led */
54bfacf466SStefan MPP22_GPIO,
55bfacf466SStefan MPP23_GPIO,
56bfacf466SStefan MPP24_GPIO, /* power off out */
57bfacf466SStefan MPP25_GPIO,
58bfacf466SStefan MPP26_GPIO, /* power led */
59bfacf466SStefan MPP27_GPIO, /* sata0(right) error led */
60bfacf466SStefan MPP28_GPIO, /* sata1(left) error led */
61bfacf466SStefan MPP29_GPIO, /* usb error led */
62bfacf466SStefan MPP30_GPIO,
63bfacf466SStefan MPP31_GPIO,
64bfacf466SStefan MPP32_GPIO,
65bfacf466SStefan MPP33_GPIO,
66bfacf466SStefan MPP34_GPIO, /* power key */
67bfacf466SStefan MPP35_GPIO,
68bfacf466SStefan MPP36_GPIO,
69bfacf466SStefan MPP37_GPIO,
70bfacf466SStefan MPP38_GPIO,
71bfacf466SStefan MPP39_GPIO, /* enable sata 0 */
72bfacf466SStefan MPP40_GPIO, /* enable sata 1 */
73bfacf466SStefan MPP41_GPIO, /* hdd0 present */
74bfacf466SStefan MPP42_GPIO, /* hdd1 present */
75bfacf466SStefan MPP43_GPIO, /* usb status led */
76bfacf466SStefan MPP44_GPIO, /* fan status */
77bfacf466SStefan MPP45_GPIO, /* fan high speed */
78bfacf466SStefan MPP46_GPIO, /* fan low speed */
79bfacf466SStefan MPP47_GPIO, /* usb umount */
80bfacf466SStefan MPP48_GPIO, /* factory reset */
81bfacf466SStefan MPP49_GPIO, /* thermal sensor */
82bfacf466SStefan 0
83bfacf466SStefan };
8484683638SValentin Longchamp kirkwood_mpp_conf(kwmpp_config, NULL);
85bfacf466SStefan
86bfacf466SStefan kw_gpio_set_blink(DNS325_GPIO_LED_POWER , 1);
87bfacf466SStefan
88bfacf466SStefan kw_gpio_set_value(DNS325_GPIO_SATA0_EN , 1);
89bfacf466SStefan return 0;
90bfacf466SStefan }
91bfacf466SStefan
board_init(void)92bfacf466SStefan int board_init(void)
93bfacf466SStefan {
94bfacf466SStefan /* Boot parameters address */
9596c5f081SStefan Roese gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
96bfacf466SStefan
97bfacf466SStefan return 0;
98bfacf466SStefan }
99bfacf466SStefan
100bfacf466SStefan #ifdef CONFIG_RESET_PHY_R
101bfacf466SStefan /* Configure and initialize PHY */
reset_phy(void)102bfacf466SStefan void reset_phy(void)
103bfacf466SStefan {
104bfacf466SStefan u16 reg;
105bfacf466SStefan u16 devadr;
106bfacf466SStefan char *name = "egiga0";
107bfacf466SStefan
108bfacf466SStefan if (miiphy_set_current_dev(name))
109bfacf466SStefan return;
110bfacf466SStefan
111bfacf466SStefan /* command to read PHY dev address */
112bfacf466SStefan if (miiphy_read(name, 0xEE, 0xEE, (u16 *) &devadr)) {
113bfacf466SStefan printf("Err..(%s) could not read PHY dev address\n", __func__);
114bfacf466SStefan return;
115bfacf466SStefan }
116bfacf466SStefan
117bfacf466SStefan /*
118bfacf466SStefan * Enable RGMII delay on Tx and Rx for CPU port
119bfacf466SStefan * Ref: sec 4.7.2 of chip datasheet
120bfacf466SStefan */
121bfacf466SStefan miiphy_write(name, devadr, MV88E1116_PGADR_REG, 2);
122bfacf466SStefan miiphy_read(name, devadr, MV88E1116_MAC_CTRL_REG, ®);
123bfacf466SStefan reg |= (MV88E1116_RGMII_RXTM_CTRL | MV88E1116_RGMII_TXTM_CTRL);
124bfacf466SStefan miiphy_write(name, devadr, MV88E1116_MAC_CTRL_REG, reg);
125bfacf466SStefan miiphy_write(name, devadr, MV88E1116_PGADR_REG, 0);
126bfacf466SStefan
127bfacf466SStefan /* reset the phy */
128bfacf466SStefan miiphy_reset(name, devadr);
129bfacf466SStefan
130bfacf466SStefan debug("88E1116 Initialized on %s\n", name);
131bfacf466SStefan }
132bfacf466SStefan #endif /* CONFIG_RESET_PHY_R */
133