Re: [PATCH 1/4] serial: 8250_dw: Add support for big-endian MMIO accesses

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07/22/2015 08:19 AM, Peter Hurley wrote:
> Hi Noam,
> 
> On 07/22/2015 05:34 AM, Noam Camus wrote:
>> From: Noam Camus <noamc@xxxxxxxxxx>
>>
>> Add support for UPIO_MEM32BE in addition to UPIO_MEM32.
> 
> This is not an adequate changelog.
> Please describe the refactoring.
> 
> Regards,
> Peter Hurley
> 
>> Signed-off-by: Noam Camus <noamc@xxxxxxxxxx>
>> ---
>>  drivers/tty/serial/8250/8250_dw.c |   42 ++++++++++++++++++++++++++++++------
>>  1 files changed, 35 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
>> index d48b506..fe0b487 100644
>> --- a/drivers/tty/serial/8250/8250_dw.c
>> +++ b/drivers/tty/serial/8250/8250_dw.c
>> @@ -173,15 +173,13 @@ static void dw8250_serial_outq(struct uart_port *p, int offset, int value)
>>  }
>>  #endif /* CONFIG_64BIT */
>>  
>> -static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
>> +static void dw8250_check_control(struct uart_port *p, int offset, int value)

Also, I think this fn name should be dw8250_check_LCR() to distinguish it
from modem control.

Regards,
Peter Hurley

>>  {
>>  	struct dw8250_data *d = p->private_data;
>>  
>>  	if (offset == UART_MCR)
>>  		d->last_mcr = value;
>>  
>> -	writel(value, p->membase + (offset << p->regshift));
>> -
>>  	/* Make sure LCR write wasn't ignored */
>>  	if (offset == UART_LCR) {
>>  		int tries = 1000;
>> @@ -190,7 +188,12 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
>>  			if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR))
>>  				return;
>>  			dw8250_force_idle(p);
>> -			writel(value, p->membase + (UART_LCR << p->regshift));
>> +			if (p->iotype == UPIO_MEM32BE)
>> +				iowrite32be(value,
>> +					p->membase + (UART_LCR << p->regshift));
>> +			else
>> +				writel(value,
>> +					p->membase + (UART_LCR << p->regshift));
>>  		}
>>  		/*
>>  		 * FIXME: this deadlocks if port->lock is already held
>> @@ -199,6 +202,12 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
>>  	}
>>  }
>>  
>> +static void dw8250_serial_out32(struct uart_port *p, int offset, int value)
>> +{
>> +	writel(value, p->membase + (offset << p->regshift));
>> +	dw8250_check_control(p, offset, value);
>> +}
>> +
>>  static unsigned int dw8250_serial_in32(struct uart_port *p, int offset)
>>  {
>>  	unsigned int value = readl(p->membase + (offset << p->regshift));
>> @@ -206,6 +215,19 @@ static unsigned int dw8250_serial_in32(struct uart_port *p, int offset)
>>  	return dw8250_modify_msr(p, offset, value);
>>  }
>>  
>> +static void dw8250_serial_out32be(struct uart_port *p, int offset, int value)
>> +{
>> +	iowrite32be(value, p->membase + (offset << p->regshift));
>> +	dw8250_check_control(p, offset, value);
>> +}
>> +
>> +static unsigned int dw8250_serial_in32be(struct uart_port *p, int offset)
>> +{
>> +	unsigned int value = ioread32be(p->membase + (offset << p->regshift));
>> +
>> +	return dw8250_modify_msr(p, offset, value);
>> +}
>> +
>>  static int dw8250_handle_irq(struct uart_port *p)
>>  {
>>  	struct dw8250_data *d = p->private_data;
>> @@ -322,9 +344,15 @@ static int dw8250_probe_of(struct uart_port *p,
>>  		case 1:
>>  			break;
>>  		case 4:
>> -			p->iotype = UPIO_MEM32;
>> -			p->serial_in = dw8250_serial_in32;
>> -			p->serial_out = dw8250_serial_out32;
>> +			p->iotype = of_device_is_big_endian(np) ?
>> +				    UPIO_MEM32BE : UPIO_MEM32;
>> +			if (p->iotype == UPIO_MEM32) {
>> +				p->serial_in = dw8250_serial_in32;
>> +				p->serial_out = dw8250_serial_out32;
>> +			} else {
>> +				p->serial_in = dw8250_serial_in32be;
>> +				p->serial_out = dw8250_serial_out32be;
>> +			}
>>  			break;
>>  		default:
>>  			dev_err(p->dev, "unsupported reg-io-width (%u)\n", val);
>>
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux