From patchwork Mon Nov 15 04:31:45 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kim, HeungJun" X-Patchwork-Id: 324582 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oAF4VmFv006836 for ; Mon, 15 Nov 2010 04:31:48 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757479Ab0KOEbr (ORCPT ); Sun, 14 Nov 2010 23:31:47 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:47674 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757342Ab0KOEbr (ORCPT ); Sun, 14 Nov 2010 23:31:47 -0500 Received: from epmmp2 (mailout2.samsung.com [203.254.224.25]) by mailout2.samsung.com (Oracle Communications Messaging Exchange Server 7u4-19.01 64bit (built Sep 7 2010)) with ESMTP id <0LBW001XJSKX6RA0@mailout2.samsung.com> for linux-input@vger.kernel.org; Mon, 15 Nov 2010 13:31:45 +0900 (KST) Received: from TNRNDGASPAPP1.tn.corp.samsungelectronics.net ([165.213.149.150]) by mmp2.samsung.com (iPlanet Messaging Server 5.2 Patch 2 (built Jul 14 2004)) with ESMTPA id <0LBW00DD8SKY17@mmp2.samsung.com> for linux-input@vger.kernel.org; Mon, 15 Nov 2010 13:31:46 +0900 (KST) Received: from [10.89.10.251] ([10.89.10.251]) by TNRNDGASPAPP1.tn.corp.samsungelectronics.net with Microsoft SMTPSVC(6.0.3790.4675); Mon, 15 Nov 2010 13:31:45 +0900 Date: Mon, 15 Nov 2010 13:31:45 +0900 From: "Kim, HeungJun" Subject: [PATCH 1/3] input: keyboard: MCS5080: support suspend/resume. To: linux-input@vger.kernel.org, dmitry.torokhov@gmail.com Cc: kyungmin.park@samsung.com Reply-to: riverful.kim@samsung.com Message-id: <4CE0B7B1.6060404@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=EUC-KR Content-transfer-encoding: 7BIT User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ko; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 X-OriginalArrivalTime: 15 Nov 2010 04:31:45.0706 (UTC) FILETIME=[02BFC8A0:01CB847E] Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 15 Nov 2010 04:31:48 +0000 (UTC) diff --git a/drivers/input/keyboard/mcs_touchkey.c b/drivers/input/keyboard/mcs_touchkey.c index 63b849d..06385f5 100644 --- a/drivers/input/keyboard/mcs_touchkey.c +++ b/drivers/input/keyboard/mcs_touchkey.c @@ -45,6 +45,8 @@ struct mcs_touchkey_chip { }; struct mcs_touchkey_data { + void (*poweron)(int); + struct i2c_client *client; struct input_dev *input_dev; struct mcs_touchkey_chip chip; @@ -168,6 +170,8 @@ static int __devinit mcs_touchkey_probe(struct i2c_client *client, if (pdata->cfg_pin) pdata->cfg_pin(); + if (pdata->poweron) + data->poweron = pdata->poweron; error = request_threaded_irq(client->irq, NULL, mcs_touchkey_interrupt, IRQF_TRIGGER_FALLING, client->dev.driver->name, data); @@ -202,6 +206,41 @@ static int __devexit mcs_touchkey_remove(struct i2c_client *client) return 0; } +#ifdef CONFIG_PM +static int mcs_touchkey_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct mcs_touchkey_data *data = i2c_get_clientdata(client); + + /* Disable the work */ + disable_irq(client->irq); + + /* Don't I2C operation since we don't know I2C bus is dead already */ + + /* Finally turn off the power */ + if (data->poweron) + data->poweron(0); + + return 0; +} + +static int mcs_touchkey_resume(struct i2c_client *client) +{ + struct mcs_touchkey_data *data = i2c_get_clientdata(client); + + /* Enable the device first */ + if (data->poweron) + data->poweron(1); + + /* Enable irq again */ + enable_irq(client->irq); + + return 0; +} +#else +#define mcs_touchkey_suspend NULL +#define mcs_touchkey_resume NULL +#endif + static const struct i2c_device_id mcs_touchkey_id[] = { { "mcs5000_touchkey", MCS5000_TOUCHKEY }, { "mcs5080_touchkey", MCS5080_TOUCHKEY }, @@ -216,6 +255,8 @@ static struct i2c_driver mcs_touchkey_driver = { }, .probe = mcs_touchkey_probe, .remove = __devexit_p(mcs_touchkey_remove), + .suspend = mcs_touchkey_suspend, + .resume = mcs_touchkey_resume, .id_table = mcs_touchkey_id, }; diff --git a/include/linux/i2c/mcs.h b/include/linux/i2c/mcs.h index 725ae7c..c4a3869 100644 --- a/include/linux/i2c/mcs.h +++ b/include/linux/i2c/mcs.h @@ -18,6 +18,7 @@ #define MCS_KEY_CODE(v) ((v) & 0xffff) struct mcs_platform_data { + void (*poweron)(int); void (*cfg_pin)(void); /* touchscreen */