diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2015-01-12 08:17:22 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-02-02 13:11:24 -0500 |
commit | 874e52086f9f1b9f9bdfbf98cca8506b110b63ba (patch) | |
tree | 3a1a1a2e70115e2812fe3d3136bc21c8448f25ac /arch/x86/platform | |
parent | 934084a9d2d95d0ce98ae8d1ec3bfe81c95c678c (diff) |
x86, mrst: remove Moorestown specific serial drivers
Intel Moorestown platform support was removed few years ago. This is a follow
up which removes Moorestown specific code for the serial devices. It includes
mrst_max3110 and earlyprintk bits.
This was used on SFI (Medfield, Clovertrail) based platforms as well, though
new ones use normal serial interface for the console service.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: David Cohen <david.a.cohen@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/x86/platform')
-rw-r--r-- | arch/x86/platform/intel-mid/device_libs/Makefile | 2 | ||||
-rw-r--r-- | arch/x86/platform/intel-mid/device_libs/platform_max3111.c | 35 | ||||
-rw-r--r-- | arch/x86/platform/intel-mid/early_printk_intel_mid.c | 220 |
3 files changed, 4 insertions, 253 deletions
diff --git a/arch/x86/platform/intel-mid/device_libs/Makefile b/arch/x86/platform/intel-mid/device_libs/Makefile index af9307f2cc28..91ec9f8704bf 100644 --- a/arch/x86/platform/intel-mid/device_libs/Makefile +++ b/arch/x86/platform/intel-mid/device_libs/Makefile | |||
@@ -16,8 +16,6 @@ obj-$(subst m,y,$(CONFIG_INPUT_MPU3050)) += platform_mpu3050.o | |||
16 | obj-$(subst m,y,$(CONFIG_INPUT_BMA150)) += platform_bma023.o | 16 | obj-$(subst m,y,$(CONFIG_INPUT_BMA150)) += platform_bma023.o |
17 | obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o | 17 | obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o |
18 | obj-$(subst m,y,$(CONFIG_DRM_MEDFIELD)) += platform_tc35876x.o | 18 | obj-$(subst m,y,$(CONFIG_DRM_MEDFIELD)) += platform_tc35876x.o |
19 | # SPI Devices | ||
20 | obj-$(subst m,y,$(CONFIG_SERIAL_MRST_MAX3110)) += platform_max3111.o | ||
21 | # MISC Devices | 19 | # MISC Devices |
22 | obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o | 20 | obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o |
23 | obj-$(subst m,y,$(CONFIG_INTEL_MID_WATCHDOG)) += platform_wdt.o | 21 | obj-$(subst m,y,$(CONFIG_INTEL_MID_WATCHDOG)) += platform_wdt.o |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_max3111.c b/arch/x86/platform/intel-mid/device_libs/platform_max3111.c deleted file mode 100644 index afd1df94e0e5..000000000000 --- a/arch/x86/platform/intel-mid/device_libs/platform_max3111.c +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | /* | ||
2 | * platform_max3111.c: max3111 platform data initilization file | ||
3 | * | ||
4 | * (C) Copyright 2013 Intel Corporation | ||
5 | * Author: Sathyanarayanan Kuppuswamy <sathyanarayanan.kuppuswamy@intel.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; version 2 | ||
10 | * of the License. | ||
11 | */ | ||
12 | |||
13 | #include <linux/gpio.h> | ||
14 | #include <linux/spi/spi.h> | ||
15 | #include <asm/intel-mid.h> | ||
16 | |||
17 | static void __init *max3111_platform_data(void *info) | ||
18 | { | ||
19 | struct spi_board_info *spi_info = info; | ||
20 | int intr = get_gpio_by_name("max3111_int"); | ||
21 | |||
22 | spi_info->mode = SPI_MODE_0; | ||
23 | if (intr == -1) | ||
24 | return NULL; | ||
25 | spi_info->irq = intr + INTEL_MID_IRQ_OFFSET; | ||
26 | return NULL; | ||
27 | } | ||
28 | |||
29 | static const struct devs_id max3111_dev_id __initconst = { | ||
30 | .name = "spi_max3111", | ||
31 | .type = SFI_DEV_TYPE_SPI, | ||
32 | .get_platform_data = &max3111_platform_data, | ||
33 | }; | ||
34 | |||
35 | sfi_device(max3111_dev_id); | ||
diff --git a/arch/x86/platform/intel-mid/early_printk_intel_mid.c b/arch/x86/platform/intel-mid/early_printk_intel_mid.c index e0bd082a80e0..4e720829ab90 100644 --- a/arch/x86/platform/intel-mid/early_printk_intel_mid.c +++ b/arch/x86/platform/intel-mid/early_printk_intel_mid.c | |||
@@ -10,15 +10,13 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* | 12 | /* |
13 | * This file implements two early consoles named mrst and hsu. | 13 | * This file implements early console named hsu. |
14 | * mrst is based on Maxim3110 spi-uart device, it exists in both | 14 | * hsu is based on a High Speed UART device which only exists in the Medfield |
15 | * Moorestown and Medfield platforms, while hsu is based on a High | 15 | * platform |
16 | * Speed UART device which only exists in the Medfield platform | ||
17 | */ | 16 | */ |
18 | 17 | ||
19 | #include <linux/serial_reg.h> | 18 | #include <linux/serial_reg.h> |
20 | #include <linux/serial_mfd.h> | 19 | #include <linux/serial_mfd.h> |
21 | #include <linux/kmsg_dump.h> | ||
22 | #include <linux/console.h> | 20 | #include <linux/console.h> |
23 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
24 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
@@ -28,216 +26,6 @@ | |||
28 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
29 | #include <asm/intel-mid.h> | 27 | #include <asm/intel-mid.h> |
30 | 28 | ||
31 | #define MRST_SPI_TIMEOUT 0x200000 | ||
32 | #define MRST_REGBASE_SPI0 0xff128000 | ||
33 | #define MRST_REGBASE_SPI1 0xff128400 | ||
34 | #define MRST_CLK_SPI0_REG 0xff11d86c | ||
35 | |||
36 | /* Bit fields in CTRLR0 */ | ||
37 | #define SPI_DFS_OFFSET 0 | ||
38 | |||
39 | #define SPI_FRF_OFFSET 4 | ||
40 | #define SPI_FRF_SPI 0x0 | ||
41 | #define SPI_FRF_SSP 0x1 | ||
42 | #define SPI_FRF_MICROWIRE 0x2 | ||
43 | #define SPI_FRF_RESV 0x3 | ||
44 | |||
45 | #define SPI_MODE_OFFSET 6 | ||
46 | #define SPI_SCPH_OFFSET 6 | ||
47 | #define SPI_SCOL_OFFSET 7 | ||
48 | #define SPI_TMOD_OFFSET 8 | ||
49 | #define SPI_TMOD_TR 0x0 /* xmit & recv */ | ||
50 | #define SPI_TMOD_TO 0x1 /* xmit only */ | ||
51 | #define SPI_TMOD_RO 0x2 /* recv only */ | ||
52 | #define SPI_TMOD_EPROMREAD 0x3 /* eeprom read mode */ | ||
53 | |||
54 | #define SPI_SLVOE_OFFSET 10 | ||
55 | #define SPI_SRL_OFFSET 11 | ||
56 | #define SPI_CFS_OFFSET 12 | ||
57 | |||
58 | /* Bit fields in SR, 7 bits */ | ||
59 | #define SR_MASK 0x7f /* cover 7 bits */ | ||
60 | #define SR_BUSY (1 << 0) | ||
61 | #define SR_TF_NOT_FULL (1 << 1) | ||
62 | #define SR_TF_EMPT (1 << 2) | ||
63 | #define SR_RF_NOT_EMPT (1 << 3) | ||
64 | #define SR_RF_FULL (1 << 4) | ||
65 | #define SR_TX_ERR (1 << 5) | ||
66 | #define SR_DCOL (1 << 6) | ||
67 | |||
68 | struct dw_spi_reg { | ||
69 | u32 ctrl0; | ||
70 | u32 ctrl1; | ||
71 | u32 ssienr; | ||
72 | u32 mwcr; | ||
73 | u32 ser; | ||
74 | u32 baudr; | ||
75 | u32 txfltr; | ||
76 | u32 rxfltr; | ||
77 | u32 txflr; | ||
78 | u32 rxflr; | ||
79 | u32 sr; | ||
80 | u32 imr; | ||
81 | u32 isr; | ||
82 | u32 risr; | ||
83 | u32 txoicr; | ||
84 | u32 rxoicr; | ||
85 | u32 rxuicr; | ||
86 | u32 msticr; | ||
87 | u32 icr; | ||
88 | u32 dmacr; | ||
89 | u32 dmatdlr; | ||
90 | u32 dmardlr; | ||
91 | u32 idr; | ||
92 | u32 version; | ||
93 | |||
94 | /* Currently operates as 32 bits, though only the low 16 bits matter */ | ||
95 | u32 dr; | ||
96 | } __packed; | ||
97 | |||
98 | #define dw_readl(dw, name) __raw_readl(&(dw)->name) | ||
99 | #define dw_writel(dw, name, val) __raw_writel((val), &(dw)->name) | ||
100 | |||
101 | /* Default use SPI0 register for mrst, we will detect Penwell and use SPI1 */ | ||
102 | static unsigned long mrst_spi_paddr = MRST_REGBASE_SPI0; | ||
103 | |||
104 | static u32 *pclk_spi0; | ||
105 | /* Always contains an accessible address, start with 0 */ | ||
106 | static struct dw_spi_reg *pspi; | ||
107 | |||
108 | static struct kmsg_dumper dw_dumper; | ||
109 | static int dumper_registered; | ||
110 | |||
111 | static void dw_kmsg_dump(struct kmsg_dumper *dumper, | ||
112 | enum kmsg_dump_reason reason) | ||
113 | { | ||
114 | static char line[1024]; | ||
115 | size_t len; | ||
116 | |||
117 | /* When run to this, we'd better re-init the HW */ | ||
118 | mrst_early_console_init(); | ||
119 | |||
120 | while (kmsg_dump_get_line(dumper, true, line, sizeof(line), &len)) | ||
121 | early_mrst_console.write(&early_mrst_console, line, len); | ||
122 | } | ||
123 | |||
124 | /* Set the ratio rate to 115200, 8n1, IRQ disabled */ | ||
125 | static void max3110_write_config(void) | ||
126 | { | ||
127 | u16 config; | ||
128 | |||
129 | config = 0xc001; | ||
130 | dw_writel(pspi, dr, config); | ||
131 | } | ||
132 | |||
133 | /* Translate char to a eligible word and send to max3110 */ | ||
134 | static void max3110_write_data(char c) | ||
135 | { | ||
136 | u16 data; | ||
137 | |||
138 | data = 0x8000 | c; | ||
139 | dw_writel(pspi, dr, data); | ||
140 | } | ||
141 | |||
142 | void mrst_early_console_init(void) | ||
143 | { | ||
144 | u32 ctrlr0 = 0; | ||
145 | u32 spi0_cdiv; | ||
146 | u32 freq; /* Freqency info only need be searched once */ | ||
147 | |||
148 | /* Base clk is 100 MHz, the actual clk = 100M / (clk_divider + 1) */ | ||
149 | pclk_spi0 = (void *)set_fixmap_offset_nocache(FIX_EARLYCON_MEM_BASE, | ||
150 | MRST_CLK_SPI0_REG); | ||
151 | spi0_cdiv = ((*pclk_spi0) & 0xe00) >> 9; | ||
152 | freq = 100000000 / (spi0_cdiv + 1); | ||
153 | |||
154 | if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_PENWELL) | ||
155 | mrst_spi_paddr = MRST_REGBASE_SPI1; | ||
156 | |||
157 | pspi = (void *)set_fixmap_offset_nocache(FIX_EARLYCON_MEM_BASE, | ||
158 | mrst_spi_paddr); | ||
159 | |||
160 | /* Disable SPI controller */ | ||
161 | dw_writel(pspi, ssienr, 0); | ||
162 | |||
163 | /* Set control param, 8 bits, transmit only mode */ | ||
164 | ctrlr0 = dw_readl(pspi, ctrl0); | ||
165 | |||
166 | ctrlr0 &= 0xfcc0; | ||
167 | ctrlr0 |= 0xf | (SPI_FRF_SPI << SPI_FRF_OFFSET) | ||
168 | | (SPI_TMOD_TO << SPI_TMOD_OFFSET); | ||
169 | dw_writel(pspi, ctrl0, ctrlr0); | ||
170 | |||
171 | /* | ||
172 | * Change the spi0 clk to comply with 115200 bps, use 100000 to | ||
173 | * calculate the clk dividor to make the clock a little slower | ||
174 | * than real baud rate. | ||
175 | */ | ||
176 | dw_writel(pspi, baudr, freq/100000); | ||
177 | |||
178 | /* Disable all INT for early phase */ | ||
179 | dw_writel(pspi, imr, 0x0); | ||
180 | |||
181 | /* Set the cs to spi-uart */ | ||
182 | dw_writel(pspi, ser, 0x2); | ||
183 | |||
184 | /* Enable the HW, the last step for HW init */ | ||
185 | dw_writel(pspi, ssienr, 0x1); | ||
186 | |||
187 | /* Set the default configuration */ | ||
188 | max3110_write_config(); | ||
189 | |||
190 | /* Register the kmsg dumper */ | ||
191 | if (!dumper_registered) { | ||
192 | dw_dumper.dump = dw_kmsg_dump; | ||
193 | kmsg_dump_register(&dw_dumper); | ||
194 | dumper_registered = 1; | ||
195 | } | ||
196 | } | ||
197 | |||
198 | /* Slave select should be called in the read/write function */ | ||
199 | static void early_mrst_spi_putc(char c) | ||
200 | { | ||
201 | unsigned int timeout; | ||
202 | u32 sr; | ||
203 | |||
204 | timeout = MRST_SPI_TIMEOUT; | ||
205 | /* Early putc needs to make sure the TX FIFO is not full */ | ||
206 | while (--timeout) { | ||
207 | sr = dw_readl(pspi, sr); | ||
208 | if (!(sr & SR_TF_NOT_FULL)) | ||
209 | cpu_relax(); | ||
210 | else | ||
211 | break; | ||
212 | } | ||
213 | |||
214 | if (!timeout) | ||
215 | pr_warn("MRST earlycon: timed out\n"); | ||
216 | else | ||
217 | max3110_write_data(c); | ||
218 | } | ||
219 | |||
220 | /* Early SPI only uses polling mode */ | ||
221 | static void early_mrst_spi_write(struct console *con, const char *str, | ||
222 | unsigned n) | ||
223 | { | ||
224 | int i; | ||
225 | |||
226 | for (i = 0; i < n && *str; i++) { | ||
227 | if (*str == '\n') | ||
228 | early_mrst_spi_putc('\r'); | ||
229 | early_mrst_spi_putc(*str); | ||
230 | str++; | ||
231 | } | ||
232 | } | ||
233 | |||
234 | struct console early_mrst_console = { | ||
235 | .name = "earlymrst", | ||
236 | .write = early_mrst_spi_write, | ||
237 | .flags = CON_PRINTBUFFER, | ||
238 | .index = -1, | ||
239 | }; | ||
240 | |||
241 | /* | 29 | /* |
242 | * Following is the early console based on Medfield HSU (High | 30 | * Following is the early console based on Medfield HSU (High |
243 | * Speed UART) device. | 31 | * Speed UART) device. |
@@ -259,7 +47,7 @@ void hsu_early_console_init(const char *s) | |||
259 | port = clamp_val(port, 0, 2); | 47 | port = clamp_val(port, 0, 2); |
260 | 48 | ||
261 | paddr = HSU_PORT_BASE + port * 0x80; | 49 | paddr = HSU_PORT_BASE + port * 0x80; |
262 | phsu = (void *)set_fixmap_offset_nocache(FIX_EARLYCON_MEM_BASE, paddr); | 50 | phsu = (void __iomem *)set_fixmap_offset_nocache(FIX_EARLYCON_MEM_BASE, paddr); |
263 | 51 | ||
264 | /* Disable FIFO */ | 52 | /* Disable FIFO */ |
265 | writeb(0x0, phsu + UART_FCR); | 53 | writeb(0x0, phsu + UART_FCR); |