mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
tty/serial_core: add ISO7816 infrastructure
Add the ISO7816 ioctl and associated accessors and data structure. Drivers can then use this common implementation to handle ISO7816 (smart cards). Signed-off-by: Nicolas Ferre <[email protected]> [[email protected]: squash and rebase, removal of gpios, checkpatch fixes] Signed-off-by: Ludovic Desroches <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
parent
c550f01c81
commit
ad8c0eaa0a
12 changed files with 179 additions and 0 deletions
|
|
@ -1308,6 +1308,58 @@ static int uart_set_rs485_config(struct uart_port *port,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int uart_get_iso7816_config(struct uart_port *port,
|
||||
struct serial_iso7816 __user *iso7816)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct serial_iso7816 aux;
|
||||
|
||||
if (!port->iso7816_config)
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
aux = port->iso7816;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
if (copy_to_user(iso7816, &aux, sizeof(aux)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uart_set_iso7816_config(struct uart_port *port,
|
||||
struct serial_iso7816 __user *iso7816_user)
|
||||
{
|
||||
struct serial_iso7816 iso7816;
|
||||
int i, ret;
|
||||
unsigned long flags;
|
||||
|
||||
if (!port->iso7816_config)
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
if (copy_from_user(&iso7816, iso7816_user, sizeof(*iso7816_user)))
|
||||
return -EFAULT;
|
||||
|
||||
/*
|
||||
* There are 5 words reserved for future use. Check that userspace
|
||||
* doesn't put stuff in there to prevent breakages in the future.
|
||||
*/
|
||||
for (i = 0; i < 5; i++)
|
||||
if (iso7816.reserved[i])
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
ret = port->iso7816_config(port, &iso7816);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (copy_to_user(iso7816_user, &port->iso7816, sizeof(port->iso7816)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called via sys_ioctl. We can use spin_lock_irq() here.
|
||||
*/
|
||||
|
|
@ -1392,6 +1444,14 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
|
|||
case TIOCSRS485:
|
||||
ret = uart_set_rs485_config(uport, uarg);
|
||||
break;
|
||||
|
||||
case TIOCSISO7816:
|
||||
ret = uart_set_iso7816_config(state->uart_port, uarg);
|
||||
break;
|
||||
|
||||
case TIOCGISO7816:
|
||||
ret = uart_get_iso7816_config(state->uart_port, uarg);
|
||||
break;
|
||||
default:
|
||||
if (uport->ops->ioctl)
|
||||
ret = uport->ops->ioctl(uport, cmd, arg);
|
||||
|
|
|
|||
Loading…
Reference in a new issue