Re: [PATCH] usb: cp210x: Added support for GPIO (CP2103/4/5)

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

 



On Wed, May 16, 2012 at 04:33:47PM +0100, Alan Cox wrote:
> So the patch looks like this, which seems nice and compact (UNTESTED)
> 
> commit 4164f9b7074e682fe71dad3b57e78521ef9df492
> Author: Alan Cox <alan@xxxxxxxxxxxxxxx>
> Date:   Wed May 16 15:13:02 2012 +0100
> 
>     tty: Add a gpio helper set
>     
>     Various tty devices have additional control lines which are sometimes used
>     as GPIO pins and sometimes also tied with the serial port to implement
>     protocols such as ISO7816.
>     
>     This code provides a kernel interface for querying the GPIO range of a tty,
>     and to describe the mapping between GPIO pins and control lines. The latter
>     will be needed for some upcoming line discipline support.
>     
>     [Proposal do not merge yet]
>     
>     Not-Signed-off-by: Alan Cox <alan@xxxxxxxxxxxxxxx>

Wow, that looks really nice and tiny, if that's all that is needed in
the core, that's great.

> diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c
> index a1b9a2f..60550e7 100644
> --- a/drivers/tty/tty_ioctl.c
> +++ b/drivers/tty/tty_ioctl.c
> @@ -1071,6 +1071,39 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
>  	case TCSETXF:
>  		return set_termiox(real_tty, p, TERMIOS_FLUSH);
>  #endif		
> +#ifdef TCGGPIO
> +	case TCGGPIO: {
> +		struct tcgpio gpio;
> +
> +		if (tty->gpio == NULL)
> +			return -EOPNOTSUPP;
> +		mutex_lock(&real_tty->termios_mutex);
> +		memset(&gpio, 0, sizeof(gpio));
> +		gpio.base = tty->gpio->base;
> +		gpio.num = tty->gpio->num;
> +		memcpy(gpio.map, tty->gpio->map, sizeof(gpio.map));
> +		mutex_unlock(&real_tty->termios_mutex);
> +		if (copy_to_user(p, &gpio, sizeof(gpio)))
> +			return -EFAULT;
> +		return 0;
> +	}
> +	case TCSGPIO:
> +        {
> +		struct tcgpio gpio;
> +
> +		if (tty->gpio == NULL)
> +			return -EOPNOTSUPP;
> +		if (copy_from_user(&gpio, p, sizeof(gpio)))
> +			return -EFAULT;
> +		mutex_lock(&real_tty->termios_mutex);
> +		memcpy(tty->gpio->map, gpio.map, sizeof(tty->gpio->map));
> +		/* An ldisc can see this by watching the ioctl go through
> +		but we may want to add a hook */
> +		mutex_unlock(&real_tty->termios_mutex);
> +                return 0;

So how would the lower tty driver get the ioctl to know to now set these
values to the hardware?  I think we at least need a hook for that,
right?  Or would that go through the ldisc?


> +        }
> +                
> +#endif
>  	case TIOCGSOFTCAR:
>  		copy_termios(real_tty, &kterm);
>  		ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
> diff --git a/include/asm-generic/ioctls.h b/include/asm-generic/ioctls.h
> index 199975f..fee17d3 100644
> --- a/include/asm-generic/ioctls.h
> +++ b/include/asm-generic/ioctls.h
> @@ -74,6 +74,8 @@
>  #define TCSETXW		0x5435
>  #define TIOCSIG		_IOW('T', 0x36, int)  /* pty: generate signal */
>  #define TIOCVHANGUP	0x5437
> +#define TCGGPIO		_IOR('T', 0x38, struct tcgpio)
> +#define TCSGPIO		_IOW('T', 0x39, struct tcgpio)
>  
>  #define FIONCLEX	0x5450
>  #define FIOCLEX		0x5451
> diff --git a/include/asm-generic/termios.h b/include/asm-generic/termios.h
> index d0922ad..3adda38 100644
> --- a/include/asm-generic/termios.h
> +++ b/include/asm-generic/termios.h
> @@ -18,6 +18,18 @@ struct winsize {
>  	unsigned short ws_ypixel;
>  };
>  
> +
> +/* GPIO handling */
> +#define NR_TTY_GPIOMAP	8
> +struct tcgpio			/* User copied version */
> +{
> +	u32 base;
> +	u16 num;
> +	u16 reserved;
> +	u32 map[NR_TTY_GPIOMAP];
> +	u32 reserved2[6];
> +};

__u32 and friends instead?

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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux