Below you can find my proposition of API for regmap paging support. It
is sufficient for my driver needs.
If you are OK with this proposition or you find any issues with it, let me know.
Kind Regards,
Krystian
---
diff --git a/drivers/base/regmap/Kconfig b/drivers/base/regmap/Kconfig
index 0f6c7fb..590d72c 100644
--- a/drivers/base/regmap/Kconfig
+++ b/drivers/base/regmap/Kconfig
@@ -16,3 +16,6 @@ config REGMAP_SPI
config REGMAP_IRQ
bool
+
+config REGMAP_PAGING
+ bool
diff --git a/include/linux/regmap.h b/include/linux/regmap.h
index a90abb6..81a11c1 100644
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
@@ -50,6 +50,15 @@ struct reg_default {
* @pad_bits: Number of bits of padding between register and value.
* @val_bits: Number of bits in a register value, mandatory.
*
+ * @page_bits: Number of bits of register page number. These are the top-most
+ * bits exdending register address. These bits will be written
+ * to page register, for page switch.
+ * @page_reg: Page register used for page update (available for any page).
+ * @page_shift: Formatting bit shift for page number, made prior to write to
+ * page register.
+ * @nonpageable_reg: Optional callback returning true if the register
+ * needs NO page switching (eg. page is irrelevant).
+ *
* @writeable_reg: Optional callback returning true if the register
* can be written to.
* @readable_reg: Optional callback returning true if the register
@@ -81,6 +90,13 @@ struct regmap_config {
int pad_bits;
int val_bits;
+#ifdef CONFIG_REGMAP_PAGING
+ int page_bits;
+ int page_shift;
+ unsigned int page_reg;
+ bool (*nonpageable_reg)(struct device *dev, unsigned int reg);
+#endif
+
bool (*writeable_reg)(struct device *dev, unsigned int reg);
bool (*readable_reg)(struct device *dev, unsigned int reg);
bool (*volatile_reg)(struct device *dev, unsigned int reg);