Commit 97cc4d49cfcda1c2dad89c00b62a25b628ce2115
Committed by
Jean Delvare
1 parent
d582963a02
Exists in
master
and in
39 other branches
i2c: Let i2c_parent_is_i2c_adapter return the parent adapter
This makes the calling site's code clearer IMHO. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Michael Lawnick <ml.lawnick@gmx.de>
Showing 3 changed files with 32 additions and 22 deletions Side-by-side Diff
drivers/i2c/i2c-core.c
... | ... | @@ -425,14 +425,14 @@ |
425 | 425 | /* walk up mux tree */ |
426 | 426 | static int i2c_check_mux_parents(struct i2c_adapter *adapter, int addr) |
427 | 427 | { |
428 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
428 | 429 | int result; |
429 | 430 | |
430 | 431 | result = device_for_each_child(&adapter->dev, &addr, |
431 | 432 | __i2c_check_addr_busy); |
432 | 433 | |
433 | - if (!result && i2c_parent_is_i2c_adapter(adapter)) | |
434 | - result = i2c_check_mux_parents( | |
435 | - to_i2c_adapter(adapter->dev.parent), addr); | |
434 | + if (!result && parent) | |
435 | + result = i2c_check_mux_parents(parent, addr); | |
436 | 436 | |
437 | 437 | return result; |
438 | 438 | } |
439 | 439 | |
... | ... | @@ -453,11 +453,11 @@ |
453 | 453 | |
454 | 454 | static int i2c_check_addr_busy(struct i2c_adapter *adapter, int addr) |
455 | 455 | { |
456 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
456 | 457 | int result = 0; |
457 | 458 | |
458 | - if (i2c_parent_is_i2c_adapter(adapter)) | |
459 | - result = i2c_check_mux_parents( | |
460 | - to_i2c_adapter(adapter->dev.parent), addr); | |
459 | + if (parent) | |
460 | + result = i2c_check_mux_parents(parent, addr); | |
461 | 461 | |
462 | 462 | if (!result) |
463 | 463 | result = device_for_each_child(&adapter->dev, &addr, |
... | ... | @@ -472,8 +472,10 @@ |
472 | 472 | */ |
473 | 473 | void i2c_lock_adapter(struct i2c_adapter *adapter) |
474 | 474 | { |
475 | - if (i2c_parent_is_i2c_adapter(adapter)) | |
476 | - i2c_lock_adapter(to_i2c_adapter(adapter->dev.parent)); | |
475 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
476 | + | |
477 | + if (parent) | |
478 | + i2c_lock_adapter(parent); | |
477 | 479 | else |
478 | 480 | rt_mutex_lock(&adapter->bus_lock); |
479 | 481 | } |
... | ... | @@ -485,8 +487,10 @@ |
485 | 487 | */ |
486 | 488 | static int i2c_trylock_adapter(struct i2c_adapter *adapter) |
487 | 489 | { |
488 | - if (i2c_parent_is_i2c_adapter(adapter)) | |
489 | - return i2c_trylock_adapter(to_i2c_adapter(adapter->dev.parent)); | |
490 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
491 | + | |
492 | + if (parent) | |
493 | + return i2c_trylock_adapter(parent); | |
490 | 494 | else |
491 | 495 | return rt_mutex_trylock(&adapter->bus_lock); |
492 | 496 | } |
... | ... | @@ -497,8 +501,10 @@ |
497 | 501 | */ |
498 | 502 | void i2c_unlock_adapter(struct i2c_adapter *adapter) |
499 | 503 | { |
500 | - if (i2c_parent_is_i2c_adapter(adapter)) | |
501 | - i2c_unlock_adapter(to_i2c_adapter(adapter->dev.parent)); | |
504 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
505 | + | |
506 | + if (parent) | |
507 | + i2c_unlock_adapter(parent); | |
502 | 508 | else |
503 | 509 | rt_mutex_unlock(&adapter->bus_lock); |
504 | 510 | } |
drivers/i2c/i2c-dev.c
... | ... | @@ -192,14 +192,13 @@ |
192 | 192 | /* walk up mux tree */ |
193 | 193 | static int i2cdev_check_mux_parents(struct i2c_adapter *adapter, int addr) |
194 | 194 | { |
195 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
195 | 196 | int result; |
196 | 197 | |
197 | 198 | result = device_for_each_child(&adapter->dev, &addr, i2cdev_check); |
199 | + if (!result && parent) | |
200 | + result = i2cdev_check_mux_parents(parent, addr); | |
198 | 201 | |
199 | - if (!result && i2c_parent_is_i2c_adapter(adapter)) | |
200 | - result = i2cdev_check_mux_parents( | |
201 | - to_i2c_adapter(adapter->dev.parent), addr); | |
202 | - | |
203 | 202 | return result; |
204 | 203 | } |
205 | 204 | |
206 | 205 | |
... | ... | @@ -222,11 +221,11 @@ |
222 | 221 | driver bound to it, as NOT busy. */ |
223 | 222 | static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr) |
224 | 223 | { |
224 | + struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); | |
225 | 225 | int result = 0; |
226 | 226 | |
227 | - if (i2c_parent_is_i2c_adapter(adapter)) | |
228 | - result = i2cdev_check_mux_parents( | |
229 | - to_i2c_adapter(adapter->dev.parent), addr); | |
227 | + if (parent) | |
228 | + result = i2cdev_check_mux_parents(parent, addr); | |
230 | 229 | |
231 | 230 | if (!result) |
232 | 231 | result = device_for_each_child(&adapter->dev, &addr, |
include/linux/i2c.h
... | ... | @@ -384,10 +384,15 @@ |
384 | 384 | dev_set_drvdata(&dev->dev, data); |
385 | 385 | } |
386 | 386 | |
387 | -static inline int i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) | |
387 | +static inline struct i2c_adapter * | |
388 | +i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) | |
388 | 389 | { |
389 | - return adapter->dev.parent != NULL | |
390 | - && adapter->dev.parent->type == &i2c_adapter_type; | |
390 | + struct device *parent = adapter->dev.parent; | |
391 | + | |
392 | + if (parent != NULL && parent->type == &i2c_adapter_type) | |
393 | + return to_i2c_adapter(parent); | |
394 | + else | |
395 | + return NULL; | |
391 | 396 | } |
392 | 397 | |
393 | 398 | /* Adapter locking functions, exported for shared pin cases */ |