aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/platform
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2015-01-12 08:17:22 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-02-02 13:11:24 -0500
commit874e52086f9f1b9f9bdfbf98cca8506b110b63ba (patch)
tree3a1a1a2e70115e2812fe3d3136bc21c8448f25ac /arch/x86/platform
parent934084a9d2d95d0ce98ae8d1ec3bfe81c95c678c (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/Makefile2
-rw-r--r--arch/x86/platform/intel-mid/device_libs/platform_max3111.c35
-rw-r--r--arch/x86/platform/intel-mid/early_printk_intel_mid.c220
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
16obj-$(subst m,y,$(CONFIG_INPUT_BMA150)) += platform_bma023.o 16obj-$(subst m,y,$(CONFIG_INPUT_BMA150)) += platform_bma023.o
17obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o 17obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o
18obj-$(subst m,y,$(CONFIG_DRM_MEDFIELD)) += platform_tc35876x.o 18obj-$(subst m,y,$(CONFIG_DRM_MEDFIELD)) += platform_tc35876x.o
19# SPI Devices
20obj-$(subst m,y,$(CONFIG_SERIAL_MRST_MAX3110)) += platform_max3111.o
21# MISC Devices 19# MISC Devices
22obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o 20obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o
23obj-$(subst m,y,$(CONFIG_INTEL_MID_WATCHDOG)) += platform_wdt.o 21obj-$(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
17static 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
29static 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
35sfi_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
68struct 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 */
102static unsigned long mrst_spi_paddr = MRST_REGBASE_SPI0;
103
104static u32 *pclk_spi0;
105/* Always contains an accessible address, start with 0 */
106static struct dw_spi_reg *pspi;
107
108static struct kmsg_dumper dw_dumper;
109static int dumper_registered;
110
111static 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 */
125static 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 */
134static void max3110_write_data(char c)
135{
136 u16 data;
137
138 data = 0x8000 | c;
139 dw_writel(pspi, dr, data);
140}
141
142void 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 */
199static 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 */
221static 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
234struct 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);