aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/keyboard/pxa27x_keyboard.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/input/keyboard/pxa27x_keyboard.c b/drivers/input/keyboard/pxa27x_keyboard.c
index ebe5eacf2990..b7061aa38816 100644
--- a/drivers/input/keyboard/pxa27x_keyboard.c
+++ b/drivers/input/keyboard/pxa27x_keyboard.c
@@ -23,6 +23,8 @@
23#include <linux/input.h> 23#include <linux/input.h>
24#include <linux/device.h> 24#include <linux/device.h>
25#include <linux/platform_device.h> 25#include <linux/platform_device.h>
26#include <linux/clk.h>
27#include <linux/err.h>
26 28
27#include <asm/mach-types.h> 29#include <asm/mach-types.h>
28#include <asm/mach/arch.h> 30#include <asm/mach/arch.h>
@@ -40,6 +42,8 @@
40 col/2 == 2 ? KPASMKP2 : KPASMKP3) 42 col/2 == 2 ? KPASMKP2 : KPASMKP3)
41#define KPASMKPx_MKC(row, col) (1 << (row + 16 * (col % 2))) 43#define KPASMKPx_MKC(row, col) (1 << (row + 16 * (col % 2)))
42 44
45static struct clk *pxakbd_clk;
46
43static irqreturn_t pxakbd_irq_handler(int irq, void *dev_id) 47static irqreturn_t pxakbd_irq_handler(int irq, void *dev_id)
44{ 48{
45 struct platform_device *pdev = dev_id; 49 struct platform_device *pdev = dev_id;
@@ -104,7 +108,7 @@ static int pxakbd_open(struct input_dev *dev)
104 KPREC = 0x7F; 108 KPREC = 0x7F;
105 109
106 /* Enable unit clock */ 110 /* Enable unit clock */
107 pxa_set_cken(CKEN_KEYPAD, 1); 111 clk_enable(pxakbd_clk);
108 112
109 return 0; 113 return 0;
110} 114}
@@ -112,7 +116,7 @@ static int pxakbd_open(struct input_dev *dev)
112static void pxakbd_close(struct input_dev *dev) 116static void pxakbd_close(struct input_dev *dev)
113{ 117{
114 /* Disable clock unit */ 118 /* Disable clock unit */
115 pxa_set_cken(CKEN_KEYPAD, 0); 119 clk_disable(pxakbd_clk);
116} 120}
117 121
118#ifdef CONFIG_PM 122#ifdef CONFIG_PM
@@ -140,7 +144,8 @@ static int pxakbd_resume(struct platform_device *pdev)
140 KPREC = pdata->reg_kprec; 144 KPREC = pdata->reg_kprec;
141 145
142 /* Enable unit clock */ 146 /* Enable unit clock */
143 pxa_set_cken(CKEN_KEYPAD, 1); 147 clk_disable(pxakbd_clk);
148 clk_enable(pxakbd_clk);
144 } 149 }
145 150
146 mutex_unlock(&input_dev->mutex); 151 mutex_unlock(&input_dev->mutex);
@@ -158,11 +163,18 @@ static int __devinit pxakbd_probe(struct platform_device *pdev)
158 struct input_dev *input_dev; 163 struct input_dev *input_dev;
159 int i, row, col, error; 164 int i, row, col, error;
160 165
166 pxakbd_clk = clk_get(&pdev->dev, "KBDCLK");
167 if (IS_ERR(pxakbd_clk)) {
168 error = PTR_ERR(pxakbd_clk);
169 goto err_clk;
170 }
171
161 /* Create and register the input driver. */ 172 /* Create and register the input driver. */
162 input_dev = input_allocate_device(); 173 input_dev = input_allocate_device();
163 if (!input_dev) { 174 if (!input_dev) {
164 printk(KERN_ERR "Cannot request keypad device\n"); 175 printk(KERN_ERR "Cannot request keypad device\n");
165 return -ENOMEM; 176 error = -ENOMEM;
177 goto err_alloc;
166 } 178 }
167 179
168 input_dev->name = DRIVER_NAME; 180 input_dev->name = DRIVER_NAME;
@@ -185,7 +197,6 @@ static int __devinit pxakbd_probe(struct platform_device *pdev)
185 DRIVER_NAME, pdev); 197 DRIVER_NAME, pdev);
186 if (error) { 198 if (error) {
187 printk(KERN_ERR "Cannot request keypad IRQ\n"); 199 printk(KERN_ERR "Cannot request keypad IRQ\n");
188 pxa_set_cken(CKEN_KEYPAD, 0);
189 goto err_free_dev; 200 goto err_free_dev;
190 } 201 }
191 202
@@ -217,6 +228,9 @@ static int __devinit pxakbd_probe(struct platform_device *pdev)
217 free_irq(IRQ_KEYPAD, pdev); 228 free_irq(IRQ_KEYPAD, pdev);
218 err_free_dev: 229 err_free_dev:
219 input_free_device(input_dev); 230 input_free_device(input_dev);
231 err_alloc:
232 clk_put(pxakbd_clk);
233 err_clk:
220 return error; 234 return error;
221} 235}
222 236
@@ -226,6 +240,7 @@ static int __devexit pxakbd_remove(struct platform_device *pdev)
226 240
227 input_unregister_device(input_dev); 241 input_unregister_device(input_dev);
228 free_irq(IRQ_KEYPAD, pdev); 242 free_irq(IRQ_KEYPAD, pdev);
243 clk_put(pxakbd_clk);
229 platform_set_drvdata(pdev, NULL); 244 platform_set_drvdata(pdev, NULL);
230 245
231 return 0; 246 return 0;