summaryrefslogtreecommitdiff
path: root/arch/arm/mach-w90x900/w90p910.c
blob: aa783bc943109d6a9fb4f4cf95f1d74782762032 (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
131
132
133
134
/*
 * linux/arch/arm/mach-w90x900/w90p910.c
 *
 * Based on linux/arch/arm/plat-s3c24xx/s3c244x.c by Ben Dooks
 *
 * Copyright (c) 2008 Nuvoton technology corporation
 * All rights reserved.
 *
 * Wan ZongShun <mcuos.com@gmail.com>
 *
 * W90P910 cpu support
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 */

#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/io.h>

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

#include <mach/hardware.h>
#include <mach/regs-serial.h>

#include "cpu.h"

/*W90P910 has five uarts*/

#define MAX_UART_COUNT 5
static int uart_count;
static struct platform_device *uart_devs[MAX_UART_COUNT-1];

/* Initial IO mappings */

static struct map_desc w90p910_iodesc[] __initdata = {
	IODESC_ENT(IRQ),
	IODESC_ENT(GCR),
	IODESC_ENT(UART),
	IODESC_ENT(TIMER),
	IODESC_ENT(EBI),
	/*IODESC_ENT(LCD),*/
};

/*Init the dev resource*/

static W90X900_RES(UART0);
static W90X900_RES(UART1);
static W90X900_RES(UART2);
static W90X900_RES(UART3);
static W90X900_RES(UART4);
static W90X900_DEVICE(uart0, UART0, 0, "w90x900-uart");
static W90X900_DEVICE(uart1, UART1, 1, "w90x900-uart");
static W90X900_DEVICE(uart2, UART2, 2, "w90x900-uart");
static W90X900_DEVICE(uart3, UART3, 3, "w90x900-uart");
static W90X900_DEVICE(uart4, UART4, 4, "w90x900-uart");

static struct platform_device *uart_devices[] __initdata = {
	&w90x900_uart0,
	&w90x900_uart1,
	&w90x900_uart2,
	&w90x900_uart3,
	&w90x900_uart4
};

/*Init W90P910 uart device*/

void __init w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no)
{
	struct platform_device *platdev;
	int uart, uartdev;

	/*By min() to judge count of uart be used indeed*/

	uartdev = ARRAY_SIZE(uart_devices);
	no = min(uartdev, no);

	for (uart = 0; uart < no; uart++, cfg++) {
		if (cfg->hwport != uart)
			printk(KERN_ERR "w90x900_uartcfg[%d] error\n", uart);
		platdev = uart_devices[cfg->hwport];
		uart_devs[uart] = platdev;
		platdev->dev.platform_data = cfg;
	}
	uart_count = uart;
}

/*Init W90P910 evb io*/

void __init w90p910_map_io(struct map_desc *mach_desc, int mach_size)
{
	unsigned long idcode = 0x0;

	iotable_init(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));

	idcode = __raw_readl(W90X900PDID);
	if (idcode != W90P910_CPUID)
		printk(KERN_ERR "CPU type 0x%08lx is not W90P910\n", idcode);
}

/*Init W90P910 clock*/

void __init w90p910_init_clocks(int xtal)
{
}

static int __init w90p910_init_cpu(void)
{
	return 0;
}

static int __init w90x900_arch_init(void)
{
	int ret;

	ret = w90p910_init_cpu();
	if (ret != 0)
		return ret;

	return platform_add_devices(uart_devs, uart_count);

}
arch_initcall(w90x900_arch_init);