Skip to content

Commit

Permalink
sh-sci: Get register size from platform device
Browse files Browse the repository at this point in the history
There is much SCI of SoC having within,
and the register size is also different in everyone.
So get from platform device.

Signed-off-by: Yoshinori Sato <[email protected]>
Acked-by: by: Geert Uytterhoeven <[email protected]>
Reviewed-by: Simon Horman <[email protected]>
  • Loading branch information
ysat0 committed Jun 23, 2015
1 parent ded515a commit e4d6f91
Showing 1 changed file with 13 additions and 21 deletions.
34 changes: 13 additions & 21 deletions drivers/tty/serial/sh-sci.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ struct sci_port {
int overrun_bit;
unsigned int error_mask;
unsigned int sampling_rate;

resource_size_t reg_size;

/* Break timer */
struct timer_list break_timer;
Expand Down Expand Up @@ -2073,23 +2073,9 @@ static const char *sci_type(struct uart_port *port)
return NULL;
}

static inline unsigned long sci_port_size(struct uart_port *port)
{
/*
* Pick an arbitrary size that encapsulates all of the base
* registers by default. This can be optimized later, or derived
* from platform resource data at such a time that ports begin to
* behave more erratically.
*/
if (port->type == PORT_HSCIF)
return 96;
else
return 64;
}

static int sci_remap_port(struct uart_port *port)
{
unsigned long size = sci_port_size(port);
struct sci_port *sport = to_sci_port(port);

/*
* Nothing to do if there's already an established membase.
Expand All @@ -2098,7 +2084,7 @@ static int sci_remap_port(struct uart_port *port)
return 0;

if (port->flags & UPF_IOREMAP) {
port->membase = ioremap_nocache(port->mapbase, size);
port->membase = ioremap_nocache(port->mapbase, sport->reg_size);
if (unlikely(!port->membase)) {
dev_err(port->dev, "can't remap port#%d\n", port->line);
return -ENXIO;
Expand All @@ -2117,23 +2103,28 @@ static int sci_remap_port(struct uart_port *port)

static void sci_release_port(struct uart_port *port)
{
struct sci_port *sport = to_sci_port(port);

if (port->flags & UPF_IOREMAP) {
iounmap(port->membase);
port->membase = NULL;
}

release_mem_region(port->mapbase, sci_port_size(port));
release_mem_region(port->mapbase, sport->reg_size);
}

static int sci_request_port(struct uart_port *port)
{
unsigned long size = sci_port_size(port);
struct resource *res;
struct sci_port *sport = to_sci_port(port);
int ret;

res = request_mem_region(port->mapbase, size, dev_name(port->dev));
if (unlikely(res == NULL))
res = request_mem_region(port->mapbase, sport->reg_size,
dev_name(port->dev));
if (unlikely(res == NULL)) {
dev_err(port->dev, "request_mem_region failed.");
return -EBUSY;
}

ret = sci_remap_port(port);
if (unlikely(ret != 0)) {
Expand Down Expand Up @@ -2207,6 +2198,7 @@ static int sci_init_single(struct platform_device *dev,
return -ENOMEM;

port->mapbase = res->start;
sci_port->reg_size = resource_size(res);

for (i = 0; i < ARRAY_SIZE(sci_port->irqs); ++i)
sci_port->irqs[i] = platform_get_irq(dev, i);
Expand Down

0 comments on commit e4d6f91

Please sign in to comment.