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
681eb167
Commit
681eb167
authored
Jan 17, 2023
by
Wolfram Sang
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'i2c/fwnode-api' into i2c/for-mergewindow
parents
59768879
373c612d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
120 additions
and
81 deletions
+120
-81
drivers/i2c/i2c-core-acpi.c
drivers/i2c/i2c-core-acpi.c
+1
-12
drivers/i2c/i2c-core-base.c
drivers/i2c/i2c-core-base.c
+98
-0
drivers/i2c/i2c-core-of.c
drivers/i2c/i2c-core-of.c
+0
-66
include/linux/i2c.h
include/linux/i2c.h
+21
-3
No files found.
drivers/i2c/i2c-core-acpi.c
View file @
681eb167
...
...
@@ -442,18 +442,7 @@ EXPORT_SYMBOL_GPL(i2c_acpi_find_adapter_by_handle);
static
struct
i2c_client
*
i2c_acpi_find_client_by_adev
(
struct
acpi_device
*
adev
)
{
struct
device
*
dev
;
struct
i2c_client
*
client
;
dev
=
bus_find_device_by_acpi_dev
(
&
i2c_bus_type
,
adev
);
if
(
!
dev
)
return
NULL
;
client
=
i2c_verify_client
(
dev
);
if
(
!
client
)
put_device
(
dev
);
return
client
;
return
i2c_find_device_by_fwnode
(
acpi_fwnode_handle
(
adev
));
}
static
int
i2c_acpi_notify
(
struct
notifier_block
*
nb
,
unsigned
long
value
,
...
...
drivers/i2c/i2c-core-base.c
View file @
681eb167
...
...
@@ -1012,6 +1012,35 @@ void i2c_unregister_device(struct i2c_client *client)
}
EXPORT_SYMBOL_GPL
(
i2c_unregister_device
);
/**
* i2c_find_device_by_fwnode() - find an i2c_client for the fwnode
* @fwnode: &struct fwnode_handle corresponding to the &struct i2c_client
*
* Look up and return the &struct i2c_client corresponding to the @fwnode.
* If no client can be found, or @fwnode is NULL, this returns NULL.
*
* The user must call put_device(&client->dev) once done with the i2c client.
*/
struct
i2c_client
*
i2c_find_device_by_fwnode
(
struct
fwnode_handle
*
fwnode
)
{
struct
i2c_client
*
client
;
struct
device
*
dev
;
if
(
!
fwnode
)
return
NULL
;
dev
=
bus_find_device_by_fwnode
(
&
i2c_bus_type
,
fwnode
);
if
(
!
dev
)
return
NULL
;
client
=
i2c_verify_client
(
dev
);
if
(
!
client
)
put_device
(
dev
);
return
client
;
}
EXPORT_SYMBOL
(
i2c_find_device_by_fwnode
);
static
const
struct
i2c_device_id
dummy_id
[]
=
{
{
"dummy"
,
0
},
...
...
@@ -1761,6 +1790,75 @@ int devm_i2c_add_adapter(struct device *dev, struct i2c_adapter *adapter)
}
EXPORT_SYMBOL_GPL
(
devm_i2c_add_adapter
);
static
int
i2c_dev_or_parent_fwnode_match
(
struct
device
*
dev
,
const
void
*
data
)
{
if
(
dev_fwnode
(
dev
)
==
data
)
return
1
;
if
(
dev
->
parent
&&
dev_fwnode
(
dev
->
parent
)
==
data
)
return
1
;
return
0
;
}
/**
* i2c_find_adapter_by_fwnode() - find an i2c_adapter for the fwnode
* @fwnode: &struct fwnode_handle corresponding to the &struct i2c_adapter
*
* Look up and return the &struct i2c_adapter corresponding to the @fwnode.
* If no adapter can be found, or @fwnode is NULL, this returns NULL.
*
* The user must call put_device(&adapter->dev) once done with the i2c adapter.
*/
struct
i2c_adapter
*
i2c_find_adapter_by_fwnode
(
struct
fwnode_handle
*
fwnode
)
{
struct
i2c_adapter
*
adapter
;
struct
device
*
dev
;
if
(
!
fwnode
)
return
NULL
;
dev
=
bus_find_device
(
&
i2c_bus_type
,
NULL
,
fwnode
,
i2c_dev_or_parent_fwnode_match
);
if
(
!
dev
)
return
NULL
;
adapter
=
i2c_verify_adapter
(
dev
);
if
(
!
adapter
)
put_device
(
dev
);
return
adapter
;
}
EXPORT_SYMBOL
(
i2c_find_adapter_by_fwnode
);
/**
* i2c_get_adapter_by_fwnode() - find an i2c_adapter for the fwnode
* @fwnode: &struct fwnode_handle corresponding to the &struct i2c_adapter
*
* Look up and return the &struct i2c_adapter corresponding to the @fwnode,
* and increment the adapter module's use count. If no adapter can be found,
* or @fwnode is NULL, this returns NULL.
*
* The user must call i2c_put_adapter(adapter) once done with the i2c adapter.
* Note that this is different from i2c_find_adapter_by_node().
*/
struct
i2c_adapter
*
i2c_get_adapter_by_fwnode
(
struct
fwnode_handle
*
fwnode
)
{
struct
i2c_adapter
*
adapter
;
adapter
=
i2c_find_adapter_by_fwnode
(
fwnode
);
if
(
!
adapter
)
return
NULL
;
if
(
!
try_module_get
(
adapter
->
owner
))
{
put_device
(
&
adapter
->
dev
);
adapter
=
NULL
;
}
return
adapter
;
}
EXPORT_SYMBOL
(
i2c_get_adapter_by_fwnode
);
static
void
i2c_parse_timing
(
struct
device
*
dev
,
char
*
prop_name
,
u32
*
cur_val_p
,
u32
def_val
,
bool
use_def
)
{
...
...
drivers/i2c/i2c-core-of.c
View file @
681eb167
...
...
@@ -113,72 +113,6 @@ void of_i2c_register_devices(struct i2c_adapter *adap)
of_node_put
(
bus
);
}
static
int
of_dev_or_parent_node_match
(
struct
device
*
dev
,
const
void
*
data
)
{
if
(
dev
->
of_node
==
data
)
return
1
;
if
(
dev
->
parent
)
return
dev
->
parent
->
of_node
==
data
;
return
0
;
}
/* must call put_device() when done with returned i2c_client device */
struct
i2c_client
*
of_find_i2c_device_by_node
(
struct
device_node
*
node
)
{
struct
device
*
dev
;
struct
i2c_client
*
client
;
dev
=
bus_find_device_by_of_node
(
&
i2c_bus_type
,
node
);
if
(
!
dev
)
return
NULL
;
client
=
i2c_verify_client
(
dev
);
if
(
!
client
)
put_device
(
dev
);
return
client
;
}
EXPORT_SYMBOL
(
of_find_i2c_device_by_node
);
/* must call put_device() when done with returned i2c_adapter device */
struct
i2c_adapter
*
of_find_i2c_adapter_by_node
(
struct
device_node
*
node
)
{
struct
device
*
dev
;
struct
i2c_adapter
*
adapter
;
dev
=
bus_find_device
(
&
i2c_bus_type
,
NULL
,
node
,
of_dev_or_parent_node_match
);
if
(
!
dev
)
return
NULL
;
adapter
=
i2c_verify_adapter
(
dev
);
if
(
!
adapter
)
put_device
(
dev
);
return
adapter
;
}
EXPORT_SYMBOL
(
of_find_i2c_adapter_by_node
);
/* must call i2c_put_adapter() when done with returned i2c_adapter device */
struct
i2c_adapter
*
of_get_i2c_adapter_by_node
(
struct
device_node
*
node
)
{
struct
i2c_adapter
*
adapter
;
adapter
=
of_find_i2c_adapter_by_node
(
node
);
if
(
!
adapter
)
return
NULL
;
if
(
!
try_module_get
(
adapter
->
owner
))
{
put_device
(
&
adapter
->
dev
);
adapter
=
NULL
;
}
return
adapter
;
}
EXPORT_SYMBOL
(
of_get_i2c_adapter_by_node
);
static
const
struct
of_device_id
*
i2c_of_match_device_sysfs
(
const
struct
of_device_id
*
matches
,
struct
i2c_client
*
client
)
...
...
include/linux/i2c.h
View file @
681eb167
...
...
@@ -965,15 +965,33 @@ int i2c_handle_smbus_host_notify(struct i2c_adapter *adap, unsigned short addr);
#endif
/* I2C */
/* must call put_device() when done with returned i2c_client device */
struct
i2c_client
*
i2c_find_device_by_fwnode
(
struct
fwnode_handle
*
fwnode
);
/* must call put_device() when done with returned i2c_adapter device */
struct
i2c_adapter
*
i2c_find_adapter_by_fwnode
(
struct
fwnode_handle
*
fwnode
);
/* must call i2c_put_adapter() when done with returned i2c_adapter device */
struct
i2c_adapter
*
i2c_get_adapter_by_fwnode
(
struct
fwnode_handle
*
fwnode
);
#if IS_ENABLED(CONFIG_OF)
/* must call put_device() when done with returned i2c_client device */
struct
i2c_client
*
of_find_i2c_device_by_node
(
struct
device_node
*
node
);
static
inline
struct
i2c_client
*
of_find_i2c_device_by_node
(
struct
device_node
*
node
)
{
return
i2c_find_device_by_fwnode
(
of_fwnode_handle
(
node
));
}
/* must call put_device() when done with returned i2c_adapter device */
struct
i2c_adapter
*
of_find_i2c_adapter_by_node
(
struct
device_node
*
node
);
static
inline
struct
i2c_adapter
*
of_find_i2c_adapter_by_node
(
struct
device_node
*
node
)
{
return
i2c_find_adapter_by_fwnode
(
of_fwnode_handle
(
node
));
}
/* must call i2c_put_adapter() when done with returned i2c_adapter device */
struct
i2c_adapter
*
of_get_i2c_adapter_by_node
(
struct
device_node
*
node
);
static
inline
struct
i2c_adapter
*
of_get_i2c_adapter_by_node
(
struct
device_node
*
node
)
{
return
i2c_get_adapter_by_fwnode
(
of_fwnode_handle
(
node
));
}
const
struct
of_device_id
*
i2c_of_match_device
(
const
struct
of_device_id
*
matches
,
...
...
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