8e0ed663ba9b9840301226f43ec4c5f0e16ebd47
[firefly-linux-kernel-4.4.55.git] / drivers / ipack / devices / ipoctal.c
1 /**
2  * ipoctal.c
3  *
4  * driver for the GE IP-OCTAL boards
5  *
6  * Copyright (C) 2009-2012 CERN (www.cern.ch)
7  * Author: Nicolas Serafini, EIC2 SA
8  * Author: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU General Public License as published by the Free
12  * Software Foundation; version 2 of the License.
13  */
14
15 #include <linux/device.h>
16 #include <linux/module.h>
17 #include <linux/interrupt.h>
18 #include <linux/sched.h>
19 #include <linux/tty.h>
20 #include <linux/serial.h>
21 #include <linux/tty_flip.h>
22 #include <linux/slab.h>
23 #include <linux/atomic.h>
24 #include <linux/io.h>
25 #include <linux/ipack.h>
26 #include "ipoctal.h"
27 #include "scc2698.h"
28
29 #define IP_OCTAL_ID_SPACE_VECTOR    0x41
30 #define IP_OCTAL_NB_BLOCKS          4
31
32 static const struct tty_operations ipoctal_fops;
33
34 struct ipoctal_channel {
35         struct ipoctal_stats            stats;
36         unsigned int                    nb_bytes;
37         wait_queue_head_t               queue;
38         spinlock_t                      lock;
39         unsigned int                    pointer_read;
40         unsigned int                    pointer_write;
41         atomic_t                        open;
42         struct tty_port                 tty_port;
43         union scc2698_channel __iomem   *regs;
44         union scc2698_block __iomem     *block_regs;
45         unsigned int                    board_id;
46         unsigned char                   *board_write;
47         u8                              isr_rx_rdy_mask;
48         u8                              isr_tx_rdy_mask;
49 };
50
51 struct ipoctal {
52         struct ipack_device             *dev;
53         unsigned int                    board_id;
54         struct ipoctal_channel          channel[NR_CHANNELS];
55         unsigned char                   write;
56         struct tty_driver               *tty_drv;
57         u8 __iomem                      *mem8_space;
58         u8 __iomem                      *int_space;
59 };
60
61 static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty)
62 {
63         struct ipoctal_channel *channel;
64
65         channel = dev_get_drvdata(tty->dev);
66
67         iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
68         return 0;
69 }
70
71 static int ipoctal_open(struct tty_struct *tty, struct file *file)
72 {
73         int res;
74         struct ipoctal_channel *channel;
75
76         channel = dev_get_drvdata(tty->dev);
77
78         if (atomic_read(&channel->open))
79                 return -EBUSY;
80
81         tty->driver_data = channel;
82
83         res = tty_port_open(&channel->tty_port, tty, file);
84         if (res)
85                 return res;
86
87         atomic_inc(&channel->open);
88         return 0;
89 }
90
91 static void ipoctal_reset_stats(struct ipoctal_stats *stats)
92 {
93         stats->tx = 0;
94         stats->rx = 0;
95         stats->rcv_break = 0;
96         stats->framing_err = 0;
97         stats->overrun_err = 0;
98         stats->parity_err = 0;
99 }
100
101 static void ipoctal_free_channel(struct ipoctal_channel *channel)
102 {
103         ipoctal_reset_stats(&channel->stats);
104         channel->pointer_read = 0;
105         channel->pointer_write = 0;
106         channel->nb_bytes = 0;
107 }
108
109 static void ipoctal_close(struct tty_struct *tty, struct file *filp)
110 {
111         struct ipoctal_channel *channel = tty->driver_data;
112
113         tty_port_close(&channel->tty_port, tty, filp);
114
115         if (atomic_dec_and_test(&channel->open))
116                 ipoctal_free_channel(channel);
117 }
118
119 static int ipoctal_get_icount(struct tty_struct *tty,
120                               struct serial_icounter_struct *icount)
121 {
122         struct ipoctal_channel *channel = tty->driver_data;
123
124         icount->cts = 0;
125         icount->dsr = 0;
126         icount->rng = 0;
127         icount->dcd = 0;
128         icount->rx = channel->stats.rx;
129         icount->tx = channel->stats.tx;
130         icount->frame = channel->stats.framing_err;
131         icount->parity = channel->stats.parity_err;
132         icount->brk = channel->stats.rcv_break;
133         return 0;
134 }
135
136 static void ipoctal_irq_rx(struct ipoctal_channel *channel,
137                            struct tty_struct *tty, u8 sr)
138 {
139         struct tty_port *port = &channel->tty_port;
140         unsigned char value;
141         unsigned char flag = TTY_NORMAL;
142         u8 isr;
143
144         do {
145                 value = ioread8(&channel->regs->r.rhr);
146                 /* Error: count statistics */
147                 if (sr & SR_ERROR) {
148                         iowrite8(CR_CMD_RESET_ERR_STATUS, &channel->regs->w.cr);
149
150                         if (sr & SR_OVERRUN_ERROR) {
151                                 channel->stats.overrun_err++;
152                                 /* Overrun doesn't affect the current character*/
153                                 tty_insert_flip_char(port, 0, TTY_OVERRUN);
154                         }
155                         if (sr & SR_PARITY_ERROR) {
156                                 channel->stats.parity_err++;
157                                 flag = TTY_PARITY;
158                         }
159                         if (sr & SR_FRAMING_ERROR) {
160                                 channel->stats.framing_err++;
161                                 flag = TTY_FRAME;
162                         }
163                         if (sr & SR_RECEIVED_BREAK) {
164                                 iowrite8(CR_CMD_RESET_BREAK_CHANGE, &channel->regs->w.cr);
165                                 channel->stats.rcv_break++;
166                                 flag = TTY_BREAK;
167                         }
168                 }
169                 tty_insert_flip_char(port, value, flag);
170
171                 /* Check if there are more characters in RX FIFO
172                  * If there are more, the isr register for this channel
173                  * has enabled the RxRDY|FFULL bit.
174                  */
175                 isr = ioread8(&channel->block_regs->r.isr);
176                 sr = ioread8(&channel->regs->r.sr);
177         } while (isr & channel->isr_rx_rdy_mask);
178
179         tty_flip_buffer_push(tty);
180 }
181
182 static void ipoctal_irq_tx(struct ipoctal_channel *channel)
183 {
184         unsigned char value;
185         unsigned int *pointer_write = &channel->pointer_write;
186
187         if (channel->nb_bytes <= 0) {
188                 channel->nb_bytes = 0;
189                 return;
190         }
191
192         value = channel->tty_port.xmit_buf[*pointer_write];
193         iowrite8(value, &channel->regs->w.thr);
194         channel->stats.tx++;
195         (*pointer_write)++;
196         *pointer_write = *pointer_write % PAGE_SIZE;
197         channel->nb_bytes--;
198
199         if ((channel->nb_bytes == 0) &&
200             (waitqueue_active(&channel->queue))) {
201
202                 if (channel->board_id != IPACK1_DEVICE_ID_SBS_OCTAL_485) {
203                         *channel->board_write = 1;
204                         wake_up_interruptible(&channel->queue);
205                 }
206         }
207 }
208
209 static void ipoctal_irq_channel(struct ipoctal_channel *channel)
210 {
211         u8 isr, sr;
212         struct tty_struct *tty;
213
214         /* If there is no client, skip the check */
215         if (!atomic_read(&channel->open))
216                 return;
217
218         tty = tty_port_tty_get(&channel->tty_port);
219         if (!tty)
220                 return;
221         /* The HW is organized in pair of channels.  See which register we need
222          * to read from */
223         isr = ioread8(&channel->block_regs->r.isr);
224         sr = ioread8(&channel->regs->r.sr);
225
226         /* In case of RS-485, change from TX to RX when finishing TX.
227          * Half-duplex. */
228         if ((channel->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) &&
229             (sr & SR_TX_EMPTY) && (channel->nb_bytes == 0)) {
230                 iowrite8(CR_DISABLE_TX, &channel->regs->w.cr);
231                 iowrite8(CR_CMD_NEGATE_RTSN, &channel->regs->w.cr);
232                 iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
233                 *channel->board_write = 1;
234                 wake_up_interruptible(&channel->queue);
235         }
236
237         /* RX data */
238         if ((isr & channel->isr_rx_rdy_mask) && (sr & SR_RX_READY))
239                 ipoctal_irq_rx(channel, tty, sr);
240
241         /* TX of each character */
242         if ((isr & channel->isr_tx_rdy_mask) && (sr & SR_TX_READY))
243                 ipoctal_irq_tx(channel);
244
245         tty_flip_buffer_push(tty);
246         tty_kref_put(tty);
247 }
248
249 static irqreturn_t ipoctal_irq_handler(void *arg)
250 {
251         unsigned int i;
252         struct ipoctal *ipoctal = (struct ipoctal *) arg;
253
254         /* Check all channels */
255         for (i = 0; i < NR_CHANNELS; i++)
256                 ipoctal_irq_channel(&ipoctal->channel[i]);
257
258         /* Clear the IPack device interrupt */
259         readw(ipoctal->int_space + ACK_INT_REQ0);
260         readw(ipoctal->int_space + ACK_INT_REQ1);
261
262         return IRQ_HANDLED;
263 }
264
265 static const struct tty_port_operations ipoctal_tty_port_ops = {
266         .dtr_rts = NULL,
267         .activate = ipoctal_port_activate,
268 };
269
270 static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
271                              unsigned int slot)
272 {
273         int res;
274         int i;
275         struct tty_driver *tty;
276         char name[20];
277         struct ipoctal_channel *channel;
278         struct ipack_region *region;
279         void __iomem *addr;
280         union scc2698_channel __iomem *chan_regs;
281         union scc2698_block __iomem *block_regs;
282
283         ipoctal->board_id = ipoctal->dev->id_device;
284
285         region = &ipoctal->dev->region[IPACK_IO_SPACE];
286         addr = devm_ioremap_nocache(&ipoctal->dev->dev,
287                                     region->start, region->size);
288         if (!addr) {
289                 dev_err(&ipoctal->dev->dev,
290                         "Unable to map slot [%d:%d] IO space!\n",
291                         bus_nr, slot);
292                 return -EADDRNOTAVAIL;
293         }
294         /* Save the virtual address to access the registers easily */
295         chan_regs =
296                 (union scc2698_channel __iomem *) addr;
297         block_regs =
298                 (union scc2698_block __iomem *) addr;
299
300         region = &ipoctal->dev->region[IPACK_INT_SPACE];
301         ipoctal->int_space =
302                 devm_ioremap_nocache(&ipoctal->dev->dev,
303                                      region->start, region->size);
304         if (!ipoctal->int_space) {
305                 dev_err(&ipoctal->dev->dev,
306                         "Unable to map slot [%d:%d] INT space!\n",
307                         bus_nr, slot);
308                 return -EADDRNOTAVAIL;
309         }
310
311         region = &ipoctal->dev->region[IPACK_MEM8_SPACE];
312         ipoctal->mem8_space =
313                 devm_ioremap_nocache(&ipoctal->dev->dev,
314                                      region->start, 0x8000);
315         if (!addr) {
316                 dev_err(&ipoctal->dev->dev,
317                         "Unable to map slot [%d:%d] MEM8 space!\n",
318                         bus_nr, slot);
319                 return -EADDRNOTAVAIL;
320         }
321
322
323         /* Disable RX and TX before touching anything */
324         for (i = 0; i < NR_CHANNELS ; i++) {
325                 struct ipoctal_channel *channel = &ipoctal->channel[i];
326                 channel->regs = chan_regs + i;
327                 channel->block_regs = block_regs + (i >> 1);
328                 channel->board_write = &ipoctal->write;
329                 channel->board_id = ipoctal->board_id;
330                 if (i & 1) {
331                         channel->isr_tx_rdy_mask = ISR_TxRDY_B;
332                         channel->isr_rx_rdy_mask = ISR_RxRDY_FFULL_B;
333                 } else {
334                         channel->isr_tx_rdy_mask = ISR_TxRDY_A;
335                         channel->isr_rx_rdy_mask = ISR_RxRDY_FFULL_A;
336                 }
337
338                 iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr);
339                 iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr);
340                 iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr);
341                 iowrite8(MR1_CHRL_8_BITS | MR1_ERROR_CHAR | MR1_RxINT_RxRDY,
342                          &channel->regs->w.mr); /* mr1 */
343                 iowrite8(0, &channel->regs->w.mr); /* mr2 */
344                 iowrite8(TX_CLK_9600  | RX_CLK_9600, &channel->regs->w.csr);
345         }
346
347         for (i = 0; i < IP_OCTAL_NB_BLOCKS; i++) {
348                 iowrite8(ACR_BRG_SET2, &block_regs[i].w.acr);
349                 iowrite8(OPCR_MPP_OUTPUT | OPCR_MPOa_RTSN | OPCR_MPOb_RTSN,
350                          &block_regs[i].w.opcr);
351                 iowrite8(IMR_TxRDY_A | IMR_RxRDY_FFULL_A | IMR_DELTA_BREAK_A |
352                          IMR_TxRDY_B | IMR_RxRDY_FFULL_B | IMR_DELTA_BREAK_B,
353                          &block_regs[i].w.imr);
354         }
355
356         /*
357          * IP-OCTAL has different addresses to copy its IRQ vector.
358          * Depending of the carrier these addresses are accesible or not.
359          * More info in the datasheet.
360          */
361         ipoctal->dev->bus->ops->request_irq(ipoctal->dev,
362                                        ipoctal_irq_handler, ipoctal);
363         /* Dummy write */
364         iowrite8(1, ipoctal->mem8_space + 1);
365
366         /* Register the TTY device */
367
368         /* Each IP-OCTAL channel is a TTY port */
369         tty = alloc_tty_driver(NR_CHANNELS);
370
371         if (!tty)
372                 return -ENOMEM;
373
374         /* Fill struct tty_driver with ipoctal data */
375         tty->owner = THIS_MODULE;
376         tty->driver_name = KBUILD_MODNAME;
377         sprintf(name, KBUILD_MODNAME ".%d.%d.", bus_nr, slot);
378         tty->name = name;
379         tty->major = 0;
380
381         tty->minor_start = 0;
382         tty->type = TTY_DRIVER_TYPE_SERIAL;
383         tty->subtype = SERIAL_TYPE_NORMAL;
384         tty->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
385         tty->init_termios = tty_std_termios;
386         tty->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
387         tty->init_termios.c_ispeed = 9600;
388         tty->init_termios.c_ospeed = 9600;
389
390         tty_set_operations(tty, &ipoctal_fops);
391         res = tty_register_driver(tty);
392         if (res) {
393                 dev_err(&ipoctal->dev->dev, "Can't register tty driver.\n");
394                 put_tty_driver(tty);
395                 return res;
396         }
397
398         /* Save struct tty_driver for use it when uninstalling the device */
399         ipoctal->tty_drv = tty;
400
401         for (i = 0; i < NR_CHANNELS; i++) {
402                 struct device *tty_dev;
403
404                 channel = &ipoctal->channel[i];
405                 tty_port_init(&channel->tty_port);
406                 tty_port_alloc_xmit_buf(&channel->tty_port);
407                 channel->tty_port.ops = &ipoctal_tty_port_ops;
408
409                 ipoctal_reset_stats(&channel->stats);
410                 channel->nb_bytes = 0;
411                 init_waitqueue_head(&channel->queue);
412
413                 spin_lock_init(&channel->lock);
414                 channel->pointer_read = 0;
415                 channel->pointer_write = 0;
416                 tty_dev = tty_port_register_device(&channel->tty_port, tty, i, NULL);
417                 if (IS_ERR(tty_dev)) {
418                         dev_err(&ipoctal->dev->dev, "Failed to register tty device.\n");
419                         tty_port_destroy(&channel->tty_port);
420                         continue;
421                 }
422                 dev_set_drvdata(tty_dev, channel);
423
424                 /*
425                  * Enable again the RX. TX will be enabled when
426                  * there is something to send
427                  */
428                 iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
429         }
430
431         return 0;
432 }
433
434 static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
435                                             const unsigned char *buf,
436                                             int count)
437 {
438         unsigned long flags;
439         int i;
440         unsigned int *pointer_read = &channel->pointer_read;
441
442         /* Copy the bytes from the user buffer to the internal one */
443         for (i = 0; i < count; i++) {
444                 if (i <= (PAGE_SIZE - channel->nb_bytes)) {
445                         spin_lock_irqsave(&channel->lock, flags);
446                         channel->tty_port.xmit_buf[*pointer_read] = buf[i];
447                         *pointer_read = (*pointer_read + 1) % PAGE_SIZE;
448                         channel->nb_bytes++;
449                         spin_unlock_irqrestore(&channel->lock, flags);
450                 } else {
451                         break;
452                 }
453         }
454         return i;
455 }
456
457 static int ipoctal_write_tty(struct tty_struct *tty,
458                              const unsigned char *buf, int count)
459 {
460         struct ipoctal_channel *channel = tty->driver_data;
461         unsigned int char_copied;
462
463         char_copied = ipoctal_copy_write_buffer(channel, buf, count);
464
465         /* As the IP-OCTAL 485 only supports half duplex, do it manually */
466         if (channel->board_id == IPACK1_DEVICE_ID_SBS_OCTAL_485) {
467                 iowrite8(CR_DISABLE_RX, &channel->regs->w.cr);
468                 iowrite8(CR_CMD_ASSERT_RTSN, &channel->regs->w.cr);
469         }
470
471         /*
472          * Send a packet and then disable TX to avoid failure after several send
473          * operations
474          */
475         iowrite8(CR_ENABLE_TX, &channel->regs->w.cr);
476         wait_event_interruptible(channel->queue, *channel->board_write);
477         iowrite8(CR_DISABLE_TX, &channel->regs->w.cr);
478
479         *channel->board_write = 0;
480         return char_copied;
481 }
482
483 static int ipoctal_write_room(struct tty_struct *tty)
484 {
485         struct ipoctal_channel *channel = tty->driver_data;
486
487         return PAGE_SIZE - channel->nb_bytes;
488 }
489
490 static int ipoctal_chars_in_buffer(struct tty_struct *tty)
491 {
492         struct ipoctal_channel *channel = tty->driver_data;
493
494         return channel->nb_bytes;
495 }
496
497 static void ipoctal_set_termios(struct tty_struct *tty,
498                                 struct ktermios *old_termios)
499 {
500         unsigned int cflag;
501         unsigned char mr1 = 0;
502         unsigned char mr2 = 0;
503         unsigned char csr = 0;
504         struct ipoctal_channel *channel = tty->driver_data;
505         speed_t baud;
506
507         cflag = tty->termios.c_cflag;
508
509         /* Disable and reset everything before change the setup */
510         iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr);
511         iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr);
512         iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr);
513         iowrite8(CR_CMD_RESET_ERR_STATUS, &channel->regs->w.cr);
514         iowrite8(CR_CMD_RESET_MR, &channel->regs->w.cr);
515
516         /* Set Bits per chars */
517         switch (cflag & CSIZE) {
518         case CS6:
519                 mr1 |= MR1_CHRL_6_BITS;
520                 break;
521         case CS7:
522                 mr1 |= MR1_CHRL_7_BITS;
523                 break;
524         case CS8:
525         default:
526                 mr1 |= MR1_CHRL_8_BITS;
527                 /* By default, select CS8 */
528                 tty->termios.c_cflag = (cflag & ~CSIZE) | CS8;
529                 break;
530         }
531
532         /* Set Parity */
533         if (cflag & PARENB)
534                 if (cflag & PARODD)
535                         mr1 |= MR1_PARITY_ON | MR1_PARITY_ODD;
536                 else
537                         mr1 |= MR1_PARITY_ON | MR1_PARITY_EVEN;
538         else
539                 mr1 |= MR1_PARITY_OFF;
540
541         /* Mark or space parity is not supported */
542         tty->termios.c_cflag &= ~CMSPAR;
543
544         /* Set stop bits */
545         if (cflag & CSTOPB)
546                 mr2 |= MR2_STOP_BITS_LENGTH_2;
547         else
548                 mr2 |= MR2_STOP_BITS_LENGTH_1;
549
550         /* Set the flow control */
551         switch (channel->board_id) {
552         case IPACK1_DEVICE_ID_SBS_OCTAL_232:
553                 if (cflag & CRTSCTS) {
554                         mr1 |= MR1_RxRTS_CONTROL_ON;
555                         mr2 |= MR2_TxRTS_CONTROL_OFF | MR2_CTS_ENABLE_TX_ON;
556                 } else {
557                         mr1 |= MR1_RxRTS_CONTROL_OFF;
558                         mr2 |= MR2_TxRTS_CONTROL_OFF | MR2_CTS_ENABLE_TX_OFF;
559                 }
560                 break;
561         case IPACK1_DEVICE_ID_SBS_OCTAL_422:
562                 mr1 |= MR1_RxRTS_CONTROL_OFF;
563                 mr2 |= MR2_TxRTS_CONTROL_OFF | MR2_CTS_ENABLE_TX_OFF;
564                 break;
565         case IPACK1_DEVICE_ID_SBS_OCTAL_485:
566                 mr1 |= MR1_RxRTS_CONTROL_OFF;
567                 mr2 |= MR2_TxRTS_CONTROL_ON | MR2_CTS_ENABLE_TX_OFF;
568                 break;
569         default:
570                 return;
571                 break;
572         }
573
574         baud = tty_get_baud_rate(tty);
575         tty_termios_encode_baud_rate(&tty->termios, baud, baud);
576
577         /* Set baud rate */
578         switch (baud) {
579         case 75:
580                 csr |= TX_CLK_75 | RX_CLK_75;
581                 break;
582         case 110:
583                 csr |= TX_CLK_110 | RX_CLK_110;
584                 break;
585         case 150:
586                 csr |= TX_CLK_150 | RX_CLK_150;
587                 break;
588         case 300:
589                 csr |= TX_CLK_300 | RX_CLK_300;
590                 break;
591         case 600:
592                 csr |= TX_CLK_600 | RX_CLK_600;
593                 break;
594         case 1200:
595                 csr |= TX_CLK_1200 | RX_CLK_1200;
596                 break;
597         case 1800:
598                 csr |= TX_CLK_1800 | RX_CLK_1800;
599                 break;
600         case 2000:
601                 csr |= TX_CLK_2000 | RX_CLK_2000;
602                 break;
603         case 2400:
604                 csr |= TX_CLK_2400 | RX_CLK_2400;
605                 break;
606         case 4800:
607                 csr |= TX_CLK_4800  | RX_CLK_4800;
608                 break;
609         case 9600:
610                 csr |= TX_CLK_9600  | RX_CLK_9600;
611                 break;
612         case 19200:
613                 csr |= TX_CLK_19200 | RX_CLK_19200;
614                 break;
615         case 38400:
616         default:
617                 csr |= TX_CLK_38400 | RX_CLK_38400;
618                 /* In case of default, we establish 38400 bps */
619                 tty_termios_encode_baud_rate(&tty->termios, 38400, 38400);
620                 break;
621         }
622
623         mr1 |= MR1_ERROR_CHAR;
624         mr1 |= MR1_RxINT_RxRDY;
625
626         /* Write the control registers */
627         iowrite8(mr1, &channel->regs->w.mr);
628         iowrite8(mr2, &channel->regs->w.mr);
629         iowrite8(csr, &channel->regs->w.csr);
630
631         /* Enable again the RX */
632         iowrite8(CR_ENABLE_RX, &channel->regs->w.cr);
633 }
634
635 static void ipoctal_hangup(struct tty_struct *tty)
636 {
637         unsigned long flags;
638         struct ipoctal_channel *channel = tty->driver_data;
639
640         if (channel == NULL)
641                 return;
642
643         spin_lock_irqsave(&channel->lock, flags);
644         channel->nb_bytes = 0;
645         channel->pointer_read = 0;
646         channel->pointer_write = 0;
647         spin_unlock_irqrestore(&channel->lock, flags);
648
649         tty_port_hangup(&channel->tty_port);
650
651         iowrite8(CR_DISABLE_RX | CR_DISABLE_TX, &channel->regs->w.cr);
652         iowrite8(CR_CMD_RESET_RX, &channel->regs->w.cr);
653         iowrite8(CR_CMD_RESET_TX, &channel->regs->w.cr);
654         iowrite8(CR_CMD_RESET_ERR_STATUS, &channel->regs->w.cr);
655         iowrite8(CR_CMD_RESET_MR, &channel->regs->w.cr);
656
657         clear_bit(ASYNCB_INITIALIZED, &channel->tty_port.flags);
658         wake_up_interruptible(&channel->tty_port.open_wait);
659 }
660
661 static const struct tty_operations ipoctal_fops = {
662         .ioctl =                NULL,
663         .open =                 ipoctal_open,
664         .close =                ipoctal_close,
665         .write =                ipoctal_write_tty,
666         .set_termios =          ipoctal_set_termios,
667         .write_room =           ipoctal_write_room,
668         .chars_in_buffer =      ipoctal_chars_in_buffer,
669         .get_icount =           ipoctal_get_icount,
670         .hangup =               ipoctal_hangup,
671 };
672
673 static int ipoctal_probe(struct ipack_device *dev)
674 {
675         int res;
676         struct ipoctal *ipoctal;
677
678         ipoctal = kzalloc(sizeof(struct ipoctal), GFP_KERNEL);
679         if (ipoctal == NULL)
680                 return -ENOMEM;
681
682         ipoctal->dev = dev;
683         res = ipoctal_inst_slot(ipoctal, dev->bus->bus_nr, dev->slot);
684         if (res)
685                 goto out_uninst;
686
687         dev_set_drvdata(&dev->dev, ipoctal);
688         return 0;
689
690 out_uninst:
691         kfree(ipoctal);
692         return res;
693 }
694
695 static void __ipoctal_remove(struct ipoctal *ipoctal)
696 {
697         int i;
698
699         ipoctal->dev->bus->ops->free_irq(ipoctal->dev);
700
701         for (i = 0; i < NR_CHANNELS; i++) {
702                 struct ipoctal_channel *channel = &ipoctal->channel[i];
703                 tty_unregister_device(ipoctal->tty_drv, i);
704                 tty_port_free_xmit_buf(&channel->tty_port);
705                 tty_port_destroy(&channel->tty_port);
706         }
707
708         tty_unregister_driver(ipoctal->tty_drv);
709         put_tty_driver(ipoctal->tty_drv);
710         kfree(ipoctal);
711 }
712
713 static void ipoctal_remove(struct ipack_device *idev)
714 {
715         __ipoctal_remove(dev_get_drvdata(&idev->dev));
716 }
717
718 static DEFINE_IPACK_DEVICE_TABLE(ipoctal_ids) = {
719         { IPACK_DEVICE(IPACK_ID_VERSION_1, IPACK1_VENDOR_ID_SBS,
720                         IPACK1_DEVICE_ID_SBS_OCTAL_232) },
721         { IPACK_DEVICE(IPACK_ID_VERSION_1, IPACK1_VENDOR_ID_SBS,
722                         IPACK1_DEVICE_ID_SBS_OCTAL_422) },
723         { IPACK_DEVICE(IPACK_ID_VERSION_1, IPACK1_VENDOR_ID_SBS,
724                         IPACK1_DEVICE_ID_SBS_OCTAL_485) },
725         { 0, },
726 };
727
728 MODULE_DEVICE_TABLE(ipack, ipoctal_ids);
729
730 static const struct ipack_driver_ops ipoctal_drv_ops = {
731         .probe  = ipoctal_probe,
732         .remove = ipoctal_remove,
733 };
734
735 static struct ipack_driver driver = {
736         .ops      = &ipoctal_drv_ops,
737         .id_table = ipoctal_ids,
738 };
739
740 static int __init ipoctal_init(void)
741 {
742         return ipack_driver_register(&driver, THIS_MODULE, KBUILD_MODNAME);
743 }
744
745 static void __exit ipoctal_exit(void)
746 {
747         ipack_driver_unregister(&driver);
748 }
749
750 MODULE_DESCRIPTION("IP-Octal 232, 422 and 485 device driver");
751 MODULE_LICENSE("GPL");
752
753 module_init(ipoctal_init);
754 module_exit(ipoctal_exit);