Lines Matching refs:drvdata
97 struct sun4i_ps2data *drvdata = dev_id; in sun4i_ps2_interrupt() local
104 guard(spinlock)(&drvdata->lock); in sun4i_ps2_interrupt()
107 intr_status = readl(drvdata->reg_base + PS2_REG_LSTS); in sun4i_ps2_interrupt()
108 fifo_status = readl(drvdata->reg_base + PS2_REG_FSTS); in sun4i_ps2_interrupt()
118 writel(rval, drvdata->reg_base + PS2_REG_LSTS); in sun4i_ps2_interrupt()
125 writel(rval, drvdata->reg_base + PS2_REG_FSTS); in sun4i_ps2_interrupt()
130 byte = readl(drvdata->reg_base + PS2_REG_DATA) & 0xff; in sun4i_ps2_interrupt()
131 serio_interrupt(drvdata->serio, byte, rxflags); in sun4i_ps2_interrupt()
134 writel(intr_status, drvdata->reg_base + PS2_REG_LSTS); in sun4i_ps2_interrupt()
135 writel(fifo_status, drvdata->reg_base + PS2_REG_FSTS); in sun4i_ps2_interrupt()
142 struct sun4i_ps2data *drvdata = serio->port_data; in sun4i_ps2_open() local
151 writel(rval, drvdata->reg_base + PS2_REG_LCTL); in sun4i_ps2_open()
158 writel(rval, drvdata->reg_base + PS2_REG_FCTL); in sun4i_ps2_open()
160 src_clk = clk_get_rate(drvdata->clk); in sun4i_ps2_open()
165 writel(rval, drvdata->reg_base + PS2_REG_CLKDR); in sun4i_ps2_open()
171 guard(spinlock_irqsave)(&drvdata->lock); in sun4i_ps2_open()
172 writel(rval, drvdata->reg_base + PS2_REG_GCTL); in sun4i_ps2_open()
179 struct sun4i_ps2data *drvdata = serio->port_data; in sun4i_ps2_close() local
183 rval = readl(drvdata->reg_base + PS2_REG_GCTL); in sun4i_ps2_close()
184 writel(rval & ~(PS2_GCTL_INTEN), drvdata->reg_base + PS2_REG_GCTL); in sun4i_ps2_close()
186 synchronize_irq(drvdata->irq); in sun4i_ps2_close()
192 struct sun4i_ps2data *drvdata = serio->port_data; in sun4i_ps2_write() local
195 if (readl(drvdata->reg_base + PS2_REG_FSTS) & PS2_FSTS_TXRDY) { in sun4i_ps2_write()
196 writel(val, drvdata->reg_base + PS2_REG_DATA); in sun4i_ps2_write()
207 struct sun4i_ps2data *drvdata; in sun4i_ps2_probe() local
212 drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL); in sun4i_ps2_probe()
214 if (!drvdata || !serio) { in sun4i_ps2_probe()
219 spin_lock_init(&drvdata->lock); in sun4i_ps2_probe()
229 drvdata->reg_base = ioremap(res->start, resource_size(res)); in sun4i_ps2_probe()
230 if (!drvdata->reg_base) { in sun4i_ps2_probe()
236 drvdata->clk = clk_get(dev, NULL); in sun4i_ps2_probe()
237 if (IS_ERR(drvdata->clk)) { in sun4i_ps2_probe()
238 error = PTR_ERR(drvdata->clk); in sun4i_ps2_probe()
243 error = clk_prepare_enable(drvdata->clk); in sun4i_ps2_probe()
253 serio->port_data = drvdata; in sun4i_ps2_probe()
259 writel(0, drvdata->reg_base + PS2_REG_GCTL); in sun4i_ps2_probe()
262 drvdata->irq = platform_get_irq(pdev, 0); in sun4i_ps2_probe()
263 if (drvdata->irq < 0) { in sun4i_ps2_probe()
264 error = drvdata->irq; in sun4i_ps2_probe()
268 drvdata->serio = serio; in sun4i_ps2_probe()
269 drvdata->dev = dev; in sun4i_ps2_probe()
271 error = request_irq(drvdata->irq, sun4i_ps2_interrupt, 0, in sun4i_ps2_probe()
272 DRIVER_NAME, drvdata); in sun4i_ps2_probe()
274 dev_err(drvdata->dev, "failed to allocate interrupt %d: %d\n", in sun4i_ps2_probe()
275 drvdata->irq, error); in sun4i_ps2_probe()
280 platform_set_drvdata(pdev, drvdata); in sun4i_ps2_probe()
285 clk_disable_unprepare(drvdata->clk); in sun4i_ps2_probe()
287 clk_put(drvdata->clk); in sun4i_ps2_probe()
289 iounmap(drvdata->reg_base); in sun4i_ps2_probe()
292 kfree(drvdata); in sun4i_ps2_probe()
298 struct sun4i_ps2data *drvdata = platform_get_drvdata(pdev); in sun4i_ps2_remove() local
300 serio_unregister_port(drvdata->serio); in sun4i_ps2_remove()
302 free_irq(drvdata->irq, drvdata); in sun4i_ps2_remove()
304 clk_disable_unprepare(drvdata->clk); in sun4i_ps2_remove()
305 clk_put(drvdata->clk); in sun4i_ps2_remove()
307 iounmap(drvdata->reg_base); in sun4i_ps2_remove()
309 kfree(drvdata); in sun4i_ps2_remove()