GNU Linux-libre 4.19.264-gnu1
[releases.git] / drivers / tty / serial / ifx6x60.h
1 // SPDX-License-Identifier: GPL-2.0
2 /****************************************************************************
3  *
4  * Driver for the IFX spi modem.
5  *
6  * Copyright (C) 2009, 2010 Intel Corp
7  * Jim Stanley <jim.stanley@intel.com>
8  *
9  *****************************************************************************/
10 #ifndef _IFX6X60_H
11 #define _IFX6X60_H
12
13 #define DRVNAME                         "ifx6x60"
14 #define TTYNAME                         "ttyIFX"
15
16 #define IFX_SPI_MAX_MINORS              1
17 #define IFX_SPI_TRANSFER_SIZE           2048
18 #define IFX_SPI_FIFO_SIZE               4096
19
20 #define IFX_SPI_HEADER_OVERHEAD         4
21 #define IFX_RESET_TIMEOUT               msecs_to_jiffies(50)
22
23 /* device flags bitfield definitions */
24 #define IFX_SPI_STATE_PRESENT           0
25 #define IFX_SPI_STATE_IO_IN_PROGRESS    1
26 #define IFX_SPI_STATE_IO_READY          2
27 #define IFX_SPI_STATE_TIMER_PENDING     3
28 #define IFX_SPI_STATE_IO_AVAILABLE      4
29
30 /* flow control bitfields */
31 #define IFX_SPI_DCD                     0
32 #define IFX_SPI_CTS                     1
33 #define IFX_SPI_DSR                     2
34 #define IFX_SPI_RI                      3
35 #define IFX_SPI_DTR                     4
36 #define IFX_SPI_RTS                     5
37 #define IFX_SPI_TX_FC                   6
38 #define IFX_SPI_RX_FC                   7
39 #define IFX_SPI_UPDATE                  8
40
41 #define IFX_SPI_PAYLOAD_SIZE            (IFX_SPI_TRANSFER_SIZE - \
42                                                 IFX_SPI_HEADER_OVERHEAD)
43
44 #define IFX_SPI_IRQ_TYPE                DETECT_EDGE_RISING
45 #define IFX_SPI_GPIO_TARGET             0
46 #define IFX_SPI_GPIO0                   0x105
47
48 #define IFX_SPI_STATUS_TIMEOUT          (2000*HZ)
49
50 /* values for bits in power status byte */
51 #define IFX_SPI_POWER_DATA_PENDING      1
52 #define IFX_SPI_POWER_SRDY              2
53
54 struct ifx_spi_device {
55         /* Our SPI device */
56         struct spi_device *spi_dev;
57
58         /* Port specific data */
59         struct kfifo tx_fifo;
60         spinlock_t fifo_lock;
61         unsigned long signal_state;
62
63         /* TTY Layer logic */
64         struct tty_port tty_port;
65         struct device *tty_dev;
66         int minor;
67
68         /* Low level I/O work */
69         struct tasklet_struct io_work_tasklet;
70         unsigned long flags;
71         dma_addr_t rx_dma;
72         dma_addr_t tx_dma;
73
74         int modem;              /* Modem type */
75         int use_dma;            /* provide dma-able addrs in SPI msg */
76         long max_hz;            /* max SPI frequency */
77
78         spinlock_t write_lock;
79         int write_pending;
80         spinlock_t power_lock;
81         unsigned char power_status;
82
83         unsigned char *rx_buffer;
84         unsigned char *tx_buffer;
85         dma_addr_t rx_bus;
86         dma_addr_t tx_bus;
87         unsigned char spi_more;
88         unsigned char spi_slave_cts;
89
90         struct timer_list spi_timer;
91
92         struct spi_message spi_msg;
93         struct spi_transfer spi_xfer;
94
95         struct {
96                 /* gpio lines */
97                 unsigned short srdy;            /* slave-ready gpio */
98                 unsigned short mrdy;            /* master-ready gpio */
99                 unsigned short reset;           /* modem-reset gpio */
100                 unsigned short po;              /* modem-on gpio */
101                 unsigned short reset_out;       /* modem-in-reset gpio */
102                 /* state/stats */
103                 int unack_srdy_int_nb;
104         } gpio;
105
106         /* modem reset */
107         unsigned long mdm_reset_state;
108 #define MR_START        0
109 #define MR_INPROGRESS   1
110 #define MR_COMPLETE     2
111         wait_queue_head_t mdm_reset_wait;
112         void (*swap_buf)(unsigned char *buf, int len, void *end);
113 };
114
115 #endif /* _IFX6X60_H */