]> Git Repo - linux.git/commitdiff
Merge tag 'regmap-noinc-read' into regmap-4.19
authorMark Brown <[email protected]>
Thu, 9 Aug 2018 10:15:06 +0000 (11:15 +0100)
committerMark Brown <[email protected]>
Thu, 9 Aug 2018 10:15:06 +0000 (11:15 +0100)
regmap: Support non-incrementing registers

Some devices have individual registers that don't autoincrement the
register address during bulk reads but instead repeatedly read the same
value, for example for monitoring GPIOs or ADCs.  Add support for these.

1  2 
include/linux/regmap.h

diff --combined include/linux/regmap.h
index 52bf358e2c736f4fc0f63de9ee94853c51c15c6a,19df946499d2109f432c88caf7c8d454f0066ad4..379505a53722fdeef727edc9c9d6c58cdbef4d4d
@@@ -268,6 -268,13 +268,13 @@@ typedef void (*regmap_unlock)(void *)
   *                field is NULL but precious_table (see below) is not, the
   *                check is performed on such table (a register is precious if
   *                it belongs to one of the ranges specified by precious_table).
+  * @readable_noinc_reg: Optional callback returning true if the register
+  *                    supports multiple read operations without incrementing
+  *                    the register number. If this field is NULL but
+  *                    rd_noinc_table (see below) is not, the check is
+  *                    performed on such table (a register is no increment
+  *                    readable if it belongs to one of the ranges specified
+  *                    by rd_noinc_table).
   * @disable_locking: This regmap is either protected by external means or
   *                   is guaranteed not be be accessed from multiple threads.
   *                   Don't use any locking mechanisms.
   * @rd_table:     As above, for read access.
   * @volatile_table: As above, for volatile registers.
   * @precious_table: As above, for precious registers.
+  * @rd_noinc_table: As above, for no increment readable registers.
   * @reg_defaults: Power on reset values for registers (for use with
   *                register cache support).
   * @num_reg_defaults: Number of elements in reg_defaults.
@@@ -344,6 -352,7 +352,7 @@@ struct regmap_config 
        bool (*readable_reg)(struct device *dev, unsigned int reg);
        bool (*volatile_reg)(struct device *dev, unsigned int reg);
        bool (*precious_reg)(struct device *dev, unsigned int reg);
+       bool (*readable_noinc_reg)(struct device *dev, unsigned int reg);
  
        bool disable_locking;
        regmap_lock lock;
        const struct regmap_access_table *rd_table;
        const struct regmap_access_table *volatile_table;
        const struct regmap_access_table *precious_table;
+       const struct regmap_access_table *rd_noinc_table;
        const struct reg_default *reg_defaults;
        unsigned int num_reg_defaults;
        enum regcache_type cache_type;
@@@ -514,10 -524,6 +524,10 @@@ struct regmap *__regmap_init_i2c(struc
                                 const struct regmap_config *config,
                                 struct lock_class_key *lock_key,
                                 const char *lock_name);
 +struct regmap *__regmap_init_sccb(struct i2c_client *i2c,
 +                                const struct regmap_config *config,
 +                                struct lock_class_key *lock_key,
 +                                const char *lock_name);
  struct regmap *__regmap_init_slimbus(struct slim_device *slimbus,
                                 const struct regmap_config *config,
                                 struct lock_class_key *lock_key,
@@@ -562,10 -568,6 +572,10 @@@ struct regmap *__devm_regmap_init_i2c(s
                                      const struct regmap_config *config,
                                      struct lock_class_key *lock_key,
                                      const char *lock_name);
 +struct regmap *__devm_regmap_init_sccb(struct i2c_client *i2c,
 +                                     const struct regmap_config *config,
 +                                     struct lock_class_key *lock_key,
 +                                     const char *lock_name);
  struct regmap *__devm_regmap_init_spi(struct spi_device *dev,
                                      const struct regmap_config *config,
                                      struct lock_class_key *lock_key,
@@@ -653,19 -655,6 +663,19 @@@ int regmap_attach_dev(struct device *de
        __regmap_lockdep_wrapper(__regmap_init_i2c, #config,            \
                                i2c, config)
  
 +/**
 + * regmap_init_sccb() - Initialise register map
 + *
 + * @i2c: Device that will be interacted with
 + * @config: Configuration for register map
 + *
 + * The return value will be an ERR_PTR() on error or a valid pointer to
 + * a struct regmap.
 + */
 +#define regmap_init_sccb(i2c, config)                                 \
 +      __regmap_lockdep_wrapper(__regmap_init_sccb, #config,           \
 +                              i2c, config)
 +
  /**
   * regmap_init_slimbus() - Initialise register map
   *
@@@ -818,20 -807,6 +828,20 @@@ bool regmap_ac97_default_volatile(struc
        __regmap_lockdep_wrapper(__devm_regmap_init_i2c, #config,       \
                                i2c, config)
  
 +/**
 + * devm_regmap_init_sccb() - Initialise managed register map
 + *
 + * @i2c: Device that will be interacted with
 + * @config: Configuration for register map
 + *
 + * The return value will be an ERR_PTR() on error or a valid pointer
 + * to a struct regmap.  The regmap will be automatically freed by the
 + * device management code.
 + */
 +#define devm_regmap_init_sccb(i2c, config)                            \
 +      __regmap_lockdep_wrapper(__devm_regmap_init_sccb, #config,      \
 +                              i2c, config)
 +
  /**
   * devm_regmap_init_spi() - Initialise register map
   *
@@@ -981,6 -956,8 +991,8 @@@ int regmap_raw_write_async(struct regma
  int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
  int regmap_raw_read(struct regmap *map, unsigned int reg,
                    void *val, size_t val_len);
+ int regmap_noinc_read(struct regmap *map, unsigned int reg,
+                     void *val, size_t val_len);
  int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
                     size_t val_count);
  int regmap_update_bits_base(struct regmap *map, unsigned int reg,
@@@ -1231,6 -1208,13 +1243,13 @@@ static inline int regmap_raw_read(struc
        return -EINVAL;
  }
  
+ static inline int regmap_noinc_read(struct regmap *map, unsigned int reg,
+                                   void *val, size_t val_len)
+ {
+       WARN_ONCE(1, "regmap API is disabled");
+       return -EINVAL;
+ }
  static inline int regmap_bulk_read(struct regmap *map, unsigned int reg,
                                   void *val, size_t val_count)
  {
This page took 0.083319 seconds and 4 git commands to generate.