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
389d0a8a
Commit
389d0a8a
authored
Sep 28, 2018
by
Rob Herring
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dt/cpu-type-rework' into dt/next
parents
da08d8cb
4c29e593
Changes
23
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
111 additions
and
120 deletions
+111
-120
arch/arm/kernel/devtree.c
arch/arm/kernel/devtree.c
+1
-4
arch/arm/kernel/topology.c
arch/arm/kernel/topology.c
+0
-6
arch/arm/mach-shmobile/pm-rcar-gen2.c
arch/arm/mach-shmobile/pm-rcar-gen2.c
+2
-6
arch/arm/mach-shmobile/pm-rmobile.c
arch/arm/mach-shmobile/pm-rmobile.c
+1
-1
arch/arm/mach-shmobile/timer.c
arch/arm/mach-shmobile/timer.c
+2
-8
arch/arm64/kernel/smp.c
arch/arm64/kernel/smp.c
+1
-1
arch/c6x/kernel/setup.c
arch/c6x/kernel/setup.c
+3
-8
arch/microblaze/kernel/cpu/cpuinfo.c
arch/microblaze/kernel/cpu/cpuinfo.c
+4
-2
arch/nios2/kernel/cpuinfo.c
arch/nios2/kernel/cpuinfo.c
+3
-1
arch/openrisc/kernel/setup.c
arch/openrisc/kernel/setup.c
+1
-2
arch/powerpc/platforms/4xx/soc.c
arch/powerpc/platforms/4xx/soc.c
+1
-1
arch/powerpc/platforms/8xx/m8xx_setup.c
arch/powerpc/platforms/8xx/m8xx_setup.c
+3
-2
arch/powerpc/platforms/powermac/feature.c
arch/powerpc/platforms/powermac/feature.c
+18
-33
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/powermac/setup.c
+8
-7
arch/sh/boards/of-generic.c
arch/sh/boards/of-generic.c
+1
-1
arch/x86/kernel/devicetree.c
arch/x86/kernel/devicetree.c
+1
-1
drivers/clk/mvebu/clk-cpu.c
drivers/clk/mvebu/clk-cpu.c
+2
-2
drivers/edac/cpc925_edac.c
drivers/edac/cpc925_edac.c
+2
-18
drivers/iommu/fsl_pamu.c
drivers/iommu/fsl_pamu.c
+1
-1
drivers/of/base.c
drivers/of/base.c
+42
-1
drivers/of/of_numa.c
drivers/of/of_numa.c
+2
-13
drivers/video/fbdev/fsl-diu-fb.c
drivers/video/fbdev/fsl-diu-fb.c
+1
-1
include/linux/of.h
include/linux/of.h
+11
-0
No files found.
arch/arm/kernel/devtree.c
View file @
389d0a8a
...
...
@@ -87,14 +87,11 @@ void __init arm_dt_init_cpu_maps(void)
if
(
!
cpus
)
return
;
for_each_
child_of_node
(
cpus
,
cpu
)
{
for_each_
of_cpu_node
(
cpu
)
{
const
__be32
*
cell
;
int
prop_bytes
;
u32
hwid
;
if
(
of_node_cmp
(
cpu
->
type
,
"cpu"
))
continue
;
pr_debug
(
" * %pOF...
\n
"
,
cpu
);
/*
* A device tree containing CPU nodes with missing "reg"
...
...
arch/arm/kernel/topology.c
View file @
389d0a8a
...
...
@@ -94,12 +94,6 @@ static void __init parse_dt_topology(void)
__cpu_capacity
=
kcalloc
(
nr_cpu_ids
,
sizeof
(
*
__cpu_capacity
),
GFP_NOWAIT
);
cn
=
of_find_node_by_path
(
"/cpus"
);
if
(
!
cn
)
{
pr_err
(
"No CPU information found in DT
\n
"
);
return
;
}
for_each_possible_cpu
(
cpu
)
{
const
u32
*
rate
;
int
len
;
...
...
arch/arm/mach-shmobile/pm-rcar-gen2.c
View file @
389d0a8a
...
...
@@ -50,7 +50,7 @@ void __init rcar_gen2_pm_init(void)
void
__iomem
*
p
;
u32
bar
;
static
int
once
;
struct
device_node
*
np
,
*
cpus
;
struct
device_node
*
np
;
bool
has_a7
=
false
;
bool
has_a15
=
false
;
struct
resource
res
;
...
...
@@ -59,11 +59,7 @@ void __init rcar_gen2_pm_init(void)
if
(
once
++
)
return
;
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
!
cpus
)
return
;
for_each_child_of_node
(
cpus
,
np
)
{
for_each_of_cpu_node
(
np
)
{
if
(
of_device_is_compatible
(
np
,
"arm,cortex-a15"
))
has_a15
=
true
;
else
if
(
of_device_is_compatible
(
np
,
"arm,cortex-a7"
))
...
...
arch/arm/mach-shmobile/pm-rmobile.c
View file @
389d0a8a
...
...
@@ -202,7 +202,7 @@ static void __init get_special_pds(void)
const
struct
of_device_id
*
id
;
/* PM domains containing CPUs */
for_each_
node_by_type
(
np
,
"cpu"
)
for_each_
of_cpu_node
(
np
)
add_special_pd
(
np
,
PD_CPU
);
/* PM domain containing console */
...
...
arch/arm/mach-shmobile/timer.c
View file @
389d0a8a
...
...
@@ -22,22 +22,16 @@
void
__init
shmobile_init_delay
(
void
)
{
struct
device_node
*
np
,
*
cpus
;
struct
device_node
*
np
;
u32
max_freq
=
0
;
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
!
cpus
)
return
;
for_each_child_of_node
(
cpus
,
np
)
{
for_each_of_cpu_node
(
np
)
{
u32
freq
;
if
(
!
of_property_read_u32
(
np
,
"clock-frequency"
,
&
freq
))
max_freq
=
max
(
max_freq
,
freq
);
}
of_node_put
(
cpus
);
if
(
!
max_freq
)
return
;
...
...
arch/arm64/kernel/smp.c
View file @
389d0a8a
...
...
@@ -602,7 +602,7 @@ static void __init of_parse_and_init_cpus(void)
{
struct
device_node
*
dn
;
for_each_
node_by_type
(
dn
,
"cpu"
)
{
for_each_
of_cpu_node
(
dn
)
{
u64
hwid
=
of_get_cpu_mpidr
(
dn
);
if
(
hwid
==
INVALID_HWID
)
...
...
arch/c6x/kernel/setup.c
View file @
389d0a8a
...
...
@@ -96,7 +96,7 @@ static void __init get_cpuinfo(void)
unsigned
long
core_khz
;
u64
tmp
;
struct
cpuinfo_c6x
*
p
;
struct
device_node
*
node
,
*
np
;
struct
device_node
*
node
;
p
=
&
per_cpu
(
cpu_data
,
smp_processor_id
());
...
...
@@ -190,13 +190,8 @@ static void __init get_cpuinfo(void)
p
->
core_id
=
get_coreid
();
node
=
of_find_node_by_name
(
NULL
,
"cpus"
);
if
(
node
)
{
for_each_child_of_node
(
node
,
np
)
if
(
!
strcmp
(
"cpu"
,
np
->
name
))
for_each_of_cpu_node
(
node
)
++
c6x_num_cores
;
of_node_put
(
node
);
}
node
=
of_find_node_by_name
(
NULL
,
"soc"
);
if
(
node
)
{
...
...
arch/microblaze/kernel/cpu/cpuinfo.c
View file @
389d0a8a
...
...
@@ -89,9 +89,9 @@ static struct device_node *cpu;
void
__init
setup_cpuinfo
(
void
)
{
cpu
=
(
struct
device_node
*
)
of_find_node_by_type
(
NULL
,
"cpu"
);
cpu
=
of_get_cpu_node
(
0
,
NULL
);
if
(
!
cpu
)
pr_err
(
"You don't have cpu!!!
\n
"
);
pr_err
(
"You don't have cpu
or are missing cpu reg property
!!!
\n
"
);
pr_info
(
"%s: initialising
\n
"
,
__func__
);
...
...
@@ -117,6 +117,8 @@ void __init setup_cpuinfo(void)
if
(
cpuinfo
.
mmu_privins
)
pr_warn
(
"%s: Stream instructions enabled"
" - USERSPACE CAN LOCK THIS KERNEL!
\n
"
,
__func__
);
of_node_put
(
cpu
);
}
void
__init
setup_cpuinfo_clk
(
void
)
...
...
arch/nios2/kernel/cpuinfo.c
View file @
389d0a8a
...
...
@@ -47,7 +47,7 @@ void __init setup_cpuinfo(void)
const
char
*
str
;
int
len
;
cpu
=
of_
find_node_by_type
(
NULL
,
"cpu"
);
cpu
=
of_
get_cpu_node
(
0
,
NULL
);
if
(
!
cpu
)
panic
(
"%s: No CPU found in devicetree!
\n
"
,
__func__
);
...
...
@@ -120,6 +120,8 @@ void __init setup_cpuinfo(void)
cpuinfo
.
reset_addr
=
fcpu
(
cpu
,
"altr,reset-addr"
);
cpuinfo
.
exception_addr
=
fcpu
(
cpu
,
"altr,exception-addr"
);
cpuinfo
.
fast_tlb_miss_exc_addr
=
fcpu
(
cpu
,
"altr,fast-tlb-miss-addr"
);
of_node_put
(
cpu
);
}
#ifdef CONFIG_PROC_FS
...
...
arch/openrisc/kernel/setup.c
View file @
389d0a8a
...
...
@@ -158,9 +158,8 @@ static struct device_node *setup_find_cpu_node(int cpu)
{
u32
hwid
;
struct
device_node
*
cpun
;
struct
device_node
*
cpus
=
of_find_node_by_path
(
"/cpus"
);
for_each_
available_child_of_node
(
cpus
,
cpun
)
{
for_each_
of_cpu_node
(
cpun
)
{
if
(
of_property_read_u32
(
cpun
,
"reg"
,
&
hwid
))
continue
;
if
(
hwid
==
cpu
)
...
...
arch/powerpc/platforms/4xx/soc.c
View file @
389d0a8a
...
...
@@ -200,7 +200,7 @@ void ppc4xx_reset_system(char *cmd)
u32
reset_type
=
DBCR0_RST_SYSTEM
;
const
u32
*
prop
;
np
=
of_
find_node_by_type
(
NULL
,
"cpu"
);
np
=
of_
get_cpu_node
(
0
,
NULL
);
if
(
np
)
{
prop
=
of_get_property
(
np
,
"reset-type"
,
NULL
);
...
...
arch/powerpc/platforms/8xx/m8xx_setup.c
View file @
389d0a8a
...
...
@@ -66,7 +66,7 @@ static int __init get_freq(char *name, unsigned long *val)
int
found
=
0
;
/* The cpu node should have timebase and clock frequency properties */
cpu
=
of_
find_node_by_type
(
NULL
,
"cpu"
);
cpu
=
of_
get_cpu_node
(
0
,
NULL
);
if
(
cpu
)
{
fp
=
of_get_property
(
cpu
,
name
,
NULL
);
...
...
@@ -147,8 +147,9 @@ void __init mpc8xx_calibrate_decr(void)
* we have to enable the timebase). The decrementer interrupt
* is wired into the vector table, nothing to do here for that.
*/
cpu
=
of_
find_node_by_type
(
NULL
,
"cpu"
);
cpu
=
of_
get_cpu_node
(
0
,
NULL
);
virq
=
irq_of_parse_and_map
(
cpu
,
0
);
of_node_put
(
cpu
);
irq
=
virq_to_hw
(
virq
);
sys_tmr2
=
immr_map
(
im_sit
);
...
...
arch/powerpc/platforms/powermac/feature.c
View file @
389d0a8a
...
...
@@ -1049,7 +1049,6 @@ core99_reset_cpu(struct device_node *node, long param, long value)
unsigned
long
flags
;
struct
macio_chip
*
macio
;
struct
device_node
*
np
;
struct
device_node
*
cpus
;
const
int
dflt_reset_lines
[]
=
{
KL_GPIO_RESET_CPU0
,
KL_GPIO_RESET_CPU1
,
KL_GPIO_RESET_CPU2
,
...
...
@@ -1059,10 +1058,7 @@ core99_reset_cpu(struct device_node *node, long param, long value)
if
(
macio
->
type
!=
macio_keylargo
)
return
-
ENODEV
;
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
cpus
==
NULL
)
return
-
ENODEV
;
for
(
np
=
cpus
->
child
;
np
!=
NULL
;
np
=
np
->
sibling
)
{
for_each_of_cpu_node
(
np
)
{
const
u32
*
num
=
of_get_property
(
np
,
"reg"
,
NULL
);
const
u32
*
rst
=
of_get_property
(
np
,
"soft-reset"
,
NULL
);
if
(
num
==
NULL
||
rst
==
NULL
)
...
...
@@ -1072,7 +1068,6 @@ core99_reset_cpu(struct device_node *node, long param, long value)
break
;
}
}
of_node_put
(
cpus
);
if
(
np
==
NULL
||
reset_io
==
0
)
reset_io
=
dflt_reset_lines
[
param
];
...
...
@@ -1504,16 +1499,12 @@ static long g5_reset_cpu(struct device_node *node, long param, long value)
unsigned
long
flags
;
struct
macio_chip
*
macio
;
struct
device_node
*
np
;
struct
device_node
*
cpus
;
macio
=
&
macio_chips
[
0
];
if
(
macio
->
type
!=
macio_keylargo2
&&
macio
->
type
!=
macio_shasta
)
return
-
ENODEV
;
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
cpus
==
NULL
)
return
-
ENODEV
;
for
(
np
=
cpus
->
child
;
np
!=
NULL
;
np
=
np
->
sibling
)
{
for_each_of_cpu_node
(
np
)
{
const
u32
*
num
=
of_get_property
(
np
,
"reg"
,
NULL
);
const
u32
*
rst
=
of_get_property
(
np
,
"soft-reset"
,
NULL
);
if
(
num
==
NULL
||
rst
==
NULL
)
...
...
@@ -1523,7 +1514,6 @@ static long g5_reset_cpu(struct device_node *node, long param, long value)
break
;
}
}
of_node_put
(
cpus
);
if
(
np
==
NULL
||
reset_io
==
0
)
return
-
ENODEV
;
...
...
@@ -2515,31 +2505,26 @@ static int __init probe_motherboard(void)
* supposed to be set when not supported, but I'm not very confident
* that all Apple OF revs did it properly, I do it the paranoid way.
*/
while
(
uninorth_base
&&
uninorth_rev
>
3
)
{
struct
device_node
*
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
uninorth_base
&&
uninorth_rev
>
3
)
{
struct
device_node
*
np
;
if
(
!
cpus
||
!
cpus
->
child
)
{
printk
(
KERN_WARNING
"Can't find CPU(s) in device tree !
\n
"
);
of_node_put
(
cpus
);
break
;
}
np
=
cpus
->
child
;
for_each_of_cpu_node
(
np
)
{
int
cpu_count
=
1
;
/* Nap mode not supported on SMP */
if
(
np
->
sibling
)
{
of_node_put
(
cpus
);
break
;
}
/* Nap mode not supported if flush-on-lock property is present */
if
(
of_get_property
(
np
,
"flush-on-lock"
,
NULL
))
{
of_node_put
(
cpus
);
if
(
of_get_property
(
np
,
"flush-on-lock"
,
NULL
)
||
(
cpu_count
>
1
))
{
powersave_nap
=
0
;
of_node_put
(
np
);
break
;
}
of_node_put
(
cpus
);
cpu_count
++
;
powersave_nap
=
1
;
printk
(
KERN_DEBUG
"Processor NAP mode on idle enabled.
\n
"
);
break
;
}
}
if
(
powersave_nap
)
printk
(
KERN_DEBUG
"Processor NAP mode on idle enabled.
\n
"
);
/* On CPUs that support it (750FX), lowspeed by default during
* NAP mode
...
...
arch/powerpc/platforms/powermac/setup.c
View file @
389d0a8a
...
...
@@ -243,10 +243,9 @@ static void __init l2cr_init(void)
{
/* Checks "l2cr-value" property in the registry */
if
(
cpu_has_feature
(
CPU_FTR_L2CR
))
{
struct
device_node
*
np
=
of_find_node_by_name
(
NULL
,
"cpus"
);
if
(
!
np
)
np
=
of_find_node_by_type
(
NULL
,
"cpu"
);
if
(
np
)
{
struct
device_node
*
np
;
for_each_of_cpu_node
(
np
)
{
const
unsigned
int
*
l2cr
=
of_get_property
(
np
,
"l2cr-value"
,
NULL
);
if
(
l2cr
)
{
...
...
@@ -256,6 +255,7 @@ static void __init l2cr_init(void)
_set_L2CR
(
ppc_override_l2cr_value
);
}
of_node_put
(
np
);
break
;
}
}
...
...
@@ -279,8 +279,8 @@ static void __init pmac_setup_arch(void)
/* Set loops_per_jiffy to a half-way reasonable value,
for use until calibrate_delay gets called. */
loops_per_jiffy
=
50000000
/
HZ
;
cpu
=
of_find_node_by_type
(
NULL
,
"cpu"
);
if
(
cpu
!=
NULL
)
{
for_each_of_cpu_node
(
cpu
)
{
fp
=
of_get_property
(
cpu
,
"clock-frequency"
,
NULL
);
if
(
fp
!=
NULL
)
{
if
(
pvr
>=
0x30
&&
pvr
<
0x80
)
...
...
@@ -292,8 +292,9 @@ static void __init pmac_setup_arch(void)
else
/* 601, 603, etc. */
loops_per_jiffy
=
*
fp
/
(
2
*
HZ
);
}
of_node_put
(
cpu
);
break
;
}
}
/* See if newworld or oldworld */
...
...
arch/sh/boards/of-generic.c
View file @
389d0a8a
...
...
@@ -64,7 +64,7 @@ static void sh_of_smp_probe(void)
init_cpu_possible
(
cpumask_of
(
0
));
for_each_
node_by_type
(
np
,
"cpu"
)
{
for_each_
of_cpu_node
(
np
)
{
const
__be32
*
cell
=
of_get_property
(
np
,
"reg"
,
NULL
);
u64
id
=
-
1
;
if
(
cell
)
id
=
of_read_number
(
cell
,
of_n_addr_cells
(
np
));
...
...
arch/x86/kernel/devicetree.c
View file @
389d0a8a
...
...
@@ -140,7 +140,7 @@ static void __init dtb_cpu_setup(void)
int
ret
;
version
=
GET_APIC_VERSION
(
apic_read
(
APIC_LVR
));
for_each_
node_by_type
(
dn
,
"cpu"
)
{
for_each_
of_cpu_node
(
dn
)
{
ret
=
of_property_read_u32
(
dn
,
"reg"
,
&
apic_id
);
if
(
ret
<
0
)
{
pr_warn
(
"%pOF: missing local APIC ID
\n
"
,
dn
);
...
...
drivers/clk/mvebu/clk-cpu.c
View file @
389d0a8a
...
...
@@ -183,7 +183,7 @@ static void __init of_cpu_clk_setup(struct device_node *node)
pr_warn
(
"%s: pmu-dfs base register not set, dynamic frequency scaling not available
\n
"
,
__func__
);
for_each_
node_by_type
(
dn
,
"cpu"
)
for_each_
of_cpu_node
(
dn
)
ncpus
++
;
cpuclk
=
kcalloc
(
ncpus
,
sizeof
(
*
cpuclk
),
GFP_KERNEL
);
...
...
@@ -194,7 +194,7 @@ static void __init of_cpu_clk_setup(struct device_node *node)
if
(
WARN_ON
(
!
clks
))
goto
clks_out
;
for_each_
node_by_type
(
dn
,
"cpu"
)
{
for_each_
of_cpu_node
(
dn
)
{
struct
clk_init_data
init
;
struct
clk
*
clk
;
char
*
clk_name
=
kzalloc
(
5
,
GFP_KERNEL
);
...
...
drivers/edac/cpc925_edac.c
View file @
389d0a8a
...
...
@@ -593,8 +593,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)
/******************** CPU err device********************************/
static
u32
cpc925_cpu_mask_disabled
(
void
)
{
struct
device_node
*
cpus
;
struct
device_node
*
cpunode
=
NULL
;
struct
device_node
*
cpunode
;
static
u32
mask
=
0
;
/* use cached value if available */
...
...
@@ -603,20 +602,8 @@ static u32 cpc925_cpu_mask_disabled(void)
mask
=
APIMASK_ADI0
|
APIMASK_ADI1
;
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
cpus
==
NULL
)
{
cpc925_printk
(
KERN_DEBUG
,
"No /cpus node !
\n
"
);
return
0
;
}
while
((
cpunode
=
of_get_next_child
(
cpus
,
cpunode
))
!=
NULL
)
{
for_each_of_cpu_node
(
cpunode
)
{
const
u32
*
reg
=
of_get_property
(
cpunode
,
"reg"
,
NULL
);
if
(
strcmp
(
cpunode
->
type
,
"cpu"
))
{
cpc925_printk
(
KERN_ERR
,
"Not a cpu node in /cpus: %s
\n
"
,
cpunode
->
name
);
continue
;
}
if
(
reg
==
NULL
||
*
reg
>
2
)
{
cpc925_printk
(
KERN_ERR
,
"Bad reg value at %pOF
\n
"
,
cpunode
);
continue
;
...
...
@@ -633,9 +620,6 @@ static u32 cpc925_cpu_mask_disabled(void)
"Assuming PI id is equal to CPU MPIC id!
\n
"
);
}
of_node_put
(
cpunode
);
of_node_put
(
cpus
);
return
mask
;
}
...
...
drivers/iommu/fsl_pamu.c
View file @
389d0a8a
...
...
@@ -543,7 +543,7 @@ u32 get_stash_id(u32 stash_dest_hint, u32 vcpu)
return
~
(
u32
)
0
;
}
for_each_
node_by_type
(
node
,
"cpu"
)
{
for_each_
of_cpu_node
(
node
)
{
prop
=
of_get_property
(
node
,
"reg"
,
&
len
);
for
(
i
=
0
;
i
<
len
/
sizeof
(
u32
);
i
++
)
{
if
(
be32_to_cpup
(
&
prop
[
i
])
==
vcpu
)
{
...
...
drivers/of/base.c
View file @
389d0a8a
...
...
@@ -330,6 +330,8 @@ static bool __of_find_n_match_cpu_property(struct device_node *cpun,
ac
=
of_n_addr_cells
(
cpun
);
cell
=
of_get_property
(
cpun
,
prop_name
,
&
prop_len
);
if
(
!
cell
&&
!
ac
&&
arch_match_cpu_phys_id
(
cpu
,
0
))
return
true
;
if
(
!
cell
||
!
ac
)
return
false
;
prop_len
/=
sizeof
(
*
cell
)
*
ac
;
...
...
@@ -390,7 +392,7 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
{
struct
device_node
*
cpun
;
for_each_
node_by_type
(
cpun
,
"cpu"
)
{
for_each_
of_cpu_node
(
cpun
)
{
if
(
arch_find_n_match_cpu_physical_id
(
cpun
,
cpu
,
thread
))
return
cpun
;
}
...
...
@@ -744,6 +746,45 @@ struct device_node *of_get_next_available_child(const struct device_node *node,
}
EXPORT_SYMBOL
(
of_get_next_available_child
);
/**
* of_get_next_cpu_node - Iterate on cpu nodes
* @prev: previous child of the /cpus node, or NULL to get first
*
* Returns a cpu node pointer with refcount incremented, use of_node_put()
* on it when done. Returns NULL when prev is the last child. Decrements
* the refcount of prev.
*/
struct
device_node
*
of_get_next_cpu_node
(
struct
device_node
*
prev
)
{
struct
device_node
*
next
=
NULL
;
unsigned
long
flags
;
struct
device_node
*
node
;
if
(
!
prev
)
node
=
of_find_node_by_path
(
"/cpus"
);
raw_spin_lock_irqsave
(
&
devtree_lock
,
flags
);
if
(
prev
)
next
=
prev
->
sibling
;
else
if
(
node
)
{
next
=
node
->
child
;
of_node_put
(
node
);
}
for
(;
next
;
next
=
next
->
sibling
)
{
if
(
!
(
of_node_name_eq
(
next
,
"cpu"
)
||
(
next
->
type
&&
!
of_node_cmp
(
next
->
type
,
"cpu"
))))
continue
;
if
(
!
__of_device_is_available
(
next
))
continue
;
if
(
of_node_get
(
next
))
break
;
}
of_node_put
(
prev
);
raw_spin_unlock_irqrestore
(
&
devtree_lock
,
flags
);
return
next
;
}
EXPORT_SYMBOL
(
of_get_next_cpu_node
);
/**
* of_get_compatible_child - Find compatible child node
* @parent: parent node
...
...
drivers/of/of_numa.c
View file @
389d0a8a
...
...
@@ -24,18 +24,9 @@ static void __init of_numa_parse_cpu_nodes(void)
{
u32
nid
;
int
r
;
struct
device_node
*
cpus
;
struct
device_node
*
np
=
NULL
;
cpus
=
of_find_node_by_path
(
"/cpus"
);
if
(
!
cpus
)
return
;
for_each_child_of_node
(
cpus
,
np
)
{
/* Skip things that are not CPUs */
if
(
of_node_cmp
(
np
->
type
,
"cpu"
)
!=
0
)
continue
;
struct
device_node
*
np
;
for_each_of_cpu_node
(
np
)
{
r
=
of_property_read_u32
(
np
,
"numa-node-id"
,
&
nid
);
if
(
r
)
continue
;
...
...
@@ -46,8 +37,6 @@ static void __init of_numa_parse_cpu_nodes(void)
else
node_set
(
nid
,
numa_nodes_parsed
);
}
of_node_put
(
cpus
);
}
static
int
__init
of_numa_parse_memory_nodes
(
void
)
...
...
drivers/video/fbdev/fsl-diu-fb.c
View file @
389d0a8a
...
...
@@ -1925,7 +1925,7 @@ static int __init fsl_diu_init(void)
pr_info
(
"Freescale Display Interface Unit (DIU) framebuffer driver
\n
"
);
#ifdef CONFIG_NOT_COHERENT_CACHE
np
=
of_
find_node_by_type
(
NULL
,
"cpu"
);
np
=
of_
get_cpu_node
(
0
,
NULL
);
if
(
!
np
)
{
pr_err
(
"fsl-diu-fb: can't find 'cpu' device node
\n
"
);
return
-
ENODEV
;
...
...
include/linux/of.h
View file @
389d0a8a
...
...
@@ -347,6 +347,8 @@ extern const void *of_get_property(const struct device_node *node,
const
char
*
name
,
int
*
lenp
);
extern
struct
device_node
*
of_get_cpu_node
(
int
cpu
,
unsigned
int
*
thread
);
extern
struct
device_node
*
of_get_next_cpu_node
(
struct
device_node
*
prev
);
#define for_each_property_of_node(dn, pp) \
for (pp = dn->properties; pp != NULL; pp = pp->next)
...
...
@@ -748,6 +750,11 @@ static inline struct device_node *of_get_cpu_node(int cpu,
return
NULL
;
}
static
inline
struct
device_node
*
of_get_next_cpu_node
(
struct
device_node
*
prev
)
{
return
NULL
;
}
static
inline
int
of_n_addr_cells
(
struct
device_node
*
np
)
{
return
0
;
...
...
@@ -1211,6 +1218,10 @@ static inline int of_property_read_s32(const struct device_node *np,
for (child = of_get_next_available_child(parent, NULL); child != NULL; \
child = of_get_next_available_child(parent, child))
#define for_each_of_cpu_node(cpu) \
for (cpu = of_get_next_cpu_node(NULL); cpu != NULL; \
cpu = of_get_next_cpu_node(cpu))
#define for_each_node_with_property(dn, prop_name) \
for (dn = of_find_node_with_property(NULL, prop_name); dn; \
dn = of_find_node_with_property(dn, prop_name))
...
...
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