Lines Matching refs:ps2if
43 struct ps2if { struct
63 struct ps2if *ps2if = dev_id; in ps2_rxint() argument
66 status = readl_relaxed(ps2if->base + PS2STAT); in ps2_rxint()
69 writel_relaxed(PS2STAT_STP, ps2if->base + PS2STAT); in ps2_rxint()
74 scancode = readl_relaxed(ps2if->base + PS2DATA) & 0xff; in ps2_rxint()
79 serio_interrupt(ps2if->io, scancode, flag); in ps2_rxint()
81 status = readl_relaxed(ps2if->base + PS2STAT); in ps2_rxint()
92 struct ps2if *ps2if = dev_id; in ps2_txint() local
95 guard(spinlock)(&ps2if->lock); in ps2_txint()
97 status = readl_relaxed(ps2if->base + PS2STAT); in ps2_txint()
98 if (ps2if->head == ps2if->tail) { in ps2_txint()
102 writel_relaxed(ps2if->buf[ps2if->tail], ps2if->base + PS2DATA); in ps2_txint()
103 ps2if->tail = (ps2if->tail + 1) & (sizeof(ps2if->buf) - 1); in ps2_txint()
115 struct ps2if *ps2if = io->port_data; in ps2_write() local
118 guard(spinlock_irqsave)(&ps2if->lock); in ps2_write()
123 if (readl_relaxed(ps2if->base + PS2STAT) & PS2STAT_TXE) { in ps2_write()
124 writel_relaxed(val, ps2if->base + PS2DATA); in ps2_write()
126 if (ps2if->head == ps2if->tail) in ps2_write()
127 enable_irq(ps2if->tx_irq); in ps2_write()
128 head = (ps2if->head + 1) & (sizeof(ps2if->buf) - 1); in ps2_write()
129 if (head != ps2if->tail) { in ps2_write()
130 ps2if->buf[ps2if->head] = val; in ps2_write()
131 ps2if->head = head; in ps2_write()
140 struct ps2if *ps2if = io->port_data; in ps2_open() local
143 ret = sa1111_enable_device(ps2if->dev); in ps2_open()
147 ret = request_irq(ps2if->rx_irq, ps2_rxint, 0, in ps2_open()
148 SA1111_DRIVER_NAME(ps2if->dev), ps2if); in ps2_open()
151 ps2if->rx_irq, ret); in ps2_open()
152 sa1111_disable_device(ps2if->dev); in ps2_open()
156 ret = request_irq(ps2if->tx_irq, ps2_txint, 0, in ps2_open()
157 SA1111_DRIVER_NAME(ps2if->dev), ps2if); in ps2_open()
160 ps2if->tx_irq, ret); in ps2_open()
161 free_irq(ps2if->rx_irq, ps2if); in ps2_open()
162 sa1111_disable_device(ps2if->dev); in ps2_open()
166 ps2if->open = 1; in ps2_open()
168 enable_irq_wake(ps2if->rx_irq); in ps2_open()
170 writel_relaxed(PS2CR_ENA, ps2if->base + PS2CR); in ps2_open()
176 struct ps2if *ps2if = io->port_data; in ps2_close() local
178 writel_relaxed(0, ps2if->base + PS2CR); in ps2_close()
180 disable_irq_wake(ps2if->rx_irq); in ps2_close()
182 ps2if->open = 0; in ps2_close()
184 free_irq(ps2if->tx_irq, ps2if); in ps2_close()
185 free_irq(ps2if->rx_irq, ps2if); in ps2_close()
187 sa1111_disable_device(ps2if->dev); in ps2_close()
193 static void ps2_clear_input(struct ps2if *ps2if) in ps2_clear_input() argument
198 if ((readl_relaxed(ps2if->base + PS2DATA) & 0xff) == 0xff) in ps2_clear_input()
203 static unsigned int ps2_test_one(struct ps2if *ps2if, in ps2_test_one() argument
208 writel_relaxed(PS2CR_ENA | mask, ps2if->base + PS2CR); in ps2_test_one()
212 val = readl_relaxed(ps2if->base + PS2STAT); in ps2_test_one()
220 static int ps2_test(struct ps2if *ps2if) in ps2_test() argument
225 stat = ps2_test_one(ps2if, PS2CR_FKC); in ps2_test()
231 stat = ps2_test_one(ps2if, 0); in ps2_test()
237 stat = ps2_test_one(ps2if, PS2CR_FKD); in ps2_test()
243 writel_relaxed(0, ps2if->base + PS2CR); in ps2_test()
253 struct ps2if *ps2if; in ps2_probe() local
257 ps2if = kzalloc(sizeof(*ps2if), GFP_KERNEL); in ps2_probe()
259 if (!ps2if || !serio) { in ps2_probe()
270 serio->port_data = ps2if; in ps2_probe()
272 ps2if->io = serio; in ps2_probe()
273 ps2if->dev = dev; in ps2_probe()
274 sa1111_set_drvdata(dev, ps2if); in ps2_probe()
276 spin_lock_init(&ps2if->lock); in ps2_probe()
278 ps2if->rx_irq = sa1111_get_irq(dev, 0); in ps2_probe()
279 if (ps2if->rx_irq <= 0) { in ps2_probe()
280 ret = ps2if->rx_irq ? : -ENXIO; in ps2_probe()
284 ps2if->tx_irq = sa1111_get_irq(dev, 1); in ps2_probe()
285 if (ps2if->tx_irq <= 0) { in ps2_probe()
286 ret = ps2if->tx_irq ? : -ENXIO; in ps2_probe()
303 ps2if->base = dev->mapbase; in ps2_probe()
305 sa1111_enable_device(ps2if->dev); in ps2_probe()
308 writel_relaxed(0, ps2if->base + PS2CLKDIV); in ps2_probe()
309 writel_relaxed(127, ps2if->base + PS2PRECNT); in ps2_probe()
314 ps2_clear_input(ps2if); in ps2_probe()
319 ret = ps2_test(ps2if); in ps2_probe()
326 ps2_clear_input(ps2if); in ps2_probe()
328 sa1111_disable_device(ps2if->dev); in ps2_probe()
329 serio_register_port(ps2if->io); in ps2_probe()
333 sa1111_disable_device(ps2if->dev); in ps2_probe()
337 kfree(ps2if); in ps2_probe()
347 struct ps2if *ps2if = sa1111_get_drvdata(dev); in ps2_remove() local
349 serio_unregister_port(ps2if->io); in ps2_remove()
353 kfree(ps2if); in ps2_remove()