mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 22:24:09 +08:00
c3310fbbeb
With clkdev based clock lookup support, the clock set and get operation using clock names communicated between the samsung uart driver and the SoC specific extension can be removed. In addition to that, for each platform specific extension, add the default clock selection, number of clock options for uart baud generator, clock selection bit mask and shift values which is required by the clkdev support in samsung uart driver. The default clock selection value 'def_clk_sel' specifies the default clock to be used as the source clock for baud rate generator in case the platform code does not specify the same. Cc: Ben Dooks <ben-linux@fluff.org> Signed-off-by: Thomas Abraham <thomas.abraham@linaro.org> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
102 lines
2.4 KiB
C
102 lines
2.4 KiB
C
/*
|
|
* Driver for Samsung SoC onboard UARTs.
|
|
*
|
|
* Ben Dooks, Copyright (c) 2003-2008 Simtec Electronics
|
|
* http://armlinux.simtec.co.uk/
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
struct s3c24xx_uart_info {
|
|
char *name;
|
|
unsigned int type;
|
|
unsigned int fifosize;
|
|
unsigned long rx_fifomask;
|
|
unsigned long rx_fifoshift;
|
|
unsigned long rx_fifofull;
|
|
unsigned long tx_fifomask;
|
|
unsigned long tx_fifoshift;
|
|
unsigned long tx_fifofull;
|
|
unsigned int def_clk_sel;
|
|
unsigned long num_clks;
|
|
unsigned long clksel_mask;
|
|
unsigned long clksel_shift;
|
|
|
|
/* uart port features */
|
|
|
|
unsigned int has_divslot:1;
|
|
|
|
/* uart controls */
|
|
int (*reset_port)(struct uart_port *, struct s3c2410_uartcfg *);
|
|
};
|
|
|
|
struct s3c24xx_uart_port {
|
|
unsigned char rx_claimed;
|
|
unsigned char tx_claimed;
|
|
unsigned int pm_level;
|
|
unsigned long baudclk_rate;
|
|
|
|
unsigned int rx_irq;
|
|
unsigned int tx_irq;
|
|
|
|
struct s3c24xx_uart_info *info;
|
|
struct clk *clk;
|
|
struct clk *baudclk;
|
|
struct uart_port port;
|
|
|
|
/* reference to platform data */
|
|
struct s3c2410_uartcfg *cfg;
|
|
|
|
#ifdef CONFIG_CPU_FREQ
|
|
struct notifier_block freq_transition;
|
|
#endif
|
|
};
|
|
|
|
/* conversion functions */
|
|
|
|
#define s3c24xx_dev_to_port(__dev) (struct uart_port *)dev_get_drvdata(__dev)
|
|
|
|
/* register access controls */
|
|
|
|
#define portaddr(port, reg) ((port)->membase + (reg))
|
|
#define portaddrl(port, reg) ((unsigned long *)((port)->membase + (reg)))
|
|
|
|
#define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
|
|
#define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
|
|
|
|
#define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
|
|
#define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg))
|
|
|
|
extern int s3c24xx_serial_probe(struct platform_device *dev,
|
|
struct s3c24xx_uart_info *uart);
|
|
|
|
extern int __devexit s3c24xx_serial_remove(struct platform_device *dev);
|
|
|
|
extern int s3c24xx_serial_initconsole(struct platform_driver *drv,
|
|
struct s3c24xx_uart_info **uart);
|
|
|
|
extern int s3c24xx_serial_init(struct platform_driver *drv,
|
|
struct s3c24xx_uart_info *info);
|
|
|
|
#ifdef CONFIG_SERIAL_SAMSUNG_DEBUG
|
|
|
|
extern void printascii(const char *);
|
|
|
|
static void dbg(const char *fmt, ...)
|
|
{
|
|
va_list va;
|
|
char buff[256];
|
|
|
|
va_start(va, fmt);
|
|
vsprintf(buff, fmt, va);
|
|
va_end(va);
|
|
|
|
printascii(buff);
|
|
}
|
|
|
|
#else
|
|
#define dbg(x...) do { } while (0)
|
|
#endif
|