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
690c8fd3
Commit
690c8fd3
authored
Jun 22, 2006
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SPARC64]: Use in-kernel PROM tree for EBUS and ISA.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
de8d28b1
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
440 additions
and
450 deletions
+440
-450
arch/sparc64/kernel/auxio.c
arch/sparc64/kernel/auxio.c
+1
-1
arch/sparc64/kernel/ebus.c
arch/sparc64/kernel/ebus.c
+75
-66
arch/sparc64/kernel/isa.c
arch/sparc64/kernel/isa.c
+57
-87
arch/sparc64/kernel/power.c
arch/sparc64/kernel/power.c
+10
-10
arch/sparc64/kernel/prom.c
arch/sparc64/kernel/prom.c
+1
-0
arch/sparc64/kernel/time.c
arch/sparc64/kernel/time.c
+194
-174
drivers/char/rtc.c
drivers/char/rtc.c
+2
-2
drivers/input/misc/sparcspkr.c
drivers/input/misc/sparcspkr.c
+2
-2
drivers/input/serio/i8042-sparcio.h
drivers/input/serio/i8042-sparcio.h
+5
-5
drivers/sbus/char/bbc_envctrl.c
drivers/sbus/char/bbc_envctrl.c
+2
-2
drivers/sbus/char/bbc_i2c.c
drivers/sbus/char/bbc_i2c.c
+2
-2
drivers/sbus/char/display7seg.c
drivers/sbus/char/display7seg.c
+1
-1
drivers/sbus/char/envctrl.c
drivers/sbus/char/envctrl.c
+33
-38
drivers/sbus/char/flash.c
drivers/sbus/char/flash.c
+9
-7
drivers/serial/sunsab.c
drivers/serial/sunsab.c
+6
-6
drivers/serial/sunsu.c
drivers/serial/sunsu.c
+2
-2
include/asm-sparc64/ebus.h
include/asm-sparc64/ebus.h
+4
-6
include/asm-sparc64/floppy.h
include/asm-sparc64/floppy.h
+13
-14
include/asm-sparc64/isa.h
include/asm-sparc64/isa.h
+3
-5
include/asm-sparc64/parport.h
include/asm-sparc64/parport.h
+12
-13
sound/sparc/cs4231.c
sound/sparc/cs4231.c
+6
-7
No files found.
arch/sparc64/kernel/auxio.c
View file @
690c8fd3
...
...
@@ -136,7 +136,7 @@ found_sdev:
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"auxio"
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"auxio"
))
goto
ebus_done
;
}
}
...
...
arch/sparc64/kernel/ebus.c
View file @
690c8fd3
...
...
@@ -285,36 +285,38 @@ static inline void *ebus_alloc(size_t size)
static
void
__init
ebus_ranges_init
(
struct
linux_ebus
*
ebus
)
{
int
success
;
struct
linux_prom_ebus_ranges
*
rngs
;
int
len
;
ebus
->
num_ebus_ranges
=
0
;
success
=
prom_getproperty
(
ebus
->
prom_node
,
"ranges"
,
(
char
*
)
ebus
->
ebus_ranges
,
sizeof
(
ebus
->
ebus_ranges
));
if
(
success
!=
-
1
)
ebus
->
num_ebus_ranges
=
(
success
/
sizeof
(
struct
linux_prom_ebus_ranges
));
rngs
=
of_get_property
(
ebus
->
prom_node
,
"ranges"
,
&
len
);
if
(
rngs
)
{
memcpy
(
ebus
->
ebus_ranges
,
rngs
,
len
);
ebus
->
num_ebus_ranges
=
(
len
/
sizeof
(
struct
linux_prom_ebus_ranges
));
}
}
static
void
__init
ebus_intmap_init
(
struct
linux_ebus
*
ebus
)
{
int
success
;
struct
linux_prom_ebus_intmap
*
imap
;
struct
linux_prom_ebus_intmask
*
imask
;
int
len
;
ebus
->
num_ebus_intmap
=
0
;
success
=
prom_getproperty
(
ebus
->
prom_node
,
"interrupt-map"
,
(
char
*
)
ebus
->
ebus_intmap
,
sizeof
(
ebus
->
ebus_intmap
));
if
(
success
==
-
1
)
imap
=
of_get_property
(
ebus
->
prom_node
,
"interrupt-map"
,
&
len
);
if
(
!
imap
)
return
;
ebus
->
num_ebus_intmap
=
(
success
/
sizeof
(
struct
linux_prom_ebus_intmap
));
memcpy
(
ebus
->
ebus_intmap
,
imap
,
len
);
ebus
->
num_ebus_intmap
=
(
len
/
sizeof
(
struct
linux_prom_ebus_intmap
));
success
=
prom_getproperty
(
ebus
->
prom_node
,
"interrupt-map-mask"
,
(
char
*
)
&
ebus
->
ebus_intmask
,
sizeof
(
ebus
->
ebus_intmask
));
if
(
success
==
-
1
)
{
prom_printf
(
"%s: can't get interrupt-map-mask
\n
"
,
__FUNCTION__
);
imask
=
of_get_property
(
ebus
->
prom_node
,
"interrupt-map-mask"
,
&
len
);
if
(
!
imask
)
{
prom_printf
(
"EBUS: can't get interrupt-map-mask
\n
"
);
prom_halt
();
}
memcpy
(
&
ebus
->
ebus_intmask
,
imask
,
sizeof
(
ebus
->
ebus_intmask
));
}
int
__init
ebus_intmap_match
(
struct
linux_ebus
*
ebus
,
...
...
@@ -341,19 +343,23 @@ int __init ebus_intmap_match(struct linux_ebus *ebus,
return
-
1
;
}
void
__init
fill_ebus_child
(
int
node
,
struct
linux_prom_registers
*
preg
,
struct
linux_ebus_child
*
dev
,
int
non_standard_regs
)
void
__init
fill_ebus_child
(
struct
device_node
*
dp
,
struct
linux_prom_registers
*
preg
,
struct
linux_ebus_child
*
dev
,
int
non_standard_regs
)
{
int
regs
[
PROMREG_MAX
]
;
int
irqs
[
PROMREG_MAX
]
;
int
*
regs
;
int
*
irqs
;
int
i
,
len
;
dev
->
prom_node
=
node
;
prom_getstring
(
node
,
"name"
,
dev
->
prom_name
,
sizeof
(
dev
->
prom_name
));
printk
(
" (%s)"
,
dev
->
prom_name
);
dev
->
prom_node
=
dp
;
printk
(
" (%s)"
,
dp
->
name
);
len
=
prom_getproperty
(
node
,
"reg"
,
(
void
*
)
regs
,
sizeof
(
regs
));
dev
->
num_addrs
=
len
/
sizeof
(
regs
[
0
]);
regs
=
of_get_property
(
dp
,
"reg"
,
&
len
);
if
(
!
regs
)
dev
->
num_addrs
=
0
;
else
dev
->
num_addrs
=
len
/
sizeof
(
regs
[
0
]);
if
(
non_standard_regs
)
{
/* This is to handle reg properties which are not
...
...
@@ -370,21 +376,21 @@ void __init fill_ebus_child(int node, struct linux_prom_registers *preg,
int
rnum
=
regs
[
i
];
if
(
rnum
>=
dev
->
parent
->
num_addrs
)
{
prom_printf
(
"UGH: property for %s was %d, need < %d
\n
"
,
d
ev
->
prom_
name
,
len
,
dev
->
parent
->
num_addrs
);
p
anic
(
__FUNCTION__
);
d
p
->
name
,
len
,
dev
->
parent
->
num_addrs
);
p
rom_halt
(
);
}
dev
->
resource
[
i
].
start
=
dev
->
parent
->
resource
[
i
].
start
;
dev
->
resource
[
i
].
end
=
dev
->
parent
->
resource
[
i
].
end
;
dev
->
resource
[
i
].
flags
=
IORESOURCE_MEM
;
dev
->
resource
[
i
].
name
=
d
ev
->
prom_
name
;
dev
->
resource
[
i
].
name
=
d
p
->
name
;
}
}
for
(
i
=
0
;
i
<
PROMINTR_MAX
;
i
++
)
dev
->
irqs
[
i
]
=
PCI_IRQ_NONE
;
len
=
prom_getproperty
(
node
,
"interrupts"
,
(
char
*
)
&
irqs
,
sizeof
(
irqs
)
);
if
(
(
len
==
-
1
)
||
(
len
==
0
)
)
{
irqs
=
of_get_property
(
dp
,
"interrupts"
,
&
len
);
if
(
!
irqs
)
{
dev
->
num_irqs
=
0
;
/*
* Oh, well, some PROMs don't export interrupts
...
...
@@ -392,8 +398,8 @@ void __init fill_ebus_child(int node, struct linux_prom_registers *preg,
*
* Be smart about PS/2 keyboard and mouse.
*/
if
(
!
strcmp
(
dev
->
parent
->
prom_name
,
"8042"
))
{
if
(
!
strcmp
(
dev
->
prom_name
,
"kb_ps2"
))
{
if
(
!
strcmp
(
dev
->
parent
->
prom_n
ode
->
n
ame
,
"8042"
))
{
if
(
!
strcmp
(
dev
->
prom_n
ode
->
n
ame
,
"kb_ps2"
))
{
dev
->
num_irqs
=
1
;
dev
->
irqs
[
0
]
=
dev
->
parent
->
irqs
[
0
];
}
else
{
...
...
@@ -423,32 +429,32 @@ void __init fill_ebus_child(int node, struct linux_prom_registers *preg,
static
int
__init
child_regs_nonstandard
(
struct
linux_ebus_device
*
dev
)
{
if
(
!
strcmp
(
dev
->
prom_name
,
"i2c"
)
||
!
strcmp
(
dev
->
prom_name
,
"SUNW,lombus"
))
if
(
!
strcmp
(
dev
->
prom_n
ode
->
n
ame
,
"i2c"
)
||
!
strcmp
(
dev
->
prom_n
ode
->
n
ame
,
"SUNW,lombus"
))
return
1
;
return
0
;
}
void
__init
fill_ebus_device
(
int
node
,
struct
linux_ebus_device
*
dev
)
void
__init
fill_ebus_device
(
struct
device_node
*
dp
,
struct
linux_ebus_device
*
dev
)
{
struct
linux_prom_registers
regs
[
PROMREG_MAX
]
;
struct
linux_prom_registers
*
regs
;
struct
linux_ebus_child
*
child
;
int
irqs
[
PROMINTR_MAX
]
;
int
*
irqs
;
int
i
,
n
,
len
;
dev
->
prom_node
=
node
;
prom_getstring
(
node
,
"name"
,
dev
->
prom_name
,
sizeof
(
dev
->
prom_name
));
printk
(
" [%s"
,
dev
->
prom_name
);
dev
->
prom_node
=
dp
;
len
=
prom_getproperty
(
node
,
"reg"
,
(
void
*
)
regs
,
sizeof
(
regs
));
if
(
len
==
-
1
)
{
printk
(
" [%s"
,
dp
->
name
);
regs
=
of_get_property
(
dp
,
"reg"
,
&
len
);
if
(
!
regs
)
{
dev
->
num_addrs
=
0
;
goto
probe_interrupts
;
}
if
(
len
%
sizeof
(
struct
linux_prom_registers
))
{
prom_printf
(
"UGH: proplen for %s was %d, need multiple of %d
\n
"
,
dev
->
prom_name
,
len
,
dev
->
prom_n
ode
->
n
ame
,
len
,
(
int
)
sizeof
(
struct
linux_prom_registers
));
prom_halt
();
}
...
...
@@ -466,7 +472,7 @@ void __init fill_ebus_device(int node, struct linux_ebus_device *dev)
dev
->
resource
[
i
].
end
=
(
dev
->
resource
[
i
].
start
+
(
unsigned
long
)
regs
[
i
].
reg_size
-
1UL
);
dev
->
resource
[
i
].
flags
=
IORESOURCE_MEM
;
dev
->
resource
[
i
].
name
=
dev
->
prom_name
;
dev
->
resource
[
i
].
name
=
dev
->
prom_n
ode
->
n
ame
;
request_resource
(
&
dev
->
bus
->
self
->
resource
[
n
],
&
dev
->
resource
[
i
]);
}
...
...
@@ -475,8 +481,8 @@ probe_interrupts:
for
(
i
=
0
;
i
<
PROMINTR_MAX
;
i
++
)
dev
->
irqs
[
i
]
=
PCI_IRQ_NONE
;
len
=
prom_getproperty
(
node
,
"interrupts"
,
(
char
*
)
&
irqs
,
sizeof
(
irqs
)
);
if
(
(
len
==
-
1
)
||
(
len
==
0
)
)
{
irqs
=
of_get_property
(
dp
,
"interrupts"
,
&
len
);
if
(
!
irqs
)
{
dev
->
num_irqs
=
0
;
}
else
{
dev
->
num_irqs
=
len
/
sizeof
(
irqs
[
0
]);
...
...
@@ -497,7 +503,8 @@ probe_interrupts:
}
}
if
((
node
=
prom_getchild
(
node
)))
{
dp
=
dp
->
child
;
if
(
dp
)
{
printk
(
" ->"
);
dev
->
children
=
ebus_alloc
(
sizeof
(
struct
linux_ebus_child
));
...
...
@@ -505,18 +512,18 @@ probe_interrupts:
child
->
next
=
NULL
;
child
->
parent
=
dev
;
child
->
bus
=
dev
->
bus
;
fill_ebus_child
(
node
,
&
regs
[
0
]
,
child
,
child
_regs_nonstandard
(
dev
));
fill_ebus_child
(
dp
,
regs
,
child
,
child_regs_nonstandard
(
dev
));
while
((
node
=
prom_getsibling
(
node
))
!=
0
)
{
while
((
dp
=
dp
->
sibling
)
!=
NULL
)
{
child
->
next
=
ebus_alloc
(
sizeof
(
struct
linux_ebus_child
));
child
=
child
->
next
;
child
->
next
=
NULL
;
child
->
parent
=
dev
;
child
->
bus
=
dev
->
bus
;
fill_ebus_child
(
node
,
&
regs
[
0
]
,
child
,
child
_regs_nonstandard
(
dev
));
fill_ebus_child
(
dp
,
regs
,
child
,
child_regs_nonstandard
(
dev
));
}
}
printk
(
"]"
);
...
...
@@ -543,7 +550,8 @@ void __init ebus_init(void)
struct
linux_ebus
*
ebus
;
struct
pci_dev
*
pdev
;
struct
pcidev_cookie
*
cookie
;
int
nd
,
ebusnd
,
is_rio
;
struct
device_node
*
dp
;
int
is_rio
;
int
num_ebus
=
0
;
pdev
=
find_next_ebus
(
NULL
,
&
is_rio
);
...
...
@@ -553,20 +561,22 @@ void __init ebus_init(void)
}
cookie
=
pdev
->
sysdata
;
ebusnd
=
cookie
->
prom_node
->
node
;
dp
=
cookie
->
prom_
node
;
ebus_chain
=
ebus
=
ebus_alloc
(
sizeof
(
struct
linux_ebus
));
ebus
->
next
=
NULL
;
ebus
->
is_rio
=
is_rio
;
while
(
ebusnd
)
{
while
(
dp
)
{
struct
device_node
*
child
;
/* SUNW,pci-qfe uses four empty ebuses on it.
I think we should not consider them here,
as they have half of the properties this
code expects and once we do PCI hot-plug,
we'd have to tweak with the ebus_chain
in the runtime after initialization. -jj */
if
(
!
prom_getchild
(
ebusnd
)
)
{
if
(
!
dp
->
child
)
{
pdev
=
find_next_ebus
(
pdev
,
&
is_rio
);
if
(
!
pdev
)
{
if
(
ebus
==
ebus_chain
)
{
...
...
@@ -578,22 +588,21 @@ void __init ebus_init(void)
}
ebus
->
is_rio
=
is_rio
;
cookie
=
pdev
->
sysdata
;
ebusnd
=
cookie
->
prom_node
->
node
;
dp
=
cookie
->
prom_
node
;
continue
;
}
printk
(
"ebus%d:"
,
num_ebus
);
prom_getstring
(
ebusnd
,
"name"
,
ebus
->
prom_name
,
sizeof
(
ebus
->
prom_name
));
ebus
->
index
=
num_ebus
;
ebus
->
prom_node
=
ebusnd
;
ebus
->
prom_node
=
dp
;
ebus
->
self
=
pdev
;
ebus
->
parent
=
pbm
=
cookie
->
pbm
;
ebus_ranges_init
(
ebus
);
ebus_intmap_init
(
ebus
);
nd
=
prom_getchild
(
ebusnd
)
;
if
(
!
n
d
)
child
=
dp
->
child
;
if
(
!
chil
d
)
goto
next_ebus
;
ebus
->
devices
=
ebus_alloc
(
sizeof
(
struct
linux_ebus_device
));
...
...
@@ -602,16 +611,16 @@ void __init ebus_init(void)
dev
->
next
=
NULL
;
dev
->
children
=
NULL
;
dev
->
bus
=
ebus
;
fill_ebus_device
(
n
d
,
dev
);
fill_ebus_device
(
chil
d
,
dev
);
while
((
nd
=
prom_getsibling
(
nd
))
!=
0
)
{
while
((
child
=
child
->
sibling
)
!=
NULL
)
{
dev
->
next
=
ebus_alloc
(
sizeof
(
struct
linux_ebus_device
));
dev
=
dev
->
next
;
dev
->
next
=
NULL
;
dev
->
children
=
NULL
;
dev
->
bus
=
ebus
;
fill_ebus_device
(
n
d
,
dev
);
fill_ebus_device
(
chil
d
,
dev
);
}
next_ebus:
...
...
@@ -622,7 +631,7 @@ void __init ebus_init(void)
break
;
cookie
=
pdev
->
sysdata
;
ebusnd
=
cookie
->
prom_node
->
node
;
dp
=
cookie
->
prom_
node
;
ebus
->
next
=
ebus_alloc
(
sizeof
(
struct
linux_ebus
));
ebus
=
ebus
->
next
;
...
...
arch/sparc64/kernel/isa.c
View file @
690c8fd3
...
...
@@ -15,23 +15,19 @@ static void __init fatal_err(const char *reason)
static
void
__init
report_dev
(
struct
sparc_isa_device
*
isa_dev
,
int
child
)
{
if
(
child
)
printk
(
" (%s)"
,
isa_dev
->
prom_name
);
printk
(
" (%s)"
,
isa_dev
->
prom_n
ode
->
n
ame
);
else
printk
(
" [%s"
,
isa_dev
->
prom_name
);
printk
(
" [%s"
,
isa_dev
->
prom_n
ode
->
n
ame
);
}
static
void
__init
isa_dev_get_resource
(
struct
sparc_isa_device
*
isa_dev
,
struct
linux_prom_registers
*
pregs
,
int
pregs_size
)
static
struct
linux_prom_registers
*
__init
isa_dev_get_resource
(
struct
sparc_isa_device
*
isa_dev
)
{
struct
linux_prom_registers
*
pregs
;
unsigned
long
base
,
len
;
int
prop_len
;
prop_len
=
prom_getproperty
(
isa_dev
->
prom_node
,
"reg"
,
(
char
*
)
pregs
,
pregs_size
);
if
(
prop_len
<=
0
)
return
;
pregs
=
of_get_property
(
isa_dev
->
prom_node
,
"reg"
,
&
prop_len
);
/* Only the first one is interesting. */
len
=
pregs
[
0
].
reg_size
;
...
...
@@ -42,10 +38,12 @@ static void __init isa_dev_get_resource(struct sparc_isa_device *isa_dev,
isa_dev
->
resource
.
start
=
base
;
isa_dev
->
resource
.
end
=
(
base
+
len
-
1UL
);
isa_dev
->
resource
.
flags
=
IORESOURCE_IO
;
isa_dev
->
resource
.
name
=
isa_dev
->
prom_name
;
isa_dev
->
resource
.
name
=
isa_dev
->
prom_n
ode
->
n
ame
;
request_resource
(
&
isa_dev
->
bus
->
parent
->
io_space
,
&
isa_dev
->
resource
);
return
pregs
;
}
/* I can't believe they didn't put a real INO in the isa device
...
...
@@ -98,8 +96,8 @@ static void __init isa_dev_get_irq(struct sparc_isa_device *isa_dev,
{
int
irq_prop
;
irq_prop
=
prom_getint
default
(
isa_dev
->
prom_node
,
"interrupts"
,
-
1
);
irq_prop
=
of_getintprop_
default
(
isa_dev
->
prom_node
,
"interrupts"
,
-
1
);
if
(
irq_prop
<=
0
)
{
goto
no_irq
;
}
else
{
...
...
@@ -141,16 +139,15 @@ no_irq:
static
void
__init
isa_fill_children
(
struct
sparc_isa_device
*
parent_isa_dev
)
{
int
node
=
prom_getchild
(
parent_isa_dev
->
prom_node
)
;
struct
device_node
*
dp
=
parent_isa_dev
->
prom_node
->
child
;
if
(
node
==
0
)
if
(
!
dp
)
return
;
printk
(
" ->"
);
while
(
node
!=
0
)
{
struct
linux_prom_registers
regs
[
PROMREG_MAX
]
;
while
(
dp
)
{
struct
linux_prom_registers
*
regs
;
struct
sparc_isa_device
*
isa_dev
;
int
prop_len
;
isa_dev
=
kmalloc
(
sizeof
(
*
isa_dev
),
GFP_KERNEL
);
if
(
!
isa_dev
)
{
...
...
@@ -165,40 +162,24 @@ static void __init isa_fill_children(struct sparc_isa_device *parent_isa_dev)
parent_isa_dev
->
child
=
isa_dev
;
isa_dev
->
bus
=
parent_isa_dev
->
bus
;
isa_dev
->
prom_node
=
node
;
prop_len
=
prom_getproperty
(
node
,
"name"
,
(
char
*
)
isa_dev
->
prom_name
,
sizeof
(
isa_dev
->
prom_name
));
if
(
prop_len
<=
0
)
{
fatal_err
(
"cannot get child isa_dev OBP node name"
);
prom_halt
();
}
prop_len
=
prom_getproperty
(
node
,
"compatible"
,
(
char
*
)
isa_dev
->
compatible
,
sizeof
(
isa_dev
->
compatible
));
isa_dev
->
prom_node
=
dp
;
/* Not having this is OK. */
if
(
prop_len
<=
0
)
isa_dev
->
compatible
[
0
]
=
'\0'
;
isa_dev_get_resource
(
isa_dev
,
regs
,
sizeof
(
regs
));
regs
=
isa_dev_get_resource
(
isa_dev
);
isa_dev_get_irq
(
isa_dev
,
regs
);
report_dev
(
isa_dev
,
1
);
node
=
prom_getsibling
(
node
)
;
dp
=
dp
->
sibling
;
}
}
static
void
__init
isa_fill_devices
(
struct
sparc_isa_bridge
*
isa_br
)
{
int
node
=
prom_getchild
(
isa_br
->
prom_node
)
;
struct
device_node
*
dp
=
isa_br
->
prom_node
->
child
;
while
(
node
!=
0
)
{
struct
linux_prom_registers
regs
[
PROMREG_MAX
]
;
while
(
dp
)
{
struct
linux_prom_registers
*
regs
;
struct
sparc_isa_device
*
isa_dev
;
int
prop_len
;
isa_dev
=
kmalloc
(
sizeof
(
*
isa_dev
),
GFP_KERNEL
);
if
(
!
isa_dev
)
{
...
...
@@ -222,24 +203,9 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
}
isa_dev
->
bus
=
isa_br
;
isa_dev
->
prom_node
=
node
;
prop_len
=
prom_getproperty
(
node
,
"name"
,
(
char
*
)
isa_dev
->
prom_name
,
sizeof
(
isa_dev
->
prom_name
));
if
(
prop_len
<=
0
)
{
fatal_err
(
"cannot get isa_dev OBP node name"
);
prom_halt
();
}
prop_len
=
prom_getproperty
(
node
,
"compatible"
,
(
char
*
)
isa_dev
->
compatible
,
sizeof
(
isa_dev
->
compatible
));
/* Not having this is OK. */
if
(
prop_len
<=
0
)
isa_dev
->
compatible
[
0
]
=
'\0'
;
isa_dev
->
prom_node
=
dp
;
isa_dev_get_resource
(
isa_dev
,
regs
,
sizeof
(
regs
)
);
regs
=
isa_dev_get_resource
(
isa_dev
);
isa_dev_get_irq
(
isa_dev
,
regs
);
report_dev
(
isa_dev
,
0
);
...
...
@@ -248,10 +214,40 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
printk
(
"]"
);
node
=
prom_getsibling
(
node
)
;
dp
=
dp
->
sibling
;
}
}
static
void
__init
get_bridge_props
(
struct
sparc_isa_bridge
*
isa_br
)
{
struct
device_node
*
dp
=
isa_br
->
prom_node
;
void
*
pval
;
int
len
;
pval
=
of_get_property
(
dp
,
"ranges"
,
&
len
);
if
(
pval
)
{
memcpy
(
isa_br
->
isa_ranges
,
pval
,
len
);
isa_br
->
num_isa_ranges
=
len
/
sizeof
(
struct
linux_prom_isa_ranges
);
}
else
{
isa_br
->
num_isa_ranges
=
0
;
}
pval
=
of_get_property
(
dp
,
"interrupt-map"
,
&
len
);
if
(
pval
)
{
memcpy
(
isa_br
->
isa_intmap
,
pval
,
len
);
isa_br
->
num_isa_intmap
=
(
len
/
sizeof
(
struct
linux_prom_isa_intmap
));
}
else
{
isa_br
->
num_isa_intmap
=
0
;
}
pval
=
of_get_property
(
dp
,
"interrupt-map-mask"
,
&
len
);
if
(
pval
)
memcpy
(
&
isa_br
->
isa_intmask
,
pval
,
sizeof
(
isa_br
->
isa_intmask
));
}
void
__init
isa_init
(
void
)
{
struct
pci_dev
*
pdev
;
...
...
@@ -266,7 +262,6 @@ void __init isa_init(void)
struct
pcidev_cookie
*
pdev_cookie
;
struct
pci_pbm_info
*
pbm
;
struct
sparc_isa_bridge
*
isa_br
;
int
prop_len
;
pdev_cookie
=
pdev
->
sysdata
;
if
(
!
pdev_cookie
)
{
...
...
@@ -291,34 +286,9 @@ void __init isa_init(void)
isa_br
->
parent
=
pbm
;
isa_br
->
self
=
pdev
;
isa_br
->
index
=
index
++
;
isa_br
->
prom_node
=
pdev_cookie
->
prom_node
->
node
;
strncpy
(
isa_br
->
prom_name
,
pdev_cookie
->
prom_node
->
name
,
sizeof
(
isa_br
->
prom_name
));
prop_len
=
prom_getproperty
(
isa_br
->
prom_node
,
"ranges"
,
(
char
*
)
isa_br
->
isa_ranges
,
sizeof
(
isa_br
->
isa_ranges
));
if
(
prop_len
<=
0
)
isa_br
->
num_isa_ranges
=
0
;
else
isa_br
->
num_isa_ranges
=
(
prop_len
/
sizeof
(
struct
linux_prom_isa_ranges
));
prop_len
=
prom_getproperty
(
isa_br
->
prom_node
,
"interrupt-map"
,
(
char
*
)
isa_br
->
isa_intmap
,
sizeof
(
isa_br
->
isa_intmap
));
if
(
prop_len
<=
0
)
isa_br
->
num_isa_intmap
=
0
;
else
isa_br
->
num_isa_intmap
=
(
prop_len
/
sizeof
(
struct
linux_prom_isa_intmap
));
prop_len
=
prom_getproperty
(
isa_br
->
prom_node
,
"interrupt-map-mask"
,
(
char
*
)
&
(
isa_br
->
isa_intmask
),
sizeof
(
isa_br
->
isa_intmask
));
isa_br
->
prom_node
=
pdev_cookie
->
prom_node
;
get_bridge_props
(
isa_br
);
printk
(
"isa%d:"
,
isa_br
->
index
);
...
...
arch/sparc64/kernel/power.c
View file @
690c8fd3
...
...
@@ -105,24 +105,24 @@ again:
return
0
;
}
static
int
__init
has_button_interrupt
(
unsigned
int
irq
,
int
prom_node
)
static
int
__init
has_button_interrupt
(
unsigned
int
irq
,
struct
device_node
*
dp
)
{
if
(
irq
==
PCI_IRQ_NONE
)
return
0
;
if
(
!
prom_node_has_property
(
prom_node
,
"button"
))
if
(
!
of_find_property
(
dp
,
"button"
,
NULL
))
return
0
;
return
1
;
}
static
int
__init
power_probe_ebus
(
struct
resource
**
resp
,
unsigned
int
*
irq_p
,
int
*
prom_node_p
)
static
int
__init
power_probe_ebus
(
struct
resource
**
resp
,
unsigned
int
*
irq_p
,
struct
device_node
*
*
prom_node_p
)
{
struct
linux_ebus
*
ebus
;
struct
linux_ebus_device
*
edev
;
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"power"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"power"
))
{
*
resp
=
&
edev
->
resource
[
0
];
*
irq_p
=
edev
->
irqs
[
0
];
*
prom_node_p
=
edev
->
prom_node
;
...
...
@@ -133,14 +133,14 @@ static int __init power_probe_ebus(struct resource **resp, unsigned int *irq_p,
return
-
ENODEV
;
}
static
int
__init
power_probe_isa
(
struct
resource
**
resp
,
unsigned
int
*
irq_p
,
int
*
prom_node_p
)
static
int
__init
power_probe_isa
(
struct
resource
**
resp
,
unsigned
int
*
irq_p
,
struct
device_node
*
*
prom_node_p
)
{
struct
sparc_isa_bridge
*
isa_bus
;
struct
sparc_isa_device
*
isa_dev
;
for_each_isa
(
isa_bus
)
{
for_each_isadev
(
isa_dev
,
isa_bus
)
{
if
(
!
strcmp
(
isa_dev
->
prom_name
,
"power"
))
{
if
(
!
strcmp
(
isa_dev
->
prom_n
ode
->
n
ame
,
"power"
))
{
*
resp
=
&
isa_dev
->
resource
;
*
irq_p
=
isa_dev
->
irq
;
*
prom_node_p
=
isa_dev
->
prom_node
;
...
...
@@ -155,17 +155,17 @@ void __init power_init(void)
{
struct
resource
*
res
=
NULL
;
unsigned
int
irq
;
int
prom_node
;
struct
device_node
*
dp
;
static
int
invoked
;
if
(
invoked
)
return
;
invoked
=
1
;
if
(
!
power_probe_ebus
(
&
res
,
&
irq
,
&
prom_node
))
if
(
!
power_probe_ebus
(
&
res
,
&
irq
,
&
dp
))
goto
found
;
if
(
!
power_probe_isa
(
&
res
,
&
irq
,
&
prom_node
))
if
(
!
power_probe_isa
(
&
res
,
&
irq
,
&
dp
))
goto
found
;
return
;
...
...
@@ -174,7 +174,7 @@ found:
power_reg
=
ioremap
(
res
->
start
,
0x4
);
printk
(
"power: Control reg at %p ... "
,
power_reg
);
poweroff_method
=
machine_halt
;
/* able to use the standard halt */
if
(
has_button_interrupt
(
irq
,
prom_node
))
{
if
(
has_button_interrupt
(
irq
,
dp
))
{
if
(
kernel_thread
(
powerd
,
NULL
,
CLONE_FS
)
<
0
)
{
printk
(
"Failed to start power daemon.
\n
"
);
return
;
...
...
arch/sparc64/kernel/prom.c
View file @
690c8fd3
...
...
@@ -63,6 +63,7 @@ struct device_node *of_find_node_by_path(const char *path)
return
np
;
}
EXPORT_SYMBOL
(
of_find_node_by_path
);
struct
device_node
*
of_find_node_by_phandle
(
phandle
handle
)
{
...
...
arch/sparc64/kernel/time.c
View file @
690c8fd3
...
...
@@ -756,24 +756,200 @@ retry:
return
-
EOPNOTSUPP
;
}
void
__init
clock_probe
(
void
)
static
int
__init
clock_model_matches
(
char
*
model
)
{
if
(
strcmp
(
model
,
"mk48t02"
)
&&
strcmp
(
model
,
"mk48t08"
)
&&
strcmp
(
model
,
"mk48t59"
)
&&
strcmp
(
model
,
"m5819"
)
&&
strcmp
(
model
,
"m5819p"
)
&&
strcmp
(
model
,
"m5823"
)
&&
strcmp
(
model
,
"ds1287"
))
return
0
;
return
1
;
}
static
void
__init
__clock_assign_common
(
void
__iomem
*
addr
,
char
*
model
)
{
if
(
model
[
5
]
==
'0'
&&
model
[
6
]
==
'2'
)
{
mstk48t02_regs
=
addr
;
}
else
if
(
model
[
5
]
==
'0'
&&
model
[
6
]
==
'8'
)
{
mstk48t08_regs
=
addr
;
mstk48t02_regs
=
mstk48t08_regs
+
MOSTEK_48T08_48T02
;
}
else
{
mstk48t59_regs
=
addr
;
mstk48t02_regs
=
mstk48t59_regs
+
MOSTEK_48T59_48T02
;
}
}
static
void
__init
clock_assign_clk_reg
(
struct
linux_prom_registers
*
clk_reg
,
char
*
model
)
{
unsigned
long
addr
;
addr
=
((
unsigned
long
)
clk_reg
[
0
].
phys_addr
|
(((
unsigned
long
)
clk_reg
[
0
].
which_io
)
<<
32UL
));
__clock_assign_common
((
void
__iomem
*
)
addr
,
model
);
}
static
int
__init
clock_probe_central
(
void
)
{
struct
linux_prom_registers
clk_reg
[
2
];
char
model
[
128
];
int
node
,
busnd
=
-
1
,
err
;
unsigned
long
flags
;
struct
linux_central
*
cbus
;
char
model
[
64
];
int
node
;
if
(
!
central_bus
)
return
0
;
/* Get Central FHC's prom node. */
node
=
central_bus
->
child
->
prom_node
;
/* Then get the first child device below it. */
node
=
prom_getchild
(
node
);
while
(
node
)
{
prom_getstring
(
node
,
"model"
,
model
,
sizeof
(
model
));
if
(
!
clock_model_matches
(
model
))
goto
next_sibling
;
prom_getproperty
(
node
,
"reg"
,
(
char
*
)
clk_reg
,
sizeof
(
clk_reg
));
apply_fhc_ranges
(
central_bus
->
child
,
clk_reg
,
1
);
apply_central_ranges
(
central_bus
,
clk_reg
,
1
);
clock_assign_clk_reg
(
clk_reg
,
model
);
return
1
;
next_sibling:
node
=
prom_getsibling
(
node
);
}
return
0
;
}
#ifdef CONFIG_PCI
struct
linux_ebus
*
ebus
=
NULL
;
struct
sparc_isa_bridge
*
isa_br
=
NULL
;
static
void
__init
clock_isa_ebus_assign_regs
(
struct
resource
*
res
,
char
*
model
)
{
if
(
!
strcmp
(
model
,
"ds1287"
)
||
!
strcmp
(
model
,
"m5819"
)
||
!
strcmp
(
model
,
"m5819p"
)
||
!
strcmp
(
model
,
"m5823"
))
{
ds1287_regs
=
res
->
start
;
}
else
{
mstk48t59_regs
=
(
void
__iomem
*
)
res
->
start
;
mstk48t02_regs
=
mstk48t59_regs
+
MOSTEK_48T59_48T02
;
}
}
static
int
__init
clock_probe_one_ebus_dev
(
struct
linux_ebus_device
*
edev
)
{
struct
device_node
*
dp
=
edev
->
prom_node
;
char
*
model
;
model
=
of_get_property
(
dp
,
"model"
,
NULL
);
if
(
!
clock_model_matches
(
model
))
return
0
;
clock_isa_ebus_assign_regs
(
&
edev
->
resource
[
0
],
model
);
return
1
;
}
static
int
__init
clock_probe_ebus
(
void
)
{
struct
linux_ebus
*
ebus
;
for_each_ebus
(
ebus
)
{
struct
linux_ebus_device
*
edev
;
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
clock_probe_one_ebus_dev
(
edev
))
return
1
;
}
}
return
0
;
}
static
int
__init
clock_probe_one_isa_dev
(
struct
sparc_isa_device
*
idev
)
{
struct
device_node
*
dp
=
idev
->
prom_node
;
char
*
model
;
model
=
of_get_property
(
dp
,
"model"
,
NULL
);
if
(
!
clock_model_matches
(
model
))
return
0
;
clock_isa_ebus_assign_regs
(
&
idev
->
resource
,
model
);
return
1
;
}
static
int
__init
clock_probe_isa
(
void
)
{
struct
sparc_isa_bridge
*
isa_br
;
for_each_isa
(
isa_br
)
{
struct
sparc_isa_device
*
isa_dev
;
for_each_isadev
(
isa_dev
,
isa_br
)
{
if
(
clock_probe_one_isa_dev
(
isa_dev
))
return
1
;
}
}
return
0
;
}
#endif
/* CONFIG_PCI */
#ifdef CONFIG_SBUS
static
int
__init
clock_probe_one_sbus_dev
(
struct
sbus_bus
*
sbus
,
struct
sbus_dev
*
sdev
)
{
struct
resource
*
res
;
char
model
[
64
];
void
__iomem
*
addr
;
prom_getstring
(
sdev
->
prom_node
,
"model"
,
model
,
sizeof
(
model
));
if
(
!
clock_model_matches
(
model
))
return
0
;
res
=
&
sdev
->
resource
[
0
];
addr
=
sbus_ioremap
(
res
,
0
,
0x800UL
,
"eeprom"
);
__clock_assign_common
(
addr
,
model
);
return
1
;
}
static
int
__init
clock_probe_sbus
(
void
)
{
struct
sbus_bus
*
sbus
;
for_each_sbus
(
sbus
)
{
struct
sbus_dev
*
sdev
;
for_each_sbusdev
(
sdev
,
sbus
)
{
if
(
clock_probe_one_sbus_dev
(
sbus
,
sdev
))
return
1
;
}
}
return
0
;
}
#endif
void
__init
clock_probe
(
void
)
{
static
int
invoked
;
unsigned
long
flags
;
if
(
invoked
)
return
;
invoked
=
1
;
if
(
this_is_starfire
)
{
xtime
.
tv_sec
=
starfire_get_time
();
xtime
.
tv_nsec
=
(
INITIAL_JIFFIES
%
HZ
)
*
(
NSEC_PER_SEC
/
HZ
);
...
...
@@ -789,183 +965,27 @@ void __init clock_probe(void)
return
;
}
local_irq_save
(
flags
);
cbus
=
central_bus
;
if
(
cbus
!=
NULL
)
busnd
=
central_bus
->
child
->
prom_node
;
/* Check FHC Central then EBUSs then ISA bridges then SBUSs.
* That way we handle the presence of multiple properly.
*
* As a special case, machines with Central must provide the
* timer chip there.
*/
if
(
!
clock_probe_central
()
&&
#ifdef CONFIG_PCI
if
(
ebus_chain
!=
NULL
)
{
ebus
=
ebus_chain
;
if
(
busnd
==
-
1
)
busnd
=
ebus
->
prom_node
;
}
if
(
isa_chain
!=
NULL
)
{
isa_br
=
isa_chain
;
if
(
busnd
==
-
1
)
busnd
=
isa_br
->
prom_node
;
}
#endif
if
(
sbus_root
!=
NULL
&&
busnd
==
-
1
)
busnd
=
sbus_root
->
prom_node
;
if
(
busnd
==
-
1
)
{
prom_printf
(
"clock_probe: problem, cannot find bus to search.
\n
"
);
prom_halt
();
}
node
=
prom_getchild
(
busnd
);
while
(
1
)
{
if
(
!
node
)
model
[
0
]
=
0
;
else
prom_getstring
(
node
,
"model"
,
model
,
sizeof
(
model
));
if
(
strcmp
(
model
,
"mk48t02"
)
&&
strcmp
(
model
,
"mk48t08"
)
&&
strcmp
(
model
,
"mk48t59"
)
&&
strcmp
(
model
,
"m5819"
)
&&
strcmp
(
model
,
"m5819p"
)
&&
strcmp
(
model
,
"m5823"
)
&&
strcmp
(
model
,
"ds1287"
))
{
if
(
cbus
!=
NULL
)
{
prom_printf
(
"clock_probe: Central bus lacks timer chip.
\n
"
);
prom_halt
();
}
if
(
node
!=
0
)
node
=
prom_getsibling
(
node
);
#ifdef CONFIG_PCI
while
((
node
==
0
)
&&
ebus
!=
NULL
)
{
ebus
=
ebus
->
next
;
if
(
ebus
!=
NULL
)
{
busnd
=
ebus
->
prom_node
;
node
=
prom_getchild
(
busnd
);
}
}
while
((
node
==
0
)
&&
isa_br
!=
NULL
)
{
isa_br
=
isa_br
->
next
;
if
(
isa_br
!=
NULL
)
{
busnd
=
isa_br
->
prom_node
;
node
=
prom_getchild
(
busnd
);
}
}
!
clock_probe_ebus
()
&&
!
clock_probe_isa
()
&&
#endif
if
(
node
==
0
)
{
prom_printf
(
"clock_probe: Cannot find timer chip
\n
"
);
prom_halt
();
}
continue
;
}
err
=
prom_getproperty
(
node
,
"reg"
,
(
char
*
)
clk_reg
,
sizeof
(
clk_reg
));
if
(
err
==
-
1
)
{
prom_printf
(
"clock_probe: Cannot get Mostek reg property
\n
"
);
prom_halt
();
}
if
(
cbus
!=
NULL
)
{
apply_fhc_ranges
(
central_bus
->
child
,
clk_reg
,
1
);
apply_central_ranges
(
central_bus
,
clk_reg
,
1
);
}
#ifdef CONFIG_PCI
else
if
(
ebus
!=
NULL
)
{
struct
linux_ebus_device
*
edev
;
for_each_ebusdev
(
edev
,
ebus
)
if
(
edev
->
prom_node
==
node
)
break
;
if
(
edev
==
NULL
)
{
if
(
isa_chain
!=
NULL
)
goto
try_isa_clock
;
prom_printf
(
"%s: Mostek not probed by EBUS
\n
"
,
__FUNCTION__
);
prom_halt
();
}
if
(
!
strcmp
(
model
,
"ds1287"
)
||
!
strcmp
(
model
,
"m5819"
)
||
!
strcmp
(
model
,
"m5819p"
)
||
!
strcmp
(
model
,
"m5823"
))
{
ds1287_regs
=
edev
->
resource
[
0
].
start
;
}
else
{
mstk48t59_regs
=
(
void
__iomem
*
)
edev
->
resource
[
0
].
start
;
mstk48t02_regs
=
mstk48t59_regs
+
MOSTEK_48T59_48T02
;
}
break
;
}
else
if
(
isa_br
!=
NULL
)
{
struct
sparc_isa_device
*
isadev
;
try_isa_clock:
for_each_isadev
(
isadev
,
isa_br
)
if
(
isadev
->
prom_node
==
node
)
break
;
if
(
isadev
==
NULL
)
{
prom_printf
(
"%s: Mostek not probed by ISA
\n
"
);
prom_halt
();
}
if
(
!
strcmp
(
model
,
"ds1287"
)
||
!
strcmp
(
model
,
"m5819"
)
||
!
strcmp
(
model
,
"m5819p"
)
||
!
strcmp
(
model
,
"m5823"
))
{
ds1287_regs
=
isadev
->
resource
.
start
;
}
else
{
mstk48t59_regs
=
(
void
__iomem
*
)
isadev
->
resource
.
start
;
mstk48t02_regs
=
mstk48t59_regs
+
MOSTEK_48T59_48T02
;
}
break
;
}
#ifdef CONFIG_SBUS
!
clock_probe_sbus
()
#endif
else
{
if
(
sbus_root
->
num_sbus_ranges
)
{
int
nranges
=
sbus_root
->
num_sbus_ranges
;
int
rngc
;
for
(
rngc
=
0
;
rngc
<
nranges
;
rngc
++
)
if
(
clk_reg
[
0
].
which_io
==
sbus_root
->
sbus_ranges
[
rngc
].
ot_child_space
)
break
;
if
(
rngc
==
nranges
)
{
prom_printf
(
"clock_probe: Cannot find ranges for "
"clock regs.
\n
"
);
prom_halt
();
}
clk_reg
[
0
].
which_io
=
sbus_root
->
sbus_ranges
[
rngc
].
ot_parent_space
;
clk_reg
[
0
].
phys_addr
+=
sbus_root
->
sbus_ranges
[
rngc
].
ot_parent_base
;
}
}
if
(
model
[
5
]
==
'0'
&&
model
[
6
]
==
'2'
)
{
mstk48t02_regs
=
(
void
__iomem
*
)
(((
u64
)
clk_reg
[
0
].
phys_addr
)
|
(((
u64
)
clk_reg
[
0
].
which_io
)
<<
32UL
));
}
else
if
(
model
[
5
]
==
'0'
&&
model
[
6
]
==
'8'
)
{
mstk48t08_regs
=
(
void
__iomem
*
)
(((
u64
)
clk_reg
[
0
].
phys_addr
)
|
(((
u64
)
clk_reg
[
0
].
which_io
)
<<
32UL
));
mstk48t02_regs
=
mstk48t08_regs
+
MOSTEK_48T08_48T02
;
}
else
{
mstk48t59_regs
=
(
void
__iomem
*
)
(((
u64
)
clk_reg
[
0
].
phys_addr
)
|
(((
u64
)
clk_reg
[
0
].
which_io
)
<<
32UL
));
mstk48t02_regs
=
mstk48t59_regs
+
MOSTEK_48T59_48T02
;
}
break
;
)
{
printk
(
KERN_WARNING
"No clock chip found.
\n
"
);
return
;
}
local_irq_save
(
flags
);
if
(
mstk48t02_regs
!=
NULL
)
{
/* Report a low battery voltage condition. */
if
(
has_low_battery
())
...
...
drivers/char/rtc.c
View file @
690c8fd3
...
...
@@ -928,7 +928,7 @@ static int __init rtc_init(void)
#ifdef __sparc__
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
strcmp
(
edev
->
prom_name
,
"rtc"
)
==
0
)
{
if
(
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"rtc"
)
==
0
)
{
rtc_port
=
edev
->
resource
[
0
].
start
;
rtc_irq
=
edev
->
irqs
[
0
];
goto
found
;
...
...
@@ -938,7 +938,7 @@ static int __init rtc_init(void)
#ifdef __sparc_v9__
for_each_isa
(
isa_br
)
{
for_each_isadev
(
isa_dev
,
isa_br
)
{
if
(
strcmp
(
isa_dev
->
prom_name
,
"rtc"
)
==
0
)
{
if
(
strcmp
(
isa_dev
->
prom_n
ode
->
n
ame
,
"rtc"
)
==
0
)
{
rtc_port
=
isa_dev
->
resource
.
start
;
rtc_irq
=
isa_dev
->
irq
;
goto
found
;
...
...
drivers/input/misc/sparcspkr.c
View file @
690c8fd3
...
...
@@ -199,7 +199,7 @@ static int __init sparcspkr_init(void)
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"beep"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"beep"
))
{
beep_name
=
"Sparc EBUS Speaker"
;
beep_event
=
ebus_spkr_event
;
beep_iobase
=
edev
->
resource
[
0
].
start
;
...
...
@@ -213,7 +213,7 @@ static int __init sparcspkr_init(void)
/* A hack, the beep device's base lives in
* the DMA isa node.
*/
if
(
!
strcmp
(
isa_dev
->
prom_name
,
"dma"
))
{
if
(
!
strcmp
(
isa_dev
->
prom_n
ode
->
n
ame
,
"dma"
))
{
beep_name
=
"Sparc ISA Speaker"
;
beep_event
=
isa_spkr_event
,
beep_iobase
=
isa_dev
->
resource
.
start
;
...
...
drivers/input/serio/i8042-sparcio.h
View file @
690c8fd3
...
...
@@ -74,7 +74,7 @@ static int __init i8042_platform_init(void)
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"8042"
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"8042"
))
goto
edev_found
;
}
}
...
...
@@ -82,14 +82,14 @@ static int __init i8042_platform_init(void)
edev_found:
for_each_edevchild
(
edev
,
child
)
{
if
(
!
strcmp
(
child
->
prom_name
,
OBP_PS2KBD_NAME1
)
||
!
strcmp
(
child
->
prom_name
,
OBP_PS2KBD_NAME2
))
{
if
(
!
strcmp
(
child
->
prom_n
ode
->
n
ame
,
OBP_PS2KBD_NAME1
)
||
!
strcmp
(
child
->
prom_n
ode
->
n
ame
,
OBP_PS2KBD_NAME2
))
{
i8042_kbd_irq
=
child
->
irqs
[
0
];
kbd_iobase
=
ioremap
(
child
->
resource
[
0
].
start
,
8
);
}
if
(
!
strcmp
(
child
->
prom_name
,
OBP_PS2MS_NAME1
)
||
!
strcmp
(
child
->
prom_name
,
OBP_PS2MS_NAME2
))
if
(
!
strcmp
(
child
->
prom_n
ode
->
n
ame
,
OBP_PS2MS_NAME1
)
||
!
strcmp
(
child
->
prom_n
ode
->
n
ame
,
OBP_PS2MS_NAME2
))
i8042_aux_irq
=
child
->
irqs
[
0
];
}
if
(
i8042_kbd_irq
==
-
1
||
...
...
drivers/sbus/char/bbc_envctrl.c
View file @
690c8fd3
...
...
@@ -575,9 +575,9 @@ int bbc_envctrl_init(void)
int
devidx
=
0
;
while
((
echild
=
bbc_i2c_getdev
(
devidx
++
))
!=
NULL
)
{
if
(
!
strcmp
(
echild
->
prom_name
,
"temperature"
))
if
(
!
strcmp
(
echild
->
prom_n
ode
->
n
ame
,
"temperature"
))
attach_one_temp
(
echild
,
temp_index
++
);
if
(
!
strcmp
(
echild
->
prom_name
,
"fan-control"
))
if
(
!
strcmp
(
echild
->
prom_n
ode
->
n
ame
,
"fan-control"
))
attach_one_fan
(
echild
,
fan_index
++
);
}
if
(
temp_index
!=
0
&&
fan_index
!=
0
)
{
...
...
drivers/sbus/char/bbc_i2c.c
View file @
690c8fd3
...
...
@@ -423,7 +423,7 @@ static int __init bbc_present(void)
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"bbc"
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"bbc"
))
return
1
;
}
}
...
...
@@ -446,7 +446,7 @@ static int __init bbc_i2c_init(void)
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"i2c"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"i2c"
))
{
if
(
!
attach_one_i2c
(
edev
,
index
))
index
++
;
}
...
...
drivers/sbus/char/display7seg.c
View file @
690c8fd3
...
...
@@ -184,7 +184,7 @@ static int __init d7s_init(void)
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
D7S_OBPNAME
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
D7S_OBPNAME
))
goto
ebus_done
;
}
}
...
...
drivers/sbus/char/envctrl.c
View file @
690c8fd3
...
...
@@ -768,16 +768,14 @@ static void envctrl_set_mon(struct i2c_child_t *pchild,
* decoding tables, monitor type, optional properties.
* Return: None.
*/
static
void
envctrl_init_adc
(
struct
i2c_child_t
*
pchild
,
int
node
)
static
void
envctrl_init_adc
(
struct
i2c_child_t
*
pchild
,
struct
device_node
*
dp
)
{
char
chnls_desc
[
CHANNEL_DESC_SZ
];
int
i
=
0
,
len
;
char
*
pos
=
chnls_desc
;
char
*
pos
;
unsigned
int
*
pval
;
/* Firmware describe channels into a stream separated by a '\0'. */
len
=
prom_getproperty
(
node
,
"channels-description"
,
chnls_desc
,
CHANNEL_DESC_SZ
);
chnls_desc
[
CHANNEL_DESC_SZ
-
1
]
=
'\0'
;
pos
=
of_get_property
(
dp
,
"channels-description"
,
&
len
);
while
(
len
>
0
)
{
int
l
=
strlen
(
pos
)
+
1
;
...
...
@@ -787,10 +785,13 @@ static void envctrl_init_adc(struct i2c_child_t *pchild, int node)
}
/* Get optional properties. */
len
=
prom_getproperty
(
node
,
"warning-temp"
,
(
char
*
)
&
warning_temperature
,
sizeof
(
warning_temperature
));
len
=
prom_getproperty
(
node
,
"shutdown-temp"
,
(
char
*
)
&
shutdown_temperature
,
sizeof
(
shutdown_temperature
));
pval
=
of_get_property
(
dp
,
"warning-temp"
,
NULL
);
if
(
pval
)
warning_temperature
=
*
pval
;
pval
=
of_get_property
(
dp
,
"shutdown-temp"
,
NULL
);
if
(
pval
)
shutdown_temperature
=
*
pval
;
}
/* Function Description: Initialize child device monitoring fan status.
...
...
@@ -864,21 +865,18 @@ static void envctrl_init_voltage_status(struct i2c_child_t *pchild)
static
void
envctrl_init_i2c_child
(
struct
linux_ebus_child
*
edev_child
,
struct
i2c_child_t
*
pchild
)
{
int
node
,
len
,
i
,
tbls_size
=
0
;
node
=
edev_child
->
prom_node
;
int
len
,
i
,
tbls_size
=
0
;
struct
device_node
*
dp
=
edev_child
->
prom_node
;
void
*
pval
;
/* Get device address. */
len
=
prom_getproperty
(
node
,
"reg"
,
(
char
*
)
&
(
pchild
->
addr
),
sizeof
(
pchild
->
addr
));
pval
=
of_get_property
(
dp
,
"reg"
,
&
len
);
memcpy
(
&
pchild
->
addr
,
pval
,
len
);
/* Get tables property. Read firmware temperature tables. */
len
=
prom_getproperty
(
node
,
"translation"
,
(
char
*
)
pchild
->
tblprop_array
,
(
PCF8584_MAX_CHANNELS
*
sizeof
(
struct
pcf8584_tblprop
)));
if
(
len
>
0
)
{
pval
=
of_get_property
(
dp
,
"translation"
,
&
len
);
if
(
pval
&&
len
>
0
)
{
memcpy
(
pchild
->
tblprop_array
,
pval
,
len
);
pchild
->
total_tbls
=
len
/
sizeof
(
struct
pcf8584_tblprop
);
for
(
i
=
0
;
i
<
pchild
->
total_tbls
;
i
++
)
{
if
((
pchild
->
tblprop_array
[
i
].
size
+
pchild
->
tblprop_array
[
i
].
offset
)
>
tbls_size
)
{
...
...
@@ -891,12 +889,12 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
printk
(
"envctrl: Failed to allocate table.
\n
"
);
return
;
}
len
=
prom_getproperty
(
node
,
"tables"
,
(
char
*
)
pchild
->
tables
,
tbls_size
);
if
(
len
<=
0
)
{
pval
=
of_get_property
(
dp
,
"tables"
,
&
len
);
if
(
!
pval
||
len
<=
0
)
{
printk
(
"envctrl: Failed to get table.
\n
"
);
return
;
}
memcpy
(
pchild
->
tables
,
pval
,
len
);
}
/* SPARCengine ASM Reference Manual (ref. SMI doc 805-7581-04)
...
...
@@ -907,12 +905,11 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
* 'NULL' monitor type.
*/
if
(
ENVCTRL_CPCI_IGNORED_NODE
==
pchild
->
addr
)
{
struct
device_node
*
root_node
;
int
len
;
char
prop
[
56
];
len
=
prom_getproperty
(
prom_root_node
,
"name"
,
prop
,
sizeof
(
prop
));
if
(
0
<
len
&&
(
0
==
strncmp
(
prop
,
"SUNW,UltraSPARC-IIi-cEngine"
,
len
)))
{
root_node
=
of_find_node_by_path
(
"/"
);
if
(
!
strcmp
(
root_node
->
name
,
"SUNW,UltraSPARC-IIi-cEngine"
))
{
for
(
len
=
0
;
len
<
PCF8584_MAX_CHANNELS
;
++
len
)
{
pchild
->
mon_type
[
len
]
=
ENVCTRL_NOMON
;
}
...
...
@@ -921,16 +918,14 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
}
/* Get the monitor channels. */
len
=
prom_getproperty
(
node
,
"channels-in-use"
,
(
char
*
)
pchild
->
chnl_array
,
(
PCF8584_MAX_CHANNELS
*
sizeof
(
struct
pcf8584_channel
)));
pval
=
of_get_property
(
dp
,
"channels-in-use"
,
&
len
);
memcpy
(
pchild
->
chnl_array
,
pval
,
len
);
pchild
->
total_chnls
=
len
/
sizeof
(
struct
pcf8584_channel
);
for
(
i
=
0
;
i
<
pchild
->
total_chnls
;
i
++
)
{
switch
(
pchild
->
chnl_array
[
i
].
type
)
{
case
PCF8584_TEMP_TYPE
:
envctrl_init_adc
(
pchild
,
node
);
envctrl_init_adc
(
pchild
,
dp
);
break
;
case
PCF8584_GLOBALADDR_TYPE
:
...
...
@@ -945,7 +940,7 @@ static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
case
PCF8584_VOLTAGE_TYPE
:
if
(
pchild
->
i2ctype
==
I2C_ADC
)
{
envctrl_init_adc
(
pchild
,
node
);
envctrl_init_adc
(
pchild
,
dp
);
}
else
{
envctrl_init_voltage_status
(
pchild
);
}
...
...
@@ -1046,7 +1041,7 @@ static int __init envctrl_init(void)
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"bbc"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"bbc"
))
{
/* If we find a boot-bus controller node,
* then this envctrl driver is not for us.
*/
...
...
@@ -1060,14 +1055,14 @@ static int __init envctrl_init(void)
*/
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"i2c"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"i2c"
))
{
i2c
=
ioremap
(
edev
->
resource
[
0
].
start
,
0x2
);
for_each_edevchild
(
edev
,
edev_child
)
{
if
(
!
strcmp
(
"gpio"
,
edev_child
->
prom_name
))
{
if
(
!
strcmp
(
"gpio"
,
edev_child
->
prom_n
ode
->
n
ame
))
{
i2c_childlist
[
i
].
i2ctype
=
I2C_GPIO
;
envctrl_init_i2c_child
(
edev_child
,
&
(
i2c_childlist
[
i
++
]));
}
if
(
!
strcmp
(
"adc"
,
edev_child
->
prom_name
))
{
if
(
!
strcmp
(
"adc"
,
edev_child
->
prom_n
ode
->
n
ame
))
{
i2c_childlist
[
i
].
i2ctype
=
I2C_ADC
;
envctrl_init_i2c_child
(
edev_child
,
&
(
i2c_childlist
[
i
++
]));
}
...
...
drivers/sbus/char/flash.c
View file @
690c8fd3
...
...
@@ -192,9 +192,11 @@ static int __init flash_init(void)
}
if
(
!
sdev
)
{
#ifdef CONFIG_PCI
struct
linux_prom_registers
*
ebus_regs
;
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"flashprom"
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"flashprom"
))
goto
ebus_done
;
}
}
...
...
@@ -202,23 +204,23 @@ static int __init flash_init(void)
if
(
!
edev
)
return
-
ENODEV
;
len
=
prom_getproperty
(
edev
->
prom_node
,
"reg"
,
(
void
*
)
regs
,
sizeof
(
regs
)
);
if
((
len
%
sizeof
(
regs
[
0
]))
!=
0
)
{
ebus_regs
=
of_get_property
(
edev
->
prom_node
,
"reg"
,
&
len
);
if
(
!
ebus_regs
||
(
len
%
sizeof
(
regs
[
0
]))
!=
0
)
{
printk
(
"flash: Strange reg property size %d
\n
"
,
len
);
return
-
ENODEV
;
}
nregs
=
len
/
sizeof
(
regs
[
0
]);
nregs
=
len
/
sizeof
(
ebus_
regs
[
0
]);
flash
.
read_base
=
edev
->
resource
[
0
].
start
;
flash
.
read_size
=
regs
[
0
].
reg_size
;
flash
.
read_size
=
ebus_
regs
[
0
].
reg_size
;
if
(
nregs
==
1
)
{
flash
.
write_base
=
edev
->
resource
[
0
].
start
;
flash
.
write_size
=
regs
[
0
].
reg_size
;
flash
.
write_size
=
ebus_
regs
[
0
].
reg_size
;
}
else
if
(
nregs
==
2
)
{
flash
.
write_base
=
edev
->
resource
[
1
].
start
;
flash
.
write_size
=
regs
[
1
].
reg_size
;
flash
.
write_size
=
ebus_
regs
[
1
].
reg_size
;
}
else
{
printk
(
"flash: Strange number of regs %d
\n
"
,
nregs
);
return
-
ENODEV
;
...
...
drivers/serial/sunsab.c
View file @
690c8fd3
...
...
@@ -984,19 +984,19 @@ static void __init for_each_sab_edev(void (*callback)(struct linux_ebus_device *
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"se"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"se"
))
{
callback
(
edev
,
arg
);
continue
;
}
else
if
(
!
strcmp
(
edev
->
prom_name
,
"serial"
))
{
char
compat
[
32
]
;
}
else
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"serial"
))
{
char
*
compat
;
int
clen
;
/* On RIO this can be an SE, check it. We could
* just check ebus->is_rio, but this is more portable.
*/
c
len
=
prom_getproperty
(
edev
->
prom_node
,
"compatible"
,
compat
,
sizeof
(
compat
)
);
if
(
clen
>
0
)
{
c
ompat
=
of_get_property
(
edev
->
prom_node
,
"compatible"
,
&
clen
);
if
(
c
ompat
&&
c
len
>
0
)
{
if
(
strncmp
(
compat
,
"sab82532"
,
8
)
==
0
)
{
callback
(
edev
,
arg
);
continue
;
...
...
drivers/serial/sunsu.c
View file @
690c8fd3
...
...
@@ -1053,7 +1053,7 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
*/
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
dev
,
ebus
)
{
if
(
dev
->
prom_node
==
up
->
port_node
)
{
if
(
dev
->
prom_node
->
node
==
up
->
port_node
)
{
/*
* The EBus is broken on sparc; it delivers
* virtual addresses in resources. Oh well...
...
...
@@ -1073,7 +1073,7 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
#ifdef CONFIG_SPARC64
for_each_isa
(
isa_br
)
{
for_each_isadev
(
isa_dev
,
isa_br
)
{
if
(
isa_dev
->
prom_node
==
up
->
port_node
)
{
if
(
isa_dev
->
prom_node
->
node
==
up
->
port_node
)
{
/* Same on sparc64. Cool architecure... */
up
->
port
.
membase
=
(
char
*
)
isa_dev
->
resource
.
start
;
up
->
port
.
mapbase
=
isa_dev
->
resource
.
start
;
...
...
include/asm-sparc64/ebus.h
View file @
690c8fd3
...
...
@@ -10,13 +10,13 @@
#include <asm/pbm.h>
#include <asm/oplib.h>
#include <asm/prom.h>
struct
linux_ebus_child
{
struct
linux_ebus_child
*
next
;
struct
linux_ebus_device
*
parent
;
struct
linux_ebus
*
bus
;
int
prom_node
;
char
prom_name
[
64
];
struct
device_node
*
prom_node
;
struct
resource
resource
[
PROMREG_MAX
];
int
num_addrs
;
unsigned
int
irqs
[
PROMINTR_MAX
];
...
...
@@ -27,8 +27,7 @@ struct linux_ebus_device {
struct
linux_ebus_device
*
next
;
struct
linux_ebus_child
*
children
;
struct
linux_ebus
*
bus
;
int
prom_node
;
char
prom_name
[
64
];
struct
device_node
*
prom_node
;
struct
resource
resource
[
PROMREG_MAX
];
int
num_addrs
;
unsigned
int
irqs
[
PROMINTR_MAX
];
...
...
@@ -42,8 +41,7 @@ struct linux_ebus {
struct
pci_dev
*
self
;
int
index
;
int
is_rio
;
int
prom_node
;
char
prom_name
[
64
];
struct
device_node
*
prom_node
;
struct
linux_prom_ebus_ranges
ebus_ranges
[
PROMREG_MAX
];
int
num_ebus_ranges
;
struct
linux_prom_ebus_intmap
ebus_intmap
[
PROMREG_MAX
];
...
...
include/asm-sparc64/floppy.h
View file @
690c8fd3
...
...
@@ -498,15 +498,14 @@ static int sun_pci_fd_test_drive(unsigned long port, int drive)
#ifdef CONFIG_PCI
static
int
__init
ebus_fdthree_p
(
struct
linux_ebus_device
*
edev
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"fdthree"
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"fdthree"
))
return
1
;
if
(
!
strcmp
(
edev
->
prom_name
,
"floppy"
))
{
char
compat
[
16
];
prom_getstring
(
edev
->
prom_node
,
"compatible"
,
compat
,
sizeof
(
compat
));
compat
[
15
]
=
'\0'
;
if
(
!
strcmp
(
compat
,
"fdthree"
))
if
(
!
strcmp
(
edev
->
prom_node
->
name
,
"floppy"
))
{
char
*
compat
;
compat
=
of_get_property
(
edev
->
prom_node
,
"compatible"
,
NULL
);
if
(
compat
&&
!
strcmp
(
compat
,
"fdthree"
))
return
1
;
}
return
0
;
...
...
@@ -524,12 +523,12 @@ static unsigned long __init isa_floppy_init(void)
for_each_isa
(
isa_br
)
{
for_each_isadev
(
isa_dev
,
isa_br
)
{
if
(
!
strcmp
(
isa_dev
->
prom_name
,
"dma"
))
{
if
(
!
strcmp
(
isa_dev
->
prom_n
ode
->
n
ame
,
"dma"
))
{
struct
sparc_isa_device
*
child
=
isa_dev
->
child
;
while
(
child
)
{
if
(
!
strcmp
(
child
->
prom_name
,
if
(
!
strcmp
(
child
->
prom_n
ode
->
n
ame
,
"floppy"
))
{
isa_dev
=
child
;
goto
isa_done
;
...
...
@@ -614,6 +613,7 @@ static unsigned long __init sun_floppy_init(void)
struct
linux_ebus_device
*
edev
=
NULL
;
unsigned
long
config
=
0
;
void
__iomem
*
auxio_reg
;
char
*
state_prop
;
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
...
...
@@ -630,9 +630,8 @@ static unsigned long __init sun_floppy_init(void)
#endif
}
prom_getproperty
(
edev
->
prom_node
,
"status"
,
state
,
sizeof
(
state
));
if
(
!
strncmp
(
state
,
"disabled"
,
8
))
state_prop
=
of_get_property
(
edev
->
prom_node
,
"status"
,
NULL
);
if
(
state_prop
&&
!
strncmp
(
state_prop
,
"disabled"
,
8
))
return
0
;
FLOPPY_IRQ
=
edev
->
irqs
[
0
];
...
...
@@ -703,7 +702,7 @@ static unsigned long __init sun_floppy_init(void)
*/
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"ecpp"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"ecpp"
))
{
config
=
edev
->
resource
[
1
].
start
;
goto
config_done
;
}
...
...
include/asm-sparc64/isa.h
View file @
690c8fd3
...
...
@@ -9,6 +9,7 @@
#include <asm/pbm.h>
#include <asm/oplib.h>
#include <asm/prom.h>
struct
sparc_isa_bridge
;
...
...
@@ -16,9 +17,7 @@ struct sparc_isa_device {
struct
sparc_isa_device
*
next
;
struct
sparc_isa_device
*
child
;
struct
sparc_isa_bridge
*
bus
;
int
prom_node
;
char
prom_name
[
64
];
char
compatible
[
64
];
struct
device_node
*
prom_node
;
struct
resource
resource
;
unsigned
int
irq
;
};
...
...
@@ -29,8 +28,7 @@ struct sparc_isa_bridge {
struct
pci_pbm_info
*
parent
;
struct
pci_dev
*
self
;
int
index
;
int
prom_node
;
char
prom_name
[
64
];
struct
device_node
*
prom_node
;
#define linux_prom_isa_ranges linux_prom_ebus_ranges
struct
linux_prom_isa_ranges
isa_ranges
[
PROMREG_MAX
];
int
num_isa_ranges
;
...
...
include/asm-sparc64/parport.h
View file @
690c8fd3
...
...
@@ -67,18 +67,17 @@ static __inline__ unsigned int get_dma_residue(unsigned int dmanr)
static
int
ebus_ecpp_p
(
struct
linux_ebus_device
*
edev
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"ecpp"
))
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"ecpp"
))
return
1
;
if
(
!
strcmp
(
edev
->
prom_name
,
"parallel"
))
{
char
compat
[
19
];
prom_getstring
(
edev
->
prom_node
,
"compatible"
,
compat
,
sizeof
(
compat
));
compat
[
18
]
=
'\0'
;
if
(
!
strcmp
(
compat
,
"ecpp"
))
return
1
;
if
(
!
strcmp
(
compat
,
"ns87317-ecpp"
)
&&
!
strcmp
(
compat
+
13
,
"ecpp"
))
if
(
!
strcmp
(
edev
->
prom_node
->
name
,
"parallel"
))
{
char
*
compat
;
compat
=
of_get_property
(
edev
->
prom_node
,
"compatible"
,
NULL
);
if
(
compat
&&
(
!
strcmp
(
compat
,
"ecpp"
)
||
!
strcmp
(
compat
,
"ns87317-ecpp"
)
||
!
strcmp
(
compat
+
13
,
"ecpp"
)))
return
1
;
}
return
0
;
...
...
@@ -94,12 +93,12 @@ static int parport_isa_probe(int count)
struct
sparc_isa_device
*
child
;
unsigned
long
base
;
if
(
strcmp
(
isa_dev
->
prom_name
,
"dma"
))
if
(
strcmp
(
isa_dev
->
prom_n
ode
->
n
ame
,
"dma"
))
continue
;
child
=
isa_dev
->
child
;
while
(
child
)
{
if
(
!
strcmp
(
child
->
prom_name
,
"parallel"
))
if
(
!
strcmp
(
child
->
prom_n
ode
->
n
ame
,
"parallel"
))
break
;
child
=
child
->
next
;
}
...
...
sound/sparc/cs4231.c
View file @
690c8fd3
...
...
@@ -2284,15 +2284,14 @@ static int __init cs4231_init(void)
for_each_ebusdev
(
edev
,
ebus
)
{
int
match
=
0
;
if
(
!
strcmp
(
edev
->
prom_name
,
"SUNW,CS4231"
))
{
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"SUNW,CS4231"
))
{
match
=
1
;
}
else
if
(
!
strcmp
(
edev
->
prom_name
,
"audio"
))
{
char
compat
[
16
]
;
}
else
if
(
!
strcmp
(
edev
->
prom_n
ode
->
n
ame
,
"audio"
))
{
char
*
compat
;
prom_getstring
(
edev
->
prom_node
,
"compatible"
,
compat
,
sizeof
(
compat
));
compat
[
15
]
=
'\0'
;
if
(
!
strcmp
(
compat
,
"SUNW,CS4231"
))
compat
=
of_get_property
(
edev
->
prom_node
,
"compatible"
,
NULL
);
if
(
compat
&&
!
strcmp
(
compat
,
"SUNW,CS4231"
))
match
=
1
;
}
...
...
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