TOMOYO Linux Cross Reference Linux/drivers/serial/max3100.c

>

 

 

http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/serial/max3100.c

TOMOYO Linux Cross Reference
Linux /drivers /serial /max3100.c

 

Version: ~ [  linux-2.6.34-rc5-ccs-1.7.2  ]

Architecture: ~ [  i386  ] ~ [  alpha  ] ~ [  m68k  ] ~ [  mips  ] ~ [  ppc  ] ~ [  sparc  ] ~ [  sparc64  ]

 

 


 

  1
 /*


2 *
3 * Copyright (C) 2008 Christian Pellegrin <chripell@evolware.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 *
11 * Notes: the MAX3100 doesn't provide an interrupt on CTS so we have
12 * to use polling for flow control. TX empty IRQ is unusable, since
13 * writing conf clears FIFO buffer and we cannot have this interrupt
14 * always asking us for attention.
15 *
16 * Example platform data:
17
18 static struct plat_max3100 max3100_plat_data = {
19 .loopback = 0,
20 .crystal = 0,
21 .poll_time = 100,
22 };
23
24 static struct spi_board_info spi_board_info[] = {
25 {
26 .modalias = "max3100",
27 .platform_data = &max3100_plat_data,
28 .irq = IRQ_EINT12,
29 .max_speed_hz = 5*1000*1000,
30 .chip_select = 0,
31 },
32 };
33
34 * The initial minor number is 209 in the low-density serial port:
35 * mknod /dev/ttyMAX0 c 204 209
36 */
37
38 #define MAX3100_MAJOR 204
39 #define MAX3100_MINOR 209
40 /* 4 MAX3100s should be enough for everyone */
41 #define MAX_MAX3100 4
42
43 #include <linux/delay.h >
44 #include <linux/slab.h >
45 #include <linux/device.h >
46 #include <linux/serial_core.h >
47 #include <linux/serial.h >
48 #include <linux/spi/spi.h >
49 #include <linux/freezer.h >
50
51 #include <linux/serial_max3100.h >
52
53 #define MAX3100_C (1<<14)
54 #define MAX3100_D (0<<14)
55 #define MAX3100_W (1<<15)
56 #define MAX3100_RX (0<<15)
57
58 #define MAX3100_WC (MAX3100_W | MAX3100_C )
59 #define MAX3100_RC (MAX3100_RX | MAX3100_C )
60 #define MAX3100_WD (MAX3100_W | MAX3100_D )
61 #define MAX3100_RD (MAX3100_RX | MAX3100_D )
62 #define MAX3100_CMD (3 << 14)
63
64 #define MAX3100_T (1<<14)
65 #define MAX3100_R (1<<15)
66
67 #define MAX3100_FEN (1<<13)
68 #define MAX3100_SHDN (1<<12)
69 #define MAX3100_TM (1<<11)
70 #define MAX3100_RM (1<<10)
71 #define MAX3100_PM (1<<9)
72 #define MAX3100_RAM (1<<8)
73 #define MAX3100_IR (1<<7)
74 #define MAX3100_ST (1<<6)
75 #define MAX3100_PE (1<<5)
76 #define MAX3100_L (1<<4)
77 #define MAX3100_BAUD (0xf)
78
79 #define MAX3100_TE (1<<10)
80 #define MAX3100_RAFE (1<<10)
81 #define MAX3100_RTS (1<<9)
82 #define MAX3100_CTS (1<<9)
83 #define MAX3100_PT (1<<8)
84 #define MAX3100_DATA (0xff)
85
86 #define MAX3100_RT (MAX3100_R | MAX3100_T )
87 #define MAX3100_RTC (MAX3100_RT | MAX3100_CTS | MAX3100_RAFE )
88
89 /* the following simulate a status reg for ignore_status_mask */
90 #define MAX3100_STATUS_PE 1
91 #define MAX3100_STATUS_FE 2
92 #define MAX3100_STATUS_OE 4
93
94 struct max3100_port {
95 struct uart_port port ;
96 struct spi_device *spi ;
97
98 int cts; /* last CTS received for flow ctrl */
99 int tx_empty; /* last TX empty bit */
100
101 spinlock_t conf_lock; /* shared data */
102 int conf_commit; /* need to make changes */
103 int conf ; /* configuration for the MAX31000
104 * (bits 0-7, bits 8-11 are irqs) */
105 int rts_commit; /* need to change rts */
106 int rts ; /* rts status */
107 int baud ; /* current baud rate */
108
109 int parity ; /* keeps track if we should send parity */
110 #define MAX3100_PARITY_ON 1
111 #define MAX3100_PARITY_ODD 2
112 #define MAX3100_7BIT 4
113 int rx_enabled ; /* if we should rx chars */
114
115 int irq ; /* irq assigned to the max3100 */
116
117 int minor ; /* minor number */
118 int crystal; /* 1 if 3.6864Mhz crystal 0 for 1.8432 */
119 int loopback ; /* 1 if we are in loopback mode */
120
121 /* for handling irqs: need workqueue since we do spi_sync */
122 struct workqueue_struct *workqueue ;
123 struct work_struct work ;
124 /* set to 1 to make the workhandler exit as soon as possible */
125 int force_end_work;
126 /* need to know we are suspending to avoid deadlock on workqueue */
127 int suspending;
128
129 /* hook for suspending MAX3100 via dedicated pin */
130 void (*max3100_hw_suspend) (int suspend );
131
132 /* poll time (in ms) for ctrl lines */
133 int poll_time;
134 /* and its timer */
135 struct timer_list timer ;
136 };
137
138 static struct max3100_port *max3100s [MAX_MAX3100 ]; /* the chips */
139 static DEFINE_MUTEX (max3100s_lock); /* race on probe */
140
141 static int max3100_do_parity (struct max3100_port *s , u16 c )
142 {
143 int parity ;
144
145 if (s ->parity & MAX3100_PARITY_ODD )
146 parity = 1;
147 else
148 parity = 0;
149
150 if (s ->parity & MAX3100_7BIT )
151 c &= 0x7f;
152 else
153 c &= 0xff;
154
155 parity = parity ^ (hweight8 (c ) & 1);
156 return parity ;
157 }
158
159 static int max3100_check_parity (struct max3100_port *s , u16 c )
160 {
161 return max3100_do_parity (s , c ) == ((c >> 8) & 1);
162 }
163
164 static void max3100_calc_parity (struct max3100_port *s , u16 *c )
165 {
166 if (s ->parity & MAX3100_7BIT )
167 *c &= 0x7f;
168 else
169 *c &= 0xff;
170
171 if (s ->parity & MAX3100_PARITY_ON )
172 *c |= max3100_do_parity (s , *c ) << 8;
173 }
174
175 static void max3100_work (struct work_struct *w );
176
177 static void max3100_dowork (struct max3100_port *s )
178 {
179 if (!s ->force_end_work && !work_pending (&s ->work ) &&
180 !freezing (current ) && !s ->suspending)
181 queue_work (s ->workqueue , &s ->work );
182 }
183
184 static void max3100_timeout (unsigned long data )
185 {
186 struct max3100_port *s = (struct max3100_port *)data ;
187
188 if (s ->port .state ) {
189 max3100_dowork (s );
190 mod_timer (&s ->timer , jiffies + s ->poll_time);
191 }
192 }
193
194 static int max3100_sr (struct max3100_port *s , u16 tx, u16 *rx )
195 {
196 struct spi_message message ;
197 u16 etx, erx;
198 int status ;
199 struct spi_transfer tran = {
200 .tx_buf = &etx,
201 .rx_buf = &erx,
202 .len = 2,
203 };
204
205 etx = cpu_to_be16 (tx);
206 spi_message_init (&message );
207 spi_message_add_tail (&tran, &message );
208 status = spi_sync (s ->spi , &message );
209 if (status ) {
210 dev_warn (&s ->spi ->dev , "error while calling spi_sync/n" );
211 return -EIO ;
212 }
213 *rx = be16_to_cpu (erx);
214 s ->tx_empty = (*rx & MAX3100_T ) > 0;
215 dev_dbg (&s ->spi ->dev , "%04x - %04x/n" , tx, *rx );
216 return 0;
217 }
218
219 static int max3100_handlerx (struct max3100_port *s , u16 rx )
220 {
221 unsigned int ch , flg, status = 0;
222 int ret = 0, cts;
223
224 if (rx & MAX3100_R && s ->rx_enabled ) {
225 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
226 ch = rx & (s ->parity & MAX3100_7BIT ? 0x7f : 0xff);
227 if (rx & MAX3100_RAFE ) {
228 s ->port .icount .frame ++;
229 flg = TTY_FRAME ;
230 status |= MAX3100_STATUS_FE ;
231 } else {
232 if (s ->parity & MAX3100_PARITY_ON ) {
233 if (max3100_check_parity (s , rx )) {
234 s ->port .icount .rx ++;
235 flg = TTY_NORMAL ;
236 } else {
237 s ->port .icount .parity ++;
238 flg = TTY_PARITY ;
239 status |= MAX3100_STATUS_PE ;
240 }
241 } else {
242 s ->port .icount .rx ++;
243 flg = TTY_NORMAL ;
244 }
245 }
246 uart_insert_char (&s ->port , status , MAX3100_STATUS_OE , ch , flg);
247 ret = 1;
248 }
249
250 cts = (rx & MAX3100_CTS ) > 0;
251 if (s ->cts != cts) {
252 s ->cts = cts;
253 uart_handle_cts_change (&s ->port , cts ? TIOCM_CTS : 0);
254 }
255
256 return ret ;
257 }
258
259 static void max3100_work (struct work_struct *w )
260 {
261 struct max3100_port *s = container_of (w , struct max3100_port , work );
262 int rxchars;
263 u16 tx, rx ;
264 int conf , cconf, rts , crts;
265 struct circ_buf *xmit = &s ->port .state ->xmit;
266
267 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
268
269 rxchars = 0;
270 do {
271 spin_lock (&s ->conf_lock);
272 conf = s ->conf ;
273 cconf = s ->conf_commit;
274 s ->conf_commit = 0;
275 rts = s ->rts ;
276 crts = s ->rts_commit;
277 s ->rts_commit = 0;
278 spin_unlock (&s ->conf_lock);
279 if (cconf)
280 max3100_sr (s , MAX3100_WC | conf , &rx );
281 if (crts) {
282 max3100_sr (s , MAX3100_WD | MAX3100_TE |
283 (s ->rts ? MAX3100_RTS : 0), &rx );
284 rxchars += max3100_handlerx (s , rx );
285 }
286
287 max3100_sr (s , MAX3100_RD , &rx );
288 rxchars += max3100_handlerx (s , rx );
289
290 if (rx & MAX3100_T ) {
291 tx = 0xffff;
292 if (s ->port .x_char) {
293 tx = s ->port .x_char;
294 s ->port .icount .tx++;
295 s ->port .x_char = 0;
296 } else if (!uart_circ_empty (xmit) &&
297 !uart_tx_stopped (&s ->port )) {
298 tx = xmit->buf [xmit->tail ];
299 xmit->tail = (xmit->tail + 1) &
300 (UART_XMIT_SIZE - 1);
301 s ->port .icount .tx++;
302 }
303 if (tx != 0xffff) {
304 max3100_calc_parity (s , &tx);
305 tx |= MAX3100_WD | (s ->rts ? MAX3100_RTS : 0);
306 max3100_sr (s , tx, &rx );
307 rxchars += max3100_handlerx (s , rx );
308 }
309 }
310
311 if (rxchars > 16 && s ->port .state ->port .tty != NULL ) {
312 tty_flip_buffer_push (s ->port .state ->port .tty );
313 rxchars = 0;
314 }
315 if (uart_circ_chars_pending (xmit) < WAKEUP_CHARS )
316 uart_write_wakeup (&s ->port );
317
318 } while (!s ->force_end_work &&
319 !freezing (current ) &&
320 ((rx & MAX3100_R ) ||
321 (!uart_circ_empty (xmit) &&
322 !uart_tx_stopped (&s ->port ))));
323
324 if (rxchars > 0 && s ->port .state ->port .tty != NULL )
325 tty_flip_buffer_push (s ->port .state ->port .tty );
326 }
327
328 static irqreturn_t max3100_irq (int irqno, void *dev_id )
329 {
330 struct max3100_port *s = dev_id ;
331
332 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
333
334 max3100_dowork (s );
335 return IRQ_HANDLED ;
336 }
337
338 static void max3100_enable_ms (struct uart_port *port )
339 {
340 struct max3100_port *s = container_of (port ,
341 struct max3100_port ,
342 port );
343
344 if (s ->poll_time > 0)
345 mod_timer (&s ->timer , jiffies );
346 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
347 }
348
349 static void max3100_start_tx (struct uart_port *port )
350 {
351 struct max3100_port *s = container_of (port ,
352 struct max3100_port ,
353 port );
354
355 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
356
357 max3100_dowork (s );
358 }
359
360 static void max3100_stop_rx (struct uart_port *port )
361 {
362 struct max3100_port *s = container_of (port ,
363 struct max3100_port ,
364 port );
365
366 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
367
368 s ->rx_enabled = 0;
369 spin_lock (&s ->conf_lock);
370 s ->conf &= ~MAX3100_RM;
371 s ->conf_commit = 1;
372 spin_unlock (&s ->conf_lock);
373 max3100_dowork (s );
374 }
375
376 static unsigned int max3100_tx_empty (struct uart_port *port )
377 {
378 struct max3100_port *s = container_of (port ,
379 struct max3100_port ,
380 port );
381
382 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
383
384 /* may not be truly up-to-date */
385 max3100_dowork (s );
386 return s ->tx_empty;
387 }
388
389 static unsigned int max3100_get_mctrl (struct uart_port *port )
390 {
391 struct max3100_port *s = container_of (port ,
392 struct max3100_port ,
393 port );
394
395 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
396
397 /* may not be truly up-to-date */
398 max3100_dowork (s );
399 /* always assert DCD and DSR since these lines are not wired */
400 return (s ->cts ? TIOCM_CTS : 0) | TIOCM_DSR | TIOCM_CAR ;
401 }
402
403 static void max3100_set_mctrl (struct uart_port *port , unsigned int mctrl)
404 {
405 struct max3100_port *s = container_of (port ,
406 struct max3100_port ,
407 port );
408 int rts ;
409
410 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
411
412 rts = (mctrl & TIOCM_RTS ) > 0;
413
414 spin_lock (&s ->conf_lock);
415 if (s ->rts != rts ) {
416 s ->rts = rts ;
417 s ->rts_commit = 1;
418 max3100_dowork (s );
419 }
420 spin_unlock (&s ->conf_lock);
421 }
422
423 static void
424 max3100_set_termios (struct uart_port *port , struct ktermios *termios ,
425 struct ktermios *old)
426 {
427 struct max3100_port *s = container_of (port ,
428 struct max3100_port ,
429 port );
430 int baud = 0;
431 unsigned cflag;
432 u32 param_new, param_mask, parity = 0;
433 struct tty_struct *tty = s ->port .state ->port .tty ;
434
435 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
436 if (!tty )
437 return;
438
439 cflag = termios ->c_cflag;
440 param_new = 0;
441 param_mask = 0;
442
443 baud = tty_get_baud_rate (tty );
444 param_new = s ->conf & MAX3100_BAUD ;
445 switch (baud ) {
446 case 300:
447 if (s ->crystal)
448 baud = s ->baud ;
449 else
450 param_new = 15;
451 break;
452 case 600:
453 param_new = 14 + s ->crystal;
454 break;
455 case 1200:
456 param_new = 13 + s ->crystal;
457 break;
458 case 2400:
459 param_new = 12 + s ->crystal;
460 break;
461 case 4800:
462 param_new = 11 + s ->crystal;
463 break;
464 case 9600:
465 param_new = 10 + s ->crystal;
466 break;
467 case 19200:
468 param_new = 9 + s ->crystal;
469 break;
470 case 38400:
471 param_new = 8 + s ->crystal;
472 break;
473 case 57600:
474 param_new = 1 + s ->crystal;
475 break;
476 case 115200:
477 param_new = 0 + s ->crystal;
478 break;
479 case 230400:
480 if (s ->crystal)
481 param_new = 0;
482 else
483 baud = s ->baud ;
484 break;
485 default:
486 baud = s ->baud ;
487 }
488 tty_encode_baud_rate (tty , baud , baud );
489 s ->baud = baud ;
490 param_mask |= MAX3100_BAUD ;
491
492 if ((cflag & CSIZE ) == CS8 ) {
493 param_new &= ~MAX3100_L;
494 parity &= ~MAX3100_7BIT;
495 } else {
496 param_new |= MAX3100_L ;
497 parity |= MAX3100_7BIT ;
498 cflag = (cflag & ~CSIZE) | CS7 ;
499 }
500 param_mask |= MAX3100_L ;
501
502 if (cflag & CSTOPB )
503 param_new |= MAX3100_ST ;
504 else
505 param_new &= ~MAX3100_ST;
506 param_mask |= MAX3100_ST ;
507
508 if (cflag & PARENB ) {
509 param_new |= MAX3100_PE ;
510 parity |= MAX3100_PARITY_ON ;
511 } else {
512 param_new &= ~MAX3100_PE;
513 parity &= ~MAX3100_PARITY_ON;
514 }
515 param_mask |= MAX3100_PE ;
516
517 if (cflag & PARODD )
518 parity |= MAX3100_PARITY_ODD ;
519 else
520 parity &= ~MAX3100_PARITY_ODD;
521
522 /* mask termios capabilities we don't support */
523 cflag &= ~CMSPAR;
524 termios ->c_cflag = cflag;
525
526 s ->port .ignore_status_mask = 0;
527 if (termios ->c_iflag & IGNPAR )
528 s ->port .ignore_status_mask |=
529 MAX3100_STATUS_PE | MAX3100_STATUS_FE |
530 MAX3100_STATUS_OE ;
531
532 /* we are sending char from a workqueue so enable */
533 s ->port .state ->port .tty ->low_latency = 1;
534
535 if (s ->poll_time > 0)
536 del_timer_sync (&s ->timer );
537
538 uart_update_timeout (port , termios ->c_cflag, baud );
539
540 spin_lock (&s ->conf_lock);
541 s ->conf = (s ->conf & ~param_mask) | (param_new & param_mask);
542 s ->conf_commit = 1;
543 s ->parity = parity ;
544 spin_unlock (&s ->conf_lock);
545 max3100_dowork (s );
546
547 if (UART_ENABLE_MS (&s ->port , termios ->c_cflag))
548 max3100_enable_ms (&s ->port );
549 }
550
551 static void max3100_shutdown (struct uart_port *port )
552 {
553 struct max3100_port *s = container_of (port ,
554 struct max3100_port ,
555 port );
556
557 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
558
559 if (s ->suspending)
560 return;
561
562 s ->force_end_work = 1;
563
564 if (s ->poll_time > 0)
565 del_timer_sync (&s ->timer );
566
567 if (s ->workqueue ) {
568 flush_workqueue (s ->workqueue );
569 destroy_workqueue (s ->workqueue );
570 s ->workqueue = NULL ;
571 }
572 if (s ->irq )
573 free_irq (s ->irq , s );
574
575 /* set shutdown mode to save power */
576 if (s ->max3100_hw_suspend)
577 s ->max3100_hw_suspend(1);
578 else {
579 u16 tx, rx ;
580
581 tx = MAX3100_WC | MAX3100_SHDN ;
582 max3100_sr (s , tx, &rx );
583 }
584 }
585
586 static int max3100_startup (struct uart_port *port )
587 {
588 struct max3100_port *s = container_of (port ,
589 struct max3100_port ,
590 port );
591 char b [12];
592
593 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
594
595 s ->conf = MAX3100_RM ;
596 s ->baud = s ->crystal ? 230400 : 115200;
597 s ->rx_enabled = 1;
598
599 if (s ->suspending)
600 return 0;
601
602 s ->force_end_work = 0;
603 s ->parity = 0;
604 s ->rts = 0;
605
606 sprintf (b , "max3100-%d" , s ->minor );
607 s ->workqueue = create_freezeable_workqueue (b );
608 if (!s ->workqueue ) {
609 dev_warn (&s ->spi ->dev , "cannot create workqueue/n" );
610 return -EBUSY ;
611 }
612 INIT_WORK (&s ->work , max3100_work );
613
614 if (request_irq (s ->irq , max3100_irq ,
615 IRQF_TRIGGER_FALLING , "max3100" , s ) < 0) {
616 dev_warn (&s ->spi ->dev , "cannot allocate irq %d/n" , s ->irq );
617 s ->irq = 0;
618 destroy_workqueue (s ->workqueue );
619 s ->workqueue = NULL ;
620 return -EBUSY ;
621 }
622
623 if (s ->loopback ) {
624 u16 tx, rx ;
625 tx = 0x4001;
626 max3100_sr (s , tx, &rx );
627 }
628
629 if (s ->max3100_hw_suspend)
630 s ->max3100_hw_suspend(0);
631 s ->conf_commit = 1;
632 max3100_dowork (s );
633 /* wait for clock to settle */
634 msleep (50);
635
636 max3100_enable_ms (&s ->port );
637
638 return 0;
639 }
640
641 static const char *max3100_type (struct uart_port *port )
642 {
643 struct max3100_port *s = container_of (port ,
644 struct max3100_port ,
645 port );
646
647 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
648
649 return s ->port .type == PORT_MAX3100 ? "MAX3100" : NULL ;
650 }
651
652 static void max3100_release_port (struct uart_port *port )
653 {
654 struct max3100_port *s = container_of (port ,
655 struct max3100_port ,
656 port );
657
658 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
659 }
660
661 static void max3100_config_port (struct uart_port *port , int flags )
662 {
663 struct max3100_port *s = container_of (port ,
664 struct max3100_port ,
665 port );
666
667 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
668
669 if (flags & UART_CONFIG_TYPE )
670 s ->port .type = PORT_MAX3100 ;
671 }
672
673 static int max3100_verify_port (struct uart_port *port ,
674 struct serial_struct *ser )
675 {
676 struct max3100_port *s = container_of (port ,
677 struct max3100_port ,
678 port );
679 int ret = -EINVAL ;
680
681 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
682
683 if (ser ->type == PORT_UNKNOWN || ser ->type == PORT_MAX3100 )
684 ret = 0;
685 return ret ;
686 }
687
688 static void max3100_stop_tx (struct uart_port *port )
689 {
690 struct max3100_port *s = container_of (port ,
691 struct max3100_port ,
692 port );
693
694 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
695 }
696
697 static int max3100_request_port (struct uart_port *port )
698 {
699 struct max3100_port *s = container_of (port ,
700 struct max3100_port ,
701 port );
702
703 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
704 return 0;
705 }
706
707 static void max3100_break_ctl (struct uart_port *port , int break_state )
708 {
709 struct max3100_port *s = container_of (port ,
710 struct max3100_port ,
711 port );
712
713 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
714 }
715
716 static struct uart_ops max3100_ops = {
717 .tx_empty = max3100_tx_empty ,
718 .set_mctrl = max3100_set_mctrl ,
719 .get_mctrl = max3100_get_mctrl ,
720 .stop_tx = max3100_stop_tx ,
721 .start_tx = max3100_start_tx ,
722 .stop_rx = max3100_stop_rx ,
723 .enable_ms = max3100_enable_ms ,
724 .break_ctl = max3100_break_ctl ,
725 .startup = max3100_startup ,
726 .shutdown = max3100_shutdown ,
727 .set_termios = max3100_set_termios ,
728 .type = max3100_type ,
729 .release_port = max3100_release_port ,
730 .request_port = max3100_request_port ,
731 .config_port = max3100_config_port ,
732 .verify_port = max3100_verify_port ,
733 };
734
735 static struct uart_driver max3100_uart_driver = {
736 .owner = THIS_MODULE ,
737 .driver_name = "ttyMAX" ,
738 .dev_name = "ttyMAX" ,
739 .major = MAX3100_MAJOR ,
740 .minor = MAX3100_MINOR ,
741 .nr = MAX_MAX3100 ,
742 };
743 static int uart_driver_registered ;
744
745 static int __devinit max3100_probe (struct spi_device *spi )
746 {
747 int i , retval;
748 struct plat_max3100 *pdata ;
749 u16 tx, rx ;
750
751 mutex_lock (&max3100s_lock);
752
753 if (!uart_driver_registered ) {
754 uart_driver_registered = 1;
755 retval = uart_register_driver (&max3100_uart_driver );
756 if (retval) {
757 printk (KERN_ERR "Couldn't register max3100 uart driver/n" );
758 mutex_unlock (&max3100s_lock);
759 return retval;
760 }
761 }
762
763 for (i = 0; i < MAX_MAX3100 ; i ++)
764 if (!max3100s [i ])
765 break;
766 if (i == MAX_MAX3100 ) {
767 dev_warn (&spi ->dev , "too many MAX3100 chips/n" );
768 mutex_unlock (&max3100s_lock);
769 return -ENOMEM ;
770 }
771
772 max3100s [i ] = kzalloc (sizeof(struct max3100_port ), GFP_KERNEL );
773 if (!max3100s [i ]) {
774 dev_warn (&spi ->dev ,
775 "kmalloc for max3100 structure %d failed!/n" , i );
776 mutex_unlock (&max3100s_lock);
777 return -ENOMEM ;
778 }
779 max3100s [i ]->spi = spi ;
780 max3100s [i ]->irq = spi ->irq ;
781 spin_lock_init (&max3100s [i ]->conf_lock);
782 dev_set_drvdata (&spi ->dev , max3100s [i ]);
783 pdata = spi ->dev .platform_data ;
784 max3100s [i ]->crystal = pdata ->crystal;
785 max3100s [i ]->loopback = pdata ->loopback ;
786 max3100s [i ]->poll_time = pdata ->poll_time * HZ / 1000;
787 if (pdata ->poll_time > 0 && max3100s [i ]->poll_time == 0)
788 max3100s [i ]->poll_time = 1;
789 max3100s [i ]->max3100_hw_suspend = pdata ->max3100_hw_suspend;
790 max3100s [i ]->minor = i ;
791 init_timer (&max3100s [i ]->timer );
792 max3100s [i ]->timer .function = max3100_timeout ;
793 max3100s [i ]->timer .data = (unsigned long) max3100s [i ];
794
795 dev_dbg (&spi ->dev , "%s: adding port %d/n" , __func__ , i );
796 max3100s [i ]->port .irq = max3100s [i ]->irq ;
797 max3100s [i ]->port .uartclk = max3100s [i ]->crystal ? 3686400 : 1843200;
798 max3100s [i ]->port .fifosize = 16;
799 max3100s [i ]->port .ops = &max3100_ops ;
800 max3100s [i ]->port .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF ;
801 max3100s [i ]->port .line = i ;
802 max3100s [i ]->port .type = PORT_MAX3100 ;
803 max3100s [i ]->port .dev = &spi ->dev ;
804 retval = uart_add_one_port (&max3100_uart_driver , &max3100s [i ]->port );
805 if (retval < 0)
806 dev_warn (&spi ->dev ,
807 "uart_add_one_port failed for line %d with error %d/n" ,
808 i , retval);
809
810 /* set shutdown mode to save power. Will be woken-up on open */
811 if (max3100s [i ]->max3100_hw_suspend)
812 max3100s [i ]->max3100_hw_suspend(1);
813 else {
814 tx = MAX3100_WC | MAX3100_SHDN ;
815 max3100_sr (max3100s [i ], tx, &rx );
816 }
817 mutex_unlock (&max3100s_lock);
818 return 0;
819 }
820
821 static int __devexit max3100_remove (struct spi_device *spi )
822 {
823 struct max3100_port *s = dev_get_drvdata (&spi ->dev );
824 int i ;
825
826 mutex_lock (&max3100s_lock);
827
828 /* find out the index for the chip we are removing */
829 for (i = 0; i < MAX_MAX3100 ; i ++)
830 if (max3100s [i ] == s )
831 break;
832
833 dev_dbg (&spi ->dev , "%s: removing port %d/n" , __func__ , i );
834 uart_remove_one_port (&max3100_uart_driver , &max3100s [i ]->port );
835 kfree (max3100s [i ]);
836 max3100s [i ] = NULL ;
837
838 /* check if this is the last chip we have */
839 for (i = 0; i < MAX_MAX3100 ; i ++)
840 if (max3100s [i ]) {
841 mutex_unlock (&max3100s_lock);
842 return 0;
843 }
844 pr_debug ("removing max3100 driver/n" );
845 uart_unregister_driver (&max3100_uart_driver );
846
847 mutex_unlock (&max3100s_lock);
848 return 0;
849 }
850
851 #ifdef CONFIG_PM
852
853 static int max3100_suspend (struct spi_device *spi , pm_message_t state )
854 {
855 struct max3100_port *s = dev_get_drvdata (&spi ->dev );
856
857 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
858
859 disable_irq (s ->irq );
860
861 s ->suspending = 1;
862 uart_suspend_port (&max3100_uart_driver , &s ->port );
863
864 if (s ->max3100_hw_suspend)
865 s ->max3100_hw_suspend(1);
866 else {
867 /* no HW suspend, so do SW one */
868 u16 tx, rx ;
869
870 tx = MAX3100_WC | MAX3100_SHDN ;
871 max3100_sr (s , tx, &rx );
872 }
873 return 0;
874 }
875
876 static int max3100_resume (struct spi_device *spi )
877 {
878 struct max3100_port *s = dev_get_drvdata (&spi ->dev );
879
880 dev_dbg (&s ->spi ->dev , "%s/n" , __func__ );
881
882 if (s ->max3100_hw_suspend)
883 s ->max3100_hw_suspend(0);
884 uart_resume_port (&max3100_uart_driver , &s ->port );
885 s ->suspending = 0;
886
887 enable_irq (s ->irq );
888
889 s ->conf_commit = 1;
890 if (s ->workqueue )
891 max3100_dowork (s );
892
893 return 0;
894 }
895
896 #else
897 #define max3100_suspend NULL
898 #define max3100_resume NULL
899 #endif
900
901 static struct spi_driver max3100_driver = {
902 .driver = {
903 .name = "max3100" ,
904 .bus = &spi_bus_type ,
905 .owner = THIS_MODULE ,
906 },
907
908 .probe = max3100_probe ,
909 .remove = __devexit_p (max3100_remove ),
910 .suspend = max3100_suspend ,
911 .resume = max3100_resume ,
912 };
913
914 static int __init max3100_init (void)
915 {
916 return spi_register_driver (&max3100_driver );
917 }
918 module_init (max3100_init );
919
920 static void __exit max3100_exit (void)
921 {
922 spi_unregister_driver (&max3100_driver );
923 }
924 module_exit (max3100_exit );
925
926 MODULE_DESCRIPTION ("MAX3100 driver" );
927 MODULE_AUTHOR ("Christian Pellegrin <chripell@evolware.org>" );
928 MODULE_LICENSE ("GPL" );
929 MODULE_ALIAS ("spi:max3100" );
930

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值