Lines Matching refs:kbd
71 struct spear_kbd *kbd = dev_id; in spear_kbd_interrupt() local
72 struct input_dev *input = kbd->input; in spear_kbd_interrupt()
76 sts = readl_relaxed(kbd->io_base + STATUS_REG); in spear_kbd_interrupt()
80 if (kbd->last_key != KEY_RESERVED) { in spear_kbd_interrupt()
81 input_report_key(input, kbd->last_key, 0); in spear_kbd_interrupt()
82 kbd->last_key = KEY_RESERVED; in spear_kbd_interrupt()
86 val = readl_relaxed(kbd->io_base + DATA_REG) & in spear_kbd_interrupt()
88 key = kbd->keycodes[val]; in spear_kbd_interrupt()
94 kbd->last_key = key; in spear_kbd_interrupt()
97 writel_relaxed(0, kbd->io_base + STATUS_REG); in spear_kbd_interrupt()
104 struct spear_kbd *kbd = input_get_drvdata(dev); in spear_kbd_open() local
108 kbd->last_key = KEY_RESERVED; in spear_kbd_open()
110 error = clk_enable(kbd->clk); in spear_kbd_open()
115 val = clk_get_rate(kbd->clk) / 1000000 - 1; in spear_kbd_open()
120 (kbd->mode << MODE_CTL_KEYNUM_SHIFT); in spear_kbd_open()
121 writel_relaxed(val, kbd->io_base + MODE_CTL_REG); in spear_kbd_open()
122 writel_relaxed(1, kbd->io_base + STATUS_REG); in spear_kbd_open()
125 val = readl_relaxed(kbd->io_base + MODE_CTL_REG); in spear_kbd_open()
127 writel_relaxed(val, kbd->io_base + MODE_CTL_REG); in spear_kbd_open()
134 struct spear_kbd *kbd = input_get_drvdata(dev); in spear_kbd_close() local
138 val = readl_relaxed(kbd->io_base + MODE_CTL_REG); in spear_kbd_close()
140 writel_relaxed(val, kbd->io_base + MODE_CTL_REG); in spear_kbd_close()
142 clk_disable(kbd->clk); in spear_kbd_close()
144 kbd->last_key = KEY_RESERVED; in spear_kbd_close()
149 struct spear_kbd *kbd) in spear_kbd_parse_dt() argument
161 kbd->rep = true; in spear_kbd_parse_dt()
164 kbd->suspended_rate = suspended_rate; in spear_kbd_parse_dt()
172 kbd->mode = val; in spear_kbd_parse_dt()
177 struct spear_kbd *kbd) in spear_kbd_parse_dt() argument
187 struct spear_kbd *kbd; in spear_kbd_probe() local
199 kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL); in spear_kbd_probe()
200 if (!kbd) { in spear_kbd_probe()
211 kbd->input = input_dev; in spear_kbd_probe()
212 kbd->irq = irq; in spear_kbd_probe()
215 error = spear_kbd_parse_dt(pdev, kbd); in spear_kbd_probe()
219 kbd->mode = pdata->mode; in spear_kbd_probe()
220 kbd->rep = pdata->rep; in spear_kbd_probe()
221 kbd->suspended_rate = pdata->suspended_rate; in spear_kbd_probe()
225 kbd->io_base = devm_ioremap_resource(&pdev->dev, res); in spear_kbd_probe()
226 if (IS_ERR(kbd->io_base)) in spear_kbd_probe()
227 return PTR_ERR(kbd->io_base); in spear_kbd_probe()
229 kbd->clk = devm_clk_get(&pdev->dev, NULL); in spear_kbd_probe()
230 if (IS_ERR(kbd->clk)) in spear_kbd_probe()
231 return PTR_ERR(kbd->clk); in spear_kbd_probe()
243 kbd->keycodes, input_dev); in spear_kbd_probe()
249 if (kbd->rep) in spear_kbd_probe()
253 input_set_drvdata(input_dev, kbd); in spear_kbd_probe()
256 "keyboard", kbd); in spear_kbd_probe()
262 error = clk_prepare(kbd->clk); in spear_kbd_probe()
269 clk_unprepare(kbd->clk); in spear_kbd_probe()
274 platform_set_drvdata(pdev, kbd); in spear_kbd_probe()
281 struct spear_kbd *kbd = platform_get_drvdata(pdev); in spear_kbd_remove() local
283 input_unregister_device(kbd->input); in spear_kbd_remove()
284 clk_unprepare(kbd->clk); in spear_kbd_remove()
295 struct spear_kbd *kbd = platform_get_drvdata(pdev); in spear_kbd_suspend() local
296 struct input_dev *input_dev = kbd->input; in spear_kbd_suspend()
302 clk_enable(kbd->clk); in spear_kbd_suspend()
304 mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG); in spear_kbd_suspend()
307 if (!enable_irq_wake(kbd->irq)) in spear_kbd_suspend()
308 kbd->irq_wake_enabled = true; in spear_kbd_suspend()
314 if (kbd->suspended_rate) in spear_kbd_suspend()
315 rate = kbd->suspended_rate / 1000000 - 1; in spear_kbd_suspend()
317 rate = clk_get_rate(kbd->clk) / 1000000 - 1; in spear_kbd_suspend()
323 writel_relaxed(val, kbd->io_base + MODE_CTL_REG); in spear_kbd_suspend()
328 kbd->io_base + MODE_CTL_REG); in spear_kbd_suspend()
329 clk_disable(kbd->clk); in spear_kbd_suspend()
335 kbd->mode_ctl_reg = mode_ctl_reg; in spear_kbd_suspend()
338 clk_disable(kbd->clk); in spear_kbd_suspend()
348 struct spear_kbd *kbd = platform_get_drvdata(pdev); in spear_kbd_resume() local
349 struct input_dev *input_dev = kbd->input; in spear_kbd_resume()
354 if (kbd->irq_wake_enabled) { in spear_kbd_resume()
355 kbd->irq_wake_enabled = false; in spear_kbd_resume()
356 disable_irq_wake(kbd->irq); in spear_kbd_resume()
360 clk_enable(kbd->clk); in spear_kbd_resume()
365 writel_relaxed(kbd->mode_ctl_reg, kbd->io_base + MODE_CTL_REG); in spear_kbd_resume()