Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
2e686bc3
Commit
2e686bc3
authored
19 years ago
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
powerpc: Merge of_device.c and of_device.h
Signed-off-by:
Paul Mackerras
<
paulus@samba.org
>
parent
187a0067
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
277 additions
and
6 deletions
+277
-6
arch/powerpc/kernel/of_device.c
arch/powerpc/kernel/of_device.c
+274
-0
include/asm-powerpc/of_device.h
include/asm-powerpc/of_device.h
+3
-4
include/asm-ppc64/of_device.h
include/asm-ppc64/of_device.h
+0
-2
No files found.
arch/powerpc/kernel/of_device.c
0 → 100644
View file @
2e686bc3
#include <linux/config.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <asm/errno.h>
#include <asm/of_device.h>
/**
* of_match_device - Tell if an of_device structure has a matching
* of_match structure
* @ids: array of of device match structures to search in
* @dev: the of device structure to match against
*
* Used by a driver to check whether an of_device present in the
* system is in its list of supported devices.
*/
const
struct
of_device_id
*
of_match_device
(
const
struct
of_device_id
*
matches
,
const
struct
of_device
*
dev
)
{
if
(
!
dev
->
node
)
return
NULL
;
while
(
matches
->
name
[
0
]
||
matches
->
type
[
0
]
||
matches
->
compatible
[
0
])
{
int
match
=
1
;
if
(
matches
->
name
[
0
])
match
&=
dev
->
node
->
name
&&
!
strcmp
(
matches
->
name
,
dev
->
node
->
name
);
if
(
matches
->
type
[
0
])
match
&=
dev
->
node
->
type
&&
!
strcmp
(
matches
->
type
,
dev
->
node
->
type
);
if
(
matches
->
compatible
[
0
])
match
&=
device_is_compatible
(
dev
->
node
,
matches
->
compatible
);
if
(
match
)
return
matches
;
matches
++
;
}
return
NULL
;
}
static
int
of_platform_bus_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
{
struct
of_device
*
of_dev
=
to_of_device
(
dev
);
struct
of_platform_driver
*
of_drv
=
to_of_platform_driver
(
drv
);
const
struct
of_device_id
*
matches
=
of_drv
->
match_table
;
if
(
!
matches
)
return
0
;
return
of_match_device
(
matches
,
of_dev
)
!=
NULL
;
}
struct
of_device
*
of_dev_get
(
struct
of_device
*
dev
)
{
struct
device
*
tmp
;
if
(
!
dev
)
return
NULL
;
tmp
=
get_device
(
&
dev
->
dev
);
if
(
tmp
)
return
to_of_device
(
tmp
);
else
return
NULL
;
}
void
of_dev_put
(
struct
of_device
*
dev
)
{
if
(
dev
)
put_device
(
&
dev
->
dev
);
}
static
int
of_device_probe
(
struct
device
*
dev
)
{
int
error
=
-
ENODEV
;
struct
of_platform_driver
*
drv
;
struct
of_device
*
of_dev
;
const
struct
of_device_id
*
match
;
drv
=
to_of_platform_driver
(
dev
->
driver
);
of_dev
=
to_of_device
(
dev
);
if
(
!
drv
->
probe
)
return
error
;
of_dev_get
(
of_dev
);
match
=
of_match_device
(
drv
->
match_table
,
of_dev
);
if
(
match
)
error
=
drv
->
probe
(
of_dev
,
match
);
if
(
error
)
of_dev_put
(
of_dev
);
return
error
;
}
static
int
of_device_remove
(
struct
device
*
dev
)
{
struct
of_device
*
of_dev
=
to_of_device
(
dev
);
struct
of_platform_driver
*
drv
=
to_of_platform_driver
(
dev
->
driver
);
if
(
dev
->
driver
&&
drv
->
remove
)
drv
->
remove
(
of_dev
);
return
0
;
}
static
int
of_device_suspend
(
struct
device
*
dev
,
pm_message_t
state
)
{
struct
of_device
*
of_dev
=
to_of_device
(
dev
);
struct
of_platform_driver
*
drv
=
to_of_platform_driver
(
dev
->
driver
);
int
error
=
0
;
if
(
dev
->
driver
&&
drv
->
suspend
)
error
=
drv
->
suspend
(
of_dev
,
state
);
return
error
;
}
static
int
of_device_resume
(
struct
device
*
dev
)
{
struct
of_device
*
of_dev
=
to_of_device
(
dev
);
struct
of_platform_driver
*
drv
=
to_of_platform_driver
(
dev
->
driver
);
int
error
=
0
;
if
(
dev
->
driver
&&
drv
->
resume
)
error
=
drv
->
resume
(
of_dev
);
return
error
;
}
struct
bus_type
of_platform_bus_type
=
{
.
name
=
"of_platform"
,
.
match
=
of_platform_bus_match
,
.
suspend
=
of_device_suspend
,
.
resume
=
of_device_resume
,
};
static
int
__init
of_bus_driver_init
(
void
)
{
return
bus_register
(
&
of_platform_bus_type
);
}
postcore_initcall
(
of_bus_driver_init
);
int
of_register_driver
(
struct
of_platform_driver
*
drv
)
{
int
count
=
0
;
/* initialize common driver fields */
drv
->
driver
.
name
=
drv
->
name
;
drv
->
driver
.
bus
=
&
of_platform_bus_type
;
drv
->
driver
.
probe
=
of_device_probe
;
drv
->
driver
.
remove
=
of_device_remove
;
/* register with core */
count
=
driver_register
(
&
drv
->
driver
);
return
count
?
count
:
1
;
}
void
of_unregister_driver
(
struct
of_platform_driver
*
drv
)
{
driver_unregister
(
&
drv
->
driver
);
}
static
ssize_t
dev_show_devspec
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
of_device
*
ofdev
;
ofdev
=
to_of_device
(
dev
);
return
sprintf
(
buf
,
"%s"
,
ofdev
->
node
->
full_name
);
}
static
DEVICE_ATTR
(
devspec
,
S_IRUGO
,
dev_show_devspec
,
NULL
);
/**
* of_release_dev - free an of device structure when all users of it are finished.
* @dev: device that's been disconnected
*
* Will be called only by the device core when all users of this of device are
* done.
*/
void
of_release_dev
(
struct
device
*
dev
)
{
struct
of_device
*
ofdev
;
ofdev
=
to_of_device
(
dev
);
of_node_put
(
ofdev
->
node
);
kfree
(
ofdev
);
}
int
of_device_register
(
struct
of_device
*
ofdev
)
{
int
rc
;
struct
of_device
**
odprop
;
BUG_ON
(
ofdev
->
node
==
NULL
);
odprop
=
(
struct
of_device
**
)
get_property
(
ofdev
->
node
,
"linux,device"
,
NULL
);
if
(
!
odprop
)
{
struct
property
*
new_prop
;
new_prop
=
kmalloc
(
sizeof
(
struct
property
)
+
sizeof
(
struct
of_device
*
),
GFP_KERNEL
);
if
(
new_prop
==
NULL
)
return
-
ENOMEM
;
new_prop
->
name
=
"linux,device"
;
new_prop
->
length
=
sizeof
(
sizeof
(
struct
of_device
*
));
new_prop
->
value
=
(
unsigned
char
*
)
&
new_prop
[
1
];
odprop
=
(
struct
of_device
**
)
new_prop
->
value
;
*
odprop
=
NULL
;
prom_add_property
(
ofdev
->
node
,
new_prop
);
}
*
odprop
=
ofdev
;
rc
=
device_register
(
&
ofdev
->
dev
);
if
(
rc
)
return
rc
;
device_create_file
(
&
ofdev
->
dev
,
&
dev_attr_devspec
);
return
0
;
}
void
of_device_unregister
(
struct
of_device
*
ofdev
)
{
struct
of_device
**
odprop
;
device_remove_file
(
&
ofdev
->
dev
,
&
dev_attr_devspec
);
odprop
=
(
struct
of_device
**
)
get_property
(
ofdev
->
node
,
"linux,device"
,
NULL
);
if
(
odprop
)
*
odprop
=
NULL
;
device_unregister
(
&
ofdev
->
dev
);
}
struct
of_device
*
of_platform_device_create
(
struct
device_node
*
np
,
const
char
*
bus_id
,
struct
device
*
parent
)
{
struct
of_device
*
dev
;
dev
=
kmalloc
(
sizeof
(
*
dev
),
GFP_KERNEL
);
if
(
!
dev
)
return
NULL
;
memset
(
dev
,
0
,
sizeof
(
*
dev
));
dev
->
node
=
of_node_get
(
np
);
dev
->
dma_mask
=
0xffffffffUL
;
dev
->
dev
.
dma_mask
=
&
dev
->
dma_mask
;
dev
->
dev
.
parent
=
parent
;
dev
->
dev
.
bus
=
&
of_platform_bus_type
;
dev
->
dev
.
release
=
of_release_dev
;
strlcpy
(
dev
->
dev
.
bus_id
,
bus_id
,
BUS_ID_SIZE
);
if
(
of_device_register
(
dev
)
!=
0
)
{
kfree
(
dev
);
return
NULL
;
}
return
dev
;
}
EXPORT_SYMBOL
(
of_match_device
);
EXPORT_SYMBOL
(
of_platform_bus_type
);
EXPORT_SYMBOL
(
of_register_driver
);
EXPORT_SYMBOL
(
of_unregister_driver
);
EXPORT_SYMBOL
(
of_device_register
);
EXPORT_SYMBOL
(
of_device_unregister
);
EXPORT_SYMBOL
(
of_dev_get
);
EXPORT_SYMBOL
(
of_dev_put
);
EXPORT_SYMBOL
(
of_platform_device_create
);
EXPORT_SYMBOL
(
of_release_dev
);
This diff is collapsed.
Click to expand it.
include/asm-ppc/of_device.h
→
include/asm-p
ower
pc/of_device.h
View file @
2e686bc3
#ifndef _
_OF_DEVICE_H__
#ifndef _
ASM_POWERPC_OF_DEVICE_H
#define _
_OF_DEVICE_H__
#define _
ASM_POWERPC_OF_DEVICE_H
#include <linux/device.h>
#include <linux/device.h>
#include <linux/mod_devicetable.h>
#include <linux/mod_devicetable.h>
...
@@ -61,5 +61,4 @@ extern struct of_device *of_platform_device_create(struct device_node *np,
...
@@ -61,5 +61,4 @@ extern struct of_device *of_platform_device_create(struct device_node *np,
struct
device
*
parent
);
struct
device
*
parent
);
extern
void
of_release_dev
(
struct
device
*
dev
);
extern
void
of_release_dev
(
struct
device
*
dev
);
#endif
/* __OF_DEVICE_H__ */
#endif
/* _ASM_POWERPC_OF_DEVICE_H */
This diff is collapsed.
Click to expand it.
include/asm-ppc64/of_device.h
deleted
100644 → 0
View file @
187a0067
#include <asm-ppc/of_device.h>
This diff is collapsed.
Click to expand it.
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