Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
mmc
host
tmio_mmc.h
Go to the documentation of this file.
1
/*
2
* linux/drivers/mmc/host/tmio_mmc.h
3
*
4
* Copyright (C) 2007 Ian Molton
5
* Copyright (C) 2004 Ian Molton
6
*
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License version 2 as
9
* published by the Free Software Foundation.
10
*
11
* Driver for the MMC / SD / SDIO cell found in:
12
*
13
* TC6393XB TC6391XB TC6387XB T7L66XB ASIC3
14
*/
15
16
#ifndef TMIO_MMC_H
17
#define TMIO_MMC_H
18
19
#include <
linux/highmem.h
>
20
#include <
linux/mmc/tmio.h
>
21
#include <
linux/mutex.h
>
22
#include <
linux/pagemap.h
>
23
#include <
linux/scatterlist.h
>
24
#include <
linux/spinlock.h
>
25
26
/* Definitions for values the CTRL_SDIO_STATUS register can take. */
27
#define TMIO_SDIO_STAT_IOIRQ 0x0001
28
#define TMIO_SDIO_STAT_EXPUB52 0x4000
29
#define TMIO_SDIO_STAT_EXWT 0x8000
30
#define TMIO_SDIO_MASK_ALL 0xc007
31
32
/* Define some IRQ masks */
33
/* This is the mask used at reset by the chip */
34
#define TMIO_MASK_ALL 0x837f031d
35
#define TMIO_MASK_READOP (TMIO_STAT_RXRDY | TMIO_STAT_DATAEND)
36
#define TMIO_MASK_WRITEOP (TMIO_STAT_TXRQ | TMIO_STAT_DATAEND)
37
#define TMIO_MASK_CMD (TMIO_STAT_CMDRESPEND | TMIO_STAT_CMDTIMEOUT | \
38
TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT)
39
#define TMIO_MASK_IRQ (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD)
40
41
struct
tmio_mmc_data
;
42
43
struct
tmio_mmc_host
{
44
void
__iomem
*
ctl
;
45
unsigned
long
bus_shift
;
46
struct
mmc_command
*
cmd
;
47
struct
mmc_request
*
mrq
;
48
struct
mmc_data
*
data
;
49
struct
mmc_host
*
mmc
;
50
51
/* Controller power state */
52
bool
power
;
53
54
/* Callbacks for clock / power control */
55
void
(*
set_pwr
)(
struct
platform_device
*
host
,
int
state
);
56
void
(*
set_clk_div
)(
struct
platform_device
*
host
,
int
state
);
57
58
/* pio related stuff */
59
struct
scatterlist
*
sg_ptr
;
60
struct
scatterlist
*
sg_orig
;
61
unsigned
int
sg_len
;
62
unsigned
int
sg_off
;
63
64
struct
platform_device
*
pdev
;
65
struct
tmio_mmc_data
*
pdata
;
66
67
/* DMA support */
68
bool
force_pio
;
69
struct
dma_chan
*
chan_rx
;
70
struct
dma_chan
*
chan_tx
;
71
struct
tasklet_struct
dma_complete
;
72
struct
tasklet_struct
dma_issue
;
73
struct
scatterlist
bounce_sg
;
74
u8
*
bounce_buf
;
75
76
/* Track lost interrupts */
77
struct
delayed_work
delayed_reset_work
;
78
struct
work_struct
done
;
79
80
/* Cache IRQ mask */
81
u32
sdcard_irq_mask
;
82
u32
sdio_irq_mask
;
83
84
spinlock_t
lock
;
/* protect host private data */
85
unsigned
long
last_req_ts
;
86
struct
mutex
ios_lock
;
/* protect set_ios() context */
87
bool
native_hotplug
;
88
};
89
90
int
tmio_mmc_host_probe
(
struct
tmio_mmc_host
**
host
,
91
struct
platform_device
*pdev,
92
struct
tmio_mmc_data
*
pdata
);
93
void
tmio_mmc_host_remove
(
struct
tmio_mmc_host
*
host
);
94
void
tmio_mmc_do_data_irq
(
struct
tmio_mmc_host
*
host
);
95
96
void
tmio_mmc_enable_mmc_irqs
(
struct
tmio_mmc_host
*
host
,
u32
i
);
97
void
tmio_mmc_disable_mmc_irqs
(
struct
tmio_mmc_host
*
host
,
u32
i
);
98
irqreturn_t
tmio_mmc_irq
(
int
irq,
void
*
devid
);
99
irqreturn_t
tmio_mmc_sdcard_irq
(
int
irq,
void
*
devid
);
100
irqreturn_t
tmio_mmc_card_detect_irq
(
int
irq,
void
*
devid
);
101
irqreturn_t
tmio_mmc_sdio_irq
(
int
irq,
void
*
devid
);
102
103
static
inline
char
*tmio_mmc_kmap_atomic(
struct
scatterlist
*
sg
,
104
unsigned
long
*
flags
)
105
{
106
local_irq_save
(*flags);
107
return
kmap_atomic
(sg_page(sg)) + sg->
offset
;
108
}
109
110
static
inline
void
tmio_mmc_kunmap_atomic(
struct
scatterlist
*sg,
111
unsigned
long
*flags,
void
*virt)
112
{
113
kunmap_atomic
(virt - sg->
offset
);
114
local_irq_restore
(*flags);
115
}
116
117
#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
118
void
tmio_mmc_start_dma
(
struct
tmio_mmc_host
*
host
,
struct
mmc_data
*
data
);
119
void
tmio_mmc_enable_dma
(
struct
tmio_mmc_host
*
host
,
bool
enable
);
120
void
tmio_mmc_request_dma
(
struct
tmio_mmc_host
*
host
,
struct
tmio_mmc_data
*
pdata
);
121
void
tmio_mmc_release_dma
(
struct
tmio_mmc_host
*
host
);
122
void
tmio_mmc_abort_dma
(
struct
tmio_mmc_host
*
host
);
123
#else
124
static
inline
void
tmio_mmc_start_dma
(
struct
tmio_mmc_host
*
host
,
125
struct
mmc_data
*
data
)
126
{
127
}
128
129
static
inline
void
tmio_mmc_enable_dma
(
struct
tmio_mmc_host
*
host
,
bool
enable
)
130
{
131
}
132
133
static
inline
void
tmio_mmc_request_dma
(
struct
tmio_mmc_host
*
host
,
134
struct
tmio_mmc_data
*
pdata
)
135
{
136
host->
chan_tx
=
NULL
;
137
host->
chan_rx
=
NULL
;
138
}
139
140
static
inline
void
tmio_mmc_release_dma
(
struct
tmio_mmc_host
*
host
)
141
{
142
}
143
144
static
inline
void
tmio_mmc_abort_dma
(
struct
tmio_mmc_host
*
host
)
145
{
146
}
147
#endif
148
149
#ifdef CONFIG_PM
150
int
tmio_mmc_host_suspend
(
struct
device
*
dev
);
151
int
tmio_mmc_host_resume
(
struct
device
*
dev
);
152
#else
153
#define tmio_mmc_host_suspend NULL
154
#define tmio_mmc_host_resume NULL
155
#endif
156
157
int
tmio_mmc_host_runtime_suspend
(
struct
device
*
dev
);
158
int
tmio_mmc_host_runtime_resume
(
struct
device
*
dev
);
159
160
static
inline
u16
sd_ctrl_read16(
struct
tmio_mmc_host
*
host
,
int
addr
)
161
{
162
return
readw
(host->
ctl
+ (addr << host->
bus_shift
));
163
}
164
165
static
inline
void
sd_ctrl_read16_rep(
struct
tmio_mmc_host
*
host
,
int
addr
,
166
u16
*
buf
,
int
count
)
167
{
168
readsw
(host->
ctl
+ (addr << host->
bus_shift
), buf, count);
169
}
170
171
static
inline
u32
sd_ctrl_read32(
struct
tmio_mmc_host
*
host
,
int
addr
)
172
{
173
return
readw
(host->
ctl
+ (addr << host->
bus_shift
)) |
174
readw
(host->
ctl
+ ((addr + 2) << host->
bus_shift
)) << 16;
175
}
176
177
static
inline
void
sd_ctrl_write16(
struct
tmio_mmc_host
*
host
,
int
addr
,
u16
val
)
178
{
179
/* If there is a hook and it returns non-zero then there
180
* is an error and the write should be skipped
181
*/
182
if
(host->
pdata
->write16_hook && host->
pdata
->write16_hook(host, addr))
183
return
;
184
writew
(val, host->
ctl
+ (addr << host->
bus_shift
));
185
}
186
187
static
inline
void
sd_ctrl_write16_rep(
struct
tmio_mmc_host
*host,
int
addr,
188
u16
*
buf
,
int
count
)
189
{
190
writesw
(host->
ctl
+ (addr << host->
bus_shift
), buf, count);
191
}
192
193
static
inline
void
sd_ctrl_write32(
struct
tmio_mmc_host
*host,
int
addr,
u32
val)
194
{
195
writew
(val, host->
ctl
+ (addr << host->
bus_shift
));
196
writew
(val >> 16, host->
ctl
+ ((addr + 2) << host->
bus_shift
));
197
}
198
199
200
#endif
Generated on Thu Jan 10 2013 13:56:03 for Linux Kernel by
1.8.2