Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/mmc/core/sdio_io.c
15109 views
1
/*
2
* linux/drivers/mmc/core/sdio_io.c
3
*
4
* Copyright 2007-2008 Pierre Ossman
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or (at
9
* your option) any later version.
10
*/
11
12
#include <linux/mmc/host.h>
13
#include <linux/mmc/card.h>
14
#include <linux/mmc/sdio.h>
15
#include <linux/mmc/sdio_func.h>
16
17
#include "sdio_ops.h"
18
19
/**
20
* sdio_claim_host - exclusively claim a bus for a certain SDIO function
21
* @func: SDIO function that will be accessed
22
*
23
* Claim a bus for a set of operations. The SDIO function given
24
* is used to figure out which bus is relevant.
25
*/
26
void sdio_claim_host(struct sdio_func *func)
27
{
28
BUG_ON(!func);
29
BUG_ON(!func->card);
30
31
mmc_claim_host(func->card->host);
32
}
33
EXPORT_SYMBOL_GPL(sdio_claim_host);
34
35
/**
36
* sdio_release_host - release a bus for a certain SDIO function
37
* @func: SDIO function that was accessed
38
*
39
* Release a bus, allowing others to claim the bus for their
40
* operations.
41
*/
42
void sdio_release_host(struct sdio_func *func)
43
{
44
BUG_ON(!func);
45
BUG_ON(!func->card);
46
47
mmc_release_host(func->card->host);
48
}
49
EXPORT_SYMBOL_GPL(sdio_release_host);
50
51
/**
52
* sdio_enable_func - enables a SDIO function for usage
53
* @func: SDIO function to enable
54
*
55
* Powers up and activates a SDIO function so that register
56
* access is possible.
57
*/
58
int sdio_enable_func(struct sdio_func *func)
59
{
60
int ret;
61
unsigned char reg;
62
unsigned long timeout;
63
64
BUG_ON(!func);
65
BUG_ON(!func->card);
66
67
pr_debug("SDIO: Enabling device %s...\n", sdio_func_id(func));
68
69
ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IOEx, 0, &reg);
70
if (ret)
71
goto err;
72
73
reg |= 1 << func->num;
74
75
ret = mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_IOEx, reg, NULL);
76
if (ret)
77
goto err;
78
79
timeout = jiffies + msecs_to_jiffies(func->enable_timeout);
80
81
while (1) {
82
ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IORx, 0, &reg);
83
if (ret)
84
goto err;
85
if (reg & (1 << func->num))
86
break;
87
ret = -ETIME;
88
if (time_after(jiffies, timeout))
89
goto err;
90
}
91
92
pr_debug("SDIO: Enabled device %s\n", sdio_func_id(func));
93
94
return 0;
95
96
err:
97
pr_debug("SDIO: Failed to enable device %s\n", sdio_func_id(func));
98
return ret;
99
}
100
EXPORT_SYMBOL_GPL(sdio_enable_func);
101
102
/**
103
* sdio_disable_func - disable a SDIO function
104
* @func: SDIO function to disable
105
*
106
* Powers down and deactivates a SDIO function. Register access
107
* to this function will fail until the function is reenabled.
108
*/
109
int sdio_disable_func(struct sdio_func *func)
110
{
111
int ret;
112
unsigned char reg;
113
114
BUG_ON(!func);
115
BUG_ON(!func->card);
116
117
pr_debug("SDIO: Disabling device %s...\n", sdio_func_id(func));
118
119
ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IOEx, 0, &reg);
120
if (ret)
121
goto err;
122
123
reg &= ~(1 << func->num);
124
125
ret = mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_IOEx, reg, NULL);
126
if (ret)
127
goto err;
128
129
pr_debug("SDIO: Disabled device %s\n", sdio_func_id(func));
130
131
return 0;
132
133
err:
134
pr_debug("SDIO: Failed to disable device %s\n", sdio_func_id(func));
135
return -EIO;
136
}
137
EXPORT_SYMBOL_GPL(sdio_disable_func);
138
139
/**
140
* sdio_set_block_size - set the block size of an SDIO function
141
* @func: SDIO function to change
142
* @blksz: new block size or 0 to use the default.
143
*
144
* The default block size is the largest supported by both the function
145
* and the host, with a maximum of 512 to ensure that arbitrarily sized
146
* data transfer use the optimal (least) number of commands.
147
*
148
* A driver may call this to override the default block size set by the
149
* core. This can be used to set a block size greater than the maximum
150
* that reported by the card; it is the driver's responsibility to ensure
151
* it uses a value that the card supports.
152
*
153
* Returns 0 on success, -EINVAL if the host does not support the
154
* requested block size, or -EIO (etc.) if one of the resultant FBR block
155
* size register writes failed.
156
*
157
*/
158
int sdio_set_block_size(struct sdio_func *func, unsigned blksz)
159
{
160
int ret;
161
162
if (blksz > func->card->host->max_blk_size)
163
return -EINVAL;
164
165
if (blksz == 0) {
166
blksz = min(func->max_blksize, func->card->host->max_blk_size);
167
blksz = min(blksz, 512u);
168
}
169
170
ret = mmc_io_rw_direct(func->card, 1, 0,
171
SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE,
172
blksz & 0xff, NULL);
173
if (ret)
174
return ret;
175
ret = mmc_io_rw_direct(func->card, 1, 0,
176
SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE + 1,
177
(blksz >> 8) & 0xff, NULL);
178
if (ret)
179
return ret;
180
func->cur_blksize = blksz;
181
return 0;
182
}
183
EXPORT_SYMBOL_GPL(sdio_set_block_size);
184
185
/*
186
* Calculate the maximum byte mode transfer size
187
*/
188
static inline unsigned int sdio_max_byte_size(struct sdio_func *func)
189
{
190
unsigned mval = min(func->card->host->max_seg_size,
191
func->card->host->max_blk_size);
192
193
if (mmc_blksz_for_byte_mode(func->card))
194
mval = min(mval, func->cur_blksize);
195
else
196
mval = min(mval, func->max_blksize);
197
198
return min(mval, 512u); /* maximum size for byte mode */
199
}
200
201
/**
202
* sdio_align_size - pads a transfer size to a more optimal value
203
* @func: SDIO function
204
* @sz: original transfer size
205
*
206
* Pads the original data size with a number of extra bytes in
207
* order to avoid controller bugs and/or performance hits
208
* (e.g. some controllers revert to PIO for certain sizes).
209
*
210
* If possible, it will also adjust the size so that it can be
211
* handled in just a single request.
212
*
213
* Returns the improved size, which might be unmodified.
214
*/
215
unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz)
216
{
217
unsigned int orig_sz;
218
unsigned int blk_sz, byte_sz;
219
unsigned chunk_sz;
220
221
orig_sz = sz;
222
223
/*
224
* Do a first check with the controller, in case it
225
* wants to increase the size up to a point where it
226
* might need more than one block.
227
*/
228
sz = mmc_align_data_size(func->card, sz);
229
230
/*
231
* If we can still do this with just a byte transfer, then
232
* we're done.
233
*/
234
if (sz <= sdio_max_byte_size(func))
235
return sz;
236
237
if (func->card->cccr.multi_block) {
238
/*
239
* Check if the transfer is already block aligned
240
*/
241
if ((sz % func->cur_blksize) == 0)
242
return sz;
243
244
/*
245
* Realign it so that it can be done with one request,
246
* and recheck if the controller still likes it.
247
*/
248
blk_sz = ((sz + func->cur_blksize - 1) /
249
func->cur_blksize) * func->cur_blksize;
250
blk_sz = mmc_align_data_size(func->card, blk_sz);
251
252
/*
253
* This value is only good if it is still just
254
* one request.
255
*/
256
if ((blk_sz % func->cur_blksize) == 0)
257
return blk_sz;
258
259
/*
260
* We failed to do one request, but at least try to
261
* pad the remainder properly.
262
*/
263
byte_sz = mmc_align_data_size(func->card,
264
sz % func->cur_blksize);
265
if (byte_sz <= sdio_max_byte_size(func)) {
266
blk_sz = sz / func->cur_blksize;
267
return blk_sz * func->cur_blksize + byte_sz;
268
}
269
} else {
270
/*
271
* We need multiple requests, so first check that the
272
* controller can handle the chunk size;
273
*/
274
chunk_sz = mmc_align_data_size(func->card,
275
sdio_max_byte_size(func));
276
if (chunk_sz == sdio_max_byte_size(func)) {
277
/*
278
* Fix up the size of the remainder (if any)
279
*/
280
byte_sz = orig_sz % chunk_sz;
281
if (byte_sz) {
282
byte_sz = mmc_align_data_size(func->card,
283
byte_sz);
284
}
285
286
return (orig_sz / chunk_sz) * chunk_sz + byte_sz;
287
}
288
}
289
290
/*
291
* The controller is simply incapable of transferring the size
292
* we want in decent manner, so just return the original size.
293
*/
294
return orig_sz;
295
}
296
EXPORT_SYMBOL_GPL(sdio_align_size);
297
298
/* Split an arbitrarily sized data transfer into several
299
* IO_RW_EXTENDED commands. */
300
static int sdio_io_rw_ext_helper(struct sdio_func *func, int write,
301
unsigned addr, int incr_addr, u8 *buf, unsigned size)
302
{
303
unsigned remainder = size;
304
unsigned max_blocks;
305
int ret;
306
307
/* Do the bulk of the transfer using block mode (if supported). */
308
if (func->card->cccr.multi_block && (size > sdio_max_byte_size(func))) {
309
/* Blocks per command is limited by host count, host transfer
310
* size (we only use a single sg entry) and the maximum for
311
* IO_RW_EXTENDED of 511 blocks. */
312
max_blocks = min(func->card->host->max_blk_count,
313
func->card->host->max_seg_size / func->cur_blksize);
314
max_blocks = min(max_blocks, 511u);
315
316
while (remainder > func->cur_blksize) {
317
unsigned blocks;
318
319
blocks = remainder / func->cur_blksize;
320
if (blocks > max_blocks)
321
blocks = max_blocks;
322
size = blocks * func->cur_blksize;
323
324
ret = mmc_io_rw_extended(func->card, write,
325
func->num, addr, incr_addr, buf,
326
blocks, func->cur_blksize);
327
if (ret)
328
return ret;
329
330
remainder -= size;
331
buf += size;
332
if (incr_addr)
333
addr += size;
334
}
335
}
336
337
/* Write the remainder using byte mode. */
338
while (remainder > 0) {
339
size = min(remainder, sdio_max_byte_size(func));
340
341
ret = mmc_io_rw_extended(func->card, write, func->num, addr,
342
incr_addr, buf, 1, size);
343
if (ret)
344
return ret;
345
346
remainder -= size;
347
buf += size;
348
if (incr_addr)
349
addr += size;
350
}
351
return 0;
352
}
353
354
/**
355
* sdio_readb - read a single byte from a SDIO function
356
* @func: SDIO function to access
357
* @addr: address to read
358
* @err_ret: optional status value from transfer
359
*
360
* Reads a single byte from the address space of a given SDIO
361
* function. If there is a problem reading the address, 0xff
362
* is returned and @err_ret will contain the error code.
363
*/
364
u8 sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret)
365
{
366
int ret;
367
u8 val;
368
369
BUG_ON(!func);
370
371
if (err_ret)
372
*err_ret = 0;
373
374
ret = mmc_io_rw_direct(func->card, 0, func->num, addr, 0, &val);
375
if (ret) {
376
if (err_ret)
377
*err_ret = ret;
378
return 0xFF;
379
}
380
381
return val;
382
}
383
EXPORT_SYMBOL_GPL(sdio_readb);
384
385
/**
386
* sdio_writeb - write a single byte to a SDIO function
387
* @func: SDIO function to access
388
* @b: byte to write
389
* @addr: address to write to
390
* @err_ret: optional status value from transfer
391
*
392
* Writes a single byte to the address space of a given SDIO
393
* function. @err_ret will contain the status of the actual
394
* transfer.
395
*/
396
void sdio_writeb(struct sdio_func *func, u8 b, unsigned int addr, int *err_ret)
397
{
398
int ret;
399
400
BUG_ON(!func);
401
402
ret = mmc_io_rw_direct(func->card, 1, func->num, addr, b, NULL);
403
if (err_ret)
404
*err_ret = ret;
405
}
406
EXPORT_SYMBOL_GPL(sdio_writeb);
407
408
/**
409
* sdio_writeb_readb - write and read a byte from SDIO function
410
* @func: SDIO function to access
411
* @write_byte: byte to write
412
* @addr: address to write to
413
* @err_ret: optional status value from transfer
414
*
415
* Performs a RAW (Read after Write) operation as defined by SDIO spec -
416
* single byte is written to address space of a given SDIO function and
417
* response is read back from the same address, both using single request.
418
* If there is a problem with the operation, 0xff is returned and
419
* @err_ret will contain the error code.
420
*/
421
u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte,
422
unsigned int addr, int *err_ret)
423
{
424
int ret;
425
u8 val;
426
427
ret = mmc_io_rw_direct(func->card, 1, func->num, addr,
428
write_byte, &val);
429
if (err_ret)
430
*err_ret = ret;
431
if (ret)
432
val = 0xff;
433
434
return val;
435
}
436
EXPORT_SYMBOL_GPL(sdio_writeb_readb);
437
438
/**
439
* sdio_memcpy_fromio - read a chunk of memory from a SDIO function
440
* @func: SDIO function to access
441
* @dst: buffer to store the data
442
* @addr: address to begin reading from
443
* @count: number of bytes to read
444
*
445
* Reads from the address space of a given SDIO function. Return
446
* value indicates if the transfer succeeded or not.
447
*/
448
int sdio_memcpy_fromio(struct sdio_func *func, void *dst,
449
unsigned int addr, int count)
450
{
451
return sdio_io_rw_ext_helper(func, 0, addr, 1, dst, count);
452
}
453
EXPORT_SYMBOL_GPL(sdio_memcpy_fromio);
454
455
/**
456
* sdio_memcpy_toio - write a chunk of memory to a SDIO function
457
* @func: SDIO function to access
458
* @addr: address to start writing to
459
* @src: buffer that contains the data to write
460
* @count: number of bytes to write
461
*
462
* Writes to the address space of a given SDIO function. Return
463
* value indicates if the transfer succeeded or not.
464
*/
465
int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr,
466
void *src, int count)
467
{
468
return sdio_io_rw_ext_helper(func, 1, addr, 1, src, count);
469
}
470
EXPORT_SYMBOL_GPL(sdio_memcpy_toio);
471
472
/**
473
* sdio_readsb - read from a FIFO on a SDIO function
474
* @func: SDIO function to access
475
* @dst: buffer to store the data
476
* @addr: address of (single byte) FIFO
477
* @count: number of bytes to read
478
*
479
* Reads from the specified FIFO of a given SDIO function. Return
480
* value indicates if the transfer succeeded or not.
481
*/
482
int sdio_readsb(struct sdio_func *func, void *dst, unsigned int addr,
483
int count)
484
{
485
return sdio_io_rw_ext_helper(func, 0, addr, 0, dst, count);
486
}
487
EXPORT_SYMBOL_GPL(sdio_readsb);
488
489
/**
490
* sdio_writesb - write to a FIFO of a SDIO function
491
* @func: SDIO function to access
492
* @addr: address of (single byte) FIFO
493
* @src: buffer that contains the data to write
494
* @count: number of bytes to write
495
*
496
* Writes to the specified FIFO of a given SDIO function. Return
497
* value indicates if the transfer succeeded or not.
498
*/
499
int sdio_writesb(struct sdio_func *func, unsigned int addr, void *src,
500
int count)
501
{
502
return sdio_io_rw_ext_helper(func, 1, addr, 0, src, count);
503
}
504
EXPORT_SYMBOL_GPL(sdio_writesb);
505
506
/**
507
* sdio_readw - read a 16 bit integer from a SDIO function
508
* @func: SDIO function to access
509
* @addr: address to read
510
* @err_ret: optional status value from transfer
511
*
512
* Reads a 16 bit integer from the address space of a given SDIO
513
* function. If there is a problem reading the address, 0xffff
514
* is returned and @err_ret will contain the error code.
515
*/
516
u16 sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret)
517
{
518
int ret;
519
520
if (err_ret)
521
*err_ret = 0;
522
523
ret = sdio_memcpy_fromio(func, func->tmpbuf, addr, 2);
524
if (ret) {
525
if (err_ret)
526
*err_ret = ret;
527
return 0xFFFF;
528
}
529
530
return le16_to_cpup((__le16 *)func->tmpbuf);
531
}
532
EXPORT_SYMBOL_GPL(sdio_readw);
533
534
/**
535
* sdio_writew - write a 16 bit integer to a SDIO function
536
* @func: SDIO function to access
537
* @b: integer to write
538
* @addr: address to write to
539
* @err_ret: optional status value from transfer
540
*
541
* Writes a 16 bit integer to the address space of a given SDIO
542
* function. @err_ret will contain the status of the actual
543
* transfer.
544
*/
545
void sdio_writew(struct sdio_func *func, u16 b, unsigned int addr, int *err_ret)
546
{
547
int ret;
548
549
*(__le16 *)func->tmpbuf = cpu_to_le16(b);
550
551
ret = sdio_memcpy_toio(func, addr, func->tmpbuf, 2);
552
if (err_ret)
553
*err_ret = ret;
554
}
555
EXPORT_SYMBOL_GPL(sdio_writew);
556
557
/**
558
* sdio_readl - read a 32 bit integer from a SDIO function
559
* @func: SDIO function to access
560
* @addr: address to read
561
* @err_ret: optional status value from transfer
562
*
563
* Reads a 32 bit integer from the address space of a given SDIO
564
* function. If there is a problem reading the address,
565
* 0xffffffff is returned and @err_ret will contain the error
566
* code.
567
*/
568
u32 sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret)
569
{
570
int ret;
571
572
if (err_ret)
573
*err_ret = 0;
574
575
ret = sdio_memcpy_fromio(func, func->tmpbuf, addr, 4);
576
if (ret) {
577
if (err_ret)
578
*err_ret = ret;
579
return 0xFFFFFFFF;
580
}
581
582
return le32_to_cpup((__le32 *)func->tmpbuf);
583
}
584
EXPORT_SYMBOL_GPL(sdio_readl);
585
586
/**
587
* sdio_writel - write a 32 bit integer to a SDIO function
588
* @func: SDIO function to access
589
* @b: integer to write
590
* @addr: address to write to
591
* @err_ret: optional status value from transfer
592
*
593
* Writes a 32 bit integer to the address space of a given SDIO
594
* function. @err_ret will contain the status of the actual
595
* transfer.
596
*/
597
void sdio_writel(struct sdio_func *func, u32 b, unsigned int addr, int *err_ret)
598
{
599
int ret;
600
601
*(__le32 *)func->tmpbuf = cpu_to_le32(b);
602
603
ret = sdio_memcpy_toio(func, addr, func->tmpbuf, 4);
604
if (err_ret)
605
*err_ret = ret;
606
}
607
EXPORT_SYMBOL_GPL(sdio_writel);
608
609
/**
610
* sdio_f0_readb - read a single byte from SDIO function 0
611
* @func: an SDIO function of the card
612
* @addr: address to read
613
* @err_ret: optional status value from transfer
614
*
615
* Reads a single byte from the address space of SDIO function 0.
616
* If there is a problem reading the address, 0xff is returned
617
* and @err_ret will contain the error code.
618
*/
619
unsigned char sdio_f0_readb(struct sdio_func *func, unsigned int addr,
620
int *err_ret)
621
{
622
int ret;
623
unsigned char val;
624
625
BUG_ON(!func);
626
627
if (err_ret)
628
*err_ret = 0;
629
630
ret = mmc_io_rw_direct(func->card, 0, 0, addr, 0, &val);
631
if (ret) {
632
if (err_ret)
633
*err_ret = ret;
634
return 0xFF;
635
}
636
637
return val;
638
}
639
EXPORT_SYMBOL_GPL(sdio_f0_readb);
640
641
/**
642
* sdio_f0_writeb - write a single byte to SDIO function 0
643
* @func: an SDIO function of the card
644
* @b: byte to write
645
* @addr: address to write to
646
* @err_ret: optional status value from transfer
647
*
648
* Writes a single byte to the address space of SDIO function 0.
649
* @err_ret will contain the status of the actual transfer.
650
*
651
* Only writes to the vendor specific CCCR registers (0xF0 -
652
* 0xFF) are permiited; @err_ret will be set to -EINVAL for *
653
* writes outside this range.
654
*/
655
void sdio_f0_writeb(struct sdio_func *func, unsigned char b, unsigned int addr,
656
int *err_ret)
657
{
658
int ret;
659
660
BUG_ON(!func);
661
662
if ((addr < 0xF0 || addr > 0xFF) && (!mmc_card_lenient_fn0(func->card))) {
663
if (err_ret)
664
*err_ret = -EINVAL;
665
return;
666
}
667
668
ret = mmc_io_rw_direct(func->card, 1, 0, addr, b, NULL);
669
if (err_ret)
670
*err_ret = ret;
671
}
672
EXPORT_SYMBOL_GPL(sdio_f0_writeb);
673
674
/**
675
* sdio_get_host_pm_caps - get host power management capabilities
676
* @func: SDIO function attached to host
677
*
678
* Returns a capability bitmask corresponding to power management
679
* features supported by the host controller that the card function
680
* might rely upon during a system suspend. The host doesn't need
681
* to be claimed, nor the function active, for this information to be
682
* obtained.
683
*/
684
mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func)
685
{
686
BUG_ON(!func);
687
BUG_ON(!func->card);
688
689
return func->card->host->pm_caps;
690
}
691
EXPORT_SYMBOL_GPL(sdio_get_host_pm_caps);
692
693
/**
694
* sdio_set_host_pm_flags - set wanted host power management capabilities
695
* @func: SDIO function attached to host
696
*
697
* Set a capability bitmask corresponding to wanted host controller
698
* power management features for the upcoming suspend state.
699
* This must be called, if needed, each time the suspend method of
700
* the function driver is called, and must contain only bits that
701
* were returned by sdio_get_host_pm_caps().
702
* The host doesn't need to be claimed, nor the function active,
703
* for this information to be set.
704
*/
705
int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags)
706
{
707
struct mmc_host *host;
708
709
BUG_ON(!func);
710
BUG_ON(!func->card);
711
712
host = func->card->host;
713
714
if (flags & ~host->pm_caps)
715
return -EINVAL;
716
717
/* function suspend methods are serialized, hence no lock needed */
718
host->pm_flags |= flags;
719
return 0;
720
}
721
EXPORT_SYMBOL_GPL(sdio_set_host_pm_flags);
722
723