From patchwork Fri Nov 14 06:03:08 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dudley Du X-Patchwork-Id: 5303821 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0212A9F440 for ; Fri, 14 Nov 2014 06:10:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1898020149 for ; Fri, 14 Nov 2014 06:10:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2C7BC2013D for ; Fri, 14 Nov 2014 06:10:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753022AbaKNGEk (ORCPT ); Fri, 14 Nov 2014 01:04:40 -0500 Received: from mail-pa0-f50.google.com ([209.85.220.50]:51771 "EHLO mail-pa0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752700AbaKNGEj (ORCPT ); Fri, 14 Nov 2014 01:04:39 -0500 Received: by mail-pa0-f50.google.com with SMTP id eu11so16849808pac.37 for ; Thu, 13 Nov 2014 22:04:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+LagBUeMWOQIPD1vVh/UvzHtPsGJIGSBkZ505lNAUCM=; b=Qb0K0/s3WTAesbjkHdIzvb5osNSqCk6UMMmVkqUqVsV/PsIYD2SMwqU/zjkyZuPAUw SUU+tfsjw7bAoSgzikBBSy7BL3+h6gAzZAZ5e5NQ9v+/IvXodx7LHspFsftswA/RRakY ZkZGVs0ky3GVp2lLIxMl+rTHTif9GsbTRC8YCY5GjR6JGl8rh7CDx4i9s9Fkd3H2Y20+ 0ACMHE7Y9AL9s52JN6gxGIAFxNg5eb6S8kOa3iRbciL6Rsn+fdB8CSIFwNZkieVTQWnx GgRO1I9vxo0o96vmcjs8EA7Jy/EeuaV7QmRRGPNOXxuJfR+RR+ysKJEAeATpzuVHa6gP OJFg== X-Received: by 10.68.215.2 with SMTP id oe2mr8016046pbc.94.1415945075683; Thu, 13 Nov 2014 22:04:35 -0800 (PST) Received: from localhost ([140.207.206.26]) by mx.google.com with ESMTPSA id jc3sm26389936pbb.49.2014.11.13.22.04.32 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 13 Nov 2014 22:04:34 -0800 (PST) From: Dudley Du X-Google-Original-From: Dudley Du To: dmitry.torokhov@gmail.com, rydberg@euromail.se Cc: Dudley Du , bleung@google.com, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v10 02/18] input: cyapa: add device resource management infrastructure support Date: Fri, 14 Nov 2014 14:03:08 +0800 Message-Id: <1415945004-19868-3-git-send-email-dudl@cypress.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1415945004-19868-1-git-send-email-dudl@cypress.com> References: <1415945004-19868-1-git-send-email-dudl@cypress.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Remove cyapa_remove() method, add cyapa_open() and cyapa_close() methods for input interface, also modified together with driver's memory and IRQ resource allocations to support device resource management infrastructure to reduce the mistakes of resource management. TEST=test on Chromebooks. Signed-off-by: Dudley Du --- drivers/input/mouse/cyapa.c | 77 +++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c index c35f398..06c94a3 100644 --- a/drivers/input/mouse/cyapa.c +++ b/drivers/input/mouse/cyapa.c @@ -753,6 +753,22 @@ static u8 cyapa_check_adapter_functionality(struct i2c_client *client) return ret; } +static int cyapa_open(struct input_dev *input) +{ + struct cyapa *cyapa = input_get_drvdata(input); + struct i2c_client *client = cyapa->client; + + enable_irq(client->irq); + return 0; +} + +static void cyapa_close(struct input_dev *input) +{ + struct cyapa *cyapa = input_get_drvdata(input); + + disable_irq(cyapa->client->irq); +} + static int cyapa_create_input_dev(struct cyapa *cyapa) { struct device *dev = &cyapa->client->dev; @@ -762,7 +778,7 @@ static int cyapa_create_input_dev(struct cyapa *cyapa) if (!cyapa->physical_size_x || !cyapa->physical_size_y) return -EINVAL; - input = cyapa->input = input_allocate_device(); + input = cyapa->input = devm_input_allocate_device(dev); if (!input) { dev_err(dev, "allocate memory for input device failed\n"); return -ENOMEM; @@ -775,6 +791,9 @@ static int cyapa_create_input_dev(struct cyapa *cyapa) input->id.product = 0; /* means any product in eventcomm. */ input->dev.parent = &cyapa->client->dev; + input->open = cyapa_open; + input->close = cyapa_close; + input_set_drvdata(input, cyapa); __set_bit(EV_ABS, input->evbit); @@ -807,21 +826,17 @@ static int cyapa_create_input_dev(struct cyapa *cyapa) if (error) { dev_err(dev, "allocate memory for MT slots failed, %d\n", error); - goto err_free_device; + return error; } /* Register the device in input subsystem */ error = input_register_device(input); if (error) { dev_err(dev, "input device register failed, %d\n", error); - goto err_free_device; + return error; } - return 0; -err_free_device: - input_free_device(input); - cyapa->input = NULL; - return error; + return 0; } static int cyapa_probe(struct i2c_client *client, @@ -838,7 +853,7 @@ static int cyapa_probe(struct i2c_client *client, return -EIO; } - cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL); + cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL); if (!cyapa) return -ENOMEM; @@ -855,51 +870,45 @@ static int cyapa_probe(struct i2c_client *client, error = cyapa_check_is_operational(cyapa); if (error) { dev_err(dev, "device not operational, %d\n", error); - goto err_mem_free; - } - - error = cyapa_create_input_dev(cyapa); - if (error) { - dev_err(dev, "create input_dev instance failed, %d\n", error); - goto err_mem_free; + return error; } error = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE); if (error) { dev_err(dev, "set active power failed, %d\n", error); - goto err_unregister_device; + return error; } cyapa->irq = client->irq; - error = request_threaded_irq(cyapa->irq, - NULL, - cyapa_irq, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - "cyapa", - cyapa); + error = devm_request_threaded_irq(dev, + cyapa->irq, + NULL, + cyapa_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "cyapa", + cyapa); if (error) { dev_err(dev, "IRQ request failed: %d\n, ", error); - goto err_unregister_device; + return error; } + /* Disable IRQ until the device is opened. */ + disable_irq(client->irq); - return 0; - -err_unregister_device: - input_unregister_device(cyapa->input); -err_mem_free: - kfree(cyapa); + error = cyapa_create_input_dev(cyapa); + if (error) { + dev_err(dev, "create input_dev instance failed, %d\n", error); + return error; + } - return error; + return 0; } static int cyapa_remove(struct i2c_client *client) { struct cyapa *cyapa = i2c_get_clientdata(client); - free_irq(cyapa->irq, cyapa); - input_unregister_device(cyapa->input); + disable_irq(cyapa->irq); cyapa_set_power_mode(cyapa, PWR_MODE_OFF); - kfree(cyapa); return 0; }