On Thu, 2010-12-30 at 03:17 +0800, Kevin McNeely wrote: [...] > + > +/* registered in driver struct */ > +static int __devexit cyttsp_i2c_remove(struct i2c_client *client) > +{ > + struct cyttsp_i2c *ts; > + > + ts = i2c_get_clientdata(client); > + cyttsp_core_release(ts->ttsp_client); > + kfree(ts); > + return 0; > +} > + > +#ifdef CONFIG_PM > +static int cyttsp_i2c_suspend(struct i2c_client *client, pm_message_t message) > +{ > + return cyttsp_suspend(dev_get_drvdata(&client->dev)); > +} > + > +static int cyttsp_i2c_resume(struct i2c_client *client) > +{ > + return cyttsp_resume(dev_get_drvdata(&client->dev)); > +} > +#endif I think what we get here is a pointer to cyttsp_i2c, and we need to pass cyttsp_i2c->ttsp_client to cyttsp_suspend/resume. Thanks, Hong > + > +static const struct i2c_device_id cyttsp_i2c_id[] = { > + { CY_I2C_NAME, 0 }, { } > +}; > + > +static struct i2c_driver cyttsp_i2c_driver = { > + .driver = { > + .name = CY_I2C_NAME, > + .owner = THIS_MODULE, > + }, > + .probe = cyttsp_i2c_probe, > + .remove = __devexit_p(cyttsp_i2c_remove), > + .id_table = cyttsp_i2c_id, > +#ifdef CONFIG_PM > + .suspend = cyttsp_i2c_suspend, > + .resume = cyttsp_i2c_resume, > +#endif > +}; > + > +static int __init cyttsp_i2c_init(void) > +{ > + return i2c_add_driver(&cyttsp_i2c_driver); > +} > + > +static void __exit cyttsp_i2c_exit(void) > +{ > + return i2c_del_driver(&cyttsp_i2c_driver); > +} > + > +module_init(cyttsp_i2c_init); > +module_exit(cyttsp_i2c_exit); > + > +MODULE_ALIAS("i2c:cyttsp"); > +MODULE_LICENSE("GPL"); > +MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard Product (TTSP) I2C driver"); > +MODULE_AUTHOR("Cypress"); > +MODULE_DEVICE_TABLE(i2c, cyttsp_i2c_id); -- 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