On 8/31/21 8:28 AM, Prathamesh Shete wrote:
From: Laxman Dewangan <ldewangan@xxxxxxxxxx>
Add support to save and restore the pincontrol HW register
for GPIO mode configurations. This helps in changing the
pin configure only during suspend and restore in resume.
Aren't we already saving all registers during suspend and restoring
during resume?
Signed-off-by: Laxman Dewangan <ldewangan@xxxxxxxxxx>
Signed-off-by: pshete <pshete@xxxxxxxxxx>
Needs full name. Also, there is a typo in the commit title, and it is
quite vague (what HW register?)
Cheers,
Mikko
---
drivers/pinctrl/pinmux.c | 24 ++++++++++++++++++++++++
drivers/pinctrl/pinmux.h | 18 ++++++++++++++++++
include/linux/pinctrl/pinmux.h | 9 +++++++++
3 files changed, 51 insertions(+)
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index 6cdbd9ccf2f0..66fc0ca22623 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -317,6 +317,30 @@ int pinmux_gpio_direction(struct pinctrl_dev *pctldev,
return ret;
}
+int pinmux_gpio_save_config(struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned pin)
+{
+ const struct pinmux_ops *ops = pctldev->desc->pmxops;
+
+ if (ops->gpio_save_config)
+ return ops->gpio_save_config(pctldev, range, pin);
+
+ return 0;
+}
+
+int pinmux_gpio_restore_config(struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned pin)
+{
+ const struct pinmux_ops *ops = pctldev->desc->pmxops;
+
+ if (ops->gpio_restore_config)
+ return ops->gpio_restore_config(pctldev, range, pin);
+
+ return 0;
+}
+
static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev,
const char *function)
{
diff --git a/drivers/pinctrl/pinmux.h b/drivers/pinctrl/pinmux.h
index 78c3a31be882..425c31a0115b 100644
--- a/drivers/pinctrl/pinmux.h
+++ b/drivers/pinctrl/pinmux.h
@@ -31,6 +31,12 @@ int pinmux_map_to_setting(const struct pinctrl_map *map,
void pinmux_free_setting(const struct pinctrl_setting *setting);
int pinmux_enable_setting(const struct pinctrl_setting *setting);
void pinmux_disable_setting(const struct pinctrl_setting *setting);
+int pinmux_gpio_save_config(struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned pin);
+int pinmux_gpio_restore_config(struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned pin);
#else
@@ -89,6 +95,18 @@ static inline void pinmux_disable_setting(const struct pinctrl_setting *setting)
{
}
+int pinmux_gpio_save_config(struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned pin)
+{
+ return 0;
+}
+int pinmux_gpio_restore_config(struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned pin)
+{
+ return 0;
+}
#endif
#if defined(CONFIG_PINMUX) && defined(CONFIG_DEBUG_FS)
diff --git a/include/linux/pinctrl/pinmux.h b/include/linux/pinctrl/pinmux.h
index 9a647fa5c8f1..cca87586d8c1 100644
--- a/include/linux/pinctrl/pinmux.h
+++ b/include/linux/pinctrl/pinmux.h
@@ -53,6 +53,8 @@ struct pinctrl_dev;
* depending on whether the GPIO is configured as input or output,
* a direction selector function may be implemented as a backing
* to the GPIO controllers that need pin muxing.
+ * @gpio_save_config: Save the GPIo configurations.
+ * @gpio_restore_config: Restore GPIO configurations.
* @strict: do not allow simultaneous use of the same pin for GPIO and another
* function. Check both gpio_owner and mux_owner strictly before approving
* the pin request.
@@ -79,6 +81,13 @@ struct pinmux_ops {
struct pinctrl_gpio_range *range,
unsigned offset,
bool input);
+ int (*gpio_save_config) (struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned offset);
+ int (*gpio_restore_config) (struct pinctrl_dev *pctldev,
+ struct pinctrl_gpio_range *range,
+ unsigned offset);
+
bool strict;
};