1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2007 Google, Inc.
4 * Copyright (C) 2012 Intel, Inc.
5 * Copyright (C) 2017 Imagination Technologies Ltd.
8 #include <linux/console.h>
9 #include <linux/interrupt.h>
10 #include <linux/platform_device.h>
11 #include <linux/tty.h>
12 #include <linux/tty_flip.h>
13 #include <linux/slab.h>
15 #include <linux/module.h>
16 #include <linux/goldfish.h>
18 #include <linux/dma-mapping.h>
19 #include <linux/serial_core.h>
21 /* Goldfish tty register's offsets */
22 #define GOLDFISH_TTY_REG_BYTES_READY 0x04
23 #define GOLDFISH_TTY_REG_CMD 0x08
24 #define GOLDFISH_TTY_REG_DATA_PTR 0x10
25 #define GOLDFISH_TTY_REG_DATA_LEN 0x14
26 #define GOLDFISH_TTY_REG_DATA_PTR_HIGH 0x18
27 #define GOLDFISH_TTY_REG_VERSION 0x20
29 /* Goldfish tty commands */
30 #define GOLDFISH_TTY_CMD_INT_DISABLE 0
31 #define GOLDFISH_TTY_CMD_INT_ENABLE 1
32 #define GOLDFISH_TTY_CMD_WRITE_BUFFER 2
33 #define GOLDFISH_TTY_CMD_READ_BUFFER 3
41 struct console console
;
46 static DEFINE_MUTEX(goldfish_tty_lock
);
47 static struct tty_driver
*goldfish_tty_driver
;
48 static u32 goldfish_tty_line_count
= 8;
49 static u32 goldfish_tty_current_line_count
;
50 static struct goldfish_tty
*goldfish_ttys
;
52 static void do_rw_io(struct goldfish_tty
*qtty
,
53 unsigned long address
,
57 unsigned long irq_flags
;
58 void __iomem
*base
= qtty
->base
;
60 spin_lock_irqsave(&qtty
->lock
, irq_flags
);
61 gf_write_ptr((void *)address
, base
+ GOLDFISH_TTY_REG_DATA_PTR
,
62 base
+ GOLDFISH_TTY_REG_DATA_PTR_HIGH
);
63 writel(count
, base
+ GOLDFISH_TTY_REG_DATA_LEN
);
66 writel(GOLDFISH_TTY_CMD_WRITE_BUFFER
,
67 base
+ GOLDFISH_TTY_REG_CMD
);
69 writel(GOLDFISH_TTY_CMD_READ_BUFFER
,
70 base
+ GOLDFISH_TTY_REG_CMD
);
72 spin_unlock_irqrestore(&qtty
->lock
, irq_flags
);
75 static void goldfish_tty_rw(struct goldfish_tty
*qtty
,
80 dma_addr_t dma_handle
;
81 enum dma_data_direction dma_dir
;
83 dma_dir
= (is_write
? DMA_TO_DEVICE
: DMA_FROM_DEVICE
);
84 if (qtty
->version
> 0) {
86 * Goldfish TTY for Ranchu platform uses
87 * physical addresses and DMA for read/write operations
89 unsigned long addr_end
= addr
+ count
;
91 while (addr
< addr_end
) {
92 unsigned long pg_end
= (addr
& PAGE_MASK
) + PAGE_SIZE
;
94 pg_end
< addr_end
? pg_end
: addr_end
;
95 unsigned long avail
= next
- addr
;
98 * Map the buffer's virtual address to the DMA address
99 * so the buffer can be accessed by the device.
101 dma_handle
= dma_map_single(qtty
->dev
, (void *)addr
,
104 if (dma_mapping_error(qtty
->dev
, dma_handle
)) {
105 dev_err(qtty
->dev
, "tty: DMA mapping error.\n");
108 do_rw_io(qtty
, dma_handle
, avail
, is_write
);
111 * Unmap the previously mapped region after
112 * the completion of the read/write operation.
114 dma_unmap_single(qtty
->dev
, dma_handle
, avail
, dma_dir
);
120 * Old style Goldfish TTY used on the Goldfish platform
121 * uses virtual addresses.
123 do_rw_io(qtty
, addr
, count
, is_write
);
127 static void goldfish_tty_do_write(int line
, const char *buf
,
130 struct goldfish_tty
*qtty
= &goldfish_ttys
[line
];
131 unsigned long address
= (unsigned long)(void *)buf
;
133 goldfish_tty_rw(qtty
, address
, count
, 1);
136 static irqreturn_t
goldfish_tty_interrupt(int irq
, void *dev_id
)
138 struct goldfish_tty
*qtty
= dev_id
;
139 void __iomem
*base
= qtty
->base
;
140 unsigned long address
;
144 count
= readl(base
+ GOLDFISH_TTY_REG_BYTES_READY
);
148 count
= tty_prepare_flip_string(&qtty
->port
, &buf
, count
);
150 address
= (unsigned long)(void *)buf
;
151 goldfish_tty_rw(qtty
, address
, count
, 0);
153 tty_schedule_flip(&qtty
->port
);
157 static int goldfish_tty_activate(struct tty_port
*port
, struct tty_struct
*tty
)
159 struct goldfish_tty
*qtty
= container_of(port
, struct goldfish_tty
,
161 writel(GOLDFISH_TTY_CMD_INT_ENABLE
, qtty
->base
+ GOLDFISH_TTY_REG_CMD
);
165 static void goldfish_tty_shutdown(struct tty_port
*port
)
167 struct goldfish_tty
*qtty
= container_of(port
, struct goldfish_tty
,
169 writel(GOLDFISH_TTY_CMD_INT_DISABLE
, qtty
->base
+ GOLDFISH_TTY_REG_CMD
);
172 static int goldfish_tty_open(struct tty_struct
*tty
, struct file
*filp
)
174 struct goldfish_tty
*qtty
= &goldfish_ttys
[tty
->index
];
175 return tty_port_open(&qtty
->port
, tty
, filp
);
178 static void goldfish_tty_close(struct tty_struct
*tty
, struct file
*filp
)
180 tty_port_close(tty
->port
, tty
, filp
);
183 static void goldfish_tty_hangup(struct tty_struct
*tty
)
185 tty_port_hangup(tty
->port
);
188 static int goldfish_tty_write(struct tty_struct
*tty
, const unsigned char *buf
,
191 goldfish_tty_do_write(tty
->index
, buf
, count
);
195 static int goldfish_tty_write_room(struct tty_struct
*tty
)
200 static int goldfish_tty_chars_in_buffer(struct tty_struct
*tty
)
202 struct goldfish_tty
*qtty
= &goldfish_ttys
[tty
->index
];
203 void __iomem
*base
= qtty
->base
;
204 return readl(base
+ GOLDFISH_TTY_REG_BYTES_READY
);
207 static void goldfish_tty_console_write(struct console
*co
, const char *b
,
210 goldfish_tty_do_write(co
->index
, b
, count
);
213 static struct tty_driver
*goldfish_tty_console_device(struct console
*c
,
217 return goldfish_tty_driver
;
220 static int goldfish_tty_console_setup(struct console
*co
, char *options
)
222 if ((unsigned)co
->index
>= goldfish_tty_line_count
)
224 if (!goldfish_ttys
[co
->index
].base
)
229 static const struct tty_port_operations goldfish_port_ops
= {
230 .activate
= goldfish_tty_activate
,
231 .shutdown
= goldfish_tty_shutdown
234 static const struct tty_operations goldfish_tty_ops
= {
235 .open
= goldfish_tty_open
,
236 .close
= goldfish_tty_close
,
237 .hangup
= goldfish_tty_hangup
,
238 .write
= goldfish_tty_write
,
239 .write_room
= goldfish_tty_write_room
,
240 .chars_in_buffer
= goldfish_tty_chars_in_buffer
,
243 static int goldfish_tty_create_driver(void)
246 struct tty_driver
*tty
;
248 goldfish_ttys
= kzalloc(sizeof(*goldfish_ttys
) *
249 goldfish_tty_line_count
, GFP_KERNEL
);
250 if (goldfish_ttys
== NULL
) {
252 goto err_alloc_goldfish_ttys_failed
;
254 tty
= alloc_tty_driver(goldfish_tty_line_count
);
257 goto err_alloc_tty_driver_failed
;
259 tty
->driver_name
= "goldfish";
261 tty
->type
= TTY_DRIVER_TYPE_SERIAL
;
262 tty
->subtype
= SERIAL_TYPE_NORMAL
;
263 tty
->init_termios
= tty_std_termios
;
264 tty
->flags
= TTY_DRIVER_RESET_TERMIOS
| TTY_DRIVER_REAL_RAW
|
265 TTY_DRIVER_DYNAMIC_DEV
;
266 tty_set_operations(tty
, &goldfish_tty_ops
);
267 ret
= tty_register_driver(tty
);
269 goto err_tty_register_driver_failed
;
271 goldfish_tty_driver
= tty
;
274 err_tty_register_driver_failed
:
276 err_alloc_tty_driver_failed
:
277 kfree(goldfish_ttys
);
278 goldfish_ttys
= NULL
;
279 err_alloc_goldfish_ttys_failed
:
283 static void goldfish_tty_delete_driver(void)
285 tty_unregister_driver(goldfish_tty_driver
);
286 put_tty_driver(goldfish_tty_driver
);
287 goldfish_tty_driver
= NULL
;
288 kfree(goldfish_ttys
);
289 goldfish_ttys
= NULL
;
292 static int goldfish_tty_probe(struct platform_device
*pdev
)
294 struct goldfish_tty
*qtty
;
297 struct device
*ttydev
;
302 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
304 pr_err("goldfish_tty: No MEM resource available!\n");
308 base
= ioremap(r
->start
, 0x1000);
310 pr_err("goldfish_tty: Unable to ioremap base!\n");
314 r
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
316 pr_err("goldfish_tty: No IRQ resource available!\n");
322 mutex_lock(&goldfish_tty_lock
);
324 if (pdev
->id
== PLATFORM_DEVID_NONE
)
325 line
= goldfish_tty_current_line_count
;
329 if (line
>= goldfish_tty_line_count
) {
330 pr_err("goldfish_tty: Reached maximum tty number of %d.\n",
331 goldfish_tty_current_line_count
);
336 if (goldfish_tty_current_line_count
== 0) {
337 ret
= goldfish_tty_create_driver();
341 goldfish_tty_current_line_count
++;
343 qtty
= &goldfish_ttys
[line
];
344 spin_lock_init(&qtty
->lock
);
345 tty_port_init(&qtty
->port
);
346 qtty
->port
.ops
= &goldfish_port_ops
;
349 qtty
->dev
= &pdev
->dev
;
352 * Goldfish TTY device used by the Goldfish emulator
353 * should identify itself with 0, forcing the driver
354 * to use virtual addresses. Goldfish TTY device
355 * on Ranchu emulator (qemu2) returns 1 here and
356 * driver will use physical addresses.
358 qtty
->version
= readl(base
+ GOLDFISH_TTY_REG_VERSION
);
361 * Goldfish TTY device on Ranchu emulator (qemu2)
362 * will use DMA for read/write IO operations.
364 if (qtty
->version
> 0) {
366 * Initialize dma_mask to 32-bits.
368 if (!pdev
->dev
.dma_mask
)
369 pdev
->dev
.dma_mask
= &pdev
->dev
.coherent_dma_mask
;
370 ret
= dma_set_mask(&pdev
->dev
, DMA_BIT_MASK(32));
372 dev_err(&pdev
->dev
, "No suitable DMA available.\n");
373 goto err_dec_line_count
;
377 writel(GOLDFISH_TTY_CMD_INT_DISABLE
, base
+ GOLDFISH_TTY_REG_CMD
);
379 ret
= request_irq(irq
, goldfish_tty_interrupt
, IRQF_SHARED
,
380 "goldfish_tty", qtty
);
382 pr_err("goldfish_tty: No IRQ available!\n");
383 goto err_dec_line_count
;
386 ttydev
= tty_port_register_device(&qtty
->port
, goldfish_tty_driver
,
388 if (IS_ERR(ttydev
)) {
389 ret
= PTR_ERR(ttydev
);
390 goto err_tty_register_device_failed
;
393 strcpy(qtty
->console
.name
, "ttyGF");
394 qtty
->console
.write
= goldfish_tty_console_write
;
395 qtty
->console
.device
= goldfish_tty_console_device
;
396 qtty
->console
.setup
= goldfish_tty_console_setup
;
397 qtty
->console
.flags
= CON_PRINTBUFFER
;
398 qtty
->console
.index
= line
;
399 register_console(&qtty
->console
);
400 platform_set_drvdata(pdev
, qtty
);
402 mutex_unlock(&goldfish_tty_lock
);
405 err_tty_register_device_failed
:
408 goldfish_tty_current_line_count
--;
409 if (goldfish_tty_current_line_count
== 0)
410 goldfish_tty_delete_driver();
412 mutex_unlock(&goldfish_tty_lock
);
418 static int goldfish_tty_remove(struct platform_device
*pdev
)
420 struct goldfish_tty
*qtty
= platform_get_drvdata(pdev
);
422 mutex_lock(&goldfish_tty_lock
);
424 unregister_console(&qtty
->console
);
425 tty_unregister_device(goldfish_tty_driver
, qtty
->console
.index
);
428 free_irq(qtty
->irq
, pdev
);
429 goldfish_tty_current_line_count
--;
430 if (goldfish_tty_current_line_count
== 0)
431 goldfish_tty_delete_driver();
432 mutex_unlock(&goldfish_tty_lock
);
436 #ifdef CONFIG_GOLDFISH_TTY_EARLY_CONSOLE
437 static void gf_early_console_putchar(struct uart_port
*port
, int ch
)
439 __raw_writel(ch
, port
->membase
);
442 static void gf_early_write(struct console
*con
, const char *s
, unsigned int n
)
444 struct earlycon_device
*dev
= con
->data
;
446 uart_console_write(&dev
->port
, s
, n
, gf_early_console_putchar
);
449 static int __init
gf_earlycon_setup(struct earlycon_device
*device
,
452 if (!device
->port
.membase
)
455 device
->con
->write
= gf_early_write
;
459 OF_EARLYCON_DECLARE(early_gf_tty
, "google,goldfish-tty", gf_earlycon_setup
);
462 static const struct of_device_id goldfish_tty_of_match
[] = {
463 { .compatible
= "google,goldfish-tty", },
467 MODULE_DEVICE_TABLE(of
, goldfish_tty_of_match
);
469 static struct platform_driver goldfish_tty_platform_driver
= {
470 .probe
= goldfish_tty_probe
,
471 .remove
= goldfish_tty_remove
,
473 .name
= "goldfish_tty",
474 .of_match_table
= goldfish_tty_of_match
,
478 module_platform_driver(goldfish_tty_platform_driver
);
480 MODULE_LICENSE("GPL v2");