summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/wago-pfc-am35xx/board.c
blob: c0a039ba50793e9f35d864ce94bd15e356c35b3c (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
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright (C) 2014 WAGO Kontakttechnik GmbH & Co. KG <http://global.wago.com>
 * Author: Heinrich Toews <heinrich.toews@wago.com>
 */
#define pr_fmt(fmt)	"pfc200: " fmt

#include <common.h>
#include <init.h>
#include <driver.h>
#include <gpio.h>
#include <linux/sizes.h>
#include <linux/err.h>
#include <linux/phy.h>
#include <linux/micrel_phy.h>
#include <asm/memory.h>
#include <mach/generic.h>

static int pfc200_mem_init(void)
{
	if (!of_machine_is_compatible("ti,pfc200"))
		return 0;

	arm_add_mem_device("ram0", 0x80000000, SZ_256M);
	return 0;
}
mem_initcall(pfc200_mem_init);

#define BMCR_HP_MDIX 0x20

static int pfc200_phy_fixup(struct mii_bus *mii, int phyadr)
{
	struct phy_device *phydev;
	int ret;

	phydev = mdiobus_scan(mii, phyadr);

	if (IS_ERR(phydev)) {
		pr_err("Cannot find phydev %d on mii bus\n", phyadr);
		return PTR_ERR(phydev);
	}

	ret = phy_write(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_HP_MDIX);
	if (ret)
		pr_err("Failed to write to phy: %s\n", strerror(-ret));

	return ret;
}

static int pfc200_late_init(void)
{
	struct mii_bus *mii;

	if (!of_machine_is_compatible("ti,pfc200"))
		return 0;

	mii = mdiobus_get_bus(0);
	if (!mii) {
		pr_err("Cannot find mii bus 0\n");
		return -ENODEV;
	}

	pfc200_phy_fixup(mii, 1);
	pfc200_phy_fixup(mii, 2);

	return 0;
}
late_initcall(pfc200_late_init);


#define GPIO_KSZ886x_RESET	136

static int pfc200_devices_init(void)
{
	if (!of_machine_is_compatible("ti,pfc200"))
		return 0;

	gpio_direction_output(GPIO_KSZ886x_RESET, 1);

	omap_set_bootmmc_devname("mmc0");

	return 0;
}
coredevice_initcall(pfc200_devices_init);