Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/mmc/host/omap_hsmmc.c
15111 views
1
/*
2
* drivers/mmc/host/omap_hsmmc.c
3
*
4
* Driver for OMAP2430/3430 MMC controller.
5
*
6
* Copyright (C) 2007 Texas Instruments.
7
*
8
* Authors:
9
* Syed Mohammed Khasim <[email protected]>
10
* Madhusudhan <[email protected]>
11
* Mohit Jalori <[email protected]>
12
*
13
* This file is licensed under the terms of the GNU General Public License
14
* version 2. This program is licensed "as is" without any warranty of any
15
* kind, whether express or implied.
16
*/
17
18
#include <linux/module.h>
19
#include <linux/init.h>
20
#include <linux/debugfs.h>
21
#include <linux/seq_file.h>
22
#include <linux/interrupt.h>
23
#include <linux/delay.h>
24
#include <linux/dma-mapping.h>
25
#include <linux/platform_device.h>
26
#include <linux/workqueue.h>
27
#include <linux/timer.h>
28
#include <linux/clk.h>
29
#include <linux/mmc/host.h>
30
#include <linux/mmc/core.h>
31
#include <linux/mmc/mmc.h>
32
#include <linux/io.h>
33
#include <linux/semaphore.h>
34
#include <linux/gpio.h>
35
#include <linux/regulator/consumer.h>
36
#include <plat/dma.h>
37
#include <mach/hardware.h>
38
#include <plat/board.h>
39
#include <plat/mmc.h>
40
#include <plat/cpu.h>
41
42
/* OMAP HSMMC Host Controller Registers */
43
#define OMAP_HSMMC_SYSCONFIG 0x0010
44
#define OMAP_HSMMC_SYSSTATUS 0x0014
45
#define OMAP_HSMMC_CON 0x002C
46
#define OMAP_HSMMC_BLK 0x0104
47
#define OMAP_HSMMC_ARG 0x0108
48
#define OMAP_HSMMC_CMD 0x010C
49
#define OMAP_HSMMC_RSP10 0x0110
50
#define OMAP_HSMMC_RSP32 0x0114
51
#define OMAP_HSMMC_RSP54 0x0118
52
#define OMAP_HSMMC_RSP76 0x011C
53
#define OMAP_HSMMC_DATA 0x0120
54
#define OMAP_HSMMC_HCTL 0x0128
55
#define OMAP_HSMMC_SYSCTL 0x012C
56
#define OMAP_HSMMC_STAT 0x0130
57
#define OMAP_HSMMC_IE 0x0134
58
#define OMAP_HSMMC_ISE 0x0138
59
#define OMAP_HSMMC_CAPA 0x0140
60
61
#define VS18 (1 << 26)
62
#define VS30 (1 << 25)
63
#define SDVS18 (0x5 << 9)
64
#define SDVS30 (0x6 << 9)
65
#define SDVS33 (0x7 << 9)
66
#define SDVS_MASK 0x00000E00
67
#define SDVSCLR 0xFFFFF1FF
68
#define SDVSDET 0x00000400
69
#define AUTOIDLE 0x1
70
#define SDBP (1 << 8)
71
#define DTO 0xe
72
#define ICE 0x1
73
#define ICS 0x2
74
#define CEN (1 << 2)
75
#define CLKD_MASK 0x0000FFC0
76
#define CLKD_SHIFT 6
77
#define DTO_MASK 0x000F0000
78
#define DTO_SHIFT 16
79
#define INT_EN_MASK 0x307F0033
80
#define BWR_ENABLE (1 << 4)
81
#define BRR_ENABLE (1 << 5)
82
#define DTO_ENABLE (1 << 20)
83
#define INIT_STREAM (1 << 1)
84
#define DP_SELECT (1 << 21)
85
#define DDIR (1 << 4)
86
#define DMA_EN 0x1
87
#define MSBS (1 << 5)
88
#define BCE (1 << 1)
89
#define FOUR_BIT (1 << 1)
90
#define DW8 (1 << 5)
91
#define CC 0x1
92
#define TC 0x02
93
#define OD 0x1
94
#define ERR (1 << 15)
95
#define CMD_TIMEOUT (1 << 16)
96
#define DATA_TIMEOUT (1 << 20)
97
#define CMD_CRC (1 << 17)
98
#define DATA_CRC (1 << 21)
99
#define CARD_ERR (1 << 28)
100
#define STAT_CLEAR 0xFFFFFFFF
101
#define INIT_STREAM_CMD 0x00000000
102
#define DUAL_VOLT_OCR_BIT 7
103
#define SRC (1 << 25)
104
#define SRD (1 << 26)
105
#define SOFTRESET (1 << 1)
106
#define RESETDONE (1 << 0)
107
108
/*
109
* FIXME: Most likely all the data using these _DEVID defines should come
110
* from the platform_data, or implemented in controller and slot specific
111
* functions.
112
*/
113
#define OMAP_MMC1_DEVID 0
114
#define OMAP_MMC2_DEVID 1
115
#define OMAP_MMC3_DEVID 2
116
#define OMAP_MMC4_DEVID 3
117
#define OMAP_MMC5_DEVID 4
118
119
#define MMC_TIMEOUT_MS 20
120
#define OMAP_MMC_MASTER_CLOCK 96000000
121
#define DRIVER_NAME "omap_hsmmc"
122
123
/* Timeouts for entering power saving states on inactivity, msec */
124
#define OMAP_MMC_DISABLED_TIMEOUT 100
125
#define OMAP_MMC_SLEEP_TIMEOUT 1000
126
#define OMAP_MMC_OFF_TIMEOUT 8000
127
128
/*
129
* One controller can have multiple slots, like on some omap boards using
130
* omap.c controller driver. Luckily this is not currently done on any known
131
* omap_hsmmc.c device.
132
*/
133
#define mmc_slot(host) (host->pdata->slots[host->slot_id])
134
135
/*
136
* MMC Host controller read/write API's
137
*/
138
#define OMAP_HSMMC_READ(base, reg) \
139
__raw_readl((base) + OMAP_HSMMC_##reg)
140
141
#define OMAP_HSMMC_WRITE(base, reg, val) \
142
__raw_writel((val), (base) + OMAP_HSMMC_##reg)
143
144
struct omap_hsmmc_host {
145
struct device *dev;
146
struct mmc_host *mmc;
147
struct mmc_request *mrq;
148
struct mmc_command *cmd;
149
struct mmc_data *data;
150
struct clk *fclk;
151
struct clk *iclk;
152
struct clk *dbclk;
153
/*
154
* vcc == configured supply
155
* vcc_aux == optional
156
* - MMC1, supply for DAT4..DAT7
157
* - MMC2/MMC2, external level shifter voltage supply, for
158
* chip (SDIO, eMMC, etc) or transceiver (MMC2 only)
159
*/
160
struct regulator *vcc;
161
struct regulator *vcc_aux;
162
struct work_struct mmc_carddetect_work;
163
void __iomem *base;
164
resource_size_t mapbase;
165
spinlock_t irq_lock; /* Prevent races with irq handler */
166
unsigned int id;
167
unsigned int dma_len;
168
unsigned int dma_sg_idx;
169
unsigned char bus_mode;
170
unsigned char power_mode;
171
u32 *buffer;
172
u32 bytesleft;
173
int suspended;
174
int irq;
175
int use_dma, dma_ch;
176
int dma_line_tx, dma_line_rx;
177
int slot_id;
178
int got_dbclk;
179
int response_busy;
180
int context_loss;
181
int dpm_state;
182
int vdd;
183
int protect_card;
184
int reqs_blocked;
185
int use_reg;
186
int req_in_progress;
187
188
struct omap_mmc_platform_data *pdata;
189
};
190
191
static int omap_hsmmc_card_detect(struct device *dev, int slot)
192
{
193
struct omap_mmc_platform_data *mmc = dev->platform_data;
194
195
/* NOTE: assumes card detect signal is active-low */
196
return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
197
}
198
199
static int omap_hsmmc_get_wp(struct device *dev, int slot)
200
{
201
struct omap_mmc_platform_data *mmc = dev->platform_data;
202
203
/* NOTE: assumes write protect signal is active-high */
204
return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
205
}
206
207
static int omap_hsmmc_get_cover_state(struct device *dev, int slot)
208
{
209
struct omap_mmc_platform_data *mmc = dev->platform_data;
210
211
/* NOTE: assumes card detect signal is active-low */
212
return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
213
}
214
215
#ifdef CONFIG_PM
216
217
static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot)
218
{
219
struct omap_mmc_platform_data *mmc = dev->platform_data;
220
221
disable_irq(mmc->slots[0].card_detect_irq);
222
return 0;
223
}
224
225
static int omap_hsmmc_resume_cdirq(struct device *dev, int slot)
226
{
227
struct omap_mmc_platform_data *mmc = dev->platform_data;
228
229
enable_irq(mmc->slots[0].card_detect_irq);
230
return 0;
231
}
232
233
#else
234
235
#define omap_hsmmc_suspend_cdirq NULL
236
#define omap_hsmmc_resume_cdirq NULL
237
238
#endif
239
240
#ifdef CONFIG_REGULATOR
241
242
static int omap_hsmmc_1_set_power(struct device *dev, int slot, int power_on,
243
int vdd)
244
{
245
struct omap_hsmmc_host *host =
246
platform_get_drvdata(to_platform_device(dev));
247
int ret;
248
249
if (mmc_slot(host).before_set_reg)
250
mmc_slot(host).before_set_reg(dev, slot, power_on, vdd);
251
252
if (power_on)
253
ret = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
254
else
255
ret = mmc_regulator_set_ocr(host->mmc, host->vcc, 0);
256
257
if (mmc_slot(host).after_set_reg)
258
mmc_slot(host).after_set_reg(dev, slot, power_on, vdd);
259
260
return ret;
261
}
262
263
static int omap_hsmmc_235_set_power(struct device *dev, int slot, int power_on,
264
int vdd)
265
{
266
struct omap_hsmmc_host *host =
267
platform_get_drvdata(to_platform_device(dev));
268
int ret = 0;
269
270
/*
271
* If we don't see a Vcc regulator, assume it's a fixed
272
* voltage always-on regulator.
273
*/
274
if (!host->vcc)
275
return 0;
276
277
if (mmc_slot(host).before_set_reg)
278
mmc_slot(host).before_set_reg(dev, slot, power_on, vdd);
279
280
/*
281
* Assume Vcc regulator is used only to power the card ... OMAP
282
* VDDS is used to power the pins, optionally with a transceiver to
283
* support cards using voltages other than VDDS (1.8V nominal). When a
284
* transceiver is used, DAT3..7 are muxed as transceiver control pins.
285
*
286
* In some cases this regulator won't support enable/disable;
287
* e.g. it's a fixed rail for a WLAN chip.
288
*
289
* In other cases vcc_aux switches interface power. Example, for
290
* eMMC cards it represents VccQ. Sometimes transceivers or SDIO
291
* chips/cards need an interface voltage rail too.
292
*/
293
if (power_on) {
294
ret = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
295
/* Enable interface voltage rail, if needed */
296
if (ret == 0 && host->vcc_aux) {
297
ret = regulator_enable(host->vcc_aux);
298
if (ret < 0)
299
ret = mmc_regulator_set_ocr(host->mmc,
300
host->vcc, 0);
301
}
302
} else {
303
/* Shut down the rail */
304
if (host->vcc_aux)
305
ret = regulator_disable(host->vcc_aux);
306
if (!ret) {
307
/* Then proceed to shut down the local regulator */
308
ret = mmc_regulator_set_ocr(host->mmc,
309
host->vcc, 0);
310
}
311
}
312
313
if (mmc_slot(host).after_set_reg)
314
mmc_slot(host).after_set_reg(dev, slot, power_on, vdd);
315
316
return ret;
317
}
318
319
static int omap_hsmmc_4_set_power(struct device *dev, int slot, int power_on,
320
int vdd)
321
{
322
return 0;
323
}
324
325
static int omap_hsmmc_1_set_sleep(struct device *dev, int slot, int sleep,
326
int vdd, int cardsleep)
327
{
328
struct omap_hsmmc_host *host =
329
platform_get_drvdata(to_platform_device(dev));
330
int mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
331
332
return regulator_set_mode(host->vcc, mode);
333
}
334
335
static int omap_hsmmc_235_set_sleep(struct device *dev, int slot, int sleep,
336
int vdd, int cardsleep)
337
{
338
struct omap_hsmmc_host *host =
339
platform_get_drvdata(to_platform_device(dev));
340
int err, mode;
341
342
/*
343
* If we don't see a Vcc regulator, assume it's a fixed
344
* voltage always-on regulator.
345
*/
346
if (!host->vcc)
347
return 0;
348
349
mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
350
351
if (!host->vcc_aux)
352
return regulator_set_mode(host->vcc, mode);
353
354
if (cardsleep) {
355
/* VCC can be turned off if card is asleep */
356
if (sleep)
357
err = mmc_regulator_set_ocr(host->mmc, host->vcc, 0);
358
else
359
err = mmc_regulator_set_ocr(host->mmc, host->vcc, vdd);
360
} else
361
err = regulator_set_mode(host->vcc, mode);
362
if (err)
363
return err;
364
365
if (!mmc_slot(host).vcc_aux_disable_is_sleep)
366
return regulator_set_mode(host->vcc_aux, mode);
367
368
if (sleep)
369
return regulator_disable(host->vcc_aux);
370
else
371
return regulator_enable(host->vcc_aux);
372
}
373
374
static int omap_hsmmc_4_set_sleep(struct device *dev, int slot, int sleep,
375
int vdd, int cardsleep)
376
{
377
return 0;
378
}
379
380
static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
381
{
382
struct regulator *reg;
383
int ret = 0;
384
int ocr_value = 0;
385
386
switch (host->id) {
387
case OMAP_MMC1_DEVID:
388
/* On-chip level shifting via PBIAS0/PBIAS1 */
389
mmc_slot(host).set_power = omap_hsmmc_1_set_power;
390
mmc_slot(host).set_sleep = omap_hsmmc_1_set_sleep;
391
break;
392
case OMAP_MMC2_DEVID:
393
case OMAP_MMC3_DEVID:
394
case OMAP_MMC5_DEVID:
395
/* Off-chip level shifting, or none */
396
mmc_slot(host).set_power = omap_hsmmc_235_set_power;
397
mmc_slot(host).set_sleep = omap_hsmmc_235_set_sleep;
398
break;
399
case OMAP_MMC4_DEVID:
400
mmc_slot(host).set_power = omap_hsmmc_4_set_power;
401
mmc_slot(host).set_sleep = omap_hsmmc_4_set_sleep;
402
default:
403
pr_err("MMC%d configuration not supported!\n", host->id);
404
return -EINVAL;
405
}
406
407
reg = regulator_get(host->dev, "vmmc");
408
if (IS_ERR(reg)) {
409
dev_dbg(host->dev, "vmmc regulator missing\n");
410
/*
411
* HACK: until fixed.c regulator is usable,
412
* we don't require a main regulator
413
* for MMC2 or MMC3
414
*/
415
if (host->id == OMAP_MMC1_DEVID) {
416
ret = PTR_ERR(reg);
417
goto err;
418
}
419
} else {
420
host->vcc = reg;
421
ocr_value = mmc_regulator_get_ocrmask(reg);
422
if (!mmc_slot(host).ocr_mask) {
423
mmc_slot(host).ocr_mask = ocr_value;
424
} else {
425
if (!(mmc_slot(host).ocr_mask & ocr_value)) {
426
pr_err("MMC%d ocrmask %x is not supported\n",
427
host->id, mmc_slot(host).ocr_mask);
428
mmc_slot(host).ocr_mask = 0;
429
return -EINVAL;
430
}
431
}
432
433
/* Allow an aux regulator */
434
reg = regulator_get(host->dev, "vmmc_aux");
435
host->vcc_aux = IS_ERR(reg) ? NULL : reg;
436
437
/* For eMMC do not power off when not in sleep state */
438
if (mmc_slot(host).no_regulator_off_init)
439
return 0;
440
/*
441
* UGLY HACK: workaround regulator framework bugs.
442
* When the bootloader leaves a supply active, it's
443
* initialized with zero usecount ... and we can't
444
* disable it without first enabling it. Until the
445
* framework is fixed, we need a workaround like this
446
* (which is safe for MMC, but not in general).
447
*/
448
if (regulator_is_enabled(host->vcc) > 0) {
449
regulator_enable(host->vcc);
450
regulator_disable(host->vcc);
451
}
452
if (host->vcc_aux) {
453
if (regulator_is_enabled(reg) > 0) {
454
regulator_enable(reg);
455
regulator_disable(reg);
456
}
457
}
458
}
459
460
return 0;
461
462
err:
463
mmc_slot(host).set_power = NULL;
464
mmc_slot(host).set_sleep = NULL;
465
return ret;
466
}
467
468
static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
469
{
470
regulator_put(host->vcc);
471
regulator_put(host->vcc_aux);
472
mmc_slot(host).set_power = NULL;
473
mmc_slot(host).set_sleep = NULL;
474
}
475
476
static inline int omap_hsmmc_have_reg(void)
477
{
478
return 1;
479
}
480
481
#else
482
483
static inline int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
484
{
485
return -EINVAL;
486
}
487
488
static inline void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
489
{
490
}
491
492
static inline int omap_hsmmc_have_reg(void)
493
{
494
return 0;
495
}
496
497
#endif
498
499
static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
500
{
501
int ret;
502
503
if (gpio_is_valid(pdata->slots[0].switch_pin)) {
504
if (pdata->slots[0].cover)
505
pdata->slots[0].get_cover_state =
506
omap_hsmmc_get_cover_state;
507
else
508
pdata->slots[0].card_detect = omap_hsmmc_card_detect;
509
pdata->slots[0].card_detect_irq =
510
gpio_to_irq(pdata->slots[0].switch_pin);
511
ret = gpio_request(pdata->slots[0].switch_pin, "mmc_cd");
512
if (ret)
513
return ret;
514
ret = gpio_direction_input(pdata->slots[0].switch_pin);
515
if (ret)
516
goto err_free_sp;
517
} else
518
pdata->slots[0].switch_pin = -EINVAL;
519
520
if (gpio_is_valid(pdata->slots[0].gpio_wp)) {
521
pdata->slots[0].get_ro = omap_hsmmc_get_wp;
522
ret = gpio_request(pdata->slots[0].gpio_wp, "mmc_wp");
523
if (ret)
524
goto err_free_cd;
525
ret = gpio_direction_input(pdata->slots[0].gpio_wp);
526
if (ret)
527
goto err_free_wp;
528
} else
529
pdata->slots[0].gpio_wp = -EINVAL;
530
531
return 0;
532
533
err_free_wp:
534
gpio_free(pdata->slots[0].gpio_wp);
535
err_free_cd:
536
if (gpio_is_valid(pdata->slots[0].switch_pin))
537
err_free_sp:
538
gpio_free(pdata->slots[0].switch_pin);
539
return ret;
540
}
541
542
static void omap_hsmmc_gpio_free(struct omap_mmc_platform_data *pdata)
543
{
544
if (gpio_is_valid(pdata->slots[0].gpio_wp))
545
gpio_free(pdata->slots[0].gpio_wp);
546
if (gpio_is_valid(pdata->slots[0].switch_pin))
547
gpio_free(pdata->slots[0].switch_pin);
548
}
549
550
/*
551
* Stop clock to the card
552
*/
553
static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host)
554
{
555
OMAP_HSMMC_WRITE(host->base, SYSCTL,
556
OMAP_HSMMC_READ(host->base, SYSCTL) & ~CEN);
557
if ((OMAP_HSMMC_READ(host->base, SYSCTL) & CEN) != 0x0)
558
dev_dbg(mmc_dev(host->mmc), "MMC Clock is not stoped\n");
559
}
560
561
static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host,
562
struct mmc_command *cmd)
563
{
564
unsigned int irq_mask;
565
566
if (host->use_dma)
567
irq_mask = INT_EN_MASK & ~(BRR_ENABLE | BWR_ENABLE);
568
else
569
irq_mask = INT_EN_MASK;
570
571
/* Disable timeout for erases */
572
if (cmd->opcode == MMC_ERASE)
573
irq_mask &= ~DTO_ENABLE;
574
575
OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
576
OMAP_HSMMC_WRITE(host->base, ISE, irq_mask);
577
OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
578
}
579
580
static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host)
581
{
582
OMAP_HSMMC_WRITE(host->base, ISE, 0);
583
OMAP_HSMMC_WRITE(host->base, IE, 0);
584
OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
585
}
586
587
#ifdef CONFIG_PM
588
589
/*
590
* Restore the MMC host context, if it was lost as result of a
591
* power state change.
592
*/
593
static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
594
{
595
struct mmc_ios *ios = &host->mmc->ios;
596
struct omap_mmc_platform_data *pdata = host->pdata;
597
int context_loss = 0;
598
u32 hctl, capa, con;
599
u16 dsor = 0;
600
unsigned long timeout;
601
602
if (pdata->get_context_loss_count) {
603
context_loss = pdata->get_context_loss_count(host->dev);
604
if (context_loss < 0)
605
return 1;
606
}
607
608
dev_dbg(mmc_dev(host->mmc), "context was %slost\n",
609
context_loss == host->context_loss ? "not " : "");
610
if (host->context_loss == context_loss)
611
return 1;
612
613
/* Wait for hardware reset */
614
timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
615
while ((OMAP_HSMMC_READ(host->base, SYSSTATUS) & RESETDONE) != RESETDONE
616
&& time_before(jiffies, timeout))
617
;
618
619
/* Do software reset */
620
OMAP_HSMMC_WRITE(host->base, SYSCONFIG, SOFTRESET);
621
timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
622
while ((OMAP_HSMMC_READ(host->base, SYSSTATUS) & RESETDONE) != RESETDONE
623
&& time_before(jiffies, timeout))
624
;
625
626
OMAP_HSMMC_WRITE(host->base, SYSCONFIG,
627
OMAP_HSMMC_READ(host->base, SYSCONFIG) | AUTOIDLE);
628
629
if (host->id == OMAP_MMC1_DEVID) {
630
if (host->power_mode != MMC_POWER_OFF &&
631
(1 << ios->vdd) <= MMC_VDD_23_24)
632
hctl = SDVS18;
633
else
634
hctl = SDVS30;
635
capa = VS30 | VS18;
636
} else {
637
hctl = SDVS18;
638
capa = VS18;
639
}
640
641
OMAP_HSMMC_WRITE(host->base, HCTL,
642
OMAP_HSMMC_READ(host->base, HCTL) | hctl);
643
644
OMAP_HSMMC_WRITE(host->base, CAPA,
645
OMAP_HSMMC_READ(host->base, CAPA) | capa);
646
647
OMAP_HSMMC_WRITE(host->base, HCTL,
648
OMAP_HSMMC_READ(host->base, HCTL) | SDBP);
649
650
timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
651
while ((OMAP_HSMMC_READ(host->base, HCTL) & SDBP) != SDBP
652
&& time_before(jiffies, timeout))
653
;
654
655
omap_hsmmc_disable_irq(host);
656
657
/* Do not initialize card-specific things if the power is off */
658
if (host->power_mode == MMC_POWER_OFF)
659
goto out;
660
661
con = OMAP_HSMMC_READ(host->base, CON);
662
switch (ios->bus_width) {
663
case MMC_BUS_WIDTH_8:
664
OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
665
break;
666
case MMC_BUS_WIDTH_4:
667
OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
668
OMAP_HSMMC_WRITE(host->base, HCTL,
669
OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT);
670
break;
671
case MMC_BUS_WIDTH_1:
672
OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
673
OMAP_HSMMC_WRITE(host->base, HCTL,
674
OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT);
675
break;
676
}
677
678
if (ios->clock) {
679
dsor = OMAP_MMC_MASTER_CLOCK / ios->clock;
680
if (dsor < 1)
681
dsor = 1;
682
683
if (OMAP_MMC_MASTER_CLOCK / dsor > ios->clock)
684
dsor++;
685
686
if (dsor > 250)
687
dsor = 250;
688
}
689
690
OMAP_HSMMC_WRITE(host->base, SYSCTL,
691
OMAP_HSMMC_READ(host->base, SYSCTL) & ~CEN);
692
OMAP_HSMMC_WRITE(host->base, SYSCTL, (dsor << 6) | (DTO << 16));
693
OMAP_HSMMC_WRITE(host->base, SYSCTL,
694
OMAP_HSMMC_READ(host->base, SYSCTL) | ICE);
695
696
timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
697
while ((OMAP_HSMMC_READ(host->base, SYSCTL) & ICS) != ICS
698
&& time_before(jiffies, timeout))
699
;
700
701
OMAP_HSMMC_WRITE(host->base, SYSCTL,
702
OMAP_HSMMC_READ(host->base, SYSCTL) | CEN);
703
704
con = OMAP_HSMMC_READ(host->base, CON);
705
if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
706
OMAP_HSMMC_WRITE(host->base, CON, con | OD);
707
else
708
OMAP_HSMMC_WRITE(host->base, CON, con & ~OD);
709
out:
710
host->context_loss = context_loss;
711
712
dev_dbg(mmc_dev(host->mmc), "context is restored\n");
713
return 0;
714
}
715
716
/*
717
* Save the MMC host context (store the number of power state changes so far).
718
*/
719
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
720
{
721
struct omap_mmc_platform_data *pdata = host->pdata;
722
int context_loss;
723
724
if (pdata->get_context_loss_count) {
725
context_loss = pdata->get_context_loss_count(host->dev);
726
if (context_loss < 0)
727
return;
728
host->context_loss = context_loss;
729
}
730
}
731
732
#else
733
734
static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
735
{
736
return 0;
737
}
738
739
static void omap_hsmmc_context_save(struct omap_hsmmc_host *host)
740
{
741
}
742
743
#endif
744
745
/*
746
* Send init stream sequence to card
747
* before sending IDLE command
748
*/
749
static void send_init_stream(struct omap_hsmmc_host *host)
750
{
751
int reg = 0;
752
unsigned long timeout;
753
754
if (host->protect_card)
755
return;
756
757
disable_irq(host->irq);
758
759
OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK);
760
OMAP_HSMMC_WRITE(host->base, CON,
761
OMAP_HSMMC_READ(host->base, CON) | INIT_STREAM);
762
OMAP_HSMMC_WRITE(host->base, CMD, INIT_STREAM_CMD);
763
764
timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
765
while ((reg != CC) && time_before(jiffies, timeout))
766
reg = OMAP_HSMMC_READ(host->base, STAT) & CC;
767
768
OMAP_HSMMC_WRITE(host->base, CON,
769
OMAP_HSMMC_READ(host->base, CON) & ~INIT_STREAM);
770
771
OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR);
772
OMAP_HSMMC_READ(host->base, STAT);
773
774
enable_irq(host->irq);
775
}
776
777
static inline
778
int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host)
779
{
780
int r = 1;
781
782
if (mmc_slot(host).get_cover_state)
783
r = mmc_slot(host).get_cover_state(host->dev, host->slot_id);
784
return r;
785
}
786
787
static ssize_t
788
omap_hsmmc_show_cover_switch(struct device *dev, struct device_attribute *attr,
789
char *buf)
790
{
791
struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
792
struct omap_hsmmc_host *host = mmc_priv(mmc);
793
794
return sprintf(buf, "%s\n",
795
omap_hsmmc_cover_is_closed(host) ? "closed" : "open");
796
}
797
798
static DEVICE_ATTR(cover_switch, S_IRUGO, omap_hsmmc_show_cover_switch, NULL);
799
800
static ssize_t
801
omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
802
char *buf)
803
{
804
struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
805
struct omap_hsmmc_host *host = mmc_priv(mmc);
806
807
return sprintf(buf, "%s\n", mmc_slot(host).name);
808
}
809
810
static DEVICE_ATTR(slot_name, S_IRUGO, omap_hsmmc_show_slot_name, NULL);
811
812
/*
813
* Configure the response type and send the cmd.
814
*/
815
static void
816
omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd,
817
struct mmc_data *data)
818
{
819
int cmdreg = 0, resptype = 0, cmdtype = 0;
820
821
dev_dbg(mmc_dev(host->mmc), "%s: CMD%d, argument 0x%08x\n",
822
mmc_hostname(host->mmc), cmd->opcode, cmd->arg);
823
host->cmd = cmd;
824
825
omap_hsmmc_enable_irq(host, cmd);
826
827
host->response_busy = 0;
828
if (cmd->flags & MMC_RSP_PRESENT) {
829
if (cmd->flags & MMC_RSP_136)
830
resptype = 1;
831
else if (cmd->flags & MMC_RSP_BUSY) {
832
resptype = 3;
833
host->response_busy = 1;
834
} else
835
resptype = 2;
836
}
837
838
/*
839
* Unlike OMAP1 controller, the cmdtype does not seem to be based on
840
* ac, bc, adtc, bcr. Only commands ending an open ended transfer need
841
* a val of 0x3, rest 0x0.
842
*/
843
if (cmd == host->mrq->stop)
844
cmdtype = 0x3;
845
846
cmdreg = (cmd->opcode << 24) | (resptype << 16) | (cmdtype << 22);
847
848
if (data) {
849
cmdreg |= DP_SELECT | MSBS | BCE;
850
if (data->flags & MMC_DATA_READ)
851
cmdreg |= DDIR;
852
else
853
cmdreg &= ~(DDIR);
854
}
855
856
if (host->use_dma)
857
cmdreg |= DMA_EN;
858
859
host->req_in_progress = 1;
860
861
OMAP_HSMMC_WRITE(host->base, ARG, cmd->arg);
862
OMAP_HSMMC_WRITE(host->base, CMD, cmdreg);
863
}
864
865
static int
866
omap_hsmmc_get_dma_dir(struct omap_hsmmc_host *host, struct mmc_data *data)
867
{
868
if (data->flags & MMC_DATA_WRITE)
869
return DMA_TO_DEVICE;
870
else
871
return DMA_FROM_DEVICE;
872
}
873
874
static void omap_hsmmc_request_done(struct omap_hsmmc_host *host, struct mmc_request *mrq)
875
{
876
int dma_ch;
877
878
spin_lock(&host->irq_lock);
879
host->req_in_progress = 0;
880
dma_ch = host->dma_ch;
881
spin_unlock(&host->irq_lock);
882
883
omap_hsmmc_disable_irq(host);
884
/* Do not complete the request if DMA is still in progress */
885
if (mrq->data && host->use_dma && dma_ch != -1)
886
return;
887
host->mrq = NULL;
888
mmc_request_done(host->mmc, mrq);
889
}
890
891
/*
892
* Notify the transfer complete to MMC core
893
*/
894
static void
895
omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
896
{
897
if (!data) {
898
struct mmc_request *mrq = host->mrq;
899
900
/* TC before CC from CMD6 - don't know why, but it happens */
901
if (host->cmd && host->cmd->opcode == 6 &&
902
host->response_busy) {
903
host->response_busy = 0;
904
return;
905
}
906
907
omap_hsmmc_request_done(host, mrq);
908
return;
909
}
910
911
host->data = NULL;
912
913
if (!data->error)
914
data->bytes_xfered += data->blocks * (data->blksz);
915
else
916
data->bytes_xfered = 0;
917
918
if (!data->stop) {
919
omap_hsmmc_request_done(host, data->mrq);
920
return;
921
}
922
omap_hsmmc_start_command(host, data->stop, NULL);
923
}
924
925
/*
926
* Notify the core about command completion
927
*/
928
static void
929
omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd)
930
{
931
host->cmd = NULL;
932
933
if (cmd->flags & MMC_RSP_PRESENT) {
934
if (cmd->flags & MMC_RSP_136) {
935
/* response type 2 */
936
cmd->resp[3] = OMAP_HSMMC_READ(host->base, RSP10);
937
cmd->resp[2] = OMAP_HSMMC_READ(host->base, RSP32);
938
cmd->resp[1] = OMAP_HSMMC_READ(host->base, RSP54);
939
cmd->resp[0] = OMAP_HSMMC_READ(host->base, RSP76);
940
} else {
941
/* response types 1, 1b, 3, 4, 5, 6 */
942
cmd->resp[0] = OMAP_HSMMC_READ(host->base, RSP10);
943
}
944
}
945
if ((host->data == NULL && !host->response_busy) || cmd->error)
946
omap_hsmmc_request_done(host, cmd->mrq);
947
}
948
949
/*
950
* DMA clean up for command errors
951
*/
952
static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
953
{
954
int dma_ch;
955
956
host->data->error = errno;
957
958
spin_lock(&host->irq_lock);
959
dma_ch = host->dma_ch;
960
host->dma_ch = -1;
961
spin_unlock(&host->irq_lock);
962
963
if (host->use_dma && dma_ch != -1) {
964
dma_unmap_sg(mmc_dev(host->mmc), host->data->sg,
965
host->data->sg_len,
966
omap_hsmmc_get_dma_dir(host, host->data));
967
omap_free_dma(dma_ch);
968
}
969
host->data = NULL;
970
}
971
972
/*
973
* Readable error output
974
*/
975
#ifdef CONFIG_MMC_DEBUG
976
static void omap_hsmmc_report_irq(struct omap_hsmmc_host *host, u32 status)
977
{
978
/* --- means reserved bit without definition at documentation */
979
static const char *omap_hsmmc_status_bits[] = {
980
"CC", "TC", "BGE", "---", "BWR", "BRR", "---", "---", "CIRQ",
981
"OBI", "---", "---", "---", "---", "---", "ERRI", "CTO", "CCRC",
982
"CEB", "CIE", "DTO", "DCRC", "DEB", "---", "ACE", "---",
983
"---", "---", "---", "CERR", "CERR", "BADA", "---", "---", "---"
984
};
985
char res[256];
986
char *buf = res;
987
int len, i;
988
989
len = sprintf(buf, "MMC IRQ 0x%x :", status);
990
buf += len;
991
992
for (i = 0; i < ARRAY_SIZE(omap_hsmmc_status_bits); i++)
993
if (status & (1 << i)) {
994
len = sprintf(buf, " %s", omap_hsmmc_status_bits[i]);
995
buf += len;
996
}
997
998
dev_dbg(mmc_dev(host->mmc), "%s\n", res);
999
}
1000
#endif /* CONFIG_MMC_DEBUG */
1001
1002
/*
1003
* MMC controller internal state machines reset
1004
*
1005
* Used to reset command or data internal state machines, using respectively
1006
* SRC or SRD bit of SYSCTL register
1007
* Can be called from interrupt context
1008
*/
1009
static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host,
1010
unsigned long bit)
1011
{
1012
unsigned long i = 0;
1013
unsigned long limit = (loops_per_jiffy *
1014
msecs_to_jiffies(MMC_TIMEOUT_MS));
1015
1016
OMAP_HSMMC_WRITE(host->base, SYSCTL,
1017
OMAP_HSMMC_READ(host->base, SYSCTL) | bit);
1018
1019
/*
1020
* OMAP4 ES2 and greater has an updated reset logic.
1021
* Monitor a 0->1 transition first
1022
*/
1023
if (mmc_slot(host).features & HSMMC_HAS_UPDATED_RESET) {
1024
while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit))
1025
&& (i++ < limit))
1026
cpu_relax();
1027
}
1028
i = 0;
1029
1030
while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) &&
1031
(i++ < limit))
1032
cpu_relax();
1033
1034
if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit)
1035
dev_err(mmc_dev(host->mmc),
1036
"Timeout waiting on controller reset in %s\n",
1037
__func__);
1038
}
1039
1040
static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
1041
{
1042
struct mmc_data *data;
1043
int end_cmd = 0, end_trans = 0;
1044
1045
if (!host->req_in_progress) {
1046
do {
1047
OMAP_HSMMC_WRITE(host->base, STAT, status);
1048
/* Flush posted write */
1049
status = OMAP_HSMMC_READ(host->base, STAT);
1050
} while (status & INT_EN_MASK);
1051
return;
1052
}
1053
1054
data = host->data;
1055
dev_dbg(mmc_dev(host->mmc), "IRQ Status is %x\n", status);
1056
1057
if (status & ERR) {
1058
#ifdef CONFIG_MMC_DEBUG
1059
omap_hsmmc_report_irq(host, status);
1060
#endif
1061
if ((status & CMD_TIMEOUT) ||
1062
(status & CMD_CRC)) {
1063
if (host->cmd) {
1064
if (status & CMD_TIMEOUT) {
1065
omap_hsmmc_reset_controller_fsm(host,
1066
SRC);
1067
host->cmd->error = -ETIMEDOUT;
1068
} else {
1069
host->cmd->error = -EILSEQ;
1070
}
1071
end_cmd = 1;
1072
}
1073
if (host->data || host->response_busy) {
1074
if (host->data)
1075
omap_hsmmc_dma_cleanup(host,
1076
-ETIMEDOUT);
1077
host->response_busy = 0;
1078
omap_hsmmc_reset_controller_fsm(host, SRD);
1079
}
1080
}
1081
if ((status & DATA_TIMEOUT) ||
1082
(status & DATA_CRC)) {
1083
if (host->data || host->response_busy) {
1084
int err = (status & DATA_TIMEOUT) ?
1085
-ETIMEDOUT : -EILSEQ;
1086
1087
if (host->data)
1088
omap_hsmmc_dma_cleanup(host, err);
1089
else
1090
host->mrq->cmd->error = err;
1091
host->response_busy = 0;
1092
omap_hsmmc_reset_controller_fsm(host, SRD);
1093
end_trans = 1;
1094
}
1095
}
1096
if (status & CARD_ERR) {
1097
dev_dbg(mmc_dev(host->mmc),
1098
"Ignoring card err CMD%d\n", host->cmd->opcode);
1099
if (host->cmd)
1100
end_cmd = 1;
1101
if (host->data)
1102
end_trans = 1;
1103
}
1104
}
1105
1106
OMAP_HSMMC_WRITE(host->base, STAT, status);
1107
1108
if (end_cmd || ((status & CC) && host->cmd))
1109
omap_hsmmc_cmd_done(host, host->cmd);
1110
if ((end_trans || (status & TC)) && host->mrq)
1111
omap_hsmmc_xfer_done(host, data);
1112
}
1113
1114
/*
1115
* MMC controller IRQ handler
1116
*/
1117
static irqreturn_t omap_hsmmc_irq(int irq, void *dev_id)
1118
{
1119
struct omap_hsmmc_host *host = dev_id;
1120
int status;
1121
1122
status = OMAP_HSMMC_READ(host->base, STAT);
1123
do {
1124
omap_hsmmc_do_irq(host, status);
1125
/* Flush posted write */
1126
status = OMAP_HSMMC_READ(host->base, STAT);
1127
} while (status & INT_EN_MASK);
1128
1129
return IRQ_HANDLED;
1130
}
1131
1132
static void set_sd_bus_power(struct omap_hsmmc_host *host)
1133
{
1134
unsigned long i;
1135
1136
OMAP_HSMMC_WRITE(host->base, HCTL,
1137
OMAP_HSMMC_READ(host->base, HCTL) | SDBP);
1138
for (i = 0; i < loops_per_jiffy; i++) {
1139
if (OMAP_HSMMC_READ(host->base, HCTL) & SDBP)
1140
break;
1141
cpu_relax();
1142
}
1143
}
1144
1145
/*
1146
* Switch MMC interface voltage ... only relevant for MMC1.
1147
*
1148
* MMC2 and MMC3 use fixed 1.8V levels, and maybe a transceiver.
1149
* The MMC2 transceiver controls are used instead of DAT4..DAT7.
1150
* Some chips, like eMMC ones, use internal transceivers.
1151
*/
1152
static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
1153
{
1154
u32 reg_val = 0;
1155
int ret;
1156
1157
/* Disable the clocks */
1158
clk_disable(host->fclk);
1159
clk_disable(host->iclk);
1160
if (host->got_dbclk)
1161
clk_disable(host->dbclk);
1162
1163
/* Turn the power off */
1164
ret = mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
1165
1166
/* Turn the power ON with given VDD 1.8 or 3.0v */
1167
if (!ret)
1168
ret = mmc_slot(host).set_power(host->dev, host->slot_id, 1,
1169
vdd);
1170
clk_enable(host->iclk);
1171
clk_enable(host->fclk);
1172
if (host->got_dbclk)
1173
clk_enable(host->dbclk);
1174
1175
if (ret != 0)
1176
goto err;
1177
1178
OMAP_HSMMC_WRITE(host->base, HCTL,
1179
OMAP_HSMMC_READ(host->base, HCTL) & SDVSCLR);
1180
reg_val = OMAP_HSMMC_READ(host->base, HCTL);
1181
1182
/*
1183
* If a MMC dual voltage card is detected, the set_ios fn calls
1184
* this fn with VDD bit set for 1.8V. Upon card removal from the
1185
* slot, omap_hsmmc_set_ios sets the VDD back to 3V on MMC_POWER_OFF.
1186
*
1187
* Cope with a bit of slop in the range ... per data sheets:
1188
* - "1.8V" for vdds_mmc1/vdds_mmc1a can be up to 2.45V max,
1189
* but recommended values are 1.71V to 1.89V
1190
* - "3.0V" for vdds_mmc1/vdds_mmc1a can be up to 3.5V max,
1191
* but recommended values are 2.7V to 3.3V
1192
*
1193
* Board setup code shouldn't permit anything very out-of-range.
1194
* TWL4030-family VMMC1 and VSIM regulators are fine (avoiding the
1195
* middle range) but VSIM can't power DAT4..DAT7 at more than 3V.
1196
*/
1197
if ((1 << vdd) <= MMC_VDD_23_24)
1198
reg_val |= SDVS18;
1199
else
1200
reg_val |= SDVS30;
1201
1202
OMAP_HSMMC_WRITE(host->base, HCTL, reg_val);
1203
set_sd_bus_power(host);
1204
1205
return 0;
1206
err:
1207
dev_dbg(mmc_dev(host->mmc), "Unable to switch operating voltage\n");
1208
return ret;
1209
}
1210
1211
/* Protect the card while the cover is open */
1212
static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
1213
{
1214
if (!mmc_slot(host).get_cover_state)
1215
return;
1216
1217
host->reqs_blocked = 0;
1218
if (mmc_slot(host).get_cover_state(host->dev, host->slot_id)) {
1219
if (host->protect_card) {
1220
printk(KERN_INFO "%s: cover is closed, "
1221
"card is now accessible\n",
1222
mmc_hostname(host->mmc));
1223
host->protect_card = 0;
1224
}
1225
} else {
1226
if (!host->protect_card) {
1227
printk(KERN_INFO "%s: cover is open, "
1228
"card is now inaccessible\n",
1229
mmc_hostname(host->mmc));
1230
host->protect_card = 1;
1231
}
1232
}
1233
}
1234
1235
/*
1236
* Work Item to notify the core about card insertion/removal
1237
*/
1238
static void omap_hsmmc_detect(struct work_struct *work)
1239
{
1240
struct omap_hsmmc_host *host =
1241
container_of(work, struct omap_hsmmc_host, mmc_carddetect_work);
1242
struct omap_mmc_slot_data *slot = &mmc_slot(host);
1243
int carddetect;
1244
1245
if (host->suspended)
1246
return;
1247
1248
sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
1249
1250
if (slot->card_detect)
1251
carddetect = slot->card_detect(host->dev, host->slot_id);
1252
else {
1253
omap_hsmmc_protect_card(host);
1254
carddetect = -ENOSYS;
1255
}
1256
1257
if (carddetect)
1258
mmc_detect_change(host->mmc, (HZ * 200) / 1000);
1259
else
1260
mmc_detect_change(host->mmc, (HZ * 50) / 1000);
1261
}
1262
1263
/*
1264
* ISR for handling card insertion and removal
1265
*/
1266
static irqreturn_t omap_hsmmc_cd_handler(int irq, void *dev_id)
1267
{
1268
struct omap_hsmmc_host *host = (struct omap_hsmmc_host *)dev_id;
1269
1270
if (host->suspended)
1271
return IRQ_HANDLED;
1272
schedule_work(&host->mmc_carddetect_work);
1273
1274
return IRQ_HANDLED;
1275
}
1276
1277
static int omap_hsmmc_get_dma_sync_dev(struct omap_hsmmc_host *host,
1278
struct mmc_data *data)
1279
{
1280
int sync_dev;
1281
1282
if (data->flags & MMC_DATA_WRITE)
1283
sync_dev = host->dma_line_tx;
1284
else
1285
sync_dev = host->dma_line_rx;
1286
return sync_dev;
1287
}
1288
1289
static void omap_hsmmc_config_dma_params(struct omap_hsmmc_host *host,
1290
struct mmc_data *data,
1291
struct scatterlist *sgl)
1292
{
1293
int blksz, nblk, dma_ch;
1294
1295
dma_ch = host->dma_ch;
1296
if (data->flags & MMC_DATA_WRITE) {
1297
omap_set_dma_dest_params(dma_ch, 0, OMAP_DMA_AMODE_CONSTANT,
1298
(host->mapbase + OMAP_HSMMC_DATA), 0, 0);
1299
omap_set_dma_src_params(dma_ch, 0, OMAP_DMA_AMODE_POST_INC,
1300
sg_dma_address(sgl), 0, 0);
1301
} else {
1302
omap_set_dma_src_params(dma_ch, 0, OMAP_DMA_AMODE_CONSTANT,
1303
(host->mapbase + OMAP_HSMMC_DATA), 0, 0);
1304
omap_set_dma_dest_params(dma_ch, 0, OMAP_DMA_AMODE_POST_INC,
1305
sg_dma_address(sgl), 0, 0);
1306
}
1307
1308
blksz = host->data->blksz;
1309
nblk = sg_dma_len(sgl) / blksz;
1310
1311
omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S32,
1312
blksz / 4, nblk, OMAP_DMA_SYNC_FRAME,
1313
omap_hsmmc_get_dma_sync_dev(host, data),
1314
!(data->flags & MMC_DATA_WRITE));
1315
1316
omap_start_dma(dma_ch);
1317
}
1318
1319
/*
1320
* DMA call back function
1321
*/
1322
static void omap_hsmmc_dma_cb(int lch, u16 ch_status, void *cb_data)
1323
{
1324
struct omap_hsmmc_host *host = cb_data;
1325
struct mmc_data *data = host->mrq->data;
1326
int dma_ch, req_in_progress;
1327
1328
if (!(ch_status & OMAP_DMA_BLOCK_IRQ)) {
1329
dev_warn(mmc_dev(host->mmc), "unexpected dma status %x\n",
1330
ch_status);
1331
return;
1332
}
1333
1334
spin_lock(&host->irq_lock);
1335
if (host->dma_ch < 0) {
1336
spin_unlock(&host->irq_lock);
1337
return;
1338
}
1339
1340
host->dma_sg_idx++;
1341
if (host->dma_sg_idx < host->dma_len) {
1342
/* Fire up the next transfer. */
1343
omap_hsmmc_config_dma_params(host, data,
1344
data->sg + host->dma_sg_idx);
1345
spin_unlock(&host->irq_lock);
1346
return;
1347
}
1348
1349
dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
1350
omap_hsmmc_get_dma_dir(host, data));
1351
1352
req_in_progress = host->req_in_progress;
1353
dma_ch = host->dma_ch;
1354
host->dma_ch = -1;
1355
spin_unlock(&host->irq_lock);
1356
1357
omap_free_dma(dma_ch);
1358
1359
/* If DMA has finished after TC, complete the request */
1360
if (!req_in_progress) {
1361
struct mmc_request *mrq = host->mrq;
1362
1363
host->mrq = NULL;
1364
mmc_request_done(host->mmc, mrq);
1365
}
1366
}
1367
1368
/*
1369
* Routine to configure and start DMA for the MMC card
1370
*/
1371
static int omap_hsmmc_start_dma_transfer(struct omap_hsmmc_host *host,
1372
struct mmc_request *req)
1373
{
1374
int dma_ch = 0, ret = 0, i;
1375
struct mmc_data *data = req->data;
1376
1377
/* Sanity check: all the SG entries must be aligned by block size. */
1378
for (i = 0; i < data->sg_len; i++) {
1379
struct scatterlist *sgl;
1380
1381
sgl = data->sg + i;
1382
if (sgl->length % data->blksz)
1383
return -EINVAL;
1384
}
1385
if ((data->blksz % 4) != 0)
1386
/* REVISIT: The MMC buffer increments only when MSB is written.
1387
* Return error for blksz which is non multiple of four.
1388
*/
1389
return -EINVAL;
1390
1391
BUG_ON(host->dma_ch != -1);
1392
1393
ret = omap_request_dma(omap_hsmmc_get_dma_sync_dev(host, data),
1394
"MMC/SD", omap_hsmmc_dma_cb, host, &dma_ch);
1395
if (ret != 0) {
1396
dev_err(mmc_dev(host->mmc),
1397
"%s: omap_request_dma() failed with %d\n",
1398
mmc_hostname(host->mmc), ret);
1399
return ret;
1400
}
1401
1402
host->dma_len = dma_map_sg(mmc_dev(host->mmc), data->sg,
1403
data->sg_len, omap_hsmmc_get_dma_dir(host, data));
1404
host->dma_ch = dma_ch;
1405
host->dma_sg_idx = 0;
1406
1407
omap_hsmmc_config_dma_params(host, data, data->sg);
1408
1409
return 0;
1410
}
1411
1412
static void set_data_timeout(struct omap_hsmmc_host *host,
1413
unsigned int timeout_ns,
1414
unsigned int timeout_clks)
1415
{
1416
unsigned int timeout, cycle_ns;
1417
uint32_t reg, clkd, dto = 0;
1418
1419
reg = OMAP_HSMMC_READ(host->base, SYSCTL);
1420
clkd = (reg & CLKD_MASK) >> CLKD_SHIFT;
1421
if (clkd == 0)
1422
clkd = 1;
1423
1424
cycle_ns = 1000000000 / (clk_get_rate(host->fclk) / clkd);
1425
timeout = timeout_ns / cycle_ns;
1426
timeout += timeout_clks;
1427
if (timeout) {
1428
while ((timeout & 0x80000000) == 0) {
1429
dto += 1;
1430
timeout <<= 1;
1431
}
1432
dto = 31 - dto;
1433
timeout <<= 1;
1434
if (timeout && dto)
1435
dto += 1;
1436
if (dto >= 13)
1437
dto -= 13;
1438
else
1439
dto = 0;
1440
if (dto > 14)
1441
dto = 14;
1442
}
1443
1444
reg &= ~DTO_MASK;
1445
reg |= dto << DTO_SHIFT;
1446
OMAP_HSMMC_WRITE(host->base, SYSCTL, reg);
1447
}
1448
1449
/*
1450
* Configure block length for MMC/SD cards and initiate the transfer.
1451
*/
1452
static int
1453
omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req)
1454
{
1455
int ret;
1456
host->data = req->data;
1457
1458
if (req->data == NULL) {
1459
OMAP_HSMMC_WRITE(host->base, BLK, 0);
1460
/*
1461
* Set an arbitrary 100ms data timeout for commands with
1462
* busy signal.
1463
*/
1464
if (req->cmd->flags & MMC_RSP_BUSY)
1465
set_data_timeout(host, 100000000U, 0);
1466
return 0;
1467
}
1468
1469
OMAP_HSMMC_WRITE(host->base, BLK, (req->data->blksz)
1470
| (req->data->blocks << 16));
1471
set_data_timeout(host, req->data->timeout_ns, req->data->timeout_clks);
1472
1473
if (host->use_dma) {
1474
ret = omap_hsmmc_start_dma_transfer(host, req);
1475
if (ret != 0) {
1476
dev_dbg(mmc_dev(host->mmc), "MMC start dma failure\n");
1477
return ret;
1478
}
1479
}
1480
return 0;
1481
}
1482
1483
/*
1484
* Request function. for read/write operation
1485
*/
1486
static void omap_hsmmc_request(struct mmc_host *mmc, struct mmc_request *req)
1487
{
1488
struct omap_hsmmc_host *host = mmc_priv(mmc);
1489
int err;
1490
1491
BUG_ON(host->req_in_progress);
1492
BUG_ON(host->dma_ch != -1);
1493
if (host->protect_card) {
1494
if (host->reqs_blocked < 3) {
1495
/*
1496
* Ensure the controller is left in a consistent
1497
* state by resetting the command and data state
1498
* machines.
1499
*/
1500
omap_hsmmc_reset_controller_fsm(host, SRD);
1501
omap_hsmmc_reset_controller_fsm(host, SRC);
1502
host->reqs_blocked += 1;
1503
}
1504
req->cmd->error = -EBADF;
1505
if (req->data)
1506
req->data->error = -EBADF;
1507
req->cmd->retries = 0;
1508
mmc_request_done(mmc, req);
1509
return;
1510
} else if (host->reqs_blocked)
1511
host->reqs_blocked = 0;
1512
WARN_ON(host->mrq != NULL);
1513
host->mrq = req;
1514
err = omap_hsmmc_prepare_data(host, req);
1515
if (err) {
1516
req->cmd->error = err;
1517
if (req->data)
1518
req->data->error = err;
1519
host->mrq = NULL;
1520
mmc_request_done(mmc, req);
1521
return;
1522
}
1523
1524
omap_hsmmc_start_command(host, req->cmd, req->data);
1525
}
1526
1527
/* Routine to configure clock values. Exposed API to core */
1528
static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
1529
{
1530
struct omap_hsmmc_host *host = mmc_priv(mmc);
1531
u16 dsor = 0;
1532
unsigned long regval;
1533
unsigned long timeout;
1534
u32 con;
1535
int do_send_init_stream = 0;
1536
1537
mmc_host_enable(host->mmc);
1538
1539
if (ios->power_mode != host->power_mode) {
1540
switch (ios->power_mode) {
1541
case MMC_POWER_OFF:
1542
mmc_slot(host).set_power(host->dev, host->slot_id,
1543
0, 0);
1544
host->vdd = 0;
1545
break;
1546
case MMC_POWER_UP:
1547
mmc_slot(host).set_power(host->dev, host->slot_id,
1548
1, ios->vdd);
1549
host->vdd = ios->vdd;
1550
break;
1551
case MMC_POWER_ON:
1552
do_send_init_stream = 1;
1553
break;
1554
}
1555
host->power_mode = ios->power_mode;
1556
}
1557
1558
/* FIXME: set registers based only on changes to ios */
1559
1560
con = OMAP_HSMMC_READ(host->base, CON);
1561
switch (mmc->ios.bus_width) {
1562
case MMC_BUS_WIDTH_8:
1563
OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
1564
break;
1565
case MMC_BUS_WIDTH_4:
1566
OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
1567
OMAP_HSMMC_WRITE(host->base, HCTL,
1568
OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT);
1569
break;
1570
case MMC_BUS_WIDTH_1:
1571
OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8);
1572
OMAP_HSMMC_WRITE(host->base, HCTL,
1573
OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT);
1574
break;
1575
}
1576
1577
if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
1578
/* Only MMC1 can interface at 3V without some flavor
1579
* of external transceiver; but they all handle 1.8V.
1580
*/
1581
if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) &&
1582
(ios->vdd == DUAL_VOLT_OCR_BIT)) {
1583
/*
1584
* The mmc_select_voltage fn of the core does
1585
* not seem to set the power_mode to
1586
* MMC_POWER_UP upon recalculating the voltage.
1587
* vdd 1.8v.
1588
*/
1589
if (omap_hsmmc_switch_opcond(host, ios->vdd) != 0)
1590
dev_dbg(mmc_dev(host->mmc),
1591
"Switch operation failed\n");
1592
}
1593
}
1594
1595
if (ios->clock) {
1596
dsor = OMAP_MMC_MASTER_CLOCK / ios->clock;
1597
if (dsor < 1)
1598
dsor = 1;
1599
1600
if (OMAP_MMC_MASTER_CLOCK / dsor > ios->clock)
1601
dsor++;
1602
1603
if (dsor > 250)
1604
dsor = 250;
1605
}
1606
omap_hsmmc_stop_clock(host);
1607
regval = OMAP_HSMMC_READ(host->base, SYSCTL);
1608
regval = regval & ~(CLKD_MASK);
1609
regval = regval | (dsor << 6) | (DTO << 16);
1610
OMAP_HSMMC_WRITE(host->base, SYSCTL, regval);
1611
OMAP_HSMMC_WRITE(host->base, SYSCTL,
1612
OMAP_HSMMC_READ(host->base, SYSCTL) | ICE);
1613
1614
/* Wait till the ICS bit is set */
1615
timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
1616
while ((OMAP_HSMMC_READ(host->base, SYSCTL) & ICS) != ICS
1617
&& time_before(jiffies, timeout))
1618
msleep(1);
1619
1620
OMAP_HSMMC_WRITE(host->base, SYSCTL,
1621
OMAP_HSMMC_READ(host->base, SYSCTL) | CEN);
1622
1623
if (do_send_init_stream)
1624
send_init_stream(host);
1625
1626
con = OMAP_HSMMC_READ(host->base, CON);
1627
if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
1628
OMAP_HSMMC_WRITE(host->base, CON, con | OD);
1629
else
1630
OMAP_HSMMC_WRITE(host->base, CON, con & ~OD);
1631
1632
if (host->power_mode == MMC_POWER_OFF)
1633
mmc_host_disable(host->mmc);
1634
else
1635
mmc_host_lazy_disable(host->mmc);
1636
}
1637
1638
static int omap_hsmmc_get_cd(struct mmc_host *mmc)
1639
{
1640
struct omap_hsmmc_host *host = mmc_priv(mmc);
1641
1642
if (!mmc_slot(host).card_detect)
1643
return -ENOSYS;
1644
return mmc_slot(host).card_detect(host->dev, host->slot_id);
1645
}
1646
1647
static int omap_hsmmc_get_ro(struct mmc_host *mmc)
1648
{
1649
struct omap_hsmmc_host *host = mmc_priv(mmc);
1650
1651
if (!mmc_slot(host).get_ro)
1652
return -ENOSYS;
1653
return mmc_slot(host).get_ro(host->dev, 0);
1654
}
1655
1656
static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
1657
{
1658
struct omap_hsmmc_host *host = mmc_priv(mmc);
1659
1660
if (mmc_slot(host).init_card)
1661
mmc_slot(host).init_card(card);
1662
}
1663
1664
static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host)
1665
{
1666
u32 hctl, capa, value;
1667
1668
/* Only MMC1 supports 3.0V */
1669
if (host->pdata->controller_flags & OMAP_HSMMC_SUPPORTS_DUAL_VOLT) {
1670
hctl = SDVS30;
1671
capa = VS30 | VS18;
1672
} else {
1673
hctl = SDVS18;
1674
capa = VS18;
1675
}
1676
1677
value = OMAP_HSMMC_READ(host->base, HCTL) & ~SDVS_MASK;
1678
OMAP_HSMMC_WRITE(host->base, HCTL, value | hctl);
1679
1680
value = OMAP_HSMMC_READ(host->base, CAPA);
1681
OMAP_HSMMC_WRITE(host->base, CAPA, value | capa);
1682
1683
/* Set the controller to AUTO IDLE mode */
1684
value = OMAP_HSMMC_READ(host->base, SYSCONFIG);
1685
OMAP_HSMMC_WRITE(host->base, SYSCONFIG, value | AUTOIDLE);
1686
1687
/* Set SD bus power bit */
1688
set_sd_bus_power(host);
1689
}
1690
1691
/*
1692
* Dynamic power saving handling, FSM:
1693
* ENABLED -> DISABLED -> CARDSLEEP / REGSLEEP -> OFF
1694
* ^___________| | |
1695
* |______________________|______________________|
1696
*
1697
* ENABLED: mmc host is fully functional
1698
* DISABLED: fclk is off
1699
* CARDSLEEP: fclk is off, card is asleep, voltage regulator is asleep
1700
* REGSLEEP: fclk is off, voltage regulator is asleep
1701
* OFF: fclk is off, voltage regulator is off
1702
*
1703
* Transition handlers return the timeout for the next state transition
1704
* or negative error.
1705
*/
1706
1707
enum {ENABLED = 0, DISABLED, CARDSLEEP, REGSLEEP, OFF};
1708
1709
/* Handler for [ENABLED -> DISABLED] transition */
1710
static int omap_hsmmc_enabled_to_disabled(struct omap_hsmmc_host *host)
1711
{
1712
omap_hsmmc_context_save(host);
1713
clk_disable(host->fclk);
1714
host->dpm_state = DISABLED;
1715
1716
dev_dbg(mmc_dev(host->mmc), "ENABLED -> DISABLED\n");
1717
1718
if (host->power_mode == MMC_POWER_OFF)
1719
return 0;
1720
1721
return OMAP_MMC_SLEEP_TIMEOUT;
1722
}
1723
1724
/* Handler for [DISABLED -> REGSLEEP / CARDSLEEP] transition */
1725
static int omap_hsmmc_disabled_to_sleep(struct omap_hsmmc_host *host)
1726
{
1727
int err, new_state;
1728
1729
if (!mmc_try_claim_host(host->mmc))
1730
return 0;
1731
1732
clk_enable(host->fclk);
1733
omap_hsmmc_context_restore(host);
1734
if (mmc_card_can_sleep(host->mmc)) {
1735
err = mmc_card_sleep(host->mmc);
1736
if (err < 0) {
1737
clk_disable(host->fclk);
1738
mmc_release_host(host->mmc);
1739
return err;
1740
}
1741
new_state = CARDSLEEP;
1742
} else {
1743
new_state = REGSLEEP;
1744
}
1745
if (mmc_slot(host).set_sleep)
1746
mmc_slot(host).set_sleep(host->dev, host->slot_id, 1, 0,
1747
new_state == CARDSLEEP);
1748
/* FIXME: turn off bus power and perhaps interrupts too */
1749
clk_disable(host->fclk);
1750
host->dpm_state = new_state;
1751
1752
mmc_release_host(host->mmc);
1753
1754
dev_dbg(mmc_dev(host->mmc), "DISABLED -> %s\n",
1755
host->dpm_state == CARDSLEEP ? "CARDSLEEP" : "REGSLEEP");
1756
1757
if (mmc_slot(host).no_off)
1758
return 0;
1759
1760
if ((host->mmc->caps & MMC_CAP_NONREMOVABLE) ||
1761
mmc_slot(host).card_detect ||
1762
(mmc_slot(host).get_cover_state &&
1763
mmc_slot(host).get_cover_state(host->dev, host->slot_id)))
1764
return OMAP_MMC_OFF_TIMEOUT;
1765
1766
return 0;
1767
}
1768
1769
/* Handler for [REGSLEEP / CARDSLEEP -> OFF] transition */
1770
static int omap_hsmmc_sleep_to_off(struct omap_hsmmc_host *host)
1771
{
1772
if (!mmc_try_claim_host(host->mmc))
1773
return 0;
1774
1775
if (mmc_slot(host).no_off)
1776
return 0;
1777
1778
if (!((host->mmc->caps & MMC_CAP_NONREMOVABLE) ||
1779
mmc_slot(host).card_detect ||
1780
(mmc_slot(host).get_cover_state &&
1781
mmc_slot(host).get_cover_state(host->dev, host->slot_id)))) {
1782
mmc_release_host(host->mmc);
1783
return 0;
1784
}
1785
1786
mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
1787
host->vdd = 0;
1788
host->power_mode = MMC_POWER_OFF;
1789
1790
dev_dbg(mmc_dev(host->mmc), "%s -> OFF\n",
1791
host->dpm_state == CARDSLEEP ? "CARDSLEEP" : "REGSLEEP");
1792
1793
host->dpm_state = OFF;
1794
1795
mmc_release_host(host->mmc);
1796
1797
return 0;
1798
}
1799
1800
/* Handler for [DISABLED -> ENABLED] transition */
1801
static int omap_hsmmc_disabled_to_enabled(struct omap_hsmmc_host *host)
1802
{
1803
int err;
1804
1805
err = clk_enable(host->fclk);
1806
if (err < 0)
1807
return err;
1808
1809
omap_hsmmc_context_restore(host);
1810
host->dpm_state = ENABLED;
1811
1812
dev_dbg(mmc_dev(host->mmc), "DISABLED -> ENABLED\n");
1813
1814
return 0;
1815
}
1816
1817
/* Handler for [SLEEP -> ENABLED] transition */
1818
static int omap_hsmmc_sleep_to_enabled(struct omap_hsmmc_host *host)
1819
{
1820
if (!mmc_try_claim_host(host->mmc))
1821
return 0;
1822
1823
clk_enable(host->fclk);
1824
omap_hsmmc_context_restore(host);
1825
if (mmc_slot(host).set_sleep)
1826
mmc_slot(host).set_sleep(host->dev, host->slot_id, 0,
1827
host->vdd, host->dpm_state == CARDSLEEP);
1828
if (mmc_card_can_sleep(host->mmc))
1829
mmc_card_awake(host->mmc);
1830
1831
dev_dbg(mmc_dev(host->mmc), "%s -> ENABLED\n",
1832
host->dpm_state == CARDSLEEP ? "CARDSLEEP" : "REGSLEEP");
1833
1834
host->dpm_state = ENABLED;
1835
1836
mmc_release_host(host->mmc);
1837
1838
return 0;
1839
}
1840
1841
/* Handler for [OFF -> ENABLED] transition */
1842
static int omap_hsmmc_off_to_enabled(struct omap_hsmmc_host *host)
1843
{
1844
clk_enable(host->fclk);
1845
1846
omap_hsmmc_context_restore(host);
1847
omap_hsmmc_conf_bus_power(host);
1848
mmc_power_restore_host(host->mmc);
1849
1850
host->dpm_state = ENABLED;
1851
1852
dev_dbg(mmc_dev(host->mmc), "OFF -> ENABLED\n");
1853
1854
return 0;
1855
}
1856
1857
/*
1858
* Bring MMC host to ENABLED from any other PM state.
1859
*/
1860
static int omap_hsmmc_enable(struct mmc_host *mmc)
1861
{
1862
struct omap_hsmmc_host *host = mmc_priv(mmc);
1863
1864
switch (host->dpm_state) {
1865
case DISABLED:
1866
return omap_hsmmc_disabled_to_enabled(host);
1867
case CARDSLEEP:
1868
case REGSLEEP:
1869
return omap_hsmmc_sleep_to_enabled(host);
1870
case OFF:
1871
return omap_hsmmc_off_to_enabled(host);
1872
default:
1873
dev_dbg(mmc_dev(host->mmc), "UNKNOWN state\n");
1874
return -EINVAL;
1875
}
1876
}
1877
1878
/*
1879
* Bring MMC host in PM state (one level deeper).
1880
*/
1881
static int omap_hsmmc_disable(struct mmc_host *mmc, int lazy)
1882
{
1883
struct omap_hsmmc_host *host = mmc_priv(mmc);
1884
1885
switch (host->dpm_state) {
1886
case ENABLED: {
1887
int delay;
1888
1889
delay = omap_hsmmc_enabled_to_disabled(host);
1890
if (lazy || delay < 0)
1891
return delay;
1892
return 0;
1893
}
1894
case DISABLED:
1895
return omap_hsmmc_disabled_to_sleep(host);
1896
case CARDSLEEP:
1897
case REGSLEEP:
1898
return omap_hsmmc_sleep_to_off(host);
1899
default:
1900
dev_dbg(mmc_dev(host->mmc), "UNKNOWN state\n");
1901
return -EINVAL;
1902
}
1903
}
1904
1905
static int omap_hsmmc_enable_fclk(struct mmc_host *mmc)
1906
{
1907
struct omap_hsmmc_host *host = mmc_priv(mmc);
1908
int err;
1909
1910
err = clk_enable(host->fclk);
1911
if (err)
1912
return err;
1913
dev_dbg(mmc_dev(host->mmc), "mmc_fclk: enabled\n");
1914
omap_hsmmc_context_restore(host);
1915
return 0;
1916
}
1917
1918
static int omap_hsmmc_disable_fclk(struct mmc_host *mmc, int lazy)
1919
{
1920
struct omap_hsmmc_host *host = mmc_priv(mmc);
1921
1922
omap_hsmmc_context_save(host);
1923
clk_disable(host->fclk);
1924
dev_dbg(mmc_dev(host->mmc), "mmc_fclk: disabled\n");
1925
return 0;
1926
}
1927
1928
static const struct mmc_host_ops omap_hsmmc_ops = {
1929
.enable = omap_hsmmc_enable_fclk,
1930
.disable = omap_hsmmc_disable_fclk,
1931
.request = omap_hsmmc_request,
1932
.set_ios = omap_hsmmc_set_ios,
1933
.get_cd = omap_hsmmc_get_cd,
1934
.get_ro = omap_hsmmc_get_ro,
1935
.init_card = omap_hsmmc_init_card,
1936
/* NYET -- enable_sdio_irq */
1937
};
1938
1939
static const struct mmc_host_ops omap_hsmmc_ps_ops = {
1940
.enable = omap_hsmmc_enable,
1941
.disable = omap_hsmmc_disable,
1942
.request = omap_hsmmc_request,
1943
.set_ios = omap_hsmmc_set_ios,
1944
.get_cd = omap_hsmmc_get_cd,
1945
.get_ro = omap_hsmmc_get_ro,
1946
.init_card = omap_hsmmc_init_card,
1947
/* NYET -- enable_sdio_irq */
1948
};
1949
1950
#ifdef CONFIG_DEBUG_FS
1951
1952
static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
1953
{
1954
struct mmc_host *mmc = s->private;
1955
struct omap_hsmmc_host *host = mmc_priv(mmc);
1956
int context_loss = 0;
1957
1958
if (host->pdata->get_context_loss_count)
1959
context_loss = host->pdata->get_context_loss_count(host->dev);
1960
1961
seq_printf(s, "mmc%d:\n"
1962
" enabled:\t%d\n"
1963
" dpm_state:\t%d\n"
1964
" nesting_cnt:\t%d\n"
1965
" ctx_loss:\t%d:%d\n"
1966
"\nregs:\n",
1967
mmc->index, mmc->enabled ? 1 : 0,
1968
host->dpm_state, mmc->nesting_cnt,
1969
host->context_loss, context_loss);
1970
1971
if (host->suspended || host->dpm_state == OFF) {
1972
seq_printf(s, "host suspended, can't read registers\n");
1973
return 0;
1974
}
1975
1976
if (clk_enable(host->fclk) != 0) {
1977
seq_printf(s, "can't read the regs\n");
1978
return 0;
1979
}
1980
1981
seq_printf(s, "SYSCONFIG:\t0x%08x\n",
1982
OMAP_HSMMC_READ(host->base, SYSCONFIG));
1983
seq_printf(s, "CON:\t\t0x%08x\n",
1984
OMAP_HSMMC_READ(host->base, CON));
1985
seq_printf(s, "HCTL:\t\t0x%08x\n",
1986
OMAP_HSMMC_READ(host->base, HCTL));
1987
seq_printf(s, "SYSCTL:\t\t0x%08x\n",
1988
OMAP_HSMMC_READ(host->base, SYSCTL));
1989
seq_printf(s, "IE:\t\t0x%08x\n",
1990
OMAP_HSMMC_READ(host->base, IE));
1991
seq_printf(s, "ISE:\t\t0x%08x\n",
1992
OMAP_HSMMC_READ(host->base, ISE));
1993
seq_printf(s, "CAPA:\t\t0x%08x\n",
1994
OMAP_HSMMC_READ(host->base, CAPA));
1995
1996
clk_disable(host->fclk);
1997
1998
return 0;
1999
}
2000
2001
static int omap_hsmmc_regs_open(struct inode *inode, struct file *file)
2002
{
2003
return single_open(file, omap_hsmmc_regs_show, inode->i_private);
2004
}
2005
2006
static const struct file_operations mmc_regs_fops = {
2007
.open = omap_hsmmc_regs_open,
2008
.read = seq_read,
2009
.llseek = seq_lseek,
2010
.release = single_release,
2011
};
2012
2013
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
2014
{
2015
if (mmc->debugfs_root)
2016
debugfs_create_file("regs", S_IRUSR, mmc->debugfs_root,
2017
mmc, &mmc_regs_fops);
2018
}
2019
2020
#else
2021
2022
static void omap_hsmmc_debugfs(struct mmc_host *mmc)
2023
{
2024
}
2025
2026
#endif
2027
2028
static int __init omap_hsmmc_probe(struct platform_device *pdev)
2029
{
2030
struct omap_mmc_platform_data *pdata = pdev->dev.platform_data;
2031
struct mmc_host *mmc;
2032
struct omap_hsmmc_host *host = NULL;
2033
struct resource *res;
2034
int ret, irq;
2035
2036
if (pdata == NULL) {
2037
dev_err(&pdev->dev, "Platform Data is missing\n");
2038
return -ENXIO;
2039
}
2040
2041
if (pdata->nr_slots == 0) {
2042
dev_err(&pdev->dev, "No Slots\n");
2043
return -ENXIO;
2044
}
2045
2046
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2047
irq = platform_get_irq(pdev, 0);
2048
if (res == NULL || irq < 0)
2049
return -ENXIO;
2050
2051
res->start += pdata->reg_offset;
2052
res->end += pdata->reg_offset;
2053
res = request_mem_region(res->start, resource_size(res), pdev->name);
2054
if (res == NULL)
2055
return -EBUSY;
2056
2057
ret = omap_hsmmc_gpio_init(pdata);
2058
if (ret)
2059
goto err;
2060
2061
mmc = mmc_alloc_host(sizeof(struct omap_hsmmc_host), &pdev->dev);
2062
if (!mmc) {
2063
ret = -ENOMEM;
2064
goto err_alloc;
2065
}
2066
2067
host = mmc_priv(mmc);
2068
host->mmc = mmc;
2069
host->pdata = pdata;
2070
host->dev = &pdev->dev;
2071
host->use_dma = 1;
2072
host->dev->dma_mask = &pdata->dma_mask;
2073
host->dma_ch = -1;
2074
host->irq = irq;
2075
host->id = pdev->id;
2076
host->slot_id = 0;
2077
host->mapbase = res->start;
2078
host->base = ioremap(host->mapbase, SZ_4K);
2079
host->power_mode = MMC_POWER_OFF;
2080
2081
platform_set_drvdata(pdev, host);
2082
INIT_WORK(&host->mmc_carddetect_work, omap_hsmmc_detect);
2083
2084
if (mmc_slot(host).power_saving)
2085
mmc->ops = &omap_hsmmc_ps_ops;
2086
else
2087
mmc->ops = &omap_hsmmc_ops;
2088
2089
/*
2090
* If regulator_disable can only put vcc_aux to sleep then there is
2091
* no off state.
2092
*/
2093
if (mmc_slot(host).vcc_aux_disable_is_sleep)
2094
mmc_slot(host).no_off = 1;
2095
2096
mmc->f_min = 400000;
2097
mmc->f_max = 52000000;
2098
2099
spin_lock_init(&host->irq_lock);
2100
2101
host->iclk = clk_get(&pdev->dev, "ick");
2102
if (IS_ERR(host->iclk)) {
2103
ret = PTR_ERR(host->iclk);
2104
host->iclk = NULL;
2105
goto err1;
2106
}
2107
host->fclk = clk_get(&pdev->dev, "fck");
2108
if (IS_ERR(host->fclk)) {
2109
ret = PTR_ERR(host->fclk);
2110
host->fclk = NULL;
2111
clk_put(host->iclk);
2112
goto err1;
2113
}
2114
2115
omap_hsmmc_context_save(host);
2116
2117
mmc->caps |= MMC_CAP_DISABLE;
2118
mmc_set_disable_delay(mmc, OMAP_MMC_DISABLED_TIMEOUT);
2119
/* we start off in DISABLED state */
2120
host->dpm_state = DISABLED;
2121
2122
if (clk_enable(host->iclk) != 0) {
2123
clk_put(host->iclk);
2124
clk_put(host->fclk);
2125
goto err1;
2126
}
2127
2128
if (mmc_host_enable(host->mmc) != 0) {
2129
clk_disable(host->iclk);
2130
clk_put(host->iclk);
2131
clk_put(host->fclk);
2132
goto err1;
2133
}
2134
2135
if (cpu_is_omap2430()) {
2136
host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck");
2137
/*
2138
* MMC can still work without debounce clock.
2139
*/
2140
if (IS_ERR(host->dbclk))
2141
dev_warn(mmc_dev(host->mmc),
2142
"Failed to get debounce clock\n");
2143
else
2144
host->got_dbclk = 1;
2145
2146
if (host->got_dbclk)
2147
if (clk_enable(host->dbclk) != 0)
2148
dev_dbg(mmc_dev(host->mmc), "Enabling debounce"
2149
" clk failed\n");
2150
}
2151
2152
/* Since we do only SG emulation, we can have as many segs
2153
* as we want. */
2154
mmc->max_segs = 1024;
2155
2156
mmc->max_blk_size = 512; /* Block Length at max can be 1024 */
2157
mmc->max_blk_count = 0xFFFF; /* No. of Blocks is 16 bits */
2158
mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
2159
mmc->max_seg_size = mmc->max_req_size;
2160
2161
mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
2162
MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
2163
2164
mmc->caps |= mmc_slot(host).caps;
2165
if (mmc->caps & MMC_CAP_8_BIT_DATA)
2166
mmc->caps |= MMC_CAP_4_BIT_DATA;
2167
2168
if (mmc_slot(host).nonremovable)
2169
mmc->caps |= MMC_CAP_NONREMOVABLE;
2170
2171
omap_hsmmc_conf_bus_power(host);
2172
2173
/* Select DMA lines */
2174
switch (host->id) {
2175
case OMAP_MMC1_DEVID:
2176
host->dma_line_tx = OMAP24XX_DMA_MMC1_TX;
2177
host->dma_line_rx = OMAP24XX_DMA_MMC1_RX;
2178
break;
2179
case OMAP_MMC2_DEVID:
2180
host->dma_line_tx = OMAP24XX_DMA_MMC2_TX;
2181
host->dma_line_rx = OMAP24XX_DMA_MMC2_RX;
2182
break;
2183
case OMAP_MMC3_DEVID:
2184
host->dma_line_tx = OMAP34XX_DMA_MMC3_TX;
2185
host->dma_line_rx = OMAP34XX_DMA_MMC3_RX;
2186
break;
2187
case OMAP_MMC4_DEVID:
2188
host->dma_line_tx = OMAP44XX_DMA_MMC4_TX;
2189
host->dma_line_rx = OMAP44XX_DMA_MMC4_RX;
2190
break;
2191
case OMAP_MMC5_DEVID:
2192
host->dma_line_tx = OMAP44XX_DMA_MMC5_TX;
2193
host->dma_line_rx = OMAP44XX_DMA_MMC5_RX;
2194
break;
2195
default:
2196
dev_err(mmc_dev(host->mmc), "Invalid MMC id\n");
2197
goto err_irq;
2198
}
2199
2200
/* Request IRQ for MMC operations */
2201
ret = request_irq(host->irq, omap_hsmmc_irq, IRQF_DISABLED,
2202
mmc_hostname(mmc), host);
2203
if (ret) {
2204
dev_dbg(mmc_dev(host->mmc), "Unable to grab HSMMC IRQ\n");
2205
goto err_irq;
2206
}
2207
2208
if (pdata->init != NULL) {
2209
if (pdata->init(&pdev->dev) != 0) {
2210
dev_dbg(mmc_dev(host->mmc),
2211
"Unable to configure MMC IRQs\n");
2212
goto err_irq_cd_init;
2213
}
2214
}
2215
2216
if (omap_hsmmc_have_reg() && !mmc_slot(host).set_power) {
2217
ret = omap_hsmmc_reg_get(host);
2218
if (ret)
2219
goto err_reg;
2220
host->use_reg = 1;
2221
}
2222
2223
mmc->ocr_avail = mmc_slot(host).ocr_mask;
2224
2225
/* Request IRQ for card detect */
2226
if ((mmc_slot(host).card_detect_irq)) {
2227
ret = request_irq(mmc_slot(host).card_detect_irq,
2228
omap_hsmmc_cd_handler,
2229
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
2230
| IRQF_DISABLED,
2231
mmc_hostname(mmc), host);
2232
if (ret) {
2233
dev_dbg(mmc_dev(host->mmc),
2234
"Unable to grab MMC CD IRQ\n");
2235
goto err_irq_cd;
2236
}
2237
pdata->suspend = omap_hsmmc_suspend_cdirq;
2238
pdata->resume = omap_hsmmc_resume_cdirq;
2239
}
2240
2241
omap_hsmmc_disable_irq(host);
2242
2243
mmc_host_lazy_disable(host->mmc);
2244
2245
omap_hsmmc_protect_card(host);
2246
2247
mmc_add_host(mmc);
2248
2249
if (mmc_slot(host).name != NULL) {
2250
ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name);
2251
if (ret < 0)
2252
goto err_slot_name;
2253
}
2254
if (mmc_slot(host).card_detect_irq && mmc_slot(host).get_cover_state) {
2255
ret = device_create_file(&mmc->class_dev,
2256
&dev_attr_cover_switch);
2257
if (ret < 0)
2258
goto err_slot_name;
2259
}
2260
2261
omap_hsmmc_debugfs(mmc);
2262
2263
return 0;
2264
2265
err_slot_name:
2266
mmc_remove_host(mmc);
2267
free_irq(mmc_slot(host).card_detect_irq, host);
2268
err_irq_cd:
2269
if (host->use_reg)
2270
omap_hsmmc_reg_put(host);
2271
err_reg:
2272
if (host->pdata->cleanup)
2273
host->pdata->cleanup(&pdev->dev);
2274
err_irq_cd_init:
2275
free_irq(host->irq, host);
2276
err_irq:
2277
mmc_host_disable(host->mmc);
2278
clk_disable(host->iclk);
2279
clk_put(host->fclk);
2280
clk_put(host->iclk);
2281
if (host->got_dbclk) {
2282
clk_disable(host->dbclk);
2283
clk_put(host->dbclk);
2284
}
2285
err1:
2286
iounmap(host->base);
2287
platform_set_drvdata(pdev, NULL);
2288
mmc_free_host(mmc);
2289
err_alloc:
2290
omap_hsmmc_gpio_free(pdata);
2291
err:
2292
release_mem_region(res->start, resource_size(res));
2293
return ret;
2294
}
2295
2296
static int omap_hsmmc_remove(struct platform_device *pdev)
2297
{
2298
struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2299
struct resource *res;
2300
2301
if (host) {
2302
mmc_host_enable(host->mmc);
2303
mmc_remove_host(host->mmc);
2304
if (host->use_reg)
2305
omap_hsmmc_reg_put(host);
2306
if (host->pdata->cleanup)
2307
host->pdata->cleanup(&pdev->dev);
2308
free_irq(host->irq, host);
2309
if (mmc_slot(host).card_detect_irq)
2310
free_irq(mmc_slot(host).card_detect_irq, host);
2311
flush_work_sync(&host->mmc_carddetect_work);
2312
2313
mmc_host_disable(host->mmc);
2314
clk_disable(host->iclk);
2315
clk_put(host->fclk);
2316
clk_put(host->iclk);
2317
if (host->got_dbclk) {
2318
clk_disable(host->dbclk);
2319
clk_put(host->dbclk);
2320
}
2321
2322
mmc_free_host(host->mmc);
2323
iounmap(host->base);
2324
omap_hsmmc_gpio_free(pdev->dev.platform_data);
2325
}
2326
2327
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2328
if (res)
2329
release_mem_region(res->start, resource_size(res));
2330
platform_set_drvdata(pdev, NULL);
2331
2332
return 0;
2333
}
2334
2335
#ifdef CONFIG_PM
2336
static int omap_hsmmc_suspend(struct device *dev)
2337
{
2338
int ret = 0;
2339
struct platform_device *pdev = to_platform_device(dev);
2340
struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2341
2342
if (host && host->suspended)
2343
return 0;
2344
2345
if (host) {
2346
host->suspended = 1;
2347
if (host->pdata->suspend) {
2348
ret = host->pdata->suspend(&pdev->dev,
2349
host->slot_id);
2350
if (ret) {
2351
dev_dbg(mmc_dev(host->mmc),
2352
"Unable to handle MMC board"
2353
" level suspend\n");
2354
host->suspended = 0;
2355
return ret;
2356
}
2357
}
2358
cancel_work_sync(&host->mmc_carddetect_work);
2359
ret = mmc_suspend_host(host->mmc);
2360
mmc_host_enable(host->mmc);
2361
if (ret == 0) {
2362
omap_hsmmc_disable_irq(host);
2363
OMAP_HSMMC_WRITE(host->base, HCTL,
2364
OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP);
2365
mmc_host_disable(host->mmc);
2366
clk_disable(host->iclk);
2367
if (host->got_dbclk)
2368
clk_disable(host->dbclk);
2369
} else {
2370
host->suspended = 0;
2371
if (host->pdata->resume) {
2372
ret = host->pdata->resume(&pdev->dev,
2373
host->slot_id);
2374
if (ret)
2375
dev_dbg(mmc_dev(host->mmc),
2376
"Unmask interrupt failed\n");
2377
}
2378
mmc_host_disable(host->mmc);
2379
}
2380
2381
}
2382
return ret;
2383
}
2384
2385
/* Routine to resume the MMC device */
2386
static int omap_hsmmc_resume(struct device *dev)
2387
{
2388
int ret = 0;
2389
struct platform_device *pdev = to_platform_device(dev);
2390
struct omap_hsmmc_host *host = platform_get_drvdata(pdev);
2391
2392
if (host && !host->suspended)
2393
return 0;
2394
2395
if (host) {
2396
ret = clk_enable(host->iclk);
2397
if (ret)
2398
goto clk_en_err;
2399
2400
if (mmc_host_enable(host->mmc) != 0) {
2401
clk_disable(host->iclk);
2402
goto clk_en_err;
2403
}
2404
2405
if (host->got_dbclk)
2406
clk_enable(host->dbclk);
2407
2408
omap_hsmmc_conf_bus_power(host);
2409
2410
if (host->pdata->resume) {
2411
ret = host->pdata->resume(&pdev->dev, host->slot_id);
2412
if (ret)
2413
dev_dbg(mmc_dev(host->mmc),
2414
"Unmask interrupt failed\n");
2415
}
2416
2417
omap_hsmmc_protect_card(host);
2418
2419
/* Notify the core to resume the host */
2420
ret = mmc_resume_host(host->mmc);
2421
if (ret == 0)
2422
host->suspended = 0;
2423
2424
mmc_host_lazy_disable(host->mmc);
2425
}
2426
2427
return ret;
2428
2429
clk_en_err:
2430
dev_dbg(mmc_dev(host->mmc),
2431
"Failed to enable MMC clocks during resume\n");
2432
return ret;
2433
}
2434
2435
#else
2436
#define omap_hsmmc_suspend NULL
2437
#define omap_hsmmc_resume NULL
2438
#endif
2439
2440
static struct dev_pm_ops omap_hsmmc_dev_pm_ops = {
2441
.suspend = omap_hsmmc_suspend,
2442
.resume = omap_hsmmc_resume,
2443
};
2444
2445
static struct platform_driver omap_hsmmc_driver = {
2446
.remove = omap_hsmmc_remove,
2447
.driver = {
2448
.name = DRIVER_NAME,
2449
.owner = THIS_MODULE,
2450
.pm = &omap_hsmmc_dev_pm_ops,
2451
},
2452
};
2453
2454
static int __init omap_hsmmc_init(void)
2455
{
2456
/* Register the MMC driver */
2457
return platform_driver_probe(&omap_hsmmc_driver, omap_hsmmc_probe);
2458
}
2459
2460
static void __exit omap_hsmmc_cleanup(void)
2461
{
2462
/* Unregister MMC driver */
2463
platform_driver_unregister(&omap_hsmmc_driver);
2464
}
2465
2466
module_init(omap_hsmmc_init);
2467
module_exit(omap_hsmmc_cleanup);
2468
2469
MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver");
2470
MODULE_LICENSE("GPL");
2471
MODULE_ALIAS("platform:" DRIVER_NAME);
2472
MODULE_AUTHOR("Texas Instruments Inc");
2473
2474