From patchwork Thu Sep 29 00:37:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 9355469 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 394956077A for ; Thu, 29 Sep 2016 00:37:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2493A29654 for ; Thu, 29 Sep 2016 00:37:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 194392965C; Thu, 29 Sep 2016 00:37:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 49DDE29654 for ; Thu, 29 Sep 2016 00:37:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750789AbcI2AhR (ORCPT ); Wed, 28 Sep 2016 20:37:17 -0400 Received: from bh-25.webhostbox.net ([208.91.199.152]:50315 "EHLO bh-25.webhostbox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750719AbcI2AhQ (ORCPT ); Wed, 28 Sep 2016 20:37:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=roeck-us.net; s=default; h=Message-Id:Date:Subject:Cc:To:From; bh=PYgviNRHtrQtIcB4VaAgCuwp5mfEwWVz8q0BHB2c0jw=; b=YwEe+068SCpBdkiDfCx11sLwV+ mwGcLOsDXHgkFgSivpZAkKuTmBH+sEsZN3Yx51fw09zBUbIQzjbi1sT5zTyBJC6t9K/JNh6ddgNt2 qOwC1OZPYXdmRC8htkOT2ZjQoVIY1UrXrWSiNaCGxUvZspB9FAWcEKq/oLdUQf8KbLjYY8jWF/mgV xYe2mQ0tBn6+mmpus3kHPhU77KKU4kpwQbRQmbcO15pz7kuHVbkqJOgd8Pz6as1fliZ3zKKbVyXNR Eira+NAlsDk5c3TwuNzt9zwL1/yN/ehhR2LRJnQg3FCNzW36cmnP5mK9YlbzvYwt8ZT5lTMsfVr+8 +x9qr1NA==; Received: from 108-223-40-66.lightspeed.sntcca.sbcglobal.net ([108.223.40.66]:60070 helo=localhost) by bh-25.webhostbox.net with esmtpa (Exim 4.86_1) (envelope-from ) id 1bpPLX-002PTT-PL; Thu, 29 Sep 2016 00:37:10 +0000 From: Guenter Roeck To: Dmitry Torokhov Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Guenter Roeck , Bjorn Andersson , Andrew Duggan Subject: [PATCH] Input: synaptics-rmi4 - Fix error handling in I2C transport driver Date: Wed, 28 Sep 2016 17:37:06 -0700 Message-Id: <1475109426-23644-1-git-send-email-linux@roeck-us.net> X-Mailer: git-send-email 2.5.0 X-Authenticated_sender: guenter@roeck-us.net X-OutGoing-Spam-Status: No, score=-1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - bh-25.webhostbox.net X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - roeck-us.net X-Get-Message-Sender-Via: bh-25.webhostbox.net: authenticated_id: guenter@roeck-us.net X-Authenticated-Sender: bh-25.webhostbox.net: guenter@roeck-us.net X-Source: X-Source-Args: X-Source-Dir: Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Instantiating the rmi4 I2C transport driver without interrupts assigned (for example using manual i2c instantiation from the command line) caused the driver to fail to load, but it does not clean up its regulator or transport device registrations. Result is a crash at a later time, for example when rebooting the system. Fixes: 946c8432aab0 ("Input: synaptics-rmi4 - support regulator supplies") Fixes: fdf51604f104 ("Input: synaptics-rmi4 - add I2C transport driver") Cc: Bjorn Andersson Cc: Andrew Duggan Signed-off-by: Guenter Roeck Reviewed-by: Bjorn Andersson --- drivers/input/rmi4/rmi_i2c.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/input/rmi4/rmi_i2c.c b/drivers/input/rmi4/rmi_i2c.c index 6f2e0e4f0296..d57b227ccd25 100644 --- a/drivers/input/rmi4/rmi_i2c.c +++ b/drivers/input/rmi4/rmi_i2c.c @@ -285,23 +285,30 @@ static int rmi_i2c_probe(struct i2c_client *client, retval = rmi_set_page(rmi_i2c, 0); if (retval) { dev_err(&client->dev, "Failed to set page select to 0.\n"); - return retval; + goto error_disable; } retval = rmi_register_transport_device(&rmi_i2c->xport); if (retval) { dev_err(&client->dev, "Failed to register transport driver at 0x%.2X.\n", client->addr); - return retval; + goto error_disable; } retval = rmi_i2c_init_irq(client); if (retval < 0) - return retval; + goto error_unregister; dev_info(&client->dev, "registered rmi i2c driver at %#04x.\n", client->addr); return 0; + +error_unregister: + rmi_unregister_transport_device(&rmi_i2c->xport); +error_disable: + regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + return retval; } static int rmi_i2c_remove(struct i2c_client *client)