Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/mach-omap2/board-n8x0.c
26295 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* linux/arch/arm/mach-omap2/board-n8x0.c
4
*
5
* Copyright (C) 2005-2009 Nokia Corporation
6
* Author: Juha Yrjola <[email protected]>
7
*
8
* Modified from mach-omap2/board-generic.c
9
*/
10
11
#include <linux/clk.h>
12
#include <linux/delay.h>
13
#include <linux/gpio/machine.h>
14
#include <linux/gpio/consumer.h>
15
#include <linux/init.h>
16
#include <linux/io.h>
17
#include <linux/irq.h>
18
#include <linux/stddef.h>
19
#include <linux/i2c.h>
20
#include <linux/spi/spi.h>
21
#include <linux/usb/musb.h>
22
#include <linux/mmc/host.h>
23
#include <linux/platform_data/spi-omap2-mcspi.h>
24
#include <linux/platform_data/mmc-omap.h>
25
#include <linux/mfd/menelaus.h>
26
27
#include <asm/mach/arch.h>
28
#include <asm/mach-types.h>
29
30
#include "common.h"
31
#include "mmc.h"
32
#include "usb-tusb6010.h"
33
#include "soc.h"
34
#include "common-board-devices.h"
35
36
#define TUSB6010_ASYNC_CS 1
37
#define TUSB6010_SYNC_CS 4
38
#define TUSB6010_DMACHAN 0x3f
39
40
#define NOKIA_N810_WIMAX (1 << 2)
41
#define NOKIA_N810 (1 << 1)
42
#define NOKIA_N800 (1 << 0)
43
44
static u32 board_caps;
45
46
#define board_is_n800() (board_caps & NOKIA_N800)
47
#define board_is_n810() (board_caps & NOKIA_N810)
48
#define board_is_n810_wimax() (board_caps & NOKIA_N810_WIMAX)
49
50
static void board_check_revision(void)
51
{
52
if (of_machine_is_compatible("nokia,n800"))
53
board_caps = NOKIA_N800;
54
else if (of_machine_is_compatible("nokia,n810"))
55
board_caps = NOKIA_N810;
56
else if (of_machine_is_compatible("nokia,n810-wimax"))
57
board_caps = NOKIA_N810_WIMAX;
58
59
if (!board_caps)
60
pr_err("Unknown board\n");
61
}
62
63
#if IS_ENABLED(CONFIG_USB_MUSB_TUSB6010)
64
65
static struct musb_hdrc_config musb_config = {
66
.multipoint = 1,
67
.dyn_fifo = 1,
68
.num_eps = 16,
69
.ram_bits = 12,
70
};
71
72
static struct musb_hdrc_platform_data tusb_data = {
73
.mode = MUSB_OTG,
74
.min_power = 25, /* x2 = 50 mA drawn from VBUS as peripheral */
75
.power = 100, /* Max 100 mA VBUS for host mode */
76
.config = &musb_config,
77
};
78
79
static struct gpiod_lookup_table tusb_gpio_table = {
80
.dev_id = "musb-tusb",
81
.table = {
82
GPIO_LOOKUP("gpio-0-31", 0, "enable", GPIO_ACTIVE_HIGH),
83
GPIO_LOOKUP("gpio-32-63", 26, "int", GPIO_ACTIVE_HIGH),
84
{ }
85
},
86
};
87
88
static void __init n8x0_usb_init(void)
89
{
90
int ret = 0;
91
92
gpiod_add_lookup_table(&tusb_gpio_table);
93
ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2,
94
TUSB6010_ASYNC_CS, TUSB6010_SYNC_CS,
95
TUSB6010_DMACHAN);
96
if (ret != 0)
97
return;
98
99
pr_info("TUSB 6010\n");
100
101
return;
102
}
103
#else
104
105
static void __init n8x0_usb_init(void) {}
106
107
#endif /*CONFIG_USB_MUSB_TUSB6010 */
108
109
110
static struct omap2_mcspi_device_config p54spi_mcspi_config = {
111
.turbo_mode = 0,
112
};
113
114
static struct spi_board_info n800_spi_board_info[] __initdata = {
115
{
116
.modalias = "p54spi",
117
.bus_num = 2,
118
.chip_select = 0,
119
.max_speed_hz = 48000000,
120
.controller_data = &p54spi_mcspi_config,
121
},
122
};
123
124
#if defined(CONFIG_MENELAUS) && IS_ENABLED(CONFIG_MMC_OMAP)
125
126
/*
127
* On both N800 and N810, only the first of the two MMC controllers is in use.
128
* The two MMC slots are multiplexed via Menelaus companion chip over I2C.
129
* On N800, both slots are powered via Menelaus. On N810, only one of the
130
* slots is powered via Menelaus. The N810 EMMC is powered via GPIO.
131
*
132
* VMMC slot 1 on both N800 and N810
133
* VDCDC3_APE and VMCS2_APE slot 2 on N800
134
* GPIO23 and GPIO9 slot 2 EMMC on N810
135
*
136
*/
137
static int slot1_cover_open;
138
static int slot2_cover_open;
139
static struct device *mmc_device;
140
141
static struct gpiod_lookup_table nokia800_mmc_gpio_table = {
142
.dev_id = "mmci-omap.0",
143
.table = {
144
/* Slot switch, GPIO 96 */
145
GPIO_LOOKUP("gpio-96-127", 0, "switch", GPIO_ACTIVE_HIGH),
146
{ }
147
},
148
};
149
150
static struct gpiod_lookup_table nokia810_mmc_gpio_table = {
151
.dev_id = "mmci-omap.0",
152
.table = {
153
/* Slot switch, GPIO 96 */
154
GPIO_LOOKUP("gpio-96-127", 0, "switch", GPIO_ACTIVE_HIGH),
155
/* Slot index 1, VSD power, GPIO 23 */
156
GPIO_LOOKUP_IDX("gpio-0-31", 23, "vsd", 1, GPIO_ACTIVE_HIGH),
157
/* Slot index 1, VIO power, GPIO 9 */
158
GPIO_LOOKUP_IDX("gpio-0-31", 9, "vio", 1, GPIO_ACTIVE_HIGH),
159
{ }
160
},
161
};
162
163
static int n8x0_mmc_set_power_menelaus(struct device *dev, int slot,
164
int power_on, int vdd)
165
{
166
int mV;
167
168
#ifdef CONFIG_MMC_DEBUG
169
dev_dbg(dev, "Set slot %d power: %s (vdd %d)\n", slot + 1,
170
power_on ? "on" : "off", vdd);
171
#endif
172
if (slot == 0) {
173
if (!power_on)
174
return menelaus_set_vmmc(0);
175
switch (1 << vdd) {
176
case MMC_VDD_33_34:
177
case MMC_VDD_32_33:
178
case MMC_VDD_31_32:
179
mV = 3100;
180
break;
181
case MMC_VDD_30_31:
182
mV = 3000;
183
break;
184
case MMC_VDD_28_29:
185
mV = 2800;
186
break;
187
case MMC_VDD_165_195:
188
mV = 1850;
189
break;
190
default:
191
BUG();
192
}
193
return menelaus_set_vmmc(mV);
194
} else {
195
if (!power_on)
196
return menelaus_set_vdcdc(3, 0);
197
switch (1 << vdd) {
198
case MMC_VDD_33_34:
199
case MMC_VDD_32_33:
200
mV = 3300;
201
break;
202
case MMC_VDD_30_31:
203
case MMC_VDD_29_30:
204
mV = 3000;
205
break;
206
case MMC_VDD_28_29:
207
case MMC_VDD_27_28:
208
mV = 2800;
209
break;
210
case MMC_VDD_24_25:
211
case MMC_VDD_23_24:
212
mV = 2400;
213
break;
214
case MMC_VDD_22_23:
215
case MMC_VDD_21_22:
216
mV = 2200;
217
break;
218
case MMC_VDD_20_21:
219
mV = 2000;
220
break;
221
case MMC_VDD_165_195:
222
mV = 1800;
223
break;
224
default:
225
BUG();
226
}
227
return menelaus_set_vdcdc(3, mV);
228
}
229
return 0;
230
}
231
232
static int n8x0_mmc_set_power(struct device *dev, int slot, int power_on,
233
int vdd)
234
{
235
if (board_is_n800() || slot == 0)
236
return n8x0_mmc_set_power_menelaus(dev, slot, power_on, vdd);
237
238
/* The n810 power will be handled by GPIO code in the driver */
239
240
return 0;
241
}
242
243
static int n8x0_mmc_set_bus_mode(struct device *dev, int slot, int bus_mode)
244
{
245
int r;
246
247
dev_dbg(dev, "Set slot %d bus mode %s\n", slot + 1,
248
bus_mode == MMC_BUSMODE_OPENDRAIN ? "open-drain" : "push-pull");
249
BUG_ON(slot != 0 && slot != 1);
250
slot++;
251
switch (bus_mode) {
252
case MMC_BUSMODE_OPENDRAIN:
253
r = menelaus_set_mmc_opendrain(slot, 1);
254
break;
255
case MMC_BUSMODE_PUSHPULL:
256
r = menelaus_set_mmc_opendrain(slot, 0);
257
break;
258
default:
259
BUG();
260
}
261
if (r != 0 && printk_ratelimit())
262
dev_err(dev, "MMC: unable to set bus mode for slot %d\n",
263
slot);
264
return r;
265
}
266
267
static int n8x0_mmc_get_cover_state(struct device *dev, int slot)
268
{
269
slot++;
270
BUG_ON(slot != 1 && slot != 2);
271
if (slot == 1)
272
return slot1_cover_open;
273
else
274
return slot2_cover_open;
275
}
276
277
static void n8x0_mmc_callback(void *data, u8 card_mask)
278
{
279
#ifdef CONFIG_MMC_OMAP
280
int bit, *openp, index;
281
282
if (board_is_n800()) {
283
bit = 1 << 1;
284
openp = &slot2_cover_open;
285
index = 1;
286
} else {
287
bit = 1;
288
openp = &slot1_cover_open;
289
index = 0;
290
}
291
292
if (card_mask & bit)
293
*openp = 1;
294
else
295
*openp = 0;
296
297
omap_mmc_notify_cover_event(mmc_device, index, *openp);
298
#else
299
pr_warn("MMC: notify cover event not available\n");
300
#endif
301
}
302
303
static int n8x0_mmc_late_init(struct device *dev)
304
{
305
int r, bit, *openp;
306
int vs2sel;
307
308
mmc_device = dev;
309
310
r = menelaus_set_slot_sel(1);
311
if (r < 0)
312
return r;
313
314
if (board_is_n800())
315
vs2sel = 0;
316
else
317
vs2sel = 2;
318
319
r = menelaus_set_mmc_slot(2, 0, vs2sel, 1);
320
if (r < 0)
321
return r;
322
323
n8x0_mmc_set_power(dev, 0, MMC_POWER_ON, 16); /* MMC_VDD_28_29 */
324
n8x0_mmc_set_power(dev, 1, MMC_POWER_ON, 16);
325
326
r = menelaus_set_mmc_slot(1, 1, 0, 1);
327
if (r < 0)
328
return r;
329
r = menelaus_set_mmc_slot(2, 1, vs2sel, 1);
330
if (r < 0)
331
return r;
332
333
r = menelaus_get_slot_pin_states();
334
if (r < 0)
335
return r;
336
337
if (board_is_n800()) {
338
bit = 1 << 1;
339
openp = &slot2_cover_open;
340
} else {
341
bit = 1;
342
openp = &slot1_cover_open;
343
slot2_cover_open = 0;
344
}
345
346
/* All slot pin bits seem to be inversed until first switch change */
347
if (r == 0xf || r == (0xf & ~bit))
348
r = ~r;
349
350
if (r & bit)
351
*openp = 1;
352
else
353
*openp = 0;
354
355
r = menelaus_register_mmc_callback(n8x0_mmc_callback, NULL);
356
357
return r;
358
}
359
360
static void n8x0_mmc_shutdown(struct device *dev)
361
{
362
int vs2sel;
363
364
if (board_is_n800())
365
vs2sel = 0;
366
else
367
vs2sel = 2;
368
369
menelaus_set_mmc_slot(1, 0, 0, 0);
370
menelaus_set_mmc_slot(2, 0, vs2sel, 0);
371
}
372
373
static void n8x0_mmc_cleanup(struct device *dev)
374
{
375
menelaus_unregister_mmc_callback();
376
}
377
378
/*
379
* MMC controller1 has two slots that are multiplexed via I2C.
380
* MMC controller2 is not in use.
381
*/
382
static struct omap_mmc_platform_data mmc1_data = {
383
.nr_slots = 0,
384
.init = n8x0_mmc_late_init,
385
.cleanup = n8x0_mmc_cleanup,
386
.shutdown = n8x0_mmc_shutdown,
387
.max_freq = 24000000,
388
.slots[0] = {
389
.wires = 4,
390
.set_power = n8x0_mmc_set_power,
391
.set_bus_mode = n8x0_mmc_set_bus_mode,
392
.get_cover_state = n8x0_mmc_get_cover_state,
393
.ocr_mask = MMC_VDD_165_195 | MMC_VDD_30_31 |
394
MMC_VDD_32_33 | MMC_VDD_33_34,
395
.name = "internal",
396
},
397
.slots[1] = {
398
.set_power = n8x0_mmc_set_power,
399
.set_bus_mode = n8x0_mmc_set_bus_mode,
400
.get_cover_state = n8x0_mmc_get_cover_state,
401
.ocr_mask = MMC_VDD_165_195 | MMC_VDD_20_21 |
402
MMC_VDD_21_22 | MMC_VDD_22_23 |
403
MMC_VDD_23_24 | MMC_VDD_24_25 |
404
MMC_VDD_27_28 | MMC_VDD_28_29 |
405
MMC_VDD_29_30 | MMC_VDD_30_31 |
406
MMC_VDD_32_33 | MMC_VDD_33_34,
407
.name = "external",
408
},
409
};
410
411
static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC];
412
413
static void __init n8x0_mmc_init(void)
414
{
415
if (board_is_n810()) {
416
mmc1_data.slots[0].name = "external";
417
418
/*
419
* Some Samsung Movinand chips do not like open-ended
420
* multi-block reads and fall to braind-dead state
421
* while doing so. Reducing the number of blocks in
422
* the transfer or delays in clock disable do not help
423
*/
424
mmc1_data.slots[1].name = "internal";
425
mmc1_data.slots[1].ban_openended = 1;
426
gpiod_add_lookup_table(&nokia810_mmc_gpio_table);
427
} else {
428
gpiod_add_lookup_table(&nokia800_mmc_gpio_table);
429
}
430
431
mmc1_data.nr_slots = 2;
432
mmc_data[0] = &mmc1_data;
433
}
434
#else
435
static struct omap_mmc_platform_data mmc1_data;
436
static void __init n8x0_mmc_init(void)
437
{
438
}
439
#endif /* CONFIG_MMC_OMAP */
440
441
#ifdef CONFIG_MENELAUS
442
443
static int n8x0_auto_sleep_regulators(void)
444
{
445
u32 val;
446
int ret;
447
448
val = EN_VPLL_SLEEP | EN_VMMC_SLEEP \
449
| EN_VAUX_SLEEP | EN_VIO_SLEEP \
450
| EN_VMEM_SLEEP | EN_DC3_SLEEP \
451
| EN_VC_SLEEP | EN_DC2_SLEEP;
452
453
ret = menelaus_set_regulator_sleep(1, val);
454
if (ret < 0) {
455
pr_err("Could not set regulators to sleep on menelaus: %u\n",
456
ret);
457
return ret;
458
}
459
return 0;
460
}
461
462
static int n8x0_auto_voltage_scale(void)
463
{
464
int ret;
465
466
ret = menelaus_set_vcore_hw(1400, 1050);
467
if (ret < 0) {
468
pr_err("Could not set VCORE voltage on menelaus: %u\n", ret);
469
return ret;
470
}
471
return 0;
472
}
473
474
static int n8x0_menelaus_late_init(struct device *dev)
475
{
476
int ret;
477
478
ret = n8x0_auto_voltage_scale();
479
if (ret < 0)
480
return ret;
481
ret = n8x0_auto_sleep_regulators();
482
if (ret < 0)
483
return ret;
484
return 0;
485
}
486
487
#else
488
static int n8x0_menelaus_late_init(struct device *dev)
489
{
490
return 0;
491
}
492
#endif
493
494
struct menelaus_platform_data n8x0_menelaus_platform_data = {
495
.late_init = n8x0_menelaus_late_init,
496
};
497
498
static struct gpiod_lookup_table nokia810_asoc_gpio_table = {
499
.dev_id = "soc-audio",
500
.table = {
501
GPIO_LOOKUP("gpio-0-15", 10, "headset", GPIO_ACTIVE_HIGH),
502
GPIO_LOOKUP("gpio-80-111", 21, "speaker", GPIO_ACTIVE_HIGH),
503
{ }
504
},
505
};
506
507
static int __init n8x0_late_initcall(void)
508
{
509
if (!board_caps)
510
return -ENODEV;
511
512
n8x0_mmc_init();
513
n8x0_usb_init();
514
gpiod_add_lookup_table(&nokia810_asoc_gpio_table);
515
516
return 0;
517
}
518
omap_late_initcall(n8x0_late_initcall);
519
520
/*
521
* Legacy init pdata init for n8x0. Note that we want to follow the
522
* I2C bus numbering starting at 0 for device tree like other omaps.
523
*/
524
void * __init n8x0_legacy_init(void)
525
{
526
board_check_revision();
527
spi_register_board_info(n800_spi_board_info,
528
ARRAY_SIZE(n800_spi_board_info));
529
return &mmc1_data;
530
}
531
532