1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * linux/arch/arm/mach-sa1100/hackkit.c
4  *
5  * Copyright (C) 2002 Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de>
6  *
7  * This file contains all HackKit tweaks. Based on original work from
8  * Nicolas Pitre's assabet fixes
9  */
10 #include <linux/init.h>
11 #include <linux/kernel.h>
12 #include <linux/sched.h>
13 #include <linux/tty.h>
14 #include <linux/module.h>
15 #include <linux/errno.h>
16 #include <linux/cpufreq.h>
17 #include <linux/platform_data/sa11x0-serial.h>
18 #include <linux/serial_core.h>
19 #include <linux/mtd/mtd.h>
20 #include <linux/mtd/partitions.h>
21 #include <linux/tty.h>
22 #include <linux/gpio.h>
23 #include <linux/leds.h>
24 #include <linux/platform_device.h>
25 #include <linux/pgtable.h>
26 
27 #include <asm/mach-types.h>
28 #include <asm/setup.h>
29 #include <asm/page.h>
30 
31 #include <asm/mach/arch.h>
32 #include <asm/mach/flash.h>
33 #include <asm/mach/map.h>
34 #include <asm/mach/irq.h>
35 
36 #include <mach/hardware.h>
37 #include <mach/irqs.h>
38 
39 #include "generic.h"
40 
41 /**********************************************************************
42  *  prototypes
43  */
44 
45 /* init funcs */
46 static void __init hackkit_map_io(void);
47 
48 static void hackkit_uart_pm(struct uart_port *port, u_int state, u_int oldstate);
49 
50 /**********************************************************************
51  *  global data
52  */
53 
54 /**********************************************************************
55  *  static data
56  */
57 
58 static struct map_desc hackkit_io_desc[] __initdata = {
59 	{	/* Flash bank 0 */
60 		.virtual	=  0xe8000000,
61 		.pfn		= __phys_to_pfn(0x00000000),
62 		.length		= 0x01000000,
63 		.type		= MT_DEVICE
64 	},
65 };
66 
67 static struct sa1100_port_fns hackkit_port_fns __initdata = {
68 	.pm		= hackkit_uart_pm,
69 };
70 
71 /**********************************************************************
72  *  Static functions
73  */
74 
hackkit_map_io(void)75 static void __init hackkit_map_io(void)
76 {
77 	sa1100_map_io();
78 	iotable_init(hackkit_io_desc, ARRAY_SIZE(hackkit_io_desc));
79 
80 	sa1100_register_uart_fns(&hackkit_port_fns);
81 	sa1100_register_uart(0, 1);	/* com port */
82 	sa1100_register_uart(1, 2);
83 	sa1100_register_uart(2, 3);	/* radio module */
84 
85 	Ser1SDCR0 |= SDCR0_SUS;
86 }
87 
88 /**
89  *	hackkit_uart_pm - powermgmt callback function for system 3 UART
90  *	@port: uart port structure
91  *	@state: pm state
92  *	@oldstate: old pm state
93  *
94  */
hackkit_uart_pm(struct uart_port * port,u_int state,u_int oldstate)95 static void hackkit_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
96 {
97 	/* TODO: switch on/off uart in powersave mode */
98 }
99 
100 static struct mtd_partition hackkit_partitions[] = {
101 	{
102 		.name		= "BLOB",
103 		.size		= 0x00040000,
104 		.offset		= 0x00000000,
105 		.mask_flags	= MTD_WRITEABLE,  /* force read-only */
106 	}, {
107 		.name		= "config",
108 		.size		= 0x00040000,
109 		.offset		= MTDPART_OFS_APPEND,
110 	}, {
111 		.name		= "kernel",
112 		.size		= 0x00100000,
113 		.offset		= MTDPART_OFS_APPEND,
114 	}, {
115 		.name		= "initrd",
116 		.size		= 0x00180000,
117 		.offset		= MTDPART_OFS_APPEND,
118 	}, {
119 		.name		= "rootfs",
120 		.size		= 0x700000,
121 		.offset		= MTDPART_OFS_APPEND,
122 	}, {
123 		.name		= "data",
124 		.size		= MTDPART_SIZ_FULL,
125 		.offset		= MTDPART_OFS_APPEND,
126 	}
127 };
128 
129 static struct flash_platform_data hackkit_flash_data = {
130 	.map_name	= "cfi_probe",
131 	.parts		= hackkit_partitions,
132 	.nr_parts	= ARRAY_SIZE(hackkit_partitions),
133 };
134 
135 static struct resource hackkit_flash_resource =
136 	DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M);
137 
138 /* LEDs */
139 struct gpio_led hackkit_gpio_leds[] = {
140 	{
141 		.name			= "hackkit:red",
142 		.default_trigger	= "cpu0",
143 		.gpio			= 22,
144 	},
145 	{
146 		.name			= "hackkit:green",
147 		.default_trigger	= "heartbeat",
148 		.gpio			= 23,
149 	},
150 };
151 
152 static struct gpio_led_platform_data hackkit_gpio_led_info = {
153 	.leds		= hackkit_gpio_leds,
154 	.num_leds	= ARRAY_SIZE(hackkit_gpio_leds),
155 };
156 
157 static struct platform_device hackkit_leds = {
158 	.name	= "leds-gpio",
159 	.id	= -1,
160 	.dev	= {
161 		.platform_data	= &hackkit_gpio_led_info,
162 	}
163 };
164 
hackkit_init(void)165 static void __init hackkit_init(void)
166 {
167 	sa11x0_register_mtd(&hackkit_flash_data, &hackkit_flash_resource, 1);
168 	platform_device_register(&hackkit_leds);
169 }
170 
171 /**********************************************************************
172  *  Exported Functions
173  */
174 
175 MACHINE_START(HACKKIT, "HackKit Cpu Board")
176 	.atag_offset	= 0x100,
177 	.map_io		= hackkit_map_io,
178 	.nr_irqs	= SA1100_NR_IRQS,
179 	.init_irq	= sa1100_init_irq,
180 	.init_time	= sa1100_timer_init,
181 	.init_machine	= hackkit_init,
182 	.init_late	= sa11x0_init_late,
183 	.restart	= sa11x0_restart,
184 MACHINE_END
185