Hi shubhrajyoti, 2010-11-15 오후 2:43, Datta, Shubhrajyoti 쓴 글: > Hi Kim, > >> -----Original Message----- >> From: linux-input-owner@xxxxxxxxxxxxxxx [mailto:linux-input- >> owner@xxxxxxxxxxxxxxx] On Behalf Of Kim, HeungJun >> Sent: Monday, November 15, 2010 10:02 AM >> To: linux-input@xxxxxxxxxxxxxxx; dmitry.torokhov@xxxxxxxxx >> Cc: kyungmin.park@xxxxxxxxxxx >> Subject: [PATCH 1/3] input: keyboard: MCS5080: support suspend/resume. >> >> This patch supports suspend/resume functions for mcs5080 touchkey >> driver. >> >> Signed-off-by: Heungjun Kim <riverful.kim@xxxxxxxxxxx> >> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> >> --- >> drivers/input/keyboard/mcs_touchkey.c | 41 >> +++++++++++++++++++++++++++++++++ >> include/linux/i2c/mcs.h | 1 + >> 2 files changed, 42 insertions(+), 0 deletions(-) >> >> 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); > Could you explain what it does? The MCS5080 chip has enable or poweron key, or may be LDO pins. So, it used in the platformdata, like above cfg_pin(). There is one reason about using poweron(). The MCS5080 chip must be re-initialize after resume(). If it's not used power off/on method and use only disable/enable irq, it happened that it dosen't issued interrupt. This is chip-level issue. So, I think that it's the very simplest method to support poweron() function to machine or platform data. > >> + >> 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; > Where is it called the first time? Actually, in the suspend(), this function called the first time. but, the actual power-up() sequence is possible in the cfg_pin(), too. So, I use this method. > >> >> 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 */ >> -- >> 1.7.0.4 >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-input" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html Thanks. If u any ideas, let me know. Regards, Heundjun Kim -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html