1 #include <linux/kernel.h>
2 #include <linux/spinlock.h>
5 #include <linux/signal.h>
6 #include <linux/sched.h>
7 #include <linux/interrupt.h>
11 #include "dvb_demux.h"
12 #include "dvb_frontend.h"
15 #include "mantis_common.h"
16 #include "mantis_reg.h"
17 #include "mantis_uart.h"
19 struct mantis_uart_params {
20 enum mantis_baud baud_rate;
21 enum mantis_parity parity;
24 #define UART_MAX_BUF 16
26 int mantis_uart_read(struct mantis_pci *mantis, u8 *data)
28 struct mantis_hwconfig *config = mantis->hwconfig;
32 for (i = 0; i < (config->bytes + 1); i++) {
34 stat = mmread(MANTIS_UART_STAT);
36 if (stat & MANTIS_UART_RXFIFO_FULL) {
37 dprintk(MANTIS_ERROR, 1, "RX Fifo FULL");
39 data[i] = mmread(MANTIS_UART_RXD) & 0x3f;
41 dprintk(MANTIS_DEBUG, 1, "Reading ... <%02x>", data[i] & 0x3f);
43 if (data[i] & (1 << 7)) {
44 dprintk(MANTIS_ERROR, 1, "UART framing error");
47 if (data[i] & (1 << 6)) {
48 dprintk(MANTIS_ERROR, 1, "UART parity error");
56 static void mantis_uart_work(struct work_struct *work)
58 struct mantis_pci *mantis = container_of(work, struct mantis_pci, uart_work);
59 struct mantis_hwconfig *config = mantis->hwconfig;
63 dprintk(MANTIS_DEBUG, 1, "UART read");
64 mantis_uart_read(mantis, buf);
66 dprintk(MANTIS_DEBUG, 1, "UART: ");
67 for (i = 0; i < (config->bytes + 1); i++)
68 dprintk(MANTIS_DEBUG, 0, "<%02x> ", buf[i]);
70 dprintk(MANTIS_DEBUG, 0, "\n");
73 static int mantis_uart_setup(struct mantis_pci *mantis,
74 struct mantis_uart_params *params)
76 char* rates[] = { "B_9600", "B_19200", "B_38400", "B_57600", "B_115200" };
77 char* parity[] = { "NONE", "ODD", "EVEN" };
81 dprintk(MANTIS_DEBUG, 1, "Set Parity <%s> Baud Rate <%s>",
82 parity[params->parity],
83 rates[params->baud_rate]);
85 mmwrite((mmread(MANTIS_UART_CTL) | (params->parity & 0x3)), MANTIS_UART_CTL);
87 reg = mmread(MANTIS_UART_BAUD);
89 switch (params->baud_rate) {
90 case MANTIS_BAUD_9600:
93 case MANTIS_BAUD_19200:
96 case MANTIS_BAUD_38400:
99 case MANTIS_BAUD_57600:
102 case MANTIS_BAUD_115200:
109 mmwrite(reg, MANTIS_UART_BAUD);
114 int mantis_uart_init(struct mantis_pci *mantis)
116 struct mantis_hwconfig *config = mantis->hwconfig;
117 struct mantis_uart_params params;
119 dprintk(MANTIS_DEBUG, 1, "Initializing UART ..");
120 /* default parity: */
121 params.baud_rate = config->baud_rate;
122 params.parity = config->parity;
124 init_waitqueue_head(&mantis->uart_wq);
125 spin_lock_init(&mantis->uart_lock);
127 INIT_WORK(&mantis->uart_work, mantis_uart_work);
129 /* disable interrupt */
130 mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
132 mantis_uart_setup(mantis, ¶ms);
135 mmwrite((mmread(MANTIS_UART_BAUD) | (config->bytes << 8)), MANTIS_UART_BAUD);
138 mmwrite((mmread(MANTIS_UART_CTL) | MANTIS_UART_RXFLUSH), MANTIS_UART_CTL);
140 /* enable interrupt */
141 mmwrite(mmread(MANTIS_INT_MASK) | 0x800, MANTIS_INT_MASK);
142 mmwrite(mmread(MANTIS_UART_CTL) | MANTIS_UART_RXINT, MANTIS_UART_CTL);
144 schedule_work(&mantis->uart_work);
148 EXPORT_SYMBOL_GPL(mantis_uart_init);
150 void mantis_uart_exit(struct mantis_pci *mantis)
152 /* disable interrupt */
153 mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
155 EXPORT_SYMBOL_GPL(mantis_uart_exit);