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
Kirill Smelkov
linux
Commits
fef3278f
Commit
fef3278f
authored
Jun 03, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-pcmcia
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
5ab27ef0
25cc28bf
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
127 additions
and
163 deletions
+127
-163
drivers/pcmcia/pxa2xx_base.c
drivers/pcmcia/pxa2xx_base.c
+37
-90
drivers/pcmcia/sa11xx_base.c
drivers/pcmcia/sa11xx_base.c
+31
-73
drivers/pcmcia/soc_common.c
drivers/pcmcia/soc_common.c
+51
-0
drivers/pcmcia/soc_common.h
drivers/pcmcia/soc_common.h
+8
-0
No files found.
drivers/pcmcia/pxa2xx_base.c
View file @
fef3278f
...
...
@@ -22,7 +22,6 @@
#include <linux/cpufreq.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/notifier.h>
#include <linux/spinlock.h>
#include <asm/hardware.h>
...
...
@@ -133,6 +132,39 @@ static int pxa2xx_pcmcia_set_timing(struct soc_pcmcia_socket *skt)
return
pxa2xx_pcmcia_set_mcxx
(
skt
,
clk
);
}
#ifdef CONFIG_CPU_FREQ
static
int
pxa2xx_pcmcia_frequency_change
(
struct
soc_pcmcia_socket
*
skt
,
unsigned
long
val
,
struct
cpufreq_freqs
*
freqs
)
{
#warning "it's not clear if this is right since the core CPU (N) clock has no effect on the memory (L) clock"
switch
(
val
)
{
case
CPUFREQ_PRECHANGE
:
if
(
freqs
->
new
>
freqs
->
old
)
{
debug
(
skt
,
2
,
"new frequency %u.%uMHz > %u.%uMHz, "
"pre-updating
\n
"
,
freqs
->
new
/
1000
,
(
freqs
->
new
/
100
)
%
10
,
freqs
->
old
/
1000
,
(
freqs
->
old
/
100
)
%
10
);
pxa2xx_pcmcia_set_mcxx
(
skt
,
freqs
->
new
);
}
break
;
case
CPUFREQ_POSTCHANGE
:
if
(
freqs
->
new
<
freqs
->
old
)
{
debug
(
skt
,
2
,
"new frequency %u.%uMHz < %u.%uMHz, "
"post-updating
\n
"
,
freqs
->
new
/
1000
,
(
freqs
->
new
/
100
)
%
10
,
freqs
->
old
/
1000
,
(
freqs
->
old
/
100
)
%
10
);
pxa2xx_pcmcia_set_mcxx
(
skt
,
freqs
->
new
);
}
break
;
}
return
0
;
}
#endif
int
pxa2xx_drv_pcmcia_probe
(
struct
device
*
dev
)
{
int
ret
;
...
...
@@ -181,6 +213,9 @@ int pxa2xx_drv_pcmcia_probe(struct device *dev)
/* Provide our PXA2xx specific timing routines. */
ops
->
set_timing
=
pxa2xx_pcmcia_set_timing
;
#ifdef CONFIG_CPU_FREQ
ops
->
frequency_change
=
pxa2xx_pcmcia_frequency_change
;
#endif
ret
=
soc_common_drv_pcmcia_probe
(
dev
,
ops
,
first
,
nr
);
...
...
@@ -227,101 +262,13 @@ static struct device_driver pxa2xx_pcmcia_driver = {
.
bus
=
&
platform_bus_type
,
};
#ifdef CONFIG_CPU_FREQ
/*
* When pxa2xx_pcmcia_notifier() decides that a MC{IO,MEM,ATT} adjustment (due
* to a core clock frequency change) is needed, this routine establishes
* new values consistent with the clock speed `clock'.
*/
static
void
pxa2xx_pcmcia_update_mcxx
(
unsigned
int
clock
)
{
struct
soc_pcmcia_socket
*
skt
;
down
(
&
soc_sockets_lock
);
list_for_each_entry
(
skt
,
&
soc_sockets
,
node
)
{
pxa2xx_pcmcia_set_mcxx
(
skt
,
clock
);
}
up
(
&
soc_sockets_lock
);
}
/*
* When changing the processor L clock frequency, it is necessary
* to adjust the MCXX timings accordingly. We've recorded the timings
* requested by Card Services, so this is just a matter of finding
* out what our current speed is, and then recomputing the new MCXX
* values.
*
* Returns: 0 on success, -1 on error
*/
static
int
pxa2xx_pcmcia_notifier
(
struct
notifier_block
*
nb
,
unsigned
long
val
,
void
*
data
)
{
struct
cpufreq_freqs
*
freqs
=
data
;
#warning "it's not clear if this is right since the core CPU (N) clock has no effect on the memory (L) clock"
switch
(
val
)
{
case
CPUFREQ_PRECHANGE
:
if
(
freqs
->
new
>
freqs
->
old
)
{
debug
(
2
,
"new frequency %u.%uMHz > %u.%uMHz, "
"pre-updating
\n
"
,
freqs
->
new
/
1000
,
(
freqs
->
new
/
100
)
%
10
,
freqs
->
old
/
1000
,
(
freqs
->
old
/
100
)
%
10
);
pxa2xx_pcmcia_update_mcxx
(
freqs
->
new
);
}
break
;
case
CPUFREQ_POSTCHANGE
:
if
(
freqs
->
new
<
freqs
->
old
)
{
debug
(
2
,
"new frequency %u.%uMHz < %u.%uMHz, "
"post-updating
\n
"
,
freqs
->
new
/
1000
,
(
freqs
->
new
/
100
)
%
10
,
freqs
->
old
/
1000
,
(
freqs
->
old
/
100
)
%
10
);
pxa2xx_pcmcia_update_mcxx
(
freqs
->
new
);
}
break
;
}
return
0
;
}
static
struct
notifier_block
pxa2xx_pcmcia_notifier_block
=
{
.
notifier_call
=
pxa2xx_pcmcia_notifier
};
static
int
__init
pxa2xx_pcmcia_cpufreq_init
(
void
)
{
int
ret
;
ret
=
cpufreq_register_notifier
(
&
pxa2xx_pcmcia_notifier_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
if
(
ret
<
0
)
printk
(
KERN_ERR
"Unable to register CPU frequency change "
"notifier for PCMCIA (%d)
\n
"
,
ret
);
return
ret
;
}
static
void
__exit
pxa2xx_pcmcia_cpufreq_exit
(
void
)
{
cpufreq_unregister_notifier
(
&
pxa2xx_pcmcia_notifier_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
}
#else
#define pxa2xx_pcmcia_cpufreq_init()
#define pxa2xx_pcmcia_cpufreq_exit()
#endif
static
int
__init
pxa2xx_pcmcia_init
(
void
)
{
int
ret
=
driver_register
(
&
pxa2xx_pcmcia_driver
);
if
(
ret
==
0
)
pxa2xx_pcmcia_cpufreq_init
();
return
ret
;
return
driver_register
(
&
pxa2xx_pcmcia_driver
);
}
static
void
__exit
pxa2xx_pcmcia_exit
(
void
)
{
pxa2xx_pcmcia_cpufreq_exit
();
driver_unregister
(
&
pxa2xx_pcmcia_driver
);
}
...
...
drivers/pcmcia/sa11xx_base.c
View file @
fef3278f
...
...
@@ -36,7 +36,6 @@
#include <linux/cpufreq.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/notifier.h>
#include <linux/spinlock.h>
#include <asm/hardware.h>
...
...
@@ -111,6 +110,32 @@ sa1100_pcmcia_set_mecr(struct soc_pcmcia_socket *skt, unsigned int cpu_clock)
return
0
;
}
#ifdef CONFIG_CPU_FREQ
static
int
sa1100_pcmcia_frequency_change
(
struct
soc_pcmcia_socket
*
skt
,
unsigned
long
val
,
struct
cpufreq_freqs
*
freqs
)
{
switch
(
val
)
{
case
CPUFREQ_PRECHANGE
:
if
(
freqs
->
new
>
freqs
->
old
)
sa1100_pcmcia_set_mecr
(
skt
,
freqs
->
new
);
break
;
case
CPUFREQ_POSTCHANGE
:
if
(
freqs
->
new
<
freqs
->
old
)
sa1100_pcmcia_set_mecr
(
skt
,
freqs
->
new
);
break
;
case
CPUFREQ_RESUMECHANGE
:
sa1100_pcmcia_set_mecr
(
skt
,
freqs
->
new
);
break
;
}
return
0
;
}
#endif
static
int
sa1100_pcmcia_set_timing
(
struct
soc_pcmcia_socket
*
skt
)
{
...
...
@@ -152,90 +177,23 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
/* Provide our SA11x0 specific timing routines. */
ops
->
set_timing
=
sa1100_pcmcia_set_timing
;
ops
->
show_timing
=
sa1100_pcmcia_show_timing
;
#ifdef CONFIG_CPU_FREQ
ops
->
frequency_change
=
sa1100_pcmcia_frequency_change
;
#endif
return
soc_common_drv_pcmcia_probe
(
dev
,
ops
,
first
,
nr
);
}
EXPORT_SYMBOL
(
sa11xx_drv_pcmcia_probe
);
#ifdef CONFIG_CPU_FREQ
/* sa1100_pcmcia_update_mecr()
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^
* When sa1100_pcmcia_notifier() decides that a MECR adjustment (due
* to a core clock frequency change) is needed, this routine establishes
* new BS_xx values consistent with the clock speed `clock'.
*/
static
void
sa1100_pcmcia_update_mecr
(
unsigned
int
clock
)
{
struct
soc_pcmcia_socket
*
skt
;
down
(
&
soc_pcmcia_sockets_lock
);
list_for_each_entry
(
skt
,
&
soc_pcmcia_sockets
,
node
)
sa1100_pcmcia_set_mecr
(
skt
,
clock
);
up
(
&
soc_pcmcia_sockets_lock
);
}
/* sa1100_pcmcia_notifier()
* ^^^^^^^^^^^^^^^^^^^^^^^^
* When changing the processor core clock frequency, it is necessary
* to adjust the MECR timings accordingly. We've recorded the timings
* requested by Card Services, so this is just a matter of finding
* out what our current speed is, and then recomputing the new MECR
* values.
*
* Returns: 0 on success, -1 on error
*/
static
int
sa1100_pcmcia_notifier
(
struct
notifier_block
*
nb
,
unsigned
long
val
,
void
*
data
)
{
struct
cpufreq_freqs
*
freqs
=
data
;
switch
(
val
)
{
case
CPUFREQ_PRECHANGE
:
if
(
freqs
->
new
>
freqs
->
old
)
sa1100_pcmcia_update_mecr
(
freqs
->
new
);
break
;
case
CPUFREQ_POSTCHANGE
:
if
(
freqs
->
new
<
freqs
->
old
)
sa1100_pcmcia_update_mecr
(
freqs
->
new
);
break
;
case
CPUFREQ_RESUMECHANGE
:
sa1100_pcmcia_update_mecr
(
freqs
->
new
);
break
;
}
return
0
;
}
static
struct
notifier_block
sa1100_pcmcia_notifier_block
=
{
.
notifier_call
=
sa1100_pcmcia_notifier
};
static
int
__init
sa11xx_pcmcia_init
(
void
)
{
int
ret
;
printk
(
KERN_INFO
"SA11xx PCMCIA
\n
"
);
ret
=
cpufreq_register_notifier
(
&
sa1100_pcmcia_notifier_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
if
(
ret
<
0
)
printk
(
KERN_ERR
"Unable to register CPU frequency change "
"notifier (%d)
\n
"
,
ret
);
return
ret
;
return
0
;
}
module_init
(
sa11xx_pcmcia_init
);
static
void
__exit
sa11xx_pcmcia_exit
(
void
)
{
cpufreq_unregister_notifier
(
&
sa1100_pcmcia_notifier_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
}
static
void
__exit
sa11xx_pcmcia_exit
(
void
)
{}
module_exit
(
sa11xx_pcmcia_exit
);
#endif
MODULE_AUTHOR
(
"John Dorsey <john+@cs.cmu.edu>"
);
MODULE_DESCRIPTION
(
"Linux PCMCIA Card Services: SA-11xx core socket driver"
);
...
...
drivers/pcmcia/soc_common.c
View file @
fef3278f
...
...
@@ -31,6 +31,7 @@
======================================================================*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
...
...
@@ -39,6 +40,7 @@
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/cpufreq.h>
#include <asm/hardware.h>
#include <asm/io.h>
...
...
@@ -614,6 +616,49 @@ struct skt_dev_info {
#define SKT_DEV_INFO_SIZE(n) \
(sizeof(struct skt_dev_info) + (n)*sizeof(struct soc_pcmcia_socket))
#ifdef CONFIG_CPU_FREQ
static
int
soc_pcmcia_notifier
(
struct
notifier_block
*
nb
,
unsigned
long
val
,
void
*
data
)
{
struct
soc_pcmcia_socket
*
skt
;
struct
cpufreq_freqs
*
freqs
=
data
;
int
ret
=
0
;
down
(
&
soc_pcmcia_sockets_lock
);
list_for_each_entry
(
skt
,
&
soc_pcmcia_sockets
,
node
)
if
(
skt
->
ops
->
frequency_change
)
ret
+=
skt
->
ops
->
frequency_change
(
skt
,
val
,
freqs
);
up
(
&
soc_pcmcia_sockets_lock
);
return
ret
;
}
static
struct
notifier_block
soc_pcmcia_notifier_block
=
{
.
notifier_call
=
soc_pcmcia_notifier
};
static
int
soc_pcmcia_cpufreq_register
(
void
)
{
int
ret
;
ret
=
cpufreq_register_notifier
(
&
soc_pcmcia_notifier_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
if
(
ret
<
0
)
printk
(
KERN_ERR
"Unable to register CPU frequency change "
"notifier for PCMCIA (%d)
\n
"
,
ret
);
return
ret
;
}
static
void
soc_pcmcia_cpufreq_unregister
(
void
)
{
cpufreq_unregister_notifier
(
&
soc_pcmcia_notifier_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
}
#else
#define soc_pcmcia_cpufreq_register()
#define soc_pcmcia_cpufreq_unregister()
#endif
int
soc_common_drv_pcmcia_probe
(
struct
device
*
dev
,
struct
pcmcia_low_level
*
ops
,
int
first
,
int
nr
)
{
struct
skt_dev_info
*
sinfo
;
...
...
@@ -692,6 +737,9 @@ int soc_common_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops
goto
out_err_5
;
}
if
(
list_empty
(
&
soc_pcmcia_sockets
)
)
soc_pcmcia_cpufreq_register
();
list_add
(
&
skt
->
node
,
&
soc_pcmcia_sockets
);
/*
...
...
@@ -789,6 +837,9 @@ int soc_common_drv_pcmcia_remove(struct device *dev)
release_resource
(
&
skt
->
res_io
);
release_resource
(
&
skt
->
res_skt
);
}
if
(
list_empty
(
&
soc_pcmcia_sockets
)
)
soc_pcmcia_cpufreq_unregister
();
up
(
&
soc_pcmcia_sockets_lock
);
kfree
(
sinfo
);
...
...
drivers/pcmcia/soc_common.h
View file @
fef3278f
...
...
@@ -10,6 +10,7 @@
#define _ASM_ARCH_PCMCIA
/* include the world */
#include <linux/cpufreq.h>
#include <pcmcia/version.h>
#include <pcmcia/cs_types.h>
#include <pcmcia/cs.h>
...
...
@@ -103,6 +104,13 @@ struct pcmcia_low_level {
unsigned
int
(
*
get_timing
)(
struct
soc_pcmcia_socket
*
,
unsigned
int
,
unsigned
int
);
int
(
*
set_timing
)(
struct
soc_pcmcia_socket
*
);
int
(
*
show_timing
)(
struct
soc_pcmcia_socket
*
,
char
*
);
#ifdef CONFIG_CPU_FREQ
/*
* CPUFREQ support.
*/
int
(
*
frequency_change
)(
struct
soc_pcmcia_socket
*
,
unsigned
long
,
struct
cpufreq_freqs
*
);
#endif
};
...
...
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