Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp808710ybc; Fri, 22 Nov 2019 13:32:18 -0800 (PST) X-Google-Smtp-Source: APXvYqxd7SFrAHiX02BjezC0wi0cLg4Xq0jDpd3jlBIWJ1xRFT+3zdtF+xwBn8RBQvHHi19x1niR X-Received: by 2002:a17:906:2f09:: with SMTP id v9mr24252318eji.91.1574458338255; Fri, 22 Nov 2019 13:32:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574458338; cv=none; d=google.com; s=arc-20160816; b=hjECyD/x1CtqEYnhgY92fNeagQRFB98TMg1IlUsXGUged2JtHcsVBgHJQBMcHZcfLc adVgoL0dsjWzGfttNrjPRn0FyIHzG68wjUU8uCpj6nj27AnTsrC1gDIc+TXKPvgBHNow sMmXHGjaeEjEtFvjdmJjEuAz6uVbr/fel11Izd+vxPQ9Kpf1FeI+3k2aIR2LC0QDvdx8 pQDRNsiirfJDjv6m1yUHx6+IrBo4reMdv4C8iIhTbCKsLTnL2Iq7qavkY9RVoLjqKl0J rrJPURz1Aam+H4it0FCORa4DMSjCTXd0zbVvFDGwsO5xQvAdrqyP0ngsS8Z7sqm7jn8I lrhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=7t6M7j4eqiF4dAhaLb38TLT0fseDmfpNVbu55ek7TJs=; b=Fjgm3dCCgnEuRJsNTuSeqcXYjztFQBkb+LGTtAuIOqo1MXnm8nnSCraRfypt8Grhy/ dl4k+YrwrqdOIrI+9pShQmrrZYSjcoz8PYETs1XPzA4w2t8ms3yrEnjXcOA+0ul5qoFk afRbBcewfiDj57uEiMOkdIPN6YAs1FeGeFHdsRipqUgsY1ezP0cQvZcyKNs/BGHgrHZa JPpXBnOZOzaGjTz7zL3Pta5WUwPHMoPaI3LIQbmYYyzKzg09OnI7FLm3SYbX6GJsrmxs CwFwASUYKIHAHt0BC39p/WCRQo1u9qTxeyDsdMubUPs3qqsgiS441gBA0osL1fj1h68o uOFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=UkcU0Xtu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d54si1513894eda.148.2019.11.22.13.31.53; Fri, 22 Nov 2019 13:32:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=UkcU0Xtu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726705AbfKVVaG (ORCPT + 99 others); Fri, 22 Nov 2019 16:30:06 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:36393 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726089AbfKVVaF (ORCPT ); Fri, 22 Nov 2019 16:30:05 -0500 Received: by mail-pg1-f195.google.com with SMTP id k13so3937537pgh.3 for ; Fri, 22 Nov 2019 13:30:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=7t6M7j4eqiF4dAhaLb38TLT0fseDmfpNVbu55ek7TJs=; b=UkcU0XtuucvAShhb0pzKP6YFeq4hY9MgO+n6mEWZfPueG4LkIw8qA/WAhVfRd7v2mE ZmhEKbsTpCo64S5pwoid3Js7ErRM5+b5naWqAs2ECtx6og9T5GPgofcFR70vUsmai/tZ wUuheWp6w/Bv5y4QdnOLThkxxiHCSb/23IkmE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=7t6M7j4eqiF4dAhaLb38TLT0fseDmfpNVbu55ek7TJs=; b=lgGjgf1IAg4ym9IGqnYo8/bWiXxE2fu6K/BcnxQmxG8vHjJvTOsp8AFdLMyMVEfuue RBRE8ayfA1CyLESd4iHcGLK8O3bWZOGr0BDj9/e+VMKFxzZ/nS6vmUtMhwpxTF0djdzI 0alO7Eltc9ERn77m8+zybmyMZAC3kg/0W8iPoREE+DJRctkXEsJVbj3+UoanJ8/HGpCn LlkvFQpamaaI14zCm23C4W3gM+BEaJYWMo9+REyRPqUr2fWEWODiTADyeysb3oneTP1z xHPobNZDrFEDOXle5v7WsBL+BYK7poFKu1XAfIOG+0+btFyTZmlB+Rc3r7d4GPQowdyX 3/OQ== X-Gm-Message-State: APjAAAV8SFUF6JSOEXfGLBPYrBVTlsSchRA5xPvSnpAOSluj6Iv00dvk I24qP5AUVjuVWfNAwt5kFloSY2tEqW8XyQ== X-Received: by 2002:a65:68ce:: with SMTP id k14mr11031165pgt.374.1574458204763; Fri, 22 Nov 2019 13:30:04 -0800 (PST) Received: from yichengli2.mtv.corp.google.com ([2620:15c:202:201:900:2031:8afd:85a7]) by smtp.gmail.com with ESMTPSA id t15sm8019237pgb.0.2019.11.22.13.30.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Nov 2019 13:30:04 -0800 (PST) From: Yicheng Li To: linux-kernel@vger.kernel.org Cc: bleung@chromium.org, yichengli@chromium.org, gwendal@chromium.org, enric.balletbo@collabora.com Subject: [PATCH v2] mfd / platform: cros_ec: Query EC protocol version if EC transitions between RO/RW Date: Fri, 22 Nov 2019 13:29:05 -0800 Message-Id: <20191122212905.35679-1-yichengli@chromium.org> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RO and RW of EC may have different EC protocol version. If EC transitions between RO and RW, but AP does not reboot (this is true for fingerprint microcontroller / cros_fp, but not true for main ec / cros_ec), the AP still uses the protocol version queried before transition, which can cause problems. In the case of fingerprint microcontroller, this causes AP to send the wrong version of EC_CMD_GET_NEXT_EVENT to RO in the interrupt handler, which in turn prevents RO to clear the interrupt line to AP, in an infinite loop. Once an EC_HOST_EVENT_INTERFACE_READY is received, we know that there might have been a transition between RO and RW, so re-query the protocol. Signed-off-by: Yicheng Li --- drivers/platform/chrome/cros_ec.c | 23 +++++++++++++++++++++ include/linux/platform_data/cros_ec_proto.h | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c index 9b2d07422e17..a72514ac3ce7 100644 --- a/drivers/platform/chrome/cros_ec.c +++ b/drivers/platform/chrome/cros_ec.c @@ -104,6 +104,22 @@ static int cros_ec_sleep_event(struct cros_ec_device *ec_dev, u8 sleep_event) return ret; } +static int cros_ec_ready_event(struct notifier_block *nb, + unsigned long queued_during_suspend, void *_notify) +{ + struct cros_ec_device *ec_dev = container_of(nb, struct cros_ec_device, + notifier_ready); + u32 host_event = cros_ec_get_host_event(ec_dev); + + if (host_event & EC_HOST_EVENT_MASK(EC_HOST_EVENT_INTERFACE_READY)) { + mutex_lock(&ec_dev->lock); + cros_ec_query_all(ec_dev); + mutex_unlock(&ec_dev->lock); + return NOTIFY_OK; + + return NOTIFY_DONE; +} + /** * cros_ec_register() - Register a new ChromeOS EC, using the provided info. * @ec_dev: Device to register. @@ -201,6 +217,13 @@ int cros_ec_register(struct cros_ec_device *ec_dev) dev_dbg(ec_dev->dev, "Error %d clearing sleep event to ec", err); + /* Register the notifier for EC_HOST_EVENT_INTERFACE_READY event. */ + ec_dev->notifier_ready.notifier_call = cros_ec_ready_event; + err = blocking_notifier_chain_register(&ec_dev->event_notifier, + &ec_dev->notifier_ready); + if (err) + return err; + dev_info(dev, "Chrome EC device registered\n"); return 0; diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/platform_data/cros_ec_proto.h index 0d4e4aaed37a..4b016d5dbf50 100644 --- a/include/linux/platform_data/cros_ec_proto.h +++ b/include/linux/platform_data/cros_ec_proto.h @@ -161,6 +161,11 @@ struct cros_ec_device { int event_size; u32 host_event_wake_mask; u32 last_resume_result; + /* + * The notifier block to let the kernel re-query EC communication + * protocol when the EC sends EC_HOST_EVENT_INTERFACE_READY. + */ + struct notifier_block notifier_ready; /* The platform devices used by the mfd driver */ struct platform_device *ec; -- 2.21.0