summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ks8695/board-dsm320.c
blob: d37c218c35847c6938f288233b457bf6d7effce8 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * arch/arm/mach-ks8695/board-dsm320.c
 *
 * DSM-320 D-Link Wireless Media Player, board support.
 *
 * Copyright 2008 Simtec Electronics
 *		  Daniel Silverstone <dsilvers@simtec.co.uk>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/gpio.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/platform_device.h>

#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/physmap.h>
#include <linux/mtd/partitions.h>

#include <asm/mach-types.h>

#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>

#include <mach/devices.h>
#include <mach/gpio-ks8695.h>

#include "generic.h"

#ifdef CONFIG_PCI
static int dsm320_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
{
	switch (slot) {
	case 0:
		/* PCI-AHB bridge? */
		return KS8695_IRQ_EXTERN0;
	case 18:
		/* Mini PCI slot */
		return KS8695_IRQ_EXTERN2;
	case 20:
		/* RealMAGIC chip */
		return KS8695_IRQ_EXTERN0;
	}
	BUG();
}

static struct ks8695_pci_cfg __initdata dsm320_pci = {
	.mode		= KS8695_MODE_MINIPCI,
	.map_irq	= dsm320_pci_map_irq,
};

static void __init dsm320_register_pci(void)
{
	/* Initialise the GPIO lines for interrupt mode */
	/* RealMAGIC */
	ks8695_gpio_interrupt(KS8695_GPIO_0, IRQ_TYPE_LEVEL_LOW);
	/* MiniPCI Slot */
	ks8695_gpio_interrupt(KS8695_GPIO_2, IRQ_TYPE_LEVEL_LOW);

	ks8695_init_pci(&dsm320_pci);
}

#else
static inline void __init dsm320_register_pci(void) { }
#endif

static struct physmap_flash_data dsm320_nor_pdata = {
	.width		= 4,
	.nr_parts	= 0,
};

static struct resource dsm320_nor_resource[] = {
	[0] = {
		.start = SZ_32M, /* We expect the bootloader to map
				  * the flash here.
				  */
		.end   = SZ_32M + SZ_4M - 1,
		.flags = IORESOURCE_MEM,
	}
};

static struct platform_device dsm320_device_nor = {
	.name		= "physmap-flash",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(dsm320_nor_resource),
	.resource	= dsm320_nor_resource,
	.dev		= {
		.platform_data = &dsm320_nor_pdata,
	},
};

void __init dsm320_register_nor(void)
{
	int ret;

	ret = platform_device_register(&dsm320_device_nor);
	if (ret < 0)
		printk(KERN_ERR "failed to register physmap-flash device\n");
}

static void __init dsm320_init(void)
{
	/* GPIO registration */
	ks8695_register_gpios();

	/* PCI registration */
	dsm320_register_pci();

	/* Network device */
	ks8695_add_device_lan();	/* eth0 = LAN */

	/* NOR devices */
	dsm320_register_nor();
}

MACHINE_START(DSM320, "D-Link DSM-320 Wireless Media Player")
	/* Maintainer: Simtec Electronics. */
	.atag_offset	= 0x100,
	.map_io		= ks8695_map_io,
	.init_irq	= ks8695_init_irq,
	.init_machine	= dsm320_init,
	.init_time	= ks8695_timer_init,
	.restart	= ks8695_restart,
MACHINE_END