Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
1d6bebf2
Commit
1d6bebf2
authored
Jul 02, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/rmk/linux-2.6-mmc
parents
86166f98
3eee0d03
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
56 additions
and
42 deletions
+56
-42
drivers/mmc/mmci.c
drivers/mmc/mmci.c
+6
-3
drivers/mmc/wbsd.c
drivers/mmc/wbsd.c
+48
-32
drivers/mmc/wbsd.h
drivers/mmc/wbsd.h
+2
-7
No files found.
drivers/mmc/mmci.c
View file @
1d6bebf2
...
...
@@ -20,6 +20,7 @@
#include <linux/mmc/host.h>
#include <linux/mmc/protocol.h>
#include <asm/div64.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/scatterlist.h>
...
...
@@ -70,6 +71,7 @@ static void mmci_stop_data(struct mmci_host *host)
static
void
mmci_start_data
(
struct
mmci_host
*
host
,
struct
mmc_data
*
data
)
{
unsigned
int
datactrl
,
timeout
,
irqmask
;
unsigned
long
long
clks
;
void
__iomem
*
base
;
DBG
(
host
,
"blksz %04x blks %04x flags %08x
\n
"
,
...
...
@@ -81,9 +83,10 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
mmci_init_sg
(
host
,
data
);
timeout
=
data
->
timeout_clks
+
((
unsigned
long
long
)
data
->
timeout_ns
*
host
->
cclk
)
/
1000000000ULL
;
clks
=
(
unsigned
long
long
)
data
->
timeout_ns
*
host
->
cclk
;
do_div
(
clks
,
1000000000UL
);
timeout
=
data
->
timeout_clks
+
(
unsigned
int
)
clks
;
base
=
host
->
base
;
writel
(
timeout
,
base
+
MMCIDATATIMER
);
...
...
drivers/mmc/wbsd.c
View file @
1d6bebf2
...
...
@@ -54,28 +54,6 @@
#define DBGF(x...) do { } while (0)
#endif
#ifdef CONFIG_MMC_DEBUG
void
DBG_REG
(
int
reg
,
u8
value
)
{
int
i
;
printk
(
KERN_DEBUG
"wbsd: Register %d: 0x%02X %3d '%c' "
,
reg
,
(
int
)
value
,
(
int
)
value
,
(
value
<
0x20
)
?
'.'
:
value
);
for
(
i
=
7
;
i
>=
0
;
i
--
)
{
if
(
value
&
(
1
<<
i
))
printk
(
"x"
);
else
printk
(
"."
);
}
printk
(
"
\n
"
);
}
#else
#define DBG_REG(r, v) do {} while (0)
#endif
/*
* Device resources
*/
...
...
@@ -92,6 +70,13 @@ MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
#endif
/* CONFIG_PNP */
static
const
int
config_ports
[]
=
{
0x2E
,
0x4E
};
static
const
int
unlock_codes
[]
=
{
0x83
,
0x87
};
static
const
int
valid_ids
[]
=
{
0x7112
,
};
#ifdef CONFIG_PNP
static
unsigned
int
nopnp
=
0
;
#else
...
...
@@ -1050,6 +1035,20 @@ static struct mmc_host_ops wbsd_ops = {
* *
\*****************************************************************************/
/*
* Helper function for card detection
*/
static
void
wbsd_detect_card
(
unsigned
long
data
)
{
struct
wbsd_host
*
host
=
(
struct
wbsd_host
*
)
data
;
BUG_ON
(
host
==
NULL
);
DBG
(
"Executing card detection
\n
"
);
mmc_detect_change
(
host
->
mmc
);
}
/*
* Tasklets
*/
...
...
@@ -1075,7 +1074,6 @@ static void wbsd_tasklet_card(unsigned long param)
{
struct
wbsd_host
*
host
=
(
struct
wbsd_host
*
)
param
;
u8
csr
;
int
change
=
0
;
spin_lock
(
&
host
->
lock
);
...
...
@@ -1094,14 +1092,20 @@ static void wbsd_tasklet_card(unsigned long param)
{
DBG
(
"Card inserted
\n
"
);
host
->
flags
|=
WBSD_FCARD_PRESENT
;
change
=
1
;
/*
* Delay card detection to allow electrical connections
* to stabilise.
*/
mod_timer
(
&
host
->
timer
,
jiffies
+
HZ
/
2
);
}
spin_unlock
(
&
host
->
lock
);
}
else
if
(
host
->
flags
&
WBSD_FCARD_PRESENT
)
{
DBG
(
"Card removed
\n
"
);
host
->
flags
&=
~
WBSD_FCARD_PRESENT
;
change
=
1
;
if
(
host
->
mrq
)
{
...
...
@@ -1112,15 +1116,14 @@ static void wbsd_tasklet_card(unsigned long param)
host
->
mrq
->
cmd
->
error
=
MMC_ERR_FAILED
;
tasklet_schedule
(
&
host
->
finish_tasklet
);
}
}
/*
* Unlock first since we might get a call back.
*/
spin_unlock
(
&
host
->
lock
);
/*
* Unlock first since we might get a call back.
*/
spin_unlock
(
&
host
->
lock
);
if
(
change
)
mmc_detect_change
(
host
->
mmc
);
}
}
static
void
wbsd_tasklet_fifo
(
unsigned
long
param
)
...
...
@@ -1324,6 +1327,13 @@ static int __devinit wbsd_alloc_mmc(struct device* dev)
spin_lock_init
(
&
host
->
lock
);
/*
* Set up detection timer
*/
init_timer
(
&
host
->
timer
);
host
->
timer
.
data
=
(
unsigned
long
)
host
;
host
->
timer
.
function
=
wbsd_detect_card
;
/*
* Maximum number of segments. Worst case is one sector per segment
* so this will be 64kB/512.
...
...
@@ -1351,11 +1361,17 @@ static int __devinit wbsd_alloc_mmc(struct device* dev)
static
void
__devexit
wbsd_free_mmc
(
struct
device
*
dev
)
{
struct
mmc_host
*
mmc
;
struct
wbsd_host
*
host
;
mmc
=
dev_get_drvdata
(
dev
);
if
(
!
mmc
)
return
;
host
=
mmc_priv
(
mmc
);
BUG_ON
(
host
==
NULL
);
del_timer_sync
(
&
host
->
timer
);
mmc_free_host
(
mmc
);
dev_set_drvdata
(
dev
,
NULL
);
...
...
drivers/mmc/wbsd.h
View file @
1d6bebf2
...
...
@@ -8,13 +8,6 @@
* published by the Free Software Foundation.
*/
const
int
config_ports
[]
=
{
0x2E
,
0x4E
};
const
int
unlock_codes
[]
=
{
0x83
,
0x87
};
const
int
valid_ids
[]
=
{
0x7112
,
};
#define LOCK_CODE 0xAA
#define WBSD_CONF_SWRST 0x02
...
...
@@ -187,4 +180,6 @@ struct wbsd_host
struct
tasklet_struct
timeout_tasklet
;
struct
tasklet_struct
finish_tasklet
;
struct
tasklet_struct
block_tasklet
;
struct
timer_list
timer
;
/* Card detection timer */
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment