From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"stable@vger.kernel.org" <stable@vger.kernel.org>
Cc: Florian Fainelli <f.fainelli@gmail.com>,
Linus Walleij <linus.walleij@linaro.org>,
Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL for 3.18 52/53] pinctrl: Really force states during suspend/resume
Date: Thu, 8 Mar 2018 05:03:30 +0000 [thread overview]
Message-ID: <20180308050230.8876-52-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180308050230.8876-1-alexander.levin@microsoft.com>
From: Florian Fainelli <f.fainelli@gmail.com>
[ Upstream commit 981ed1bfbc6c4660b2ddaa8392893e20a6255048 ]
In case a platform only defaults a "default" set of pins, but not a
"sleep" set of pins, and this particular platform suspends and resumes
in a way that the pin states are not preserved by the hardware, when we
resume, we would call pinctrl_single_resume() -> pinctrl_force_default()
-> pinctrl_select_state() and the first thing we do is check that the
pins state is the same as before, and do nothing.
In order to fix this, decouple the actual state change from
pinctrl_select_state() and move it pinctrl_commit_state(), while keeping
the p->state == state check in pinctrl_select_state() not to change the
caller assumptions. pinctrl_force_sleep() and pinctrl_force_default()
are updated to bypass the state check by calling pinctrl_commit_state().
[Linus Walleij]
The forced pin control states are currently only used in some pin
controller drivers that grab their own reference to their own pins.
This is equal to the pin control hogs: pins taken by pin control
devices since there are no corresponding device in the Linux device
hierarchy, such as memory controller lines or unused GPIO lines,
or GPIO lines that are used orthogonally from the GPIO subsystem
but pincontrol-wise managed as hogs (non-strict mode, allowing
simultaneous use by GPIO and pin control). For this case forcing
the state from the drivers' suspend()/resume() callbacks makes
sense and should semantically match the name of the function.
Fixes: 6e5e959dde0d ("pinctrl: API changes to support multiple states per device")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
drivers/pinctrl/core.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 18ee2089df4a..db43f8b34e2a 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -977,19 +977,16 @@ struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
/**
- * pinctrl_select_state() - select/activate/program a pinctrl state to HW
+ * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
* @p: the pinctrl handle for the device that requests configuration
* @state: the state handle to select/activate/program
*/
-int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
+static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
{
struct pinctrl_setting *setting, *setting2;
struct pinctrl_state *old_state = p->state;
int ret;
- if (p->state == state)
- return 0;
-
if (p->state) {
/*
* For each pinmux setting in the old state, forget SW's record
@@ -1053,6 +1050,19 @@ int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
return ret;
}
+
+/**
+ * pinctrl_select_state() - select/activate/program a pinctrl state to HW
+ * @p: the pinctrl handle for the device that requests configuration
+ * @state: the state handle to select/activate/program
+ */
+int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
+{
+ if (p->state == state)
+ return 0;
+
+ return pinctrl_commit_state(p, state);
+}
EXPORT_SYMBOL_GPL(pinctrl_select_state);
static void devm_pinctrl_release(struct device *dev, void *res)
@@ -1221,7 +1231,7 @@ void pinctrl_unregister_map(struct pinctrl_map const *map)
int pinctrl_force_sleep(struct pinctrl_dev *pctldev)
{
if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_sleep))
- return pinctrl_select_state(pctldev->p, pctldev->hog_sleep);
+ return pinctrl_commit_state(pctldev->p, pctldev->hog_sleep);
return 0;
}
EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
@@ -1233,7 +1243,7 @@ EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
int pinctrl_force_default(struct pinctrl_dev *pctldev)
{
if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_default))
- return pinctrl_select_state(pctldev->p, pctldev->hog_default);
+ return pinctrl_commit_state(pctldev->p, pctldev->hog_default);
return 0;
}
EXPORT_SYMBOL_GPL(pinctrl_force_default);
--
2.14.1
prev parent reply other threads:[~2018-03-08 5:11 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-08 5:03 [PATCH AUTOSEL for 3.18 01/53] usb: gadget: dummy_hcd: Fix wrong power status bit clear/reset in dummy_hub_control() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 02/53] perf session: Don't rely on evlist in pipe mode Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 04/53] scsi: sg: close race condition in sg_remove_sfp_usercontext() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 03/53] scsi: sg: check for valid direction before starting the request Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 05/53] kprobes/x86: Fix kprobe-booster not to boost far call instructions Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 06/53] kprobes/x86: Set kprobes pages read-only Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 07/53] wil6210: fix memory access violation in wil_memcpy_from/toio_32 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 09/53] x86: i8259: export legacy_pic symbol Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 08/53] platform/x86: asus-nb-wmi: Add wapf4 quirk for the X302UA Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 10/53] Input: ar1021_i2c - fix too long name in driver's device table Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 12/53] cpufreq/sh: Replace racy task affinity logic Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 11/53] ACPI/processor: " Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 14/53] i2c: i2c-scmi: add a MS HID Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 13/53] genirq: Use irqd_get_trigger_type to compare the trigger type for shared IRQs Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 15/53] net: ipv6: send unsolicited NA on admin up Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 16/53] [media] media/dvb-core: Race condition when writing to CAM Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 18/53] ath: Fix updating radar flags for coutry code India Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 17/53] spi: dw: Disable clock after unregistering the host Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 21/53] tcp: remove poll() flakes with FastOpen Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 20/53] KVM: PPC: Book3S PR: Exit KVM on failed mapping Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 19/53] scsi: virtio_scsi: Always try to read VPD pages Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 23/53] ALSA: hda - Fix headset microphone detection for ASUS N551 and N751 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 22/53] e1000e: fix timing for 82579 Gigabit Ethernet controller Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 24/53] IB/ipoib: Update broadcast object if PKey value was changed in index 0 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 25/53] HSI: ssi_protocol: double free in ssip_pn_xmit() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 27/53] mmc: host: omap_hsmmc: checking for NULL instead of IS_ERR() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 26/53] Fix driver usage of 128B WQEs when WQ_CREATE is V1 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 28/53] wan: pc300too: abort path on failure Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 29/53] qlcnic: fix unchecked return value Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 31/53] rndis_wlan: add return value validation Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 30/53] scsi: mac_esp: Replace bogus memory barrier with spinlock Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 32/53] Btrfs: send, fix file hole not being preserved due to inline extent Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 33/53] mac80211: don't parse encrypted management frames in ieee80211_frame_acked Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 34/53] mfd: palmas: Reset the POWERHOLD mux during power off Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 36/53] ipmi/watchdog: fix wdog hang on panic waiting for ipmi response Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 35/53] ARM: DRA7: clockdomain: Change the CLKTRCTRL of CM_PCIE_CLKSTCTRL to SW_WKUP Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 37/53] bnx2x: Align RX buffers Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 38/53] power: supply: pda_power: move from timer to delayed_work Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 40/53] ia64: fix module loading for gcc-5.4 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 39/53] md/raid10: skip spare disk as 'first' disk Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 41/53] video: fbdev: udlfb: Fix buffer on stack Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 42/53] sm501fb: don't return zero on failure path in sm501fb_start() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 44/53] drm/msm: fix leak in failed get_pages Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 43/53] cifs: small underflow in cnvrtDosUnixTm() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 46/53] media: [RESEND] media: dvb-frontends: Add delay to Si2168 restart Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 45/53] media: bt8xx: Fix err 'bt878_probe()' Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 48/53] IB/ipoib: Avoid memory leak if the SA returns a different DGID Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 47/53] mmc: avoid removing non-removable hosts during suspend Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 50/53] vgacon: Set VGA struct resource types Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 49/53] RDMA/cma: Use correct size when writing netlink stats Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 51/53] drm/omap: DMM: Check for DMM readiness after successful transaction commit Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 53/53] clk: si5351: Rename internal plls to avoid name collisions Sasha Levin
2018-03-08 5:03 ` Sasha Levin [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180308050230.8876-52-alexander.levin@microsoft.com \
--to=alexander.levin@microsoft.com \
--cc=f.fainelli@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®