Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/mips/alchemy/board-xxs1500.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* BRIEF MODULE DESCRIPTION
4
* MyCable XXS1500 board support
5
*
6
* Copyright 2003, 2008 MontaVista Software Inc.
7
* Author: MontaVista Software, Inc. <[email protected]>
8
*/
9
10
#include <linux/kernel.h>
11
#include <linux/init.h>
12
#include <linux/interrupt.h>
13
#include <linux/platform_device.h>
14
#include <linux/gpio.h>
15
#include <linux/delay.h>
16
#include <linux/pm.h>
17
#include <asm/bootinfo.h>
18
#include <asm/reboot.h>
19
#include <asm/setup.h>
20
#include <asm/mach-au1x00/au1000.h>
21
#include <asm/mach-au1x00/gpio-au1000.h>
22
#include <prom.h>
23
24
const char *get_system_type(void)
25
{
26
return "XXS1500";
27
}
28
29
void prom_putchar(char c)
30
{
31
alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c);
32
}
33
34
static void xxs1500_reset(char *c)
35
{
36
/* Jump to the reset vector */
37
__asm__ __volatile__("jr\t%0" : : "r"(0xbfc00000));
38
}
39
40
static void xxs1500_power_off(void)
41
{
42
while (1)
43
asm volatile (
44
" .set mips32 \n"
45
" wait \n"
46
" .set mips0 \n");
47
}
48
49
void __init board_setup(void)
50
{
51
u32 pin_func;
52
53
pm_power_off = xxs1500_power_off;
54
_machine_halt = xxs1500_power_off;
55
_machine_restart = xxs1500_reset;
56
57
alchemy_gpio1_input_enable();
58
alchemy_gpio2_enable();
59
60
/* Set multiple use pins (UART3/GPIO) to UART (it's used as UART too) */
61
pin_func = alchemy_rdsys(AU1000_SYS_PINFUNC) & ~SYS_PF_UR3;
62
pin_func |= SYS_PF_UR3;
63
alchemy_wrsys(pin_func, AU1000_SYS_PINFUNC);
64
65
/* Enable UART */
66
alchemy_uart_enable(AU1000_UART3_PHYS_ADDR);
67
/* Enable DTR (MCR bit 0) = USB power up */
68
__raw_writel(1, (void __iomem *)KSEG1ADDR(AU1000_UART3_PHYS_ADDR + 0x18));
69
wmb();
70
}
71
72
/******************************************************************************/
73
74
static struct resource xxs1500_pcmcia_res[] = {
75
{
76
.name = "pcmcia-io",
77
.flags = IORESOURCE_MEM,
78
.start = AU1000_PCMCIA_IO_PHYS_ADDR,
79
.end = AU1000_PCMCIA_IO_PHYS_ADDR + 0x000400000 - 1,
80
},
81
{
82
.name = "pcmcia-attr",
83
.flags = IORESOURCE_MEM,
84
.start = AU1000_PCMCIA_ATTR_PHYS_ADDR,
85
.end = AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,
86
},
87
{
88
.name = "pcmcia-mem",
89
.flags = IORESOURCE_MEM,
90
.start = AU1000_PCMCIA_MEM_PHYS_ADDR,
91
.end = AU1000_PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1,
92
},
93
};
94
95
static struct platform_device xxs1500_pcmcia_dev = {
96
.name = "xxs1500_pcmcia",
97
.id = -1,
98
.num_resources = ARRAY_SIZE(xxs1500_pcmcia_res),
99
.resource = xxs1500_pcmcia_res,
100
};
101
102
static struct platform_device *xxs1500_devs[] __initdata = {
103
&xxs1500_pcmcia_dev,
104
};
105
106
static int __init xxs1500_dev_init(void)
107
{
108
irq_set_irq_type(AU1500_GPIO204_INT, IRQ_TYPE_LEVEL_HIGH);
109
irq_set_irq_type(AU1500_GPIO201_INT, IRQ_TYPE_LEVEL_LOW);
110
irq_set_irq_type(AU1500_GPIO202_INT, IRQ_TYPE_LEVEL_LOW);
111
irq_set_irq_type(AU1500_GPIO203_INT, IRQ_TYPE_LEVEL_LOW);
112
irq_set_irq_type(AU1500_GPIO205_INT, IRQ_TYPE_LEVEL_LOW);
113
irq_set_irq_type(AU1500_GPIO207_INT, IRQ_TYPE_LEVEL_LOW);
114
115
irq_set_irq_type(AU1500_GPIO0_INT, IRQ_TYPE_LEVEL_LOW);
116
irq_set_irq_type(AU1500_GPIO1_INT, IRQ_TYPE_LEVEL_LOW);
117
irq_set_irq_type(AU1500_GPIO2_INT, IRQ_TYPE_LEVEL_LOW);
118
irq_set_irq_type(AU1500_GPIO3_INT, IRQ_TYPE_LEVEL_LOW);
119
irq_set_irq_type(AU1500_GPIO4_INT, IRQ_TYPE_LEVEL_LOW); /* CF irq */
120
irq_set_irq_type(AU1500_GPIO5_INT, IRQ_TYPE_LEVEL_LOW);
121
122
return platform_add_devices(xxs1500_devs,
123
ARRAY_SIZE(xxs1500_devs));
124
}
125
device_initcall(xxs1500_dev_init);
126
127