sh-sci: Get register size from platform device
Subsystems (2)
Yoshinori Sato
maintainerPATCH v3 1/1 sh-sci: Get register size from platform device
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]>
--- drivers/tty/serial/sh-sci.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-)
drivers/tty/serial/sh-sci.c +13 -21
@@ -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;
@@ -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.
@@ -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 ;
@@ -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 )) {
@@ -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);
Signature · 1 line
2.1.4
Quoted 5 lines · Yoshinori Sato
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]>
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 5 lines · Yoshinori Sato
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]>
Reviewed-by Simon Horman <[email protected]>
Quoted 100 lines
--- drivers/tty/serial/sh-sci.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-)drivers/tty/serial/sh-sci.c +13
-21@@ -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;@@ -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. @@ -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 ;@@ -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 )) {@@ -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);Signature · 6 lines
2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html