Re: [RFC][PATCH] serial: spi: add spi-uart driver for Maxim 3110

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

 



> As a RFC, the driver doesn't have a valid UART port type yet, but borrow
> PORT_PXA. I would apply one if there is no main objection for it.

Please just add a new uart type for it.

> +config MAX3110_DESIGNWARE
> +	boolean "Enable Max3110 to work with Designware controller"
> +	default y
> +	depends on SERIAL_MAX3110
> +
> +config MAX3110_IRQ
> +	boolean "Enable IRQ for Max3110"
> +	default n
> +	depends on SERIAL_MAX3110
> +

These should be runtime


> +int max3110_write_then_read(struct uart_max3110 *max,
> +		const u8 *txbuf, u8 *rxbuf, unsigned len, int always_fast)
> +{
> +	struct spi_device *spi = max->spi;
> +	struct spi_message	message;
> +	struct spi_transfer	x;
> +	int ret;
> +
> +	if (!txbuf || !rxbuf)
> +		return -EINVAL;

How can the above occur - it seems no user triggered event can cause it
and almost all the paths then lose the error before userspace gets it
(and silently).


> +	if (len > MAX_READ_LEN) {
> +		pr_err(PR_FMT "read len %d is too large\n", len);
> +		return 0;
> +	}

Ditto


> +	while (len) {
> +		usable = tty_buffer_request_room(tty, len);
> +		if (usable) {
> +			tty_insert_flip_string(tty, str, usable);
> +			str += usable;
> +			port->icount.rx += usable;
> +			tty_flip_buffer_push(tty);

You really only want to push once. tty_insert_flip_string also knows
about multiple blocks so all of this can be a single

	tty_insert_flip_string(tty, str, len);
	tty_flip_buffer_push(tty);


>
> +static void
> +serial_m3110_set_termios(struct uart_port *port, struct ktermios *termios,
> +		       struct ktermios *old)
> +{
> +	struct uart_max3110 *max =
> +		container_of(port, struct uart_max3110, port);
> +	unsigned char cval;
> +	unsigned int baud, parity = 0;
> +	int clk_div = -1;
> +	u16 new_conf = max->cur_conf;
> +
> +	switch (termios->c_cflag & CSIZE) {
> +	case CS7:
> +		cval = UART_LCR_WLEN7;
> +		new_conf |= WC_7BIT_WORD;
> +		break;
> +	default:
> +	case CS8:
> +		cval = UART_LCR_WLEN8;
> +		new_conf |= WC_8BIT_WORD;

If you can only do CS8 when asked for other values you need to update the
termios struct to report that

		termios->c_cflag &= ~CSIZE;
		termios->c_flag |= CS8;

> +	if (!(termios->c_cflag & PARODD))
> +		parity |= UART_LCR_EPAR;
> +	max->parity = parity;
> +
> +	uart_update_timeout(port, termios->c_cflag, baud);
> +
> +	new_conf |= WC_TAG;
> +	if (new_conf != max->cur_conf) {
> +		max3110_out(max, new_conf);
> +		max->cur_conf = new_conf;
> +		max->baud = baud;
> +	}

And as you don't support it

	termios->c_cflag &= ~CMSPAR;


I'll take a more serious look over it in the new year when I'm back at
work.

--
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