Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/input/touchscreen/jornada720_ts.c (Version 2.6.25) and /linux/drivers/input/touchscreen/jornada720_ts.c (Version 2.6.31.13)


  1 /*                                                  1 /*
  2  * drivers/input/touchscreen/jornada720_ts.c        2  * drivers/input/touchscreen/jornada720_ts.c
  3  *                                                  3  *
  4  * Copyright (C) 2007 Kristoffer Ericson <Kris      4  * Copyright (C) 2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com>
  5  *                                                  5  *
  6  *  Copyright (C) 2006 Filip Zyzniewski <filip      6  *  Copyright (C) 2006 Filip Zyzniewski <filip.zyzniewski@tefnet.pl>
  7  *  based on HP Jornada 56x touchscreen driver      7  *  based on HP Jornada 56x touchscreen driver by Alex Lange <chicken@handhelds.org>
  8  *                                                  8  *
  9  * This program is free software; you can redi      9  * This program is free software; you can redistribute it and/or modify
 10  * it under the terms of the GNU General Publi     10  * it under the terms of the GNU General Public License version 2 as
 11  * published by the Free Software Foundation.      11  * published by the Free Software Foundation.
 12  *                                                 12  *
 13  * HP Jornada 710/720/729 Touchscreen Driver       13  * HP Jornada 710/720/729 Touchscreen Driver
 14  */                                                14  */
 15                                                    15 
 16 #include <linux/platform_device.h>                 16 #include <linux/platform_device.h>
 17 #include <linux/init.h>                            17 #include <linux/init.h>
 18 #include <linux/input.h>                           18 #include <linux/input.h>
 19 #include <linux/interrupt.h>                       19 #include <linux/interrupt.h>
 20 #include <linux/module.h>                          20 #include <linux/module.h>
 21                                                    21 
 22 #include <asm/hardware.h>                      !!  22 #include <mach/hardware.h>
 23 #include <asm/arch/jornada720.h>               !!  23 #include <mach/jornada720.h>
 24                                                    24 
 25 MODULE_AUTHOR("Kristoffer Ericson <kristoffer.     25 MODULE_AUTHOR("Kristoffer Ericson <kristoffer.ericson@gmail.com>");
 26 MODULE_DESCRIPTION("HP Jornada 710/720/728 tou     26 MODULE_DESCRIPTION("HP Jornada 710/720/728 touchscreen driver");
 27 MODULE_LICENSE("GPLv2");                       !!  27 MODULE_LICENSE("GPL v2");
 28                                                    28 
 29 struct jornada_ts {                                29 struct jornada_ts {
 30         struct input_dev *dev;                     30         struct input_dev *dev;
 31         int x_data[4];          /* X sample va     31         int x_data[4];          /* X sample values */
 32         int y_data[4];          /* Y sample va     32         int y_data[4];          /* Y sample values */
 33 };                                                 33 };
 34                                                    34 
 35 static void jornada720_ts_collect_data(struct      35 static void jornada720_ts_collect_data(struct jornada_ts *jornada_ts)
 36 {                                                  36 {
 37                                                    37 
 38     /* 3 low word X samples */                     38     /* 3 low word X samples */
 39     jornada_ts->x_data[0] = jornada_ssp_byte(T     39     jornada_ts->x_data[0] = jornada_ssp_byte(TXDUMMY);
 40     jornada_ts->x_data[1] = jornada_ssp_byte(T     40     jornada_ts->x_data[1] = jornada_ssp_byte(TXDUMMY);
 41     jornada_ts->x_data[2] = jornada_ssp_byte(T     41     jornada_ts->x_data[2] = jornada_ssp_byte(TXDUMMY);
 42                                                    42 
 43     /* 3 low word Y samples */                     43     /* 3 low word Y samples */
 44     jornada_ts->y_data[0] = jornada_ssp_byte(T     44     jornada_ts->y_data[0] = jornada_ssp_byte(TXDUMMY);
 45     jornada_ts->y_data[1] = jornada_ssp_byte(T     45     jornada_ts->y_data[1] = jornada_ssp_byte(TXDUMMY);
 46     jornada_ts->y_data[2] = jornada_ssp_byte(T     46     jornada_ts->y_data[2] = jornada_ssp_byte(TXDUMMY);
 47                                                    47 
 48     /* combined x samples bits */                  48     /* combined x samples bits */
 49     jornada_ts->x_data[3] = jornada_ssp_byte(T     49     jornada_ts->x_data[3] = jornada_ssp_byte(TXDUMMY);
 50                                                    50 
 51     /* combined y samples bits */                  51     /* combined y samples bits */
 52     jornada_ts->y_data[3] = jornada_ssp_byte(T     52     jornada_ts->y_data[3] = jornada_ssp_byte(TXDUMMY);
 53 }                                                  53 }
 54                                                    54 
 55 static int jornada720_ts_average(int coords[4]     55 static int jornada720_ts_average(int coords[4])
 56 {                                                  56 {
 57         int coord, high_bits = coords[3];          57         int coord, high_bits = coords[3];
 58                                                    58 
 59         coord  = coords[0] | ((high_bits & 0x0     59         coord  = coords[0] | ((high_bits & 0x03) << 8);
 60         coord += coords[1] | ((high_bits & 0x0     60         coord += coords[1] | ((high_bits & 0x0c) << 6);
 61         coord += coords[2] | ((high_bits & 0x3     61         coord += coords[2] | ((high_bits & 0x30) << 4);
 62                                                    62 
 63         return coord / 3;                          63         return coord / 3;
 64 }                                                  64 }
 65                                                    65 
 66 static irqreturn_t jornada720_ts_interrupt(int     66 static irqreturn_t jornada720_ts_interrupt(int irq, void *dev_id)
 67 {                                                  67 {
 68         struct platform_device *pdev = dev_id;     68         struct platform_device *pdev = dev_id;
 69         struct jornada_ts *jornada_ts = platfo     69         struct jornada_ts *jornada_ts = platform_get_drvdata(pdev);
 70         struct input_dev *input = jornada_ts->     70         struct input_dev *input = jornada_ts->dev;
 71         int x, y;                                  71         int x, y;
 72                                                    72 
 73         /* If GPIO_GPIO9 is set to high then r     73         /* If GPIO_GPIO9 is set to high then report pen up */
 74         if (GPLR & GPIO_GPIO(9)) {                 74         if (GPLR & GPIO_GPIO(9)) {
 75                 input_report_key(input, BTN_TO     75                 input_report_key(input, BTN_TOUCH, 0);
 76                 input_sync(input);                 76                 input_sync(input);
 77         } else {                                   77         } else {
 78                 jornada_ssp_start();               78                 jornada_ssp_start();
 79                                                    79 
 80                 /* proper reply to request is      80                 /* proper reply to request is always TXDUMMY */
 81                 if (jornada_ssp_inout(GETTOUCH     81                 if (jornada_ssp_inout(GETTOUCHSAMPLES) == TXDUMMY) {
 82                         jornada720_ts_collect_     82                         jornada720_ts_collect_data(jornada_ts);
 83                                                    83 
 84                         x = jornada720_ts_aver     84                         x = jornada720_ts_average(jornada_ts->x_data);
 85                         y = jornada720_ts_aver     85                         y = jornada720_ts_average(jornada_ts->y_data);
 86                                                    86 
 87                         input_report_key(input     87                         input_report_key(input, BTN_TOUCH, 1);
 88                         input_report_abs(input     88                         input_report_abs(input, ABS_X, x);
 89                         input_report_abs(input     89                         input_report_abs(input, ABS_Y, y);
 90                         input_sync(input);         90                         input_sync(input);
 91                 }                                  91                 }
 92                                                    92 
 93                 jornada_ssp_end();                 93                 jornada_ssp_end();
 94         }                                          94         }
 95                                                    95 
 96         return IRQ_HANDLED;                        96         return IRQ_HANDLED;
 97 }                                                  97 }
 98                                                    98 
 99 static int __devinit jornada720_ts_probe(struc     99 static int __devinit jornada720_ts_probe(struct platform_device *pdev)
100 {                                                 100 {
101         struct jornada_ts *jornada_ts;            101         struct jornada_ts *jornada_ts;
102         struct input_dev *input_dev;              102         struct input_dev *input_dev;
103         int error;                                103         int error;
104                                                   104 
105         jornada_ts = kzalloc(sizeof(struct jor    105         jornada_ts = kzalloc(sizeof(struct jornada_ts), GFP_KERNEL);
106         input_dev = input_allocate_device();      106         input_dev = input_allocate_device();
107                                                   107 
108         if (!jornada_ts || !input_dev) {          108         if (!jornada_ts || !input_dev) {
109                 error = -ENOMEM;                  109                 error = -ENOMEM;
110                 goto fail1;                       110                 goto fail1;
111         }                                         111         }
112                                                   112 
113         platform_set_drvdata(pdev, jornada_ts)    113         platform_set_drvdata(pdev, jornada_ts);
114                                                   114 
115         jornada_ts->dev = input_dev;              115         jornada_ts->dev = input_dev;
116                                                   116 
117         input_dev->name = "HP Jornada 7xx Touc    117         input_dev->name = "HP Jornada 7xx Touchscreen";
118         input_dev->phys = "jornadats/input0";     118         input_dev->phys = "jornadats/input0";
119         input_dev->id.bustype = BUS_HOST;         119         input_dev->id.bustype = BUS_HOST;
120         input_dev->dev.parent = &pdev->dev;       120         input_dev->dev.parent = &pdev->dev;
121                                                   121 
122         input_dev->evbit[0] = BIT(EV_KEY) | BI !! 122         input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
123         input_dev->keybit[LONG(BTN_TOUCH)] = B !! 123         input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
124         input_set_abs_params(input_dev, ABS_X,    124         input_set_abs_params(input_dev, ABS_X, 270, 3900, 0, 0);
125         input_set_abs_params(input_dev, ABS_Y,    125         input_set_abs_params(input_dev, ABS_Y, 180, 3700, 0, 0);
126                                                   126 
127         error = request_irq(IRQ_GPIO9,            127         error = request_irq(IRQ_GPIO9,
128                         jornada720_ts_interrup    128                         jornada720_ts_interrupt,
129                         IRQF_DISABLED | IRQF_T    129                         IRQF_DISABLED | IRQF_TRIGGER_RISING,
130                         "HP7XX Touchscreen dri    130                         "HP7XX Touchscreen driver", pdev);
131         if (error) {                              131         if (error) {
132                 printk(KERN_INFO "HP7XX TS : U    132                 printk(KERN_INFO "HP7XX TS : Unable to acquire irq!\n");
133                 goto fail1;                       133                 goto fail1;
134         }                                         134         }
135                                                   135 
136         error = input_register_device(jornada_    136         error = input_register_device(jornada_ts->dev);
137         if (error)                                137         if (error)
138                 goto fail2;                       138                 goto fail2;
139                                                   139 
140         return 0;                                 140         return 0;
141                                                   141 
142  fail2:                                           142  fail2:
143         free_irq(IRQ_GPIO9, pdev);                143         free_irq(IRQ_GPIO9, pdev);
144  fail1:                                           144  fail1:
145         platform_set_drvdata(pdev, NULL);         145         platform_set_drvdata(pdev, NULL);
146         input_free_device(input_dev);             146         input_free_device(input_dev);
147         kfree(jornada_ts);                        147         kfree(jornada_ts);
148         return error;                             148         return error;
149 }                                                 149 }
150                                                   150 
151 static int __devexit jornada720_ts_remove(stru    151 static int __devexit jornada720_ts_remove(struct platform_device *pdev)
152 {                                                 152 {
153         struct jornada_ts *jornada_ts = platfo    153         struct jornada_ts *jornada_ts = platform_get_drvdata(pdev);
154                                                   154 
155         free_irq(IRQ_GPIO9, pdev);                155         free_irq(IRQ_GPIO9, pdev);
156         platform_set_drvdata(pdev, NULL);         156         platform_set_drvdata(pdev, NULL);
157         input_unregister_device(jornada_ts->de    157         input_unregister_device(jornada_ts->dev);
158         kfree(jornada_ts);                        158         kfree(jornada_ts);
159                                                   159 
160         return 0;                                 160         return 0;
161 }                                                 161 }
162                                                   162 
                                                   >> 163 /* work with hotplug and coldplug */
                                                   >> 164 MODULE_ALIAS("platform:jornada_ts");
                                                   >> 165 
163 static struct platform_driver jornada720_ts_dr    166 static struct platform_driver jornada720_ts_driver = {
164         .probe          = jornada720_ts_probe,    167         .probe          = jornada720_ts_probe,
165         .remove         = __devexit_p(jornada7    168         .remove         = __devexit_p(jornada720_ts_remove),
166         .driver         = {                       169         .driver         = {
167                 .name   = "jornada_ts",           170                 .name   = "jornada_ts",
                                                   >> 171                 .owner  = THIS_MODULE,
168         },                                        172         },
169 };                                                173 };
170                                                   174 
171 static int __init jornada720_ts_init(void)        175 static int __init jornada720_ts_init(void)
172 {                                                 176 {
173         return platform_driver_register(&jorna    177         return platform_driver_register(&jornada720_ts_driver);
174 }                                                 178 }
175                                                   179 
176 static void __exit jornada720_ts_exit(void)       180 static void __exit jornada720_ts_exit(void)
177 {                                                 181 {
178         platform_driver_unregister(&jornada720    182         platform_driver_unregister(&jornada720_ts_driver);
179 }                                                 183 }
180                                                   184 
181 module_init(jornada720_ts_init);                  185 module_init(jornada720_ts_init);
182 module_exit(jornada720_ts_exit);                  186 module_exit(jornada720_ts_exit);
183                                                   187 
  This page was automatically generated by the LXR engine.