pinctrl: Enable device link creation for pin control
authorBenjamin Gaignard <benjamin.gaignard@st.com>
Wed, 22 May 2019 15:29:24 +0000 (17:29 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 23 May 2019 07:34:54 +0000 (09:34 +0200)
A pin controller may want to create a link between itself
and its clients to be sure of suspend/resume call ordering.

Introduce link_consumers field in pinctrl_desc structure to let
pinctrl core knows that controller expect to create a link.

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@st.com>
[Renamed create_link to link_consumers]
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/core.c
include/linux/pinctrl/pinctrl.h

index c6ff4d5fa482e09f3aac5ad723e1510d364a099d..d757c51d7114f9cd3abb1a40c6551656a6c532bd 100644 (file)
@@ -1216,6 +1216,15 @@ struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
 }
 EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
 
+static void pinctrl_link_add(struct pinctrl_dev *pctldev,
+                            struct device *consumer)
+{
+       if (pctldev->desc->link_consumers)
+               device_link_add(consumer, pctldev->dev,
+                               DL_FLAG_PM_RUNTIME |
+                               DL_FLAG_AUTOREMOVE_CONSUMER);
+}
+
 /**
  * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
  * @p: the pinctrl handle for the device that requests configuration
@@ -1261,6 +1270,8 @@ static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
                if (ret < 0) {
                        goto unapply_new_state;
                }
+
+               pinctrl_link_add(setting->pctldev, p->dev);
        }
 
        p->state = state;
index 8f5dbb84547a41ba32315e619270861d267d7c8b..2744113f10240495e7a9868195b67bdf397f331f 100644 (file)
@@ -125,6 +125,10 @@ struct pinctrl_ops {
  *     the hardware description
  * @custom_conf_items: Information how to print @params in debugfs, must be
  *     the same size as the @custom_params, i.e. @num_custom_params
+ * @link_consumers: If true create a device link between pinctrl and its
+ *     consumers (i.e. the devices requesting pin control states). This is
+ *     sometimes necessary to ascertain the right suspend/resume order for
+ *     example.
  */
 struct pinctrl_desc {
        const char *name;
@@ -139,6 +143,7 @@ struct pinctrl_desc {
        const struct pinconf_generic_params *custom_params;
        const struct pin_config_item *custom_conf_items;
 #endif
+       bool link_consumers;
 };
 
 /* External interface to pin controller */