1e4ac92df2791c1a3912643e9547941f430fda726Joe Perches#ifndef __SAMSUNG_H
2e4ac92df2791c1a3912643e9547941f430fda726Joe Perches#define __SAMSUNG_H
3e4ac92df2791c1a3912643e9547941f430fda726Joe Perches
499edb3d10a9d384d69557bd09cc39b9ec62aa04eJovi Zhang/*
5b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks * Driver for Samsung SoC onboard UARTs.
6b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks *
7ccae941ee2de58b9391f4e166b1bad33fcbfc119Ben Dooks * Ben Dooks, Copyright (c) 2003-2008 Simtec Electronics
8b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks *	http://armlinux.simtec.co.uk/
9b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks *
10b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks * This program is free software; you can redistribute it and/or modify
11b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks * it under the terms of the GNU General Public License version 2 as
12b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks * published by the Free Software Foundation.
13b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks*/
14b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
15b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooksstruct s3c24xx_uart_info {
16b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	char			*name;
17b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned int		type;
18b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned int		fifosize;
19b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned long		rx_fifomask;
20b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned long		rx_fifoshift;
21b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned long		rx_fifofull;
22b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned long		tx_fifomask;
23b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned long		tx_fifoshift;
24b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned long		tx_fifofull;
255f5a7a5578c5885201cf9c85856f023fe8b81765Thomas Abraham	unsigned int		def_clk_sel;
265f5a7a5578c5885201cf9c85856f023fe8b81765Thomas Abraham	unsigned long		num_clks;
275f5a7a5578c5885201cf9c85856f023fe8b81765Thomas Abraham	unsigned long		clksel_mask;
285f5a7a5578c5885201cf9c85856f023fe8b81765Thomas Abraham	unsigned long		clksel_shift;
29b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
30090f848da000083bf6c1a052222396970e53b4d7Ben Dooks	/* uart port features */
31090f848da000083bf6c1a052222396970e53b4d7Ben Dooks
32090f848da000083bf6c1a052222396970e53b4d7Ben Dooks	unsigned int		has_divslot:1;
33090f848da000083bf6c1a052222396970e53b4d7Ben Dooks
34b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	/* uart controls */
35b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	int (*reset_port)(struct uart_port *, struct s3c2410_uartcfg *);
36b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks};
37b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
38da121506eb03ee5daea55404709110b798bd61d9Thomas Abrahamstruct s3c24xx_serial_drv_data {
39da121506eb03ee5daea55404709110b798bd61d9Thomas Abraham	struct s3c24xx_uart_info	*info;
40da121506eb03ee5daea55404709110b798bd61d9Thomas Abraham	struct s3c2410_uartcfg		*def_cfg;
41da121506eb03ee5daea55404709110b798bd61d9Thomas Abraham	unsigned int			fifosize[CONFIG_SERIAL_SAMSUNG_UARTS];
42da121506eb03ee5daea55404709110b798bd61d9Thomas Abraham};
43da121506eb03ee5daea55404709110b798bd61d9Thomas Abraham
44b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooksstruct s3c24xx_uart_port {
45b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned char			rx_claimed;
46b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	unsigned char			tx_claimed;
47305554768011707f33f437b96f999f812ba2a7e4Ben Dooks	unsigned int			pm_level;
48305554768011707f33f437b96f999f812ba2a7e4Ben Dooks	unsigned long			baudclk_rate;
49b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
50b73c289cc90138e9f78d487434df0f8eeb2daf9bBen Dooks	unsigned int			rx_irq;
51b73c289cc90138e9f78d487434df0f8eeb2daf9bBen Dooks	unsigned int			tx_irq;
52b73c289cc90138e9f78d487434df0f8eeb2daf9bBen Dooks
53b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	struct s3c24xx_uart_info	*info;
54b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	struct clk			*clk;
55b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	struct clk			*baudclk;
56b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks	struct uart_port		port;
57da121506eb03ee5daea55404709110b798bd61d9Thomas Abraham	struct s3c24xx_serial_drv_data	*drv_data;
58305554768011707f33f437b96f999f812ba2a7e4Ben Dooks
594d84e970d0faec772a9eaa818feee38aeca121b2Thomas Abraham	/* reference to platform data */
604d84e970d0faec772a9eaa818feee38aeca121b2Thomas Abraham	struct s3c2410_uartcfg		*cfg;
614d84e970d0faec772a9eaa818feee38aeca121b2Thomas Abraham
62305554768011707f33f437b96f999f812ba2a7e4Ben Dooks#ifdef CONFIG_CPU_FREQ
63305554768011707f33f437b96f999f812ba2a7e4Ben Dooks	struct notifier_block		freq_transition;
64305554768011707f33f437b96f999f812ba2a7e4Ben Dooks#endif
65b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks};
66b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
67b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks/* conversion functions */
68b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
69d4aab2064adbd0660ab9cbfc3e93eae8216b41aaJingoo Han#define s3c24xx_dev_to_port(__dev) dev_get_drvdata(__dev)
70b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
71b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks/* register access controls */
72b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
73b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks#define portaddr(port, reg) ((port)->membase + (reg))
749fdedf5d16d04238833d1d45a8e303fdb86bee3aJingoo Han#define portaddrl(port, reg) \
759fdedf5d16d04238833d1d45a8e303fdb86bee3aJingoo Han	((unsigned long *)(unsigned long)((port)->membase + (reg)))
76b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
77b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks#define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
78b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks#define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
79b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
80b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks#define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
81b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks#define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg))
82b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks
83b497549a035c2a81b71c7a27f2b00c8a16c09423Ben Dooks#endif
84