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
62f5b7c7
Commit
62f5b7c7
authored
Jul 27, 2019
by
Jonathan Cameron
Browse files
Options
Browse Files
Download
Plain Diff
Merge tag 'tags/i3c/export-i3c_device_match_id' into HEAD
Needed for the st_lsm6dsx_i3c.c driver
parents
3f2cde74
934d24a5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
57 additions
and
45 deletions
+57
-45
drivers/i3c/device.c
drivers/i3c/device.c
+53
-0
drivers/i3c/master.c
drivers/i3c/master.c
+0
-45
include/linux/i3c/device.h
include/linux/i3c/device.h
+4
-0
No files found.
drivers/i3c/device.c
View file @
62f5b7c7
...
...
@@ -200,6 +200,59 @@ struct i3c_device *dev_to_i3cdev(struct device *dev)
}
EXPORT_SYMBOL_GPL
(
dev_to_i3cdev
);
/**
* i3c_device_match_id() - Returns the i3c_device_id entry matching @i3cdev
* @i3cdev: I3C device
* @id_table: I3C device match table
*
* Return: a pointer to an i3c_device_id object or NULL if there's no match.
*/
const
struct
i3c_device_id
*
i3c_device_match_id
(
struct
i3c_device
*
i3cdev
,
const
struct
i3c_device_id
*
id_table
)
{
struct
i3c_device_info
devinfo
;
const
struct
i3c_device_id
*
id
;
i3c_device_get_info
(
i3cdev
,
&
devinfo
);
/*
* The lower 32bits of the provisional ID is just filled with a random
* value, try to match using DCR info.
*/
if
(
!
I3C_PID_RND_LOWER_32BITS
(
devinfo
.
pid
))
{
u16
manuf
=
I3C_PID_MANUF_ID
(
devinfo
.
pid
);
u16
part
=
I3C_PID_PART_ID
(
devinfo
.
pid
);
u16
ext_info
=
I3C_PID_EXTRA_INFO
(
devinfo
.
pid
);
/* First try to match by manufacturer/part ID. */
for
(
id
=
id_table
;
id
->
match_flags
!=
0
;
id
++
)
{
if
((
id
->
match_flags
&
I3C_MATCH_MANUF_AND_PART
)
!=
I3C_MATCH_MANUF_AND_PART
)
continue
;
if
(
manuf
!=
id
->
manuf_id
||
part
!=
id
->
part_id
)
continue
;
if
((
id
->
match_flags
&
I3C_MATCH_EXTRA_INFO
)
&&
ext_info
!=
id
->
extra_info
)
continue
;
return
id
;
}
}
/* Fallback to DCR match. */
for
(
id
=
id_table
;
id
->
match_flags
!=
0
;
id
++
)
{
if
((
id
->
match_flags
&
I3C_MATCH_DCR
)
&&
id
->
dcr
==
devinfo
.
dcr
)
return
id
;
}
return
NULL
;
}
EXPORT_SYMBOL_GPL
(
i3c_device_match_id
);
/**
* i3c_driver_register_with_owner() - register an I3C device driver
*
...
...
drivers/i3c/master.c
View file @
62f5b7c7
...
...
@@ -276,51 +276,6 @@ static const struct device_type i3c_device_type = {
.
uevent
=
i3c_device_uevent
,
};
static
const
struct
i3c_device_id
*
i3c_device_match_id
(
struct
i3c_device
*
i3cdev
,
const
struct
i3c_device_id
*
id_table
)
{
struct
i3c_device_info
devinfo
;
const
struct
i3c_device_id
*
id
;
i3c_device_get_info
(
i3cdev
,
&
devinfo
);
/*
* The lower 32bits of the provisional ID is just filled with a random
* value, try to match using DCR info.
*/
if
(
!
I3C_PID_RND_LOWER_32BITS
(
devinfo
.
pid
))
{
u16
manuf
=
I3C_PID_MANUF_ID
(
devinfo
.
pid
);
u16
part
=
I3C_PID_PART_ID
(
devinfo
.
pid
);
u16
ext_info
=
I3C_PID_EXTRA_INFO
(
devinfo
.
pid
);
/* First try to match by manufacturer/part ID. */
for
(
id
=
id_table
;
id
->
match_flags
!=
0
;
id
++
)
{
if
((
id
->
match_flags
&
I3C_MATCH_MANUF_AND_PART
)
!=
I3C_MATCH_MANUF_AND_PART
)
continue
;
if
(
manuf
!=
id
->
manuf_id
||
part
!=
id
->
part_id
)
continue
;
if
((
id
->
match_flags
&
I3C_MATCH_EXTRA_INFO
)
&&
ext_info
!=
id
->
extra_info
)
continue
;
return
id
;
}
}
/* Fallback to DCR match. */
for
(
id
=
id_table
;
id
->
match_flags
!=
0
;
id
++
)
{
if
((
id
->
match_flags
&
I3C_MATCH_DCR
)
&&
id
->
dcr
==
devinfo
.
dcr
)
return
id
;
}
return
NULL
;
}
static
int
i3c_device_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
{
struct
i3c_device
*
i3cdev
;
...
...
include/linux/i3c/device.h
View file @
62f5b7c7
...
...
@@ -188,6 +188,10 @@ static inline struct i3c_driver *drv_to_i3cdrv(struct device_driver *drv)
struct
device
*
i3cdev_to_dev
(
struct
i3c_device
*
i3cdev
);
struct
i3c_device
*
dev_to_i3cdev
(
struct
device
*
dev
);
const
struct
i3c_device_id
*
i3c_device_match_id
(
struct
i3c_device
*
i3cdev
,
const
struct
i3c_device_id
*
id_table
);
static
inline
void
i3cdev_set_drvdata
(
struct
i3c_device
*
i3cdev
,
void
*
data
)
{
...
...
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