Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
59603b9a
Commit
59603b9a
authored
Mar 09, 2010
by
Benjamin Herrenschmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'kumar/next' into merge
parents
57d54889
a1110654
Changes
22
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
1045 additions
and
174 deletions
+1045
-174
arch/powerpc/boot/dts/gef_ppc9a.dts
arch/powerpc/boot/dts/gef_ppc9a.dts
+2
-2
arch/powerpc/boot/dts/gef_sbc310.dts
arch/powerpc/boot/dts/gef_sbc310.dts
+2
-2
arch/powerpc/boot/dts/gef_sbc610.dts
arch/powerpc/boot/dts/gef_sbc610.dts
+2
-2
arch/powerpc/include/asm/perf_event.h
arch/powerpc/include/asm/perf_event.h
+11
-98
arch/powerpc/include/asm/perf_event_fsl_emb.h
arch/powerpc/include/asm/perf_event_fsl_emb.h
+50
-0
arch/powerpc/include/asm/perf_event_server.h
arch/powerpc/include/asm/perf_event_server.h
+110
-0
arch/powerpc/include/asm/reg_fsl_emb.h
arch/powerpc/include/asm/reg_fsl_emb.h
+1
-1
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/Makefile
+6
-1
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/cputable.c
+1
-1
arch/powerpc/kernel/e500-pmu.c
arch/powerpc/kernel/e500-pmu.c
+129
-0
arch/powerpc/kernel/perf_event_fsl_emb.c
arch/powerpc/kernel/perf_event_fsl_emb.c
+654
-0
arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
+5
-5
arch/powerpc/platforms/85xx/socrates_fpga_pic.c
arch/powerpc/platforms/85xx/socrates_fpga_pic.c
+17
-17
arch/powerpc/platforms/86xx/Kconfig
arch/powerpc/platforms/86xx/Kconfig
+6
-6
arch/powerpc/platforms/86xx/gef_gpio.c
arch/powerpc/platforms/86xx/gef_gpio.c
+5
-5
arch/powerpc/platforms/86xx/gef_pic.c
arch/powerpc/platforms/86xx/gef_pic.c
+10
-10
arch/powerpc/platforms/86xx/gef_ppc9a.c
arch/powerpc/platforms/86xx/gef_ppc9a.c
+6
-6
arch/powerpc/platforms/86xx/gef_sbc310.c
arch/powerpc/platforms/86xx/gef_sbc310.c
+6
-6
arch/powerpc/platforms/86xx/gef_sbc610.c
arch/powerpc/platforms/86xx/gef_sbc610.c
+6
-6
arch/powerpc/platforms/Kconfig.cputype
arch/powerpc/platforms/Kconfig.cputype
+10
-0
arch/powerpc/sysdev/cpm2_pic.h
arch/powerpc/sysdev/cpm2_pic.h
+1
-1
arch/powerpc/sysdev/qe_lib/qe_ic.c
arch/powerpc/sysdev/qe_lib/qe_ic.c
+5
-5
No files found.
arch/powerpc/boot/dts/gef_ppc9a.dts
View file @
59603b9a
/*
*
GE
Fanuc
PPC9A
Device
Tree
Source
*
GE
PPC9A
Device
Tree
Source
*
*
Copyright
2008
GE
Fanuc
Intelligent
Platforms
Embedded
Systems
,
Inc
.
*
Copyright
2008
GE
Intelligent
Platforms
Embedded
Systems
,
Inc
.
*
*
This
program
is
free
software
;
you
can
redistribute
it
and
/
or
modify
it
*
under
the
terms
of
the
GNU
General
Public
License
as
published
by
the
...
...
arch/powerpc/boot/dts/gef_sbc310.dts
View file @
59603b9a
/*
*
GE
Fanuc
SBC310
Device
Tree
Source
*
GE
SBC310
Device
Tree
Source
*
*
Copyright
2008
GE
Fanuc
Intelligent
Platforms
Embedded
Systems
,
Inc
.
*
Copyright
2008
GE
Intelligent
Platforms
Embedded
Systems
,
Inc
.
*
*
This
program
is
free
software
;
you
can
redistribute
it
and
/
or
modify
it
*
under
the
terms
of
the
GNU
General
Public
License
as
published
by
the
...
...
arch/powerpc/boot/dts/gef_sbc610.dts
View file @
59603b9a
/*
*
GE
Fanuc
SBC610
Device
Tree
Source
*
GE
SBC610
Device
Tree
Source
*
*
Copyright
2008
GE
Fanuc
Intelligent
Platforms
Embedded
Systems
,
Inc
.
*
Copyright
2008
GE
Intelligent
Platforms
Embedded
Systems
,
Inc
.
*
*
This
program
is
free
software
;
you
can
redistribute
it
and
/
or
modify
it
*
under
the
terms
of
the
GNU
General
Public
License
as
published
by
the
...
...
arch/powerpc/include/asm/perf_event.h
View file @
59603b9a
/*
* Performance event support -
PowerPC-specific definitions.
* Performance event support -
hardware-specific disambiguation
*
* Copyright 2008-2009 Paul Mackerras, IBM Corporation.
* For now this is a compile-time decision, but eventually it should be
* runtime. This would allow multiplatform perf event support for e300 (fsl
* embedded perf counters) plus server/classic, and would accommodate
* devices other than the core which provide their own performance counters.
*
* Copyright 2010 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/types.h>
#include <asm/hw_irq.h>
#define MAX_HWEVENTS 8
#define MAX_EVENT_ALTERNATIVES 8
#define MAX_LIMITED_HWCOUNTERS 2
/*
* This struct provides the constants and functions needed to
* describe the PMU on a particular POWER-family CPU.
*/
struct
power_pmu
{
const
char
*
name
;
int
n_counter
;
int
max_alternatives
;
unsigned
long
add_fields
;
unsigned
long
test_adder
;
int
(
*
compute_mmcr
)(
u64
events
[],
int
n_ev
,
unsigned
int
hwc
[],
unsigned
long
mmcr
[]);
int
(
*
get_constraint
)(
u64
event_id
,
unsigned
long
*
mskp
,
unsigned
long
*
valp
);
int
(
*
get_alternatives
)(
u64
event_id
,
unsigned
int
flags
,
u64
alt
[]);
void
(
*
disable_pmc
)(
unsigned
int
pmc
,
unsigned
long
mmcr
[]);
int
(
*
limited_pmc_event
)(
u64
event_id
);
u32
flags
;
int
n_generic
;
int
*
generic_events
;
int
(
*
cache_events
)[
PERF_COUNT_HW_CACHE_MAX
]
[
PERF_COUNT_HW_CACHE_OP_MAX
]
[
PERF_COUNT_HW_CACHE_RESULT_MAX
];
};
/*
* Values for power_pmu.flags
*/
#define PPMU_LIMITED_PMC5_6 1
/* PMC5/6 have limited function */
#define PPMU_ALT_SIPR 2
/* uses alternate posn for SIPR/HV */
/*
* Values for flags to get_alternatives()
*/
#define PPMU_LIMITED_PMC_OK 1
/* can put this on a limited PMC */
#define PPMU_LIMITED_PMC_REQD 2
/* have to put this on a limited PMC */
#define PPMU_ONLY_COUNT_RUN 4
/* only counting in run state */
extern
int
register_power_pmu
(
struct
power_pmu
*
);
struct
pt_regs
;
extern
unsigned
long
perf_misc_flags
(
struct
pt_regs
*
regs
);
extern
unsigned
long
perf_instruction_pointer
(
struct
pt_regs
*
regs
);
#define PERF_EVENT_INDEX_OFFSET 1
/*
* Only override the default definitions in include/linux/perf_event.h
* if we have hardware PMU support.
*/
#ifdef CONFIG_PPC_PERF_CTRS
#
define perf_misc_flags(regs) perf_misc_flags(regs)
#
include <asm/perf_event_server.h>
#endif
/*
* The power_pmu.get_constraint function returns a 32/64-bit value and
* a 32/64-bit mask that express the constraints between this event_id and
* other events.
*
* The value and mask are divided up into (non-overlapping) bitfields
* of three different types:
*
* Select field: this expresses the constraint that some set of bits
* in MMCR* needs to be set to a specific value for this event_id. For a
* select field, the mask contains 1s in every bit of the field, and
* the value contains a unique value for each possible setting of the
* MMCR* bits. The constraint checking code will ensure that two events
* that set the same field in their masks have the same value in their
* value dwords.
*
* Add field: this expresses the constraint that there can be at most
* N events in a particular class. A field of k bits can be used for
* N <= 2^(k-1) - 1. The mask has the most significant bit of the field
* set (and the other bits 0), and the value has only the least significant
* bit of the field set. In addition, the 'add_fields' and 'test_adder'
* in the struct power_pmu for this processor come into play. The
* add_fields value contains 1 in the LSB of the field, and the
* test_adder contains 2^(k-1) - 1 - N in the field.
*
* NAND field: this expresses the constraint that you may not have events
* in all of a set of classes. (For example, on PPC970, you can't select
* events from the FPU, ISU and IDU simultaneously, although any two are
* possible.) For N classes, the field is N+1 bits wide, and each class
* is assigned one bit from the least-significant N bits. The mask has
* only the most-significant bit set, and the value has only the bit
* for the event_id's class set. The test_adder has the least significant
* bit set in the field.
*
* If an event_id is not subject to the constraint expressed by a particular
* field, then it will have 0 in both the mask and value for that field.
*/
#ifdef CONFIG_FSL_EMB_PERF_EVENT
#include <asm/perf_event_fsl_emb.h>
#endif
arch/powerpc/include/asm/perf_event_fsl_emb.h
0 → 100644
View file @
59603b9a
/*
* Performance event support - Freescale embedded specific definitions.
*
* Copyright 2008-2009 Paul Mackerras, IBM Corporation.
* Copyright 2010 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/types.h>
#include <asm/hw_irq.h>
#define MAX_HWEVENTS 4
/* event flags */
#define FSL_EMB_EVENT_VALID 1
#define FSL_EMB_EVENT_RESTRICTED 2
/* upper half of event flags is PMLCb */
#define FSL_EMB_EVENT_THRESHMUL 0x0000070000000000ULL
#define FSL_EMB_EVENT_THRESH 0x0000003f00000000ULL
struct
fsl_emb_pmu
{
const
char
*
name
;
int
n_counter
;
/* total number of counters */
/*
* The number of contiguous counters starting at zero that
* can hold restricted events, or zero if there are no
* restricted events.
*
* This isn't a very flexible method of expressing constraints,
* but it's very simple and is adequate for existing chips.
*/
int
n_restricted
;
/* Returns event flags and PMLCb (FSL_EMB_EVENT_*) */
u64
(
*
xlate_event
)(
u64
event_id
);
int
n_generic
;
int
*
generic_events
;
int
(
*
cache_events
)[
PERF_COUNT_HW_CACHE_MAX
]
[
PERF_COUNT_HW_CACHE_OP_MAX
]
[
PERF_COUNT_HW_CACHE_RESULT_MAX
];
};
int
register_fsl_emb_pmu
(
struct
fsl_emb_pmu
*
);
arch/powerpc/include/asm/perf_event_server.h
0 → 100644
View file @
59603b9a
/*
* Performance event support - PowerPC classic/server specific definitions.
*
* Copyright 2008-2009 Paul Mackerras, IBM Corporation.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/types.h>
#include <asm/hw_irq.h>
#define MAX_HWEVENTS 8
#define MAX_EVENT_ALTERNATIVES 8
#define MAX_LIMITED_HWCOUNTERS 2
/*
* This struct provides the constants and functions needed to
* describe the PMU on a particular POWER-family CPU.
*/
struct
power_pmu
{
const
char
*
name
;
int
n_counter
;
int
max_alternatives
;
unsigned
long
add_fields
;
unsigned
long
test_adder
;
int
(
*
compute_mmcr
)(
u64
events
[],
int
n_ev
,
unsigned
int
hwc
[],
unsigned
long
mmcr
[]);
int
(
*
get_constraint
)(
u64
event_id
,
unsigned
long
*
mskp
,
unsigned
long
*
valp
);
int
(
*
get_alternatives
)(
u64
event_id
,
unsigned
int
flags
,
u64
alt
[]);
void
(
*
disable_pmc
)(
unsigned
int
pmc
,
unsigned
long
mmcr
[]);
int
(
*
limited_pmc_event
)(
u64
event_id
);
u32
flags
;
int
n_generic
;
int
*
generic_events
;
int
(
*
cache_events
)[
PERF_COUNT_HW_CACHE_MAX
]
[
PERF_COUNT_HW_CACHE_OP_MAX
]
[
PERF_COUNT_HW_CACHE_RESULT_MAX
];
};
/*
* Values for power_pmu.flags
*/
#define PPMU_LIMITED_PMC5_6 1
/* PMC5/6 have limited function */
#define PPMU_ALT_SIPR 2
/* uses alternate posn for SIPR/HV */
/*
* Values for flags to get_alternatives()
*/
#define PPMU_LIMITED_PMC_OK 1
/* can put this on a limited PMC */
#define PPMU_LIMITED_PMC_REQD 2
/* have to put this on a limited PMC */
#define PPMU_ONLY_COUNT_RUN 4
/* only counting in run state */
extern
int
register_power_pmu
(
struct
power_pmu
*
);
struct
pt_regs
;
extern
unsigned
long
perf_misc_flags
(
struct
pt_regs
*
regs
);
extern
unsigned
long
perf_instruction_pointer
(
struct
pt_regs
*
regs
);
#define PERF_EVENT_INDEX_OFFSET 1
/*
* Only override the default definitions in include/linux/perf_event.h
* if we have hardware PMU support.
*/
#ifdef CONFIG_PPC_PERF_CTRS
#define perf_misc_flags(regs) perf_misc_flags(regs)
#endif
/*
* The power_pmu.get_constraint function returns a 32/64-bit value and
* a 32/64-bit mask that express the constraints between this event_id and
* other events.
*
* The value and mask are divided up into (non-overlapping) bitfields
* of three different types:
*
* Select field: this expresses the constraint that some set of bits
* in MMCR* needs to be set to a specific value for this event_id. For a
* select field, the mask contains 1s in every bit of the field, and
* the value contains a unique value for each possible setting of the
* MMCR* bits. The constraint checking code will ensure that two events
* that set the same field in their masks have the same value in their
* value dwords.
*
* Add field: this expresses the constraint that there can be at most
* N events in a particular class. A field of k bits can be used for
* N <= 2^(k-1) - 1. The mask has the most significant bit of the field
* set (and the other bits 0), and the value has only the least significant
* bit of the field set. In addition, the 'add_fields' and 'test_adder'
* in the struct power_pmu for this processor come into play. The
* add_fields value contains 1 in the LSB of the field, and the
* test_adder contains 2^(k-1) - 1 - N in the field.
*
* NAND field: this expresses the constraint that you may not have events
* in all of a set of classes. (For example, on PPC970, you can't select
* events from the FPU, ISU and IDU simultaneously, although any two are
* possible.) For N classes, the field is N+1 bits wide, and each class
* is assigned one bit from the least-significant N bits. The mask has
* only the most-significant bit set, and the value has only the bit
* for the event_id's class set. The test_adder has the least significant
* bit set in the field.
*
* If an event_id is not subject to the constraint expressed by a particular
* field, then it will have 0 in both the mask and value for that field.
*/
arch/powerpc/include/asm/reg_fsl_emb.h
View file @
59603b9a
...
...
@@ -31,7 +31,7 @@
#define PMLCA_FCM0 0x08000000
/* Freeze when PMM==0 */
#define PMLCA_CE 0x04000000
/* Condition Enable */
#define PMLCA_EVENT_MASK 0x00
7
f0000
/* Event field */
#define PMLCA_EVENT_MASK 0x00
f
f0000
/* Event field */
#define PMLCA_EVENT_SHIFT 16
#define PMRN_PMLCB0 0x110
/* PM Local Control B0 */
...
...
arch/powerpc/kernel/Makefile
View file @
59603b9a
...
...
@@ -98,11 +98,16 @@ obj64-$(CONFIG_AUDIT) += compat_audit.o
obj-$(CONFIG_DYNAMIC_FTRACE)
+=
ftrace.o
obj-$(CONFIG_FUNCTION_GRAPH_TRACER)
+=
ftrace.o
obj-$(CONFIG_PPC_PERF_CTRS)
+=
perf_event.o perf_callchain.o
obj-$(CONFIG_PERF_EVENTS)
+=
perf_callchain.o
obj-$(CONFIG_PPC_PERF_CTRS)
+=
perf_event.o
obj64-$(CONFIG_PPC_PERF_CTRS)
+=
power4-pmu.o ppc970-pmu.o power5-pmu.o
\
power5+-pmu.o power6-pmu.o power7-pmu.o
obj32-$(CONFIG_PPC_PERF_CTRS)
+=
mpc7450-pmu.o
obj-$(CONFIG_FSL_EMB_PERF_EVENT)
+=
perf_event_fsl_emb.o
obj-$(CONFIG_FSL_EMB_PERF_EVENT_E500)
+=
e500-pmu.o
obj-$(CONFIG_8XX_MINIMAL_FPEMU)
+=
softemu8xx.o
ifneq
($(CONFIG_PPC_INDIRECT_IO),y)
...
...
arch/powerpc/kernel/cputable.c
View file @
59603b9a
...
...
@@ -1808,7 +1808,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.
icache_bsize
=
64
,
.
dcache_bsize
=
64
,
.
num_pmcs
=
4
,
.
oprofile_cpu_type
=
"ppc/e500
"
,
/* xxx - galak, e500mc? */
.
oprofile_cpu_type
=
"ppc/e500
mc"
,
.
oprofile_type
=
PPC_OPROFILE_FSL_EMB
,
.
cpu_setup
=
__setup_cpu_e500mc
,
.
machine_check
=
machine_check_e500
,
...
...
arch/powerpc/kernel/e500-pmu.c
0 → 100644
View file @
59603b9a
/*
* Performance counter support for e500 family processors.
*
* Copyright 2008-2009 Paul Mackerras, IBM Corporation.
* Copyright 2010 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/string.h>
#include <linux/perf_event.h>
#include <asm/reg.h>
#include <asm/cputable.h>
/*
* Map of generic hardware event types to hardware events
* Zero if unsupported
*/
static
int
e500_generic_events
[]
=
{
[
PERF_COUNT_HW_CPU_CYCLES
]
=
1
,
[
PERF_COUNT_HW_INSTRUCTIONS
]
=
2
,
[
PERF_COUNT_HW_CACHE_MISSES
]
=
41
,
/* Data L1 cache reloads */
[
PERF_COUNT_HW_BRANCH_INSTRUCTIONS
]
=
12
,
[
PERF_COUNT_HW_BRANCH_MISSES
]
=
15
,
};
#define C(x) PERF_COUNT_HW_CACHE_##x
/*
* Table of generalized cache-related events.
* 0 means not supported, -1 means nonsensical, other values
* are event codes.
*/
static
int
e500_cache_events
[
C
(
MAX
)][
C
(
OP_MAX
)][
C
(
RESULT_MAX
)]
=
{
/*
* D-cache misses are not split into read/write/prefetch;
* use raw event 41.
*/
[
C
(
L1D
)]
=
{
/* RESULT_ACCESS RESULT_MISS */
[
C
(
OP_READ
)]
=
{
27
,
0
},
[
C
(
OP_WRITE
)]
=
{
28
,
0
},
[
C
(
OP_PREFETCH
)]
=
{
29
,
0
},
},
[
C
(
L1I
)]
=
{
/* RESULT_ACCESS RESULT_MISS */
[
C
(
OP_READ
)]
=
{
2
,
60
},
[
C
(
OP_WRITE
)]
=
{
-
1
,
-
1
},
[
C
(
OP_PREFETCH
)]
=
{
0
,
0
},
},
/*
* Assuming LL means L2, it's not a good match for this model.
* It allocates only on L1 castout or explicit prefetch, and
* does not have separate read/write events (but it does have
* separate instruction/data events).
*/
[
C
(
LL
)]
=
{
/* RESULT_ACCESS RESULT_MISS */
[
C
(
OP_READ
)]
=
{
0
,
0
},
[
C
(
OP_WRITE
)]
=
{
0
,
0
},
[
C
(
OP_PREFETCH
)]
=
{
0
,
0
},
},
/*
* There are data/instruction MMU misses, but that's a miss on
* the chip's internal level-one TLB which is probably not
* what the user wants. Instead, unified level-two TLB misses
* are reported here.
*/
[
C
(
DTLB
)]
=
{
/* RESULT_ACCESS RESULT_MISS */
[
C
(
OP_READ
)]
=
{
26
,
66
},
[
C
(
OP_WRITE
)]
=
{
-
1
,
-
1
},
[
C
(
OP_PREFETCH
)]
=
{
-
1
,
-
1
},
},
[
C
(
BPU
)]
=
{
/* RESULT_ACCESS RESULT_MISS */
[
C
(
OP_READ
)]
=
{
12
,
15
},
[
C
(
OP_WRITE
)]
=
{
-
1
,
-
1
},
[
C
(
OP_PREFETCH
)]
=
{
-
1
,
-
1
},
},
};
static
int
num_events
=
128
;
/* Upper half of event id is PMLCb, for threshold events */
static
u64
e500_xlate_event
(
u64
event_id
)
{
u32
event_low
=
(
u32
)
event_id
;
u64
ret
;
if
(
event_low
>=
num_events
)
return
0
;
ret
=
FSL_EMB_EVENT_VALID
;
if
(
event_low
>=
76
&&
event_low
<=
81
)
{
ret
|=
FSL_EMB_EVENT_RESTRICTED
;
ret
|=
event_id
&
(
FSL_EMB_EVENT_THRESHMUL
|
FSL_EMB_EVENT_THRESH
);
}
else
if
(
event_id
&
(
FSL_EMB_EVENT_THRESHMUL
|
FSL_EMB_EVENT_THRESH
))
{
/* Threshold requested on non-threshold event */
return
0
;
}
return
ret
;
}
static
struct
fsl_emb_pmu
e500_pmu
=
{
.
name
=
"e500 family"
,
.
n_counter
=
4
,
.
n_restricted
=
2
,
.
xlate_event
=
e500_xlate_event
,
.
n_generic
=
ARRAY_SIZE
(
e500_generic_events
),
.
generic_events
=
e500_generic_events
,
.
cache_events
=
&
e500_cache_events
,
};
static
int
init_e500_pmu
(
void
)
{
if
(
!
cur_cpu_spec
->
oprofile_cpu_type
)
return
-
ENODEV
;
if
(
!
strcmp
(
cur_cpu_spec
->
oprofile_cpu_type
,
"ppc/e500mc"
))
num_events
=
256
;
else
if
(
strcmp
(
cur_cpu_spec
->
oprofile_cpu_type
,
"ppc/e500"
))
return
-
ENODEV
;
return
register_fsl_emb_pmu
(
&
e500_pmu
);
}
arch_initcall
(
init_e500_pmu
);
arch/powerpc/kernel/perf_event_fsl_emb.c
0 → 100644
View file @
59603b9a
This diff is collapsed.
Click to expand it.
arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
View file @
59603b9a
...
...
@@ -24,7 +24,7 @@
#include "pq2.h"
static
DEFINE_SPINLOCK
(
pci_pic_lock
);
static
DEFINE_
RAW_
SPINLOCK
(
pci_pic_lock
);
struct
pq2ads_pci_pic
{
struct
device_node
*
node
;
...
...
@@ -45,12 +45,12 @@ static void pq2ads_pci_mask_irq(unsigned int virq)
if
(
irq
!=
-
1
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
pci_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
pci_pic_lock
,
flags
);
setbits32
(
&
priv
->
regs
->
mask
,
1
<<
irq
);
mb
();
spin_unlock_irqrestore
(
&
pci_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
pci_pic_lock
,
flags
);
}
}
...
...
@@ -62,9 +62,9 @@ static void pq2ads_pci_unmask_irq(unsigned int virq)
if
(
irq
!=
-
1
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
pci_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
pci_pic_lock
,
flags
);
clrbits32
(
&
priv
->
regs
->
mask
,
1
<<
irq
);
spin_unlock_irqrestore
(
&
pci_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
pci_pic_lock
,
flags
);
}
}
...
...
arch/powerpc/platforms/85xx/socrates_fpga_pic.c
View file @
59603b9a
...
...
@@ -50,7 +50,7 @@ static struct socrates_fpga_irq_info fpga_irqs[SOCRATES_FPGA_NUM_IRQS] = {
#define socrates_fpga_irq_to_hw(virq) ((unsigned int)irq_map[virq].hwirq)
static
DEFINE_SPINLOCK
(
socrates_fpga_pic_lock
);
static
DEFINE_
RAW_
SPINLOCK
(
socrates_fpga_pic_lock
);
static
void
__iomem
*
socrates_fpga_pic_iobase
;
static
struct
irq_host
*
socrates_fpga_pic_irq_host
;
...
...
@@ -80,9 +80,9 @@ static inline unsigned int socrates_fpga_pic_get_irq(unsigned int irq)
if
(
i
==
3
)
return
NO_IRQ
;
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
cause
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQMASK
(
i
));
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
for
(
i
=
SOCRATES_FPGA_NUM_IRQS
-
1
;
i
>=
0
;
i
--
)
{
if
(
cause
>>
(
i
+
16
))
break
;
...
...
@@ -116,12 +116,12 @@ static void socrates_fpga_pic_ack(unsigned int virq)
hwirq
=
socrates_fpga_irq_to_hw
(
virq
);
irq_line
=
fpga_irqs
[
hwirq
].
irq_line
;
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
mask
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQMASK
(
irq_line
))
&
SOCRATES_FPGA_IRQ_MASK
;
mask
|=
(
1
<<
(
hwirq
+
16
));
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
irq_line
),
mask
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
}
static
void
socrates_fpga_pic_mask
(
unsigned
int
virq
)
...
...
@@ -134,12 +134,12 @@ static void socrates_fpga_pic_mask(unsigned int virq)
hwirq
=
socrates_fpga_irq_to_hw
(
virq
);
irq_line
=
fpga_irqs
[
hwirq
].
irq_line
;
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
mask
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQMASK
(
irq_line
))
&
SOCRATES_FPGA_IRQ_MASK
;
mask
&=
~
(
1
<<
hwirq
);
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
irq_line
),
mask
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
}
static
void
socrates_fpga_pic_mask_ack
(
unsigned
int
virq
)
...
...
@@ -152,13 +152,13 @@ static void socrates_fpga_pic_mask_ack(unsigned int virq)
hwirq
=
socrates_fpga_irq_to_hw
(
virq
);
irq_line
=
fpga_irqs
[
hwirq
].
irq_line
;
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
mask
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQMASK
(
irq_line
))
&
SOCRATES_FPGA_IRQ_MASK
;
mask
&=
~
(
1
<<
hwirq
);
mask
|=
(
1
<<
(
hwirq
+
16
));
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
irq_line
),
mask
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
}
static
void
socrates_fpga_pic_unmask
(
unsigned
int
virq
)
...
...
@@ -171,12 +171,12 @@ static void socrates_fpga_pic_unmask(unsigned int virq)
hwirq
=
socrates_fpga_irq_to_hw
(
virq
);
irq_line
=
fpga_irqs
[
hwirq
].
irq_line
;
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
mask
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQMASK
(
irq_line
))
&
SOCRATES_FPGA_IRQ_MASK
;
mask
|=
(
1
<<
hwirq
);
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
irq_line
),
mask
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
}
static
void
socrates_fpga_pic_eoi
(
unsigned
int
virq
)
...
...
@@ -189,12 +189,12 @@ static void socrates_fpga_pic_eoi(unsigned int virq)
hwirq
=
socrates_fpga_irq_to_hw
(
virq
);
irq_line
=
fpga_irqs
[
hwirq
].
irq_line
;
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
mask
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQMASK
(
irq_line
))
&
SOCRATES_FPGA_IRQ_MASK
;
mask
|=
(
1
<<
(
hwirq
+
16
));
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
irq_line
),
mask
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
}
static
int
socrates_fpga_pic_set_type
(
unsigned
int
virq
,
...
...
@@ -220,14 +220,14 @@ static int socrates_fpga_pic_set_type(unsigned int virq,
default:
return
-
EINVAL
;
}
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
mask
=
socrates_fpga_pic_read
(
FPGA_PIC_IRQCFG
);
if
(
polarity
)
mask
|=
(
1
<<
hwirq
);
else
mask
&=
~
(
1
<<
hwirq
);
socrates_fpga_pic_write
(
FPGA_PIC_IRQCFG
,
mask
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
return
0
;
}
...
...
@@ -314,14 +314,14 @@ void socrates_fpga_pic_init(struct device_node *pic)
socrates_fpga_pic_iobase
=
of_iomap
(
pic
,
0
);
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
socrates_fpga_pic_lock
,
flags
);
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
0
),
SOCRATES_FPGA_IRQ_MASK
<<
16
);
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
1
),
SOCRATES_FPGA_IRQ_MASK
<<
16
);
socrates_fpga_pic_write
(
FPGA_PIC_IRQMASK
(
2
),
SOCRATES_FPGA_IRQ_MASK
<<
16
);
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
socrates_fpga_pic_lock
,
flags
);
pr_info
(
"FPGA PIC: Setting up Socrates FPGA PIC
\n
"
);
}
arch/powerpc/platforms/86xx/Kconfig
View file @
59603b9a
...
...
@@ -33,32 +33,32 @@ config MPC8610_HPCD
This option enables support for the MPC8610 HPCD board.
config GEF_PPC9A
bool "GE
Fanuc
PPC9A"
bool "GE PPC9A"
select DEFAULT_UIMAGE
select MMIO_NVRAM
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
help
This option enables support for
GE Fanuc's
PPC9A.
This option enables support for
the GE
PPC9A.
config GEF_SBC310
bool "GE
Fanuc
SBC310"
bool "GE SBC310"
select DEFAULT_UIMAGE
select MMIO_NVRAM
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
help
This option enables support for
GE Fanuc's
SBC310.
This option enables support for
the GE
SBC310.
config GEF_SBC610
bool "GE
Fanuc
SBC610"
bool "GE SBC610"
select DEFAULT_UIMAGE
select MMIO_NVRAM
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
select HAS_RAPIDIO
help
This option enables support for
GE Fanuc's
SBC610.
This option enables support for
the GE
SBC610.
endif
...
...
arch/powerpc/platforms/86xx/gef_gpio.c
View file @
59603b9a
/*
* Driver for GE F
anuc's FPGA based GPIO pins
* Driver for GE F
PGA based GPIO
*
* Author: Martyn Welch <martyn.welch@ge
fanuc
.com>
* Author: Martyn Welch <martyn.welch@ge.com>
*
* 2008 (c) GE
Fanuc
Intelligent Platforms Embedded Systems, Inc.
* 2008 (c) GE Intelligent Platforms Embedded Systems, Inc.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
...
...
@@ -164,6 +164,6 @@ static int __init gef_gpio_init(void)
};
arch_initcall
(
gef_gpio_init
);
MODULE_DESCRIPTION
(
"GE
Fanuc
I/O FPGA GPIO driver"
);
MODULE_AUTHOR
(
"Martyn Welch <martyn.welch@ge
fanuc
.com"
);
MODULE_DESCRIPTION
(
"GE I/O FPGA GPIO driver"
);
MODULE_AUTHOR
(
"Martyn Welch <martyn.welch@ge.com"
);
MODULE_LICENSE
(
"GPL"
);
arch/powerpc/platforms/86xx/gef_pic.c
View file @
59603b9a
/*
* Interrupt handling for GE F
anuc's F
PGA based PIC
* Interrupt handling for GE FPGA based PIC
*
* Author: Martyn Welch <martyn.welch@ge
fanuc
.com>
* Author: Martyn Welch <martyn.welch@ge.com>
*
* 2008 (c) GE
Fanuc
Intelligent Platforms Embedded Systems, Inc.
* 2008 (c) GE Intelligent Platforms Embedded Systems, Inc.
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
...
...
@@ -49,7 +49,7 @@
#define gef_irq_to_hw(virq) ((unsigned int)irq_map[virq].hwirq)
static
DEFINE_SPINLOCK
(
gef_pic_lock
);
static
DEFINE_
RAW_
SPINLOCK
(
gef_pic_lock
);
static
void
__iomem
*
gef_pic_irq_reg_base
;
static
struct
irq_host
*
gef_pic_irq_host
;
...
...
@@ -118,11 +118,11 @@ static void gef_pic_mask(unsigned int virq)
hwirq
=
gef_irq_to_hw
(
virq
);
spin_lock_irqsave
(
&
gef_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
gef_pic_lock
,
flags
);
mask
=
in_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_INTR_MASK
(
0
));
mask
&=
~
(
1
<<
hwirq
);
out_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_INTR_MASK
(
0
),
mask
);
spin_unlock_irqrestore
(
&
gef_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
gef_pic_lock
,
flags
);
}
static
void
gef_pic_mask_ack
(
unsigned
int
virq
)
...
...
@@ -141,11 +141,11 @@ static void gef_pic_unmask(unsigned int virq)
hwirq
=
gef_irq_to_hw
(
virq
);
spin_lock_irqsave
(
&
gef_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
gef_pic_lock
,
flags
);
mask
=
in_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_INTR_MASK
(
0
));
mask
|=
(
1
<<
hwirq
);
out_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_INTR_MASK
(
0
),
mask
);
spin_unlock_irqrestore
(
&
gef_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
gef_pic_lock
,
flags
);
}
static
struct
irq_chip
gef_pic_chip
=
{
...
...
@@ -199,7 +199,7 @@ void __init gef_pic_init(struct device_node *np)
/* Map the devices registers into memory */
gef_pic_irq_reg_base
=
of_iomap
(
np
,
0
);
spin_lock_irqsave
(
&
gef_pic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
gef_pic_lock
,
flags
);
/* Initialise everything as masked. */
out_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_CPU0_INTR_MASK
,
0
);
...
...
@@ -208,7 +208,7 @@ void __init gef_pic_init(struct device_node *np)
out_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_CPU0_MCP_MASK
,
0
);
out_be32
(
gef_pic_irq_reg_base
+
GEF_PIC_CPU1_MCP_MASK
,
0
);
spin_unlock_irqrestore
(
&
gef_pic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
gef_pic_lock
,
flags
);
/* Map controller */
gef_pic_cascade_irq
=
irq_of_parse_and_map
(
np
,
0
);
...
...
arch/powerpc/platforms/86xx/gef_ppc9a.c
View file @
59603b9a
/*
* GE
Fanuc
PPC9A board support
* GE PPC9A board support
*
* Author: Martyn Welch <martyn.welch@ge
fanuc
.com>
* Author: Martyn Welch <martyn.welch@ge.com>
*
* Copyright 2008 GE
Fanuc
Intelligent Platforms Embedded Systems, Inc.
* Copyright 2008 GE Intelligent Platforms Embedded Systems, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
...
...
@@ -82,7 +82,7 @@ static void __init gef_ppc9a_setup_arch(void)
}
#endif
printk
(
KERN_INFO
"GE
Fanuc
Intelligent Platforms PPC9A 6U VME SBC
\n
"
);
printk
(
KERN_INFO
"GE Intelligent Platforms PPC9A 6U VME SBC
\n
"
);
#ifdef CONFIG_SMP
mpc86xx_smp_init
();
...
...
@@ -151,7 +151,7 @@ static void gef_ppc9a_show_cpuinfo(struct seq_file *m)
{
uint
svid
=
mfspr
(
SPRN_SVR
);
seq_printf
(
m
,
"Vendor
\t\t
: GE
Fanuc
Intelligent Platforms
\n
"
);
seq_printf
(
m
,
"Vendor
\t\t
: GE Intelligent Platforms
\n
"
);
seq_printf
(
m
,
"Revision
\t
: %u%c
\n
"
,
gef_ppc9a_get_pcb_rev
(),
(
'A'
+
gef_ppc9a_get_board_rev
()));
...
...
@@ -235,7 +235,7 @@ static int __init declare_of_platform_devices(void)
machine_device_initcall
(
gef_ppc9a
,
declare_of_platform_devices
);
define_machine
(
gef_ppc9a
)
{
.
name
=
"GE
Fanuc
PPC9A"
,
.
name
=
"GE PPC9A"
,
.
probe
=
gef_ppc9a_probe
,
.
setup_arch
=
gef_ppc9a_setup_arch
,
.
init_IRQ
=
gef_ppc9a_init_irq
,
...
...
arch/powerpc/platforms/86xx/gef_sbc310.c
View file @
59603b9a
/*
* GE
Fanuc
SBC310 board support
* GE SBC310 board support
*
* Author: Martyn Welch <martyn.welch@ge
fanuc
.com>
* Author: Martyn Welch <martyn.welch@ge.com>
*
* Copyright 2008 GE
Fanuc
Intelligent Platforms Embedded Systems, Inc.
* Copyright 2008 GE Intelligent Platforms Embedded Systems, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
...
...
@@ -82,7 +82,7 @@ static void __init gef_sbc310_setup_arch(void)
}
#endif
printk
(
KERN_INFO
"GE
Fanuc
Intelligent Platforms SBC310 6U VPX SBC
\n
"
);
printk
(
KERN_INFO
"GE Intelligent Platforms SBC310 6U VPX SBC
\n
"
);
#ifdef CONFIG_SMP
mpc86xx_smp_init
();
...
...
@@ -142,7 +142,7 @@ static void gef_sbc310_show_cpuinfo(struct seq_file *m)
{
uint
svid
=
mfspr
(
SPRN_SVR
);
seq_printf
(
m
,
"Vendor
\t\t
: GE
Fanuc
Intelligent Platforms
\n
"
);
seq_printf
(
m
,
"Vendor
\t\t
: GE Intelligent Platforms
\n
"
);
seq_printf
(
m
,
"Board ID
\t
: 0x%2.2x
\n
"
,
gef_sbc310_get_board_id
());
seq_printf
(
m
,
"Revision
\t
: %u%c
\n
"
,
gef_sbc310_get_pcb_rev
(),
...
...
@@ -223,7 +223,7 @@ static int __init declare_of_platform_devices(void)
machine_device_initcall
(
gef_sbc310
,
declare_of_platform_devices
);
define_machine
(
gef_sbc310
)
{
.
name
=
"GE
Fanuc
SBC310"
,
.
name
=
"GE SBC310"
,
.
probe
=
gef_sbc310_probe
,
.
setup_arch
=
gef_sbc310_setup_arch
,
.
init_IRQ
=
gef_sbc310_init_irq
,
...
...
arch/powerpc/platforms/86xx/gef_sbc610.c
View file @
59603b9a
/*
* GE
Fanuc
SBC610 board support
* GE SBC610 board support
*
* Author: Martyn Welch <martyn.welch@ge
fanuc
.com>
* Author: Martyn Welch <martyn.welch@ge.com>
*
* Copyright 2008 GE
Fanuc
Intelligent Platforms Embedded Systems, Inc.
* Copyright 2008 GE Intelligent Platforms Embedded Systems, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
...
...
@@ -82,7 +82,7 @@ static void __init gef_sbc610_setup_arch(void)
}
#endif
printk
(
KERN_INFO
"GE
Fanuc
Intelligent Platforms SBC610 6U VPX SBC
\n
"
);
printk
(
KERN_INFO
"GE Intelligent Platforms SBC610 6U VPX SBC
\n
"
);
#ifdef CONFIG_SMP
mpc86xx_smp_init
();
...
...
@@ -133,7 +133,7 @@ static void gef_sbc610_show_cpuinfo(struct seq_file *m)
{
uint
svid
=
mfspr
(
SPRN_SVR
);
seq_printf
(
m
,
"Vendor
\t\t
: GE
Fanuc
Intelligent Platforms
\n
"
);
seq_printf
(
m
,
"Vendor
\t\t
: GE Intelligent Platforms
\n
"
);
seq_printf
(
m
,
"Revision
\t
: %u%c
\n
"
,
gef_sbc610_get_pcb_rev
(),
(
'A'
+
gef_sbc610_get_board_rev
()
-
1
));
...
...
@@ -212,7 +212,7 @@ static int __init declare_of_platform_devices(void)
machine_device_initcall
(
gef_sbc610
,
declare_of_platform_devices
);
define_machine
(
gef_sbc610
)
{
.
name
=
"GE
Fanuc
SBC610"
,
.
name
=
"GE SBC610"
,
.
probe
=
gef_sbc610_probe
,
.
setup_arch
=
gef_sbc610_setup_arch
,
.
init_IRQ
=
gef_sbc610_init_irq
,
...
...
arch/powerpc/platforms/Kconfig.cputype
View file @
59603b9a
...
...
@@ -144,6 +144,16 @@ config FSL_EMB_PERFMON
and some e300 cores (c3 and c4). Select this only if your
core supports the Embedded Performance Monitor APU
config FSL_EMB_PERF_EVENT
bool
depends on FSL_EMB_PERFMON && PERF_EVENTS && !PPC_PERF_CTRS
default y
config FSL_EMB_PERF_EVENT_E500
bool
depends on FSL_EMB_PERF_EVENT && E500
default y
config 4xx
bool
depends on 40x || 44x
...
...
arch/powerpc/sysdev/cpm2_pic.h
View file @
59603b9a
...
...
@@ -3,6 +3,6 @@
extern
unsigned
int
cpm2_get_irq
(
void
);
extern
void
cpm2_pic_init
(
struct
device_node
*
);
extern
void
cpm2_pic_init
(
struct
device_node
*
);
#endif
/* _PPC_KERNEL_CPM2_H */
arch/powerpc/sysdev/qe_lib/qe_ic.c
View file @
59603b9a
...
...
@@ -33,7 +33,7 @@
#include "qe_ic.h"
static
DEFINE_SPINLOCK
(
qe_ic_lock
);
static
DEFINE_
RAW_
SPINLOCK
(
qe_ic_lock
);
static
struct
qe_ic_info
qe_ic_info
[]
=
{
[
1
]
=
{
...
...
@@ -201,13 +201,13 @@ static void qe_ic_unmask_irq(unsigned int virq)
unsigned
long
flags
;
u32
temp
;
spin_lock_irqsave
(
&
qe_ic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
qe_ic_lock
,
flags
);
temp
=
qe_ic_read
(
qe_ic
->
regs
,
qe_ic_info
[
src
].
mask_reg
);
qe_ic_write
(
qe_ic
->
regs
,
qe_ic_info
[
src
].
mask_reg
,
temp
|
qe_ic_info
[
src
].
mask
);
spin_unlock_irqrestore
(
&
qe_ic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
qe_ic_lock
,
flags
);
}
static
void
qe_ic_mask_irq
(
unsigned
int
virq
)
...
...
@@ -217,7 +217,7 @@ static void qe_ic_mask_irq(unsigned int virq)
unsigned
long
flags
;
u32
temp
;
spin_lock_irqsave
(
&
qe_ic_lock
,
flags
);
raw_
spin_lock_irqsave
(
&
qe_ic_lock
,
flags
);
temp
=
qe_ic_read
(
qe_ic
->
regs
,
qe_ic_info
[
src
].
mask_reg
);
qe_ic_write
(
qe_ic
->
regs
,
qe_ic_info
[
src
].
mask_reg
,
...
...
@@ -233,7 +233,7 @@ static void qe_ic_mask_irq(unsigned int virq)
*/
mb
();
spin_unlock_irqrestore
(
&
qe_ic_lock
,
flags
);
raw_
spin_unlock_irqrestore
(
&
qe_ic_lock
,
flags
);
}
static
struct
irq_chip
qe_ic_irq_chip
=
{
...
...
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