From patchwork Mon Oct 19 03:17:35 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 532111 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 8500A1401F0 for ; Mon, 19 Oct 2015 14:24:36 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=QJ8Yrek9; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 399664B7BF; Mon, 19 Oct 2015 05:24:19 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ODN6qbPsBaLf; Mon, 19 Oct 2015 05:24:19 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 68ED14B7D1; Mon, 19 Oct 2015 05:24:12 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AA5E64B6E3 for ; Mon, 19 Oct 2015 05:23:52 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1WAbnMrv-Jnq for ; Mon, 19 Oct 2015 05:23:52 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-ig0-f182.google.com (mail-ig0-f182.google.com [209.85.213.182]) by theia.denx.de (Postfix) with ESMTPS id 594294B6F3 for ; Mon, 19 Oct 2015 05:23:48 +0200 (CEST) Received: by igbkq10 with SMTP id kq10so47829283igb.0 for ; Sun, 18 Oct 2015 20:23:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=SaGWglTm29s/CSUocKGggL2RCjsxYWmgjBtAMe+9MiQ=; b=QJ8Yrek9/7vpUVw7sBieq6qWja8DH7Dr/btCpQsQanH3bMraxPR0NP46lL1UKOnFMM DWkw1VgQta2glbev3VELXKT8RDhlwH0lN3re8yhPbKWhg/M+X1Ox4jWqVcVV2FiZtrPC DKYoMjoyZv/v74TPQk3daX6iLM2ILfvE+zpWBjZhDUMhEAWH0mas2ytuyS+PXyDBJQT0 4zvxsORmWF9FTWjJigXgtFLtHzezjzw0sIH4UFr2x1wDhD2J+um4dfcScCWoYu8XEk2T rb5rLz/47ABgEqGxKQ4OZ+2HQ5fA/isAjVT+QFPFsfyyXvQGVEpBxN49u2bOYWmo4nQ2 wlQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=SaGWglTm29s/CSUocKGggL2RCjsxYWmgjBtAMe+9MiQ=; b=f+aFgFl8+3ZnaQj6ZwSOjRx2WJ/pjxPaEuqcZR0ZYGqJMsrEVkwo7kBhiGc27ji6RC qj9O5zjKvHFFrRe8l1jEh2LFdIn42KXczOMLitt4hR7xynLMPhh35gg37BWih+nUUrd3 /ZcQDkGXVTOQ7Hbuj19Ci4B7lOoEt9IS6QCmGqpl3GRwHjEAYNlsAgXUXqsi0HMjuMdM AiandK/80xvAmUvSVugPLfa8z2MNjCWmsPud03tTd7V6/kniQPZRyIiOvFuZS0/drTUT TylI7bAKoZa9+j/FQ6KvbL7phWgXUMM7stG4eedRQd+/UXlm2u4Q3SiJyXz2Hx6CzIdk vXCw== X-Gm-Message-State: ALoCoQnU2KzKvrJQo5y9CLcFxekgb7m7r+AP+hgd0WJMqkd5/SlcKmMM7AIXMWlDSfR8ROVo8A01 X-Received: by 10.50.142.99 with SMTP id rv3mr67692igb.16.1445225027588; Sun, 18 Oct 2015 20:23:47 -0700 (PDT) Received: from kaki.bld.corp.google.com ([172.29.216.32]) by smtp.gmail.com with ESMTPSA id l80sm5389545iod.34.2015.10.18.20.23.45 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 18 Oct 2015 20:23:47 -0700 (PDT) Received: by kaki.bld.corp.google.com (Postfix, from userid 121222) id 14CE2223484; Sun, 18 Oct 2015 21:17:46 -0600 (MDT) From: Simon Glass To: U-Boot Mailing List Date: Sun, 18 Oct 2015 21:17:35 -0600 Message-Id: <1445224657-20622-27-git-send-email-sjg@chromium.org> X-Mailer: git-send-email 2.6.0.rc2.230.g3dd15c0 In-Reply-To: <1445224657-20622-1-git-send-email-sjg@chromium.org> References: <1445224657-20622-1-git-send-email-sjg@chromium.org> Subject: [U-Boot] [PATCH v2 26/28] i8042: Handle a duplicate power-on-reset response X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Sometimes we seem to get 0xaa twice which causes the config read to fail. This causes chromebook_link to fail to set up the keyboard. Add a check for this and read the config again when detected. Signed-off-by: Simon Glass Reviewed-by: Bin Meng --- Changes in v2: - Use device tree to handle this quirk drivers/input/i8042.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/input/i8042.c b/drivers/input/i8042.c index e5e2926..6d358b7 100644 --- a/drivers/input/i8042.c +++ b/drivers/input/i8042.c @@ -15,13 +15,20 @@ #include #include +DECLARE_GLOBAL_DATA_PTR; + /* defines */ #define in8(p) inb(p) #define out8(p, v) outb(v, p) +enum { + QUICK_DUP_POR = 1 << 0, +}; + /* locals */ struct i8042_kbd_priv { bool extended; /* true if an extended keycode is expected next */ + int quirks; /* quirks that we support */ }; static unsigned char ext_key_map[] = { @@ -113,7 +120,7 @@ static int kbd_cmd_write(int cmd, int data) return kbd_write(I8042_DATA_REG, data); } -static int kbd_reset(void) +static int kbd_reset(int quirk) { int config; @@ -132,6 +139,10 @@ static int kbd_reset(void) if (config == -1) goto err; + /* Sometimes get a second byte */ + else if ((quirk & QUICK_DUP_POR) && config == KBD_POR) + config = kbd_cmd_read(CMD_RD_CONFIG); + config |= CONFIG_AT_TRANS; config &= ~(CONFIG_KIRQ_EN | CONFIG_MIRQ_EN); if (kbd_cmd_write(CMD_WR_CONFIG, config)) @@ -246,6 +257,7 @@ static int i8042_kbd_check(struct input_config *input) static int i8042_start(struct udevice *dev) { struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev); + struct i8042_kbd_priv *priv = dev_get_priv(dev); struct input_config *input = &uc_priv->input; int keymap, try; char *penv; @@ -264,7 +276,7 @@ static int i8042_start(struct udevice *dev) keymap = KBD_GER; } - for (try = 0; kbd_reset() != 0; try++) { + for (try = 0; kbd_reset(priv->quirks) != 0; try++) { if (try >= KBD_RESET_TRIES) return -1; } @@ -294,10 +306,15 @@ static int i8042_start(struct udevice *dev) static int i8042_kbd_probe(struct udevice *dev) { struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev); + struct i8042_kbd_priv *priv = dev_get_priv(dev); struct stdio_dev *sdev = &uc_priv->sdev; struct input_config *input = &uc_priv->input; int ret; + if (fdtdec_get_bool(gd->fdt_blob, dev->of_offset, + "intel,duplicate-por")) + priv->quirks |= QUICK_DUP_POR; + /* Register the device. i8042_start() will be called soon */ input->dev = dev; input->read_keys = i8042_kbd_check;