summaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/board-snowball-netdev.c
blob: 48404e4f953340c05ea2042021c335ce956f2d81 (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
#include <linux/module.h>
#include <linux/resource.h>
#include <linux/platform_device.h>
#include <linux/smsc911x.h>
#include <mach/irqs.h>
#include <asm/io.h>

struct smsc911x_platform_config sbnet_cfg = {
	.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
	.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
	.shift = 1,
	.flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
};

struct resource sbnet_res[] = {
	{
		.name = "smsc911x-memory",
		.start = (0x5000 << 16),
		.end  =  (0x5000 << 16) + 0x3ff,
		.flags = IORESOURCE_MEM,
	},{
		.start = GPIO_TO_IRQ(140),
		.end = GPIO_TO_IRQ(140),
		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
	},
};

struct platform_device sbnet_dev = {
	.name		= "smsc911x",
	.num_resources	= ARRAY_SIZE(sbnet_res),
	.resource	= sbnet_res,
	.dev		= {
		.platform_data = &sbnet_cfg,
	},
};

int sbnet_init(void)
{
	volatile u32 *ptr = ioremap(0x80000000, 0x10000);

	if (!machine_is_snowball()) {
		printk("no netdev: no snowball\n");
		return 0;
	}
	printk("init netdev: is snowball\n");

	/*
	 * Horribly, fix all the configuration by hand
	 */
	/* Turn on the FSMC device */
	*(ptr + 0xf000 / 4) = 1;
	*(ptr + 0xf008 / 4) = 1;

	/* Configure the FSMC device */
	*(ptr + 0x0000 / 4) = 0x0000305b;
	*(ptr + 0x0004 / 4) = 0x01010110;

	/* Fix some gpio bits */
	*(ptr + 0xe120 / 4) &= ~0x7f8;
	*(ptr + 0xe124 / 4) |=  0x7f8;
	iounmap(ptr);

	return platform_device_register(&sbnet_dev);
}

void sbnet_exit(void)
{
	platform_device_unregister(&sbnet_dev);
}

module_init(sbnet_init);
module_exit(sbnet_exit);

MODULE_LICENSE("GPL");