lkml.org 
[lkml]   [2020]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 232/245] regmap: fix page selection for noinc reads
    Date
    From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

    [ Upstream commit 4003324856311faebb46cbd56a1616bd3f3b67c2 ]

    Non-incrementing reads can fail if register + length crosses page
    border. However for non-incrementing reads we should not check for page
    border crossing. Fix this by passing additional flag to _regmap_raw_read
    and passing length to _regmap_select_page basing on the flag.

    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Fixes: 74fe7b551f33 ("regmap: Add regmap_noinc_read API")
    Link: https://lore.kernel.org/r/20200917153405.3139200-1-dmitry.baryshkov@linaro.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/base/regmap/regmap.c | 12 ++++++------
    1 file changed, 6 insertions(+), 6 deletions(-)

    diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
    index d26b485ccc7d0..e8b3353c18eb8 100644
    --- a/drivers/base/regmap/regmap.c
    +++ b/drivers/base/regmap/regmap.c
    @@ -2367,7 +2367,7 @@ int regmap_raw_write_async(struct regmap *map, unsigned int reg,
    EXPORT_SYMBOL_GPL(regmap_raw_write_async);

    static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
    - unsigned int val_len)
    + unsigned int val_len, bool noinc)
    {
    struct regmap_range_node *range;
    int ret;
    @@ -2380,7 +2380,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
    range = _regmap_range_lookup(map, reg);
    if (range) {
    ret = _regmap_select_page(map, &reg, range,
    - val_len / map->format.val_bytes);
    + noinc ? 1 : val_len / map->format.val_bytes);
    if (ret != 0)
    return ret;
    }
    @@ -2418,7 +2418,7 @@ static int _regmap_bus_read(void *context, unsigned int reg,
    if (!map->format.parse_val)
    return -EINVAL;

    - ret = _regmap_raw_read(map, reg, work_val, map->format.val_bytes);
    + ret = _regmap_raw_read(map, reg, work_val, map->format.val_bytes, false);
    if (ret == 0)
    *val = map->format.parse_val(work_val);

    @@ -2536,7 +2536,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,

    /* Read bytes that fit into whole chunks */
    for (i = 0; i < chunk_count; i++) {
    - ret = _regmap_raw_read(map, reg, val, chunk_bytes);
    + ret = _regmap_raw_read(map, reg, val, chunk_bytes, false);
    if (ret != 0)
    goto out;

    @@ -2547,7 +2547,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,

    /* Read remaining bytes */
    if (val_len) {
    - ret = _regmap_raw_read(map, reg, val, val_len);
    + ret = _regmap_raw_read(map, reg, val, val_len, false);
    if (ret != 0)
    goto out;
    }
    @@ -2622,7 +2622,7 @@ int regmap_noinc_read(struct regmap *map, unsigned int reg,
    read_len = map->max_raw_read;
    else
    read_len = val_len;
    - ret = _regmap_raw_read(map, reg, val, read_len);
    + ret = _regmap_raw_read(map, reg, val, read_len, true);
    if (ret)
    goto out_unlock;
    val = ((u8 *)val) + read_len;
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-09-29 14:19    [W:4.030 / U:8.892 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site