diff options
Diffstat (limited to 'drivers/base/regmap')
-rw-r--r-- | drivers/base/regmap/regmap.c | 107 |
1 files changed, 43 insertions, 64 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index bb4502a48be5..01ae4b829360 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -449,78 +449,64 @@ int regmap_attach_dev(struct device *dev, struct regmap *map, } EXPORT_SYMBOL_GPL(regmap_attach_dev); -enum regmap_endian_type { - REGMAP_ENDIAN_REG, - REGMAP_ENDIAN_VAL, -}; +static enum regmap_endian regmap_get_reg_endian(const struct regmap_bus *bus, + const struct regmap_config *config) +{ + enum regmap_endian endian; -static int regmap_get_endian(struct device *dev, - const struct regmap_bus *bus, - const struct regmap_config *config, - enum regmap_endian_type type, - enum regmap_endian *endian) + /* Retrieve the endianness specification from the regmap config */ + endian = config->reg_format_endian; + + /* If the regmap config specified a non-default value, use that */ + if (endian != REGMAP_ENDIAN_DEFAULT) + return endian; + + /* Retrieve the endianness specification from the bus config */ + if (bus && bus->reg_format_endian_default) + endian = bus->reg_format_endian_default; + + /* If the bus specified a non-default value, use that */ + if (endian != REGMAP_ENDIAN_DEFAULT) + return endian; + + /* Use this if no other value was found */ + return REGMAP_ENDIAN_BIG; +} + +static enum regmap_endian regmap_get_val_endian(struct device *dev, + const struct regmap_bus *bus, + const struct regmap_config *config) { struct device_node *np = dev->of_node; - - if (!endian || !config) - return -EINVAL; + enum regmap_endian endian; /* Retrieve the endianness specification from the regmap config */ - switch (type) { - case REGMAP_ENDIAN_REG: - *endian = config->reg_format_endian; - break; - case REGMAP_ENDIAN_VAL: - *endian = config->val_format_endian; - break; - default: - return -EINVAL; - } + endian = config->val_format_endian; /* If the regmap config specified a non-default value, use that */ - if (*endian != REGMAP_ENDIAN_DEFAULT) - return 0; + if (endian != REGMAP_ENDIAN_DEFAULT) + return endian; /* Parse the device's DT node for an endianness specification */ - switch (type) { - case REGMAP_ENDIAN_VAL: - if (of_property_read_bool(np, "big-endian")) - *endian = REGMAP_ENDIAN_BIG; - else if (of_property_read_bool(np, "little-endian")) - *endian = REGMAP_ENDIAN_LITTLE; - break; - case REGMAP_ENDIAN_REG: - break; - default: - return -EINVAL; - } + if (of_property_read_bool(np, "big-endian")) + endian = REGMAP_ENDIAN_BIG; + else if (of_property_read_bool(np, "little-endian")) + endian = REGMAP_ENDIAN_LITTLE; /* If the endianness was specified in DT, use that */ - if (*endian != REGMAP_ENDIAN_DEFAULT) - return 0; + if (endian != REGMAP_ENDIAN_DEFAULT) + return endian; /* Retrieve the endianness specification from the bus config */ - switch (type) { - case REGMAP_ENDIAN_REG: - if (bus && bus->reg_format_endian_default) - *endian = bus->reg_format_endian_default; - break; - case REGMAP_ENDIAN_VAL: - if (bus && bus->val_format_endian_default) - *endian = bus->val_format_endian_default; - break; - default: - return -EINVAL; - } + if (bus && bus->val_format_endian_default) + endian = bus->val_format_endian_default; /* If the bus specified a non-default value, use that */ - if (*endian != REGMAP_ENDIAN_DEFAULT) - return 0; + if (endian != REGMAP_ENDIAN_DEFAULT) + return endian; /* Use this if no other value was found */ - *endian = REGMAP_ENDIAN_BIG; - - return 0; + return REGMAP_ENDIAN_BIG; } /** @@ -626,15 +612,8 @@ struct regmap *regmap_init(struct device *dev, map->reg_read = _regmap_bus_read; } - ret = regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_REG, - ®_endian); - if (ret) - return ERR_PTR(ret); - - ret = regmap_get_endian(dev, bus, config, REGMAP_ENDIAN_VAL, - &val_endian); - if (ret) - return ERR_PTR(ret); + reg_endian = regmap_get_reg_endian(bus, config); + val_endian = regmap_get_val_endian(dev, bus, config); switch (config->reg_bits + map->reg_shift) { case 2: |