mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (112 commits) sh: Move SH-4 CPU headers down one more level. sh: Only build in gpio.o when CONFIG_GENERIC_GPIO is selected. sh: Migrate common board headers to mach-common/. sh: Move the CPU definition headers from asm/ to cpu/. serial: sh-sci: Add support SCIF of SH7723 video: add sh_mobile_lcdc platform flags video: remove unused sh_mobile_lcdc platform data sh: remove consistent alloc cruft sh: add dynamic crash base address support sh: reduce Migo-R smc91x overruns sh: Fix up some merge damage. Fix debugfs_create_file's error checking method for arch/sh/mm/ Fix debugfs_create_dir's error checking method for arch/sh/kernel/ sh: ap325rxa: Add support RTC RX-8564LC in AP325RXA board sh: Use sh7720 GPIO on magicpanelr2 board sh: Add sh7720 pinmux code sh: Use sh7203 GPIO on rsk7203 board sh: Add sh7203 pinmux code sh: Use sh7723 GPIO on AP325RXA board sh: Add sh7723 pinmux code ...
This commit is contained in:
commit
ed402af3c2
176 changed files with 13195 additions and 1219 deletions
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* SuperH on-chip serial module support. (SCI with no FIFO / with FIFO)
|
||||
*
|
||||
* Copyright (C) 2002 - 2006 Paul Mundt
|
||||
* Copyright (C) 2002 - 2008 Paul Mundt
|
||||
* Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Jul 2007).
|
||||
*
|
||||
* based off of the old drivers/char/sh-sci.c by:
|
||||
|
|
@ -46,6 +46,7 @@
|
|||
#include <linux/cpufreq.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#ifdef CONFIG_SUPERH
|
||||
#include <asm/clock.h>
|
||||
|
|
@ -78,7 +79,7 @@ struct sci_port {
|
|||
struct timer_list break_timer;
|
||||
int break_flag;
|
||||
|
||||
#ifdef CONFIG_SUPERH
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
/* Port clock */
|
||||
struct clk *clk;
|
||||
#endif
|
||||
|
|
@ -831,7 +832,7 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_HAVE_CLK)
|
||||
/*
|
||||
* Here we define a transistion notifier so that we can update all of our
|
||||
* ports' baud rate when the peripheral clock changes.
|
||||
|
|
@ -860,7 +861,7 @@ static int sci_notifier(struct notifier_block *self,
|
|||
* Clean this up later..
|
||||
*/
|
||||
clk = clk_get(NULL, "module_clk");
|
||||
port->uartclk = clk_get_rate(clk) * 16;
|
||||
port->uartclk = clk_get_rate(clk);
|
||||
clk_put(clk);
|
||||
}
|
||||
|
||||
|
|
@ -873,7 +874,7 @@ static int sci_notifier(struct notifier_block *self,
|
|||
}
|
||||
|
||||
static struct notifier_block sci_nb = { &sci_notifier, NULL, 0 };
|
||||
#endif /* CONFIG_CPU_FREQ */
|
||||
#endif /* CONFIG_CPU_FREQ && CONFIG_HAVE_CLK */
|
||||
|
||||
static int sci_request_irq(struct sci_port *port)
|
||||
{
|
||||
|
|
@ -1008,7 +1009,7 @@ static int sci_startup(struct uart_port *port)
|
|||
if (s->enable)
|
||||
s->enable(port);
|
||||
|
||||
#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
s->clk = clk_get(NULL, "module_clk");
|
||||
#endif
|
||||
|
||||
|
|
@ -1030,7 +1031,7 @@ static void sci_shutdown(struct uart_port *port)
|
|||
if (s->disable)
|
||||
s->disable(port);
|
||||
|
||||
#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_put(s->clk);
|
||||
s->clk = NULL;
|
||||
#endif
|
||||
|
|
@ -1041,24 +1042,11 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
|
|||
{
|
||||
struct sci_port *s = &sci_ports[port->line];
|
||||
unsigned int status, baud, smr_val;
|
||||
int t;
|
||||
int t = -1;
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
|
||||
|
||||
switch (baud) {
|
||||
case 0:
|
||||
t = -1;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
|
||||
t = SCBRR_VALUE(baud, clk_get_rate(s->clk));
|
||||
#else
|
||||
t = SCBRR_VALUE(baud);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (likely(baud))
|
||||
t = SCBRR_VALUE(baud, port->uartclk);
|
||||
|
||||
do {
|
||||
status = sci_in(port, SCxSR);
|
||||
|
|
@ -1113,7 +1101,7 @@ static const char *sci_type(struct uart_port *port)
|
|||
case PORT_IRDA: return "irda";
|
||||
}
|
||||
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void sci_release_port(struct uart_port *port)
|
||||
|
|
@ -1145,12 +1133,16 @@ static void sci_config_port(struct uart_port *port, int flags)
|
|||
break;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103)
|
||||
if (port->mapbase == 0)
|
||||
if (port->flags & UPF_IOREMAP && !port->membase) {
|
||||
#if defined(CONFIG_SUPERH64)
|
||||
port->mapbase = onchip_remap(SCIF_ADDR_SH5, 1024, "SCIF");
|
||||
|
||||
port->membase = (void __iomem *)port->mapbase;
|
||||
port->membase = (void __iomem *)port->mapbase;
|
||||
#else
|
||||
port->membase = ioremap_nocache(port->mapbase, 0x40);
|
||||
#endif
|
||||
|
||||
printk(KERN_ERR "sci: can't remap port#%d\n", port->line);
|
||||
}
|
||||
}
|
||||
|
||||
static int sci_verify_port(struct uart_port *port, struct serial_struct *ser)
|
||||
|
|
@ -1207,17 +1199,17 @@ static void __init sci_init_ports(void)
|
|||
sci_ports[i].disable = h8300_sci_disable;
|
||||
#endif
|
||||
sci_ports[i].port.uartclk = CONFIG_CPU_CLOCK;
|
||||
#elif defined(CONFIG_SUPERH64)
|
||||
sci_ports[i].port.uartclk = current_cpu_data.module_clock * 16;
|
||||
#else
|
||||
#elif defined(CONFIG_HAVE_CLK)
|
||||
/*
|
||||
* XXX: We should use a proper SCI/SCIF clock
|
||||
*/
|
||||
{
|
||||
struct clk *clk = clk_get(NULL, "module_clk");
|
||||
sci_ports[i].port.uartclk = clk_get_rate(clk) * 16;
|
||||
sci_ports[i].port.uartclk = clk_get_rate(clk);
|
||||
clk_put(clk);
|
||||
}
|
||||
#else
|
||||
#error "Need a valid uartclk"
|
||||
#endif
|
||||
|
||||
sci_ports[i].break_timer.data = (unsigned long)&sci_ports[i];
|
||||
|
|
@ -1285,7 +1277,7 @@ static int __init serial_console_setup(struct console *co, char *options)
|
|||
|
||||
port->type = serial_console_port->type;
|
||||
|
||||
#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (!serial_console_port->clk)
|
||||
serial_console_port->clk = clk_get(NULL, "module_clk");
|
||||
#endif
|
||||
|
|
@ -1436,7 +1428,7 @@ static struct uart_driver sci_uart_driver = {
|
|||
static int __devinit sci_probe(struct platform_device *dev)
|
||||
{
|
||||
struct plat_sci_port *p = dev->dev.platform_data;
|
||||
int i;
|
||||
int i, ret = -EINVAL;
|
||||
|
||||
for (i = 0; p && p->flags != 0; p++, i++) {
|
||||
struct sci_port *sciport = &sci_ports[i];
|
||||
|
|
@ -1453,12 +1445,22 @@ static int __devinit sci_probe(struct platform_device *dev)
|
|||
|
||||
sciport->port.mapbase = p->mapbase;
|
||||
|
||||
/*
|
||||
* For the simple (and majority of) cases where we don't need
|
||||
* to do any remapping, just cast the cookie directly.
|
||||
*/
|
||||
if (p->mapbase && !p->membase && !(p->flags & UPF_IOREMAP))
|
||||
p->membase = (void __iomem *)p->mapbase;
|
||||
if (p->mapbase && !p->membase) {
|
||||
if (p->flags & UPF_IOREMAP) {
|
||||
p->membase = ioremap_nocache(p->mapbase, 0x40);
|
||||
if (IS_ERR(p->membase)) {
|
||||
ret = PTR_ERR(p->membase);
|
||||
goto err_unreg;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* For the simple (and majority of) cases
|
||||
* where we don't need to do any remapping,
|
||||
* just cast the cookie directly.
|
||||
*/
|
||||
p->membase = (void __iomem *)p->mapbase;
|
||||
}
|
||||
}
|
||||
|
||||
sciport->port.membase = p->membase;
|
||||
|
||||
|
|
@ -1479,7 +1481,7 @@ static int __devinit sci_probe(struct platform_device *dev)
|
|||
kgdb_putchar = kgdb_sci_putchar;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
#if defined(CONFIG_CPU_FREQ) && defined(CONFIG_HAVE_CLK)
|
||||
cpufreq_register_notifier(&sci_nb, CPUFREQ_TRANSITION_NOTIFIER);
|
||||
dev_info(&dev->dev, "CPU frequency notifier registered\n");
|
||||
#endif
|
||||
|
|
@ -1489,6 +1491,12 @@ static int __devinit sci_probe(struct platform_device *dev)
|
|||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
err_unreg:
|
||||
for (i = i - 1; i >= 0; i--)
|
||||
uart_remove_one_port(&sci_uart_driver, &sci_ports[i].port);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit sci_remove(struct platform_device *dev)
|
||||
|
|
|
|||
|
|
@ -320,18 +320,16 @@
|
|||
#define SCI_EVENT_WRITE_WAKEUP 0
|
||||
|
||||
#define SCI_IN(size, offset) \
|
||||
unsigned int addr = port->mapbase + (offset); \
|
||||
if ((size) == 8) { \
|
||||
return ctrl_inb(addr); \
|
||||
return ioread8(port->membase + (offset)); \
|
||||
} else { \
|
||||
return ctrl_inw(addr); \
|
||||
return ioread16(port->membase + (offset)); \
|
||||
}
|
||||
#define SCI_OUT(size, offset, value) \
|
||||
unsigned int addr = port->mapbase + (offset); \
|
||||
if ((size) == 8) { \
|
||||
ctrl_outb(value, addr); \
|
||||
iowrite8(value, port->membase + (offset)); \
|
||||
} else if ((size) == 16) { \
|
||||
ctrl_outw(value, addr); \
|
||||
iowrite16(value, port->membase + (offset)); \
|
||||
}
|
||||
|
||||
#define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\
|
||||
|
|
@ -791,11 +789,16 @@ static inline int sci_rxd_in(struct uart_port *port)
|
|||
defined(CONFIG_CPU_SUBTYPE_SH7721)
|
||||
#define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1)
|
||||
#elif defined(CONFIG_CPU_SUBTYPE_SH7723)
|
||||
#define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(16*bps)-1)
|
||||
static inline int scbrr_calc(struct uart_port *port, int bps, int clk)
|
||||
{
|
||||
if (port->type == PORT_SCIF)
|
||||
return (clk+16*bps)/(32*bps)-1;
|
||||
else
|
||||
return ((clk*2)+16*bps)/(16*bps)-1;
|
||||
}
|
||||
#define SCBRR_VALUE(bps, clk) scbrr_calc(port, bps, clk)
|
||||
#elif defined(__H8300H__) || defined(__H8300S__)
|
||||
#define SCBRR_VALUE(bps) (((CONFIG_CPU_CLOCK*1000/32)/bps)-1)
|
||||
#elif defined(CONFIG_SUPERH64)
|
||||
#define SCBRR_VALUE(bps) ((current_cpu_data.module_clock+16*bps)/(32*bps)-1)
|
||||
#define SCBRR_VALUE(bps, clk) (((clk*1000/32)/bps)-1)
|
||||
#else /* Generic SH */
|
||||
#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue