serial: 8250: Add support for big-endian MMIO accesses
Add cases for UPIO_MEM32BE wherever there are currently cases handling UPIO_MEM32. Signed-off-by: Kevin Cernekee <cernekee@gmail.com> Reviewed-by: Peter Hurley <peter@hurleysoftware.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
		
					parent
					
						
							
								65a71007a2
							
						
					
				
			
			
				commit
				
					
						c627f2ceb6
					
				
			
		
					 2 changed files with 25 additions and 0 deletions
				
			
		|  | @ -439,6 +439,18 @@ static unsigned int mem32_serial_in(struct uart_port *p, int offset) | ||||||
| 	return readl(p->membase + offset); | 	return readl(p->membase + offset); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void mem32be_serial_out(struct uart_port *p, int offset, int value) | ||||||
|  | { | ||||||
|  | 	offset = offset << p->regshift; | ||||||
|  | 	iowrite32be(value, p->membase + offset); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static unsigned int mem32be_serial_in(struct uart_port *p, int offset) | ||||||
|  | { | ||||||
|  | 	offset = offset << p->regshift; | ||||||
|  | 	return ioread32be(p->membase + offset); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static unsigned int io_serial_in(struct uart_port *p, int offset) | static unsigned int io_serial_in(struct uart_port *p, int offset) | ||||||
| { | { | ||||||
| 	offset = offset << p->regshift; | 	offset = offset << p->regshift; | ||||||
|  | @ -477,6 +489,11 @@ static void set_io_from_upio(struct uart_port *p) | ||||||
| 		p->serial_out = mem32_serial_out; | 		p->serial_out = mem32_serial_out; | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
|  | 	case UPIO_MEM32BE: | ||||||
|  | 		p->serial_in = mem32be_serial_in; | ||||||
|  | 		p->serial_out = mem32be_serial_out; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
| #if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X) | #if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X) | ||||||
| 	case UPIO_AU: | 	case UPIO_AU: | ||||||
| 		p->serial_in = au_serial_in; | 		p->serial_in = au_serial_in; | ||||||
|  | @ -502,6 +519,7 @@ serial_port_out_sync(struct uart_port *p, int offset, int value) | ||||||
| 	switch (p->iotype) { | 	switch (p->iotype) { | ||||||
| 	case UPIO_MEM: | 	case UPIO_MEM: | ||||||
| 	case UPIO_MEM32: | 	case UPIO_MEM32: | ||||||
|  | 	case UPIO_MEM32BE: | ||||||
| 	case UPIO_AU: | 	case UPIO_AU: | ||||||
| 		p->serial_out(p, offset, value); | 		p->serial_out(p, offset, value); | ||||||
| 		p->serial_in(p, UART_LCR);	/* safe, no side-effects */ | 		p->serial_in(p, UART_LCR);	/* safe, no side-effects */ | ||||||
|  | @ -2743,6 +2761,7 @@ static int serial8250_request_std_resource(struct uart_8250_port *up) | ||||||
| 	case UPIO_AU: | 	case UPIO_AU: | ||||||
| 	case UPIO_TSI: | 	case UPIO_TSI: | ||||||
| 	case UPIO_MEM32: | 	case UPIO_MEM32: | ||||||
|  | 	case UPIO_MEM32BE: | ||||||
| 	case UPIO_MEM: | 	case UPIO_MEM: | ||||||
| 		if (!port->mapbase) | 		if (!port->mapbase) | ||||||
| 			break; | 			break; | ||||||
|  | @ -2779,6 +2798,7 @@ static void serial8250_release_std_resource(struct uart_8250_port *up) | ||||||
| 	case UPIO_AU: | 	case UPIO_AU: | ||||||
| 	case UPIO_TSI: | 	case UPIO_TSI: | ||||||
| 	case UPIO_MEM32: | 	case UPIO_MEM32: | ||||||
|  | 	case UPIO_MEM32BE: | ||||||
| 	case UPIO_MEM: | 	case UPIO_MEM: | ||||||
| 		if (!port->mapbase) | 		if (!port->mapbase) | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
|  | @ -45,6 +45,8 @@ unsigned int __weak __init serial8250_early_in(struct uart_port *port, int offse | ||||||
| 		return readb(port->membase + offset); | 		return readb(port->membase + offset); | ||||||
| 	case UPIO_MEM32: | 	case UPIO_MEM32: | ||||||
| 		return readl(port->membase + (offset << 2)); | 		return readl(port->membase + (offset << 2)); | ||||||
|  | 	case UPIO_MEM32BE: | ||||||
|  | 		return ioread32be(port->membase + (offset << 2)); | ||||||
| 	case UPIO_PORT: | 	case UPIO_PORT: | ||||||
| 		return inb(port->iobase + offset); | 		return inb(port->iobase + offset); | ||||||
| 	default: | 	default: | ||||||
|  | @ -61,6 +63,9 @@ void __weak __init serial8250_early_out(struct uart_port *port, int offset, int | ||||||
| 	case UPIO_MEM32: | 	case UPIO_MEM32: | ||||||
| 		writel(value, port->membase + (offset << 2)); | 		writel(value, port->membase + (offset << 2)); | ||||||
| 		break; | 		break; | ||||||
|  | 	case UPIO_MEM32BE: | ||||||
|  | 		iowrite32be(value, port->membase + (offset << 2)); | ||||||
|  | 		break; | ||||||
| 	case UPIO_PORT: | 	case UPIO_PORT: | ||||||
| 		outb(value, port->iobase + offset); | 		outb(value, port->iobase + offset); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Kevin Cernekee
				Kevin Cernekee