Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
p720t.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-clps711x/p720t.c
3  *
4  * Copyright (C) 2000-2001 Deep Blue Solutions Ltd
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  */
20 #include <linux/kernel.h>
21 #include <linux/init.h>
22 #include <linux/types.h>
23 #include <linux/string.h>
24 #include <linux/mm.h>
25 #include <linux/io.h>
26 #include <linux/slab.h>
27 #include <linux/leds.h>
28 
29 #include <mach/hardware.h>
30 #include <asm/pgtable.h>
31 #include <asm/page.h>
32 #include <asm/setup.h>
33 #include <asm/sizes.h>
34 #include <asm/mach-types.h>
35 #include <asm/mach/arch.h>
36 #include <asm/mach/map.h>
37 #include <mach/syspld.h>
38 
39 #include <asm/hardware/clps7111.h>
40 
41 #include "common.h"
42 
43 /*
44  * Map the P720T system PLD. It occupies two address spaces:
45  * SYSPLD_PHYS_BASE and SYSPLD_PHYS_BASE + 0x00400000
46  * We map both here.
47  */
48 static struct map_desc p720t_io_desc[] __initdata = {
49  {
50  .virtual = SYSPLD_VIRT_BASE,
52  .length = SZ_1M,
53  .type = MT_DEVICE
54  }, {
55  .virtual = 0xfe400000,
56  .pfn = __phys_to_pfn(0x10400000),
57  .length = SZ_1M,
58  .type = MT_DEVICE
59  }
60 };
61 
62 static void __init
63 fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi)
64 {
65  /*
66  * Our bootloader doesn't setup any tags (yet).
67  */
68  if (tag->hdr.tag != ATAG_CORE) {
69  tag->hdr.tag = ATAG_CORE;
70  tag->hdr.size = tag_size(tag_core);
71  tag->u.core.flags = 0;
72  tag->u.core.pagesize = PAGE_SIZE;
73  tag->u.core.rootdev = 0x0100;
74 
75  tag = tag_next(tag);
76  tag->hdr.tag = ATAG_MEM;
77  tag->hdr.size = tag_size(tag_mem32);
78  tag->u.mem.size = 4096;
79  tag->u.mem.start = PHYS_OFFSET;
80 
81  tag = tag_next(tag);
82  tag->hdr.tag = ATAG_NONE;
83  tag->hdr.size = 0;
84  }
85 }
86 
87 static void __init p720t_map_io(void)
88 {
90  iotable_init(p720t_io_desc, ARRAY_SIZE(p720t_io_desc));
91 }
92 
93 static void __init p720t_init_early(void)
94 {
95  /*
96  * Power down as much as possible in case we don't
97  * have the drivers loaded.
98  */
99  PLD_LCDEN = 0;
101 
102  PLD_KBD = 0;
103  PLD_IO = 0;
104  PLD_IRDA = 0;
105  PLD_CODEC = 0;
106  PLD_TCH = 0;
107  PLD_SPI = 0;
108  if (!IS_ENABLED(CONFIG_DEBUG_LL)) {
109  PLD_COM2 = 0;
110  PLD_COM1 = 0;
111  }
112 }
113 
114 /*
115  * LED controled by CPLD
116  */
117 #if defined(CONFIG_NEW_LEDS) && defined(CONFIG_LEDS_CLASS)
118 static void p720t_led_set(struct led_classdev *cdev,
119  enum led_brightness b)
120 {
121  u8 reg = clps_readb(PDDR);
122 
123  if (b != LED_OFF)
124  reg |= 0x1;
125  else
126  reg &= ~0x1;
127 
128  clps_writeb(reg, PDDR);
129 }
130 
131 static enum led_brightness p720t_led_get(struct led_classdev *cdev)
132 {
133  u8 reg = clps_readb(PDDR);
134 
135  return (reg & 0x1) ? LED_FULL : LED_OFF;
136 }
137 
138 static int __init p720t_leds_init(void)
139 {
140 
141  struct led_classdev *cdev;
142  int ret;
143 
144  if (!machine_is_p720t())
145  return -ENODEV;
146 
147  cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
148  if (!cdev)
149  return -ENOMEM;
150 
151  cdev->name = "p720t:0";
152  cdev->brightness_set = p720t_led_set;
153  cdev->brightness_get = p720t_led_get;
154  cdev->default_trigger = "heartbeat";
155 
156  ret = led_classdev_register(NULL, cdev);
157  if (ret < 0) {
158  kfree(cdev);
159  return ret;
160  }
161 
162  return 0;
163 }
164 
165 /*
166  * Since we may have triggers on any subsystem, defer registration
167  * until after subsystem_init.
168  */
169 fs_initcall(p720t_leds_init);
170 #endif
171 
172 MACHINE_START(P720T, "ARM-Prospector720T")
173  /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
174  .atag_offset = 0x100,
175  .fixup = fixup_p720t,
176  .init_early = p720t_init_early,
177  .map_io = p720t_map_io,
178  .init_irq = clps711x_init_irq,
179  .timer = &clps711x_timer,
180  .restart = clps711x_restart,