From 57a4af9be7051302edc51c878ecfbd90466827ff Mon Sep 17 00:00:00 2001 From: Balaji Rao Date: Tue, 27 Jan 2009 14:38:49 +0000 Subject: Subject: pcf50606_rebase_changes,patch X-Git-Url: http://git.openmoko.org/?p=kernel.git;a=commitdiff_plain;h=445395c9fcfb78ea62ab5a69b84c2c12efe01cff pcf50606_rebase_changes,patch This patch brings into andy-tracking all changes related to pcf50606 from old balaji-tracking. --- drivers/input/misc/pcf50606-input.c | 113 +++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 48 deletions(-) (limited to 'drivers/input') diff --git a/drivers/input/misc/pcf50606-input.c b/drivers/input/misc/pcf50606-input.c index 0e4564c4c82..044438ed662 100644 --- a/drivers/input/misc/pcf50606-input.c +++ b/drivers/input/misc/pcf50606-input.c @@ -12,92 +12,109 @@ * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 060, Boston, - * MA 02111-1307 USA */ +#include +#include +#include +#include +#include #include #include -#include + +#define PCF50606_OOCS_ONKEY 0x01 +#define PCF50606_OOCS_EXTON 0x02 + +#define PCF50606_OOCC2_ONKEYDB_NONE 0x00 +#define PCF50606_OOCC2_ONKEYDB_14ms 0x01 +#define PCF50606_OOCC2_ONKEYDB_62ms 0x02 +#define PCF50606_OOCC2_ONKEYDB_500ms 0x03 +#define PCF50606_OOCC2_EXTONDB_NONE 0x00 +#define PCF50606_OOCC2_EXTONDB_14ms 0x04 +#define PCF50606_OOCC2_EXTONDB_62ms 0x08 +#define PCF50606_OOCC2_EXTONDB_500ms 0x0c + +#define PCF50606_REG_OOCS 0x01 + +struct pcf50606_input { + struct pcf50606 *pcf; + struct input_dev *input_dev; +}; static void -pcf50606_input_irq(struct pcf50606 *pcf, int irq, void *data) +pcf50606_input_irq(int irq, void *data) { - struct input_dev *input_dev = pcf->input.input_dev; + struct pcf50606_input *input; int onkey_released; - /* We report only one event depending on if the key status */ - onkey_released = pcf50606_reg_read(pcf, PCF50606_REG_OOCS) & - PCF50606_OOCS_ONKEY; + input = data; + onkey_released = pcf50606_reg_read(input->pcf, PCF50606_REG_OOCS) & + PCF50606_OOCS_ONKEY; if (irq == PCF50606_IRQ_ONKEYF && !onkey_released) - input_report_key(input_dev, KEY_POWER, 1); + input_report_key(input->input_dev, KEY_POWER, 1); else if (irq == PCF50606_IRQ_ONKEYR && onkey_released) - input_report_key(input_dev, KEY_POWER, 0); + input_report_key(input->input_dev, KEY_POWER, 0); - input_sync(input_dev); + input_sync(input->input_dev); } -int __init pcf50606_input_probe(struct platform_device *pdev) +static int __devinit pcf50606_input_probe(struct platform_device *pdev) { - struct pcf50606 *pcf; + struct pcf50606_input *input; + struct pcf50606_subdev_pdata *pdata = pdev->dev.platform_data; struct input_dev *input_dev; int ret; - pcf = platform_get_drvdata(pdev); + + input = kzalloc(sizeof(*input), GFP_KERNEL); + if (!input) + return -ENOMEM; input_dev = input_allocate_device(); - if (!input_dev) - return -ENODEV; + if (!input_dev) { + kfree(input); + return -ENOMEM; + } + + platform_set_drvdata(pdev, input); + input->pcf = pdata->pcf; + input->input_dev = input_dev; input_dev->name = "PCF50606 PMU events"; input_dev->id.bustype = BUS_I2C; - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR); set_bit(KEY_POWER, input_dev->keybit); - set_bit(KEY_POWER2, input_dev->keybit); ret = input_register_device(input_dev); - if (ret) - goto out; - - pcf->input.input_dev = input_dev; - - /* Currently we care only about ONKEY and USBINS/USBREM - * - * USBINS/USBREM are told to us by mbc driver as we can't setup - * two handlers for an IRQ - */ - pcf->irq_handler[PCF50606_IRQ_ONKEYR].handler = pcf50606_input_irq; - - pcf->irq_handler[PCF50606_IRQ_ONKEYF].handler = pcf50606_input_irq; + if (ret) { + input_free_device(input_dev); + kfree(input); + return ret; + } + pcf50606_register_irq(pdata->pcf, PCF50606_IRQ_ONKEYR, + pcf50606_input_irq, input); + pcf50606_register_irq(pdata->pcf, PCF50606_IRQ_ONKEYF, + pcf50606_input_irq, input); return 0; - -out: - input_free_device(input_dev); - return ret; } static int __devexit pcf50606_input_remove(struct platform_device *pdev) { - struct pcf50606 *pcf; + struct pcf50606_input *input = platform_get_drvdata(pdev); + + input_unregister_device(input->input_dev); + pcf50606_free_irq(input->pcf, PCF50606_IRQ_ONKEYR); + pcf50606_free_irq(input->pcf, PCF50606_IRQ_ONKEYF); - pcf = platform_get_drvdata(pdev); - input_unregister_device(pcf->input.input_dev); + kfree(input); return 0; } -struct platform_driver pcf50606_input_driver = { +static struct platform_driver pcf50606_input_driver = { .driver = { .name = "pcf50606-input", }, @@ -107,13 +124,13 @@ struct platform_driver pcf50606_input_driver = { static int __init pcf50606_input_init(void) { - return platform_driver_register(&pcf50606_input_driver); + return platform_driver_register(&pcf50606_input_driver); } module_init(pcf50606_input_init); static void __exit pcf50606_input_exit(void) { - platform_driver_unregister(&pcf50606_input_driver); + platform_driver_unregister(&pcf50606_input_driver); } module_exit(pcf50606_input_exit); -- cgit v1.2.3