Skip to content

Commit

Permalink
serial: sh-sci: Depend on HAVE_CLK unconditionally.
Browse files Browse the repository at this point in the history
The sh-sci code conditionalized the clock framework support in order to
give the other platforms a chance to catch up. sh64 supported this some
time ago and the forthcoming ARM changes handle this as well, this leaves
h8300 as the odd one out. H8300 has had since 2.5 to merge it's sh-sci
support upstream, and has yet to do so. At this point I will no longer be
holding back the driver to support an unreponsive architecture, 7 years
is quite enough of a grace period. Support is easily implemented on the
architecture if and when it ever decides to merge its changes upstream.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Nov 25, 2009
1 parent 6ba6538 commit edad1f2
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 54 deletions.
2 changes: 1 addition & 1 deletion drivers/serial/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -996,7 +996,7 @@ config SERIAL_IP22_ZILOG_CONSOLE

config SERIAL_SH_SCI
tristate "SuperH SCI(F) serial port support"
depends on SUPERH || H8300
depends on HAVE_CLK && (SUPERH || H8300)
select SERIAL_CORE

config SERIAL_SH_SCI_NR_UARTS
Expand Down
53 changes: 1 addition & 52 deletions drivers/serial/sh-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@
#include <linux/list.h>

#ifdef CONFIG_SUPERH
#include <asm/clock.h>
#include <asm/sh_bios.h>
#endif

Expand Down Expand Up @@ -79,22 +78,18 @@ struct sci_port {
struct timer_list break_timer;
int break_flag;

#ifdef CONFIG_HAVE_CLK
/* Interface clock */
struct clk *iclk;
/* Data clock */
struct clk *dclk;
#endif

struct list_head node;
};

struct sh_sci_priv {
spinlock_t lock;
struct list_head ports;

#ifdef CONFIG_HAVE_CLK
struct notifier_block clk_nb;
#endif
};

/* Function prototypes */
Expand Down Expand Up @@ -156,32 +151,6 @@ static void sci_poll_put_char(struct uart_port *port, unsigned char c)
}
#endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */

#if defined(__H8300S__)
enum { sci_disable, sci_enable };

static void h8300_sci_config(struct uart_port *port, unsigned int ctrl)
{
volatile unsigned char *mstpcrl = (volatile unsigned char *)MSTPCRL;
int ch = (port->mapbase - SMR0) >> 3;
unsigned char mask = 1 << (ch+1);

if (ctrl == sci_disable)
*mstpcrl |= mask;
else
*mstpcrl &= ~mask;
}

static void h8300_sci_enable(struct uart_port *port)
{
h8300_sci_config(port, sci_enable);
}

static void h8300_sci_disable(struct uart_port *port)
{
h8300_sci_config(port, sci_disable);
}
#endif

#if defined(__H8300H__) || defined(__H8300S__)
static void sci_init_pins(struct uart_port *port, unsigned int cflag)
{
Expand Down Expand Up @@ -733,7 +702,6 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
return ret;
}

#ifdef 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.
Expand All @@ -751,7 +719,6 @@ static int sci_notifier(struct notifier_block *self,
spin_lock_irqsave(&priv->lock, flags);
list_for_each_entry(sci_port, &priv->ports, node)
sci_port->port.uartclk = clk_get_rate(sci_port->dclk);

spin_unlock_irqrestore(&priv->lock, flags);
}

Expand All @@ -778,7 +745,6 @@ static void sci_clk_disable(struct uart_port *port)

clk_disable(sci_port->dclk);
}
#endif

static int sci_request_irq(struct sci_port *port)
{
Expand Down Expand Up @@ -1077,21 +1043,10 @@ static void __devinit sci_init_single(struct platform_device *dev,
sci_port->port.iotype = UPIO_MEM;
sci_port->port.line = index;
sci_port->port.fifosize = 1;

#if defined(__H8300H__) || defined(__H8300S__)
#ifdef __H8300S__
sci_port->enable = h8300_sci_enable;
sci_port->disable = h8300_sci_disable;
#endif
sci_port->port.uartclk = CONFIG_CPU_CLOCK;
#elif defined(CONFIG_HAVE_CLK)
sci_port->iclk = p->clk ? clk_get(&dev->dev, p->clk) : NULL;
sci_port->dclk = clk_get(&dev->dev, "peripheral_clk");
sci_port->enable = sci_clk_enable;
sci_port->disable = sci_clk_disable;
#else
#error "Need a valid uartclk"
#endif

sci_port->break_timer.data = (unsigned long)sci_port;
sci_port->break_timer.function = sci_break_timer;
Expand All @@ -1106,7 +1061,6 @@ static void __devinit sci_init_single(struct platform_device *dev,
sci_port->type = sci_port->port.type = p->type;

memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs));

}

#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
Expand Down Expand Up @@ -1239,14 +1193,11 @@ static int sci_remove(struct platform_device *dev)
struct sci_port *p;
unsigned long flags;

#ifdef CONFIG_HAVE_CLK
cpufreq_unregister_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER);
#endif

spin_lock_irqsave(&priv->lock, flags);
list_for_each_entry(p, &priv->ports, node)
uart_remove_one_port(&sci_uart_driver, &p->port);

spin_unlock_irqrestore(&priv->lock, flags);

kfree(priv);
Expand Down Expand Up @@ -1307,10 +1258,8 @@ static int __devinit sci_probe(struct platform_device *dev)
spin_lock_init(&priv->lock);
platform_set_drvdata(dev, priv);

#ifdef CONFIG_HAVE_CLK
priv->clk_nb.notifier_call = sci_notifier;
cpufreq_register_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER);
#endif

if (dev->id != -1) {
ret = sci_probe_single(dev, dev->id, p, &sci_ports[dev->id]);
Expand Down
2 changes: 1 addition & 1 deletion drivers/serial/sh-sci.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include <linux/serial_core.h>
#include <asm/io.h>
#include <linux/io.h>
#include <linux/gpio.h>

#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
Expand Down

0 comments on commit edad1f2

Please sign in to comment.