diff options
author | Mark Brown <broonie@kernel.org> | 2014-09-29 15:49:42 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-09-29 15:49:42 -0400 |
commit | 45942c310da8eadc603e7d2332897909c1da4b70 (patch) | |
tree | 40ef6d2a4ac4d1a676d3c8e4b7a91460896bd7e2 /drivers/base/regmap/regmap.c | |
parent | 88507a2ba8b453a38b950f3ccb2cae6cc4d82e7a (diff) | |
parent | 6e64b6ccc1e46932768e3bb8974fc2e5589bca7a (diff) |
Merge remote-tracking branch 'regmap/topic/dt-endian' into regmap-next
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r-- | drivers/base/regmap/regmap.c | 79 |
1 files changed, 68 insertions, 11 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 3a785a4f4ff6..d2f8a818d200 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/export.h> | 15 | #include <linux/export.h> |
16 | #include <linux/mutex.h> | 16 | #include <linux/mutex.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/of.h> | ||
18 | #include <linux/rbtree.h> | 19 | #include <linux/rbtree.h> |
19 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
20 | 21 | ||
@@ -448,6 +449,71 @@ int regmap_attach_dev(struct device *dev, struct regmap *map, | |||
448 | } | 449 | } |
449 | EXPORT_SYMBOL_GPL(regmap_attach_dev); | 450 | EXPORT_SYMBOL_GPL(regmap_attach_dev); |
450 | 451 | ||
452 | static enum regmap_endian regmap_get_reg_endian(const struct regmap_bus *bus, | ||
453 | const struct regmap_config *config) | ||
454 | { | ||
455 | enum regmap_endian endian; | ||
456 | |||
457 | /* Retrieve the endianness specification from the regmap config */ | ||
458 | endian = config->reg_format_endian; | ||
459 | |||
460 | /* If the regmap config specified a non-default value, use that */ | ||
461 | if (endian != REGMAP_ENDIAN_DEFAULT) | ||
462 | return endian; | ||
463 | |||
464 | /* Retrieve the endianness specification from the bus config */ | ||
465 | if (bus && bus->reg_format_endian_default) | ||
466 | endian = bus->reg_format_endian_default; | ||
467 | |||
468 | /* If the bus specified a non-default value, use that */ | ||
469 | if (endian != REGMAP_ENDIAN_DEFAULT) | ||
470 | return endian; | ||
471 | |||
472 | /* Use this if no other value was found */ | ||
473 | return REGMAP_ENDIAN_BIG; | ||
474 | } | ||
475 | |||
476 | static enum regmap_endian regmap_get_val_endian(struct device *dev, | ||
477 | const struct regmap_bus *bus, | ||
478 | const struct regmap_config *config) | ||
479 | { | ||
480 | struct device_node *np; | ||
481 | enum regmap_endian endian; | ||
482 | |||
483 | /* Retrieve the endianness specification from the regmap config */ | ||
484 | endian = config->val_format_endian; | ||
485 | |||
486 | /* If the regmap config specified a non-default value, use that */ | ||
487 | if (endian != REGMAP_ENDIAN_DEFAULT) | ||
488 | return endian; | ||
489 | |||
490 | /* If the dev and dev->of_node exist try to get endianness from DT */ | ||
491 | if (dev && dev->of_node) { | ||
492 | np = dev->of_node; | ||
493 | |||
494 | /* Parse the device's DT node for an endianness specification */ | ||
495 | if (of_property_read_bool(np, "big-endian")) | ||
496 | endian = REGMAP_ENDIAN_BIG; | ||
497 | else if (of_property_read_bool(np, "little-endian")) | ||
498 | endian = REGMAP_ENDIAN_LITTLE; | ||
499 | |||
500 | /* If the endianness was specified in DT, use that */ | ||
501 | if (endian != REGMAP_ENDIAN_DEFAULT) | ||
502 | return endian; | ||
503 | } | ||
504 | |||
505 | /* Retrieve the endianness specification from the bus config */ | ||
506 | if (bus && bus->val_format_endian_default) | ||
507 | endian = bus->val_format_endian_default; | ||
508 | |||
509 | /* If the bus specified a non-default value, use that */ | ||
510 | if (endian != REGMAP_ENDIAN_DEFAULT) | ||
511 | return endian; | ||
512 | |||
513 | /* Use this if no other value was found */ | ||
514 | return REGMAP_ENDIAN_BIG; | ||
515 | } | ||
516 | |||
451 | /** | 517 | /** |
452 | * regmap_init(): Initialise register map | 518 | * regmap_init(): Initialise register map |
453 | * | 519 | * |
@@ -551,17 +617,8 @@ struct regmap *regmap_init(struct device *dev, | |||
551 | map->reg_read = _regmap_bus_read; | 617 | map->reg_read = _regmap_bus_read; |
552 | } | 618 | } |
553 | 619 | ||
554 | reg_endian = config->reg_format_endian; | 620 | reg_endian = regmap_get_reg_endian(bus, config); |
555 | if (reg_endian == REGMAP_ENDIAN_DEFAULT) | 621 | val_endian = regmap_get_val_endian(dev, bus, config); |
556 | reg_endian = bus->reg_format_endian_default; | ||
557 | if (reg_endian == REGMAP_ENDIAN_DEFAULT) | ||
558 | reg_endian = REGMAP_ENDIAN_BIG; | ||
559 | |||
560 | val_endian = config->val_format_endian; | ||
561 | if (val_endian == REGMAP_ENDIAN_DEFAULT) | ||
562 | val_endian = bus->val_format_endian_default; | ||
563 | if (val_endian == REGMAP_ENDIAN_DEFAULT) | ||
564 | val_endian = REGMAP_ENDIAN_BIG; | ||
565 | 622 | ||
566 | switch (config->reg_bits + map->reg_shift) { | 623 | switch (config->reg_bits + map->reg_shift) { |
567 | case 2: | 624 | case 2: |