2 * Simple synchronous serial port driver for ETRAX 100LX.
4 * Synchronous serial ports are used for continous streamed data like audio.
5 * The default setting for this driver is compatible with the STA 013 MP3
6 * decoder. The driver can easily be tuned to fit other audio encoder/decoders
9 * Copyright (c) 2001 Axis Communications AB
11 * Author: Mikael Starvik
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/config.h>
17 #include <linux/types.h>
18 #include <linux/errno.h>
19 #include <linux/major.h>
20 #include <linux/sched.h>
21 #include <linux/slab.h>
22 #include <linux/interrupt.h>
23 #include <linux/init.h>
24 #include <linux/timer.h>
27 #include <asm/svinto.h>
28 #include <asm/uaccess.h>
29 #include <asm/system.h>
30 #include <asm/sync_serial.h>
32 /* The receiver is a bit tricky beacuse of the continous stream of data. */
34 /* Two DMA descriptors are linked together. Each DMA descriptor is */
35 /* responsible for one half of a common buffer. */
37 /* ------------------------------ */
38 /* | ---------- ---------- | */
39 /* --> | Descr1 |-->| Descr2 |--- */
40 /* ---------- ---------- */
43 /* ----------------------------- */
45 /* ----------------------------- */
49 /* If the application keeps up the pace readp will be right after writep.*/
50 /* If the application can't keep the pace we have to throw away data. */
51 /* The idea is that readp should be ready with the data pointed out by */
52 /* Descr1 when the DMA has filled in Descr2. Otherwise we will discard */
53 /* the rest of the data pointed out by Descr1 and set readp to the start */
56 #define SYNC_SERIAL_MAJOR 125
58 /* IN_BUFFER_SIZE should be a multiple of 6 to make sure that 24 bit */
59 /* words can be handled */
61 #define IN_BUFFER_SIZE 12288
62 #define OUT_BUFFER_SIZE 4096
64 #define DEFAULT_FRAME_RATE 0
65 #define DEFAULT_WORD_RATE 7
69 /* Define some macros to access ETRAX 100 registers */
70 #define SETF(var, reg, field, val) var = (var & ~IO_MASK(##reg##, field)) | \
71 IO_FIELD(##reg##, field, val)
72 #define SETS(var, reg, field, val) var = (var & ~IO_MASK(##reg##, field)) | \
73 IO_STATE(##reg##, field, val)
75 typedef struct sync_port
77 /* Etrax registers and bits*/
78 volatile unsigned * const status
;
79 volatile unsigned * const ctrl_data
;
80 volatile unsigned * const output_dma_first
;
81 volatile unsigned char * const output_dma_cmd
;
82 volatile unsigned char * const output_dma_clr_irq
;
83 volatile unsigned * const input_dma_first
;
84 volatile unsigned char * const input_dma_cmd
;
85 volatile unsigned char * const input_dma_clr_irq
;
86 volatile unsigned * const data_out
;
87 volatile unsigned * const data_in
;
88 char data_avail_bit
; /* In R_IRQ_MASK1_RD */
89 char transmitter_ready_bit
; /* In R_IRQ_MASK1_RD */
90 char ready_irq_bit
; /* In R_IRQ_MASK1_SET and R_IRQ_MASK1_CLR */
91 char input_dma_descr_bit
; /* In R_IRQ_MASK2_RD */
92 char output_dma_bit
; /* In R_IRQ_MASK2_RD */
94 int enabled
; /* 1 if port is enabled */
95 int use_dma
; /* 1 if port uses dma */
96 int port_nbr
; /* Port 0 or 1 */
97 unsigned ctrl_data_shadow
; /* Register shadow */
98 char busy
; /* 1 if port is busy */
99 wait_queue_head_t out_wait_q
;
100 wait_queue_head_t in_wait_q
;
101 struct etrax_dma_descr out_descr
;
102 struct etrax_dma_descr in_descr1
;
103 struct etrax_dma_descr in_descr2
;
104 char out_buffer
[OUT_BUFFER_SIZE
];
105 int out_count
; /* Remaining bytes for current transfer */
106 char* outp
; /* Current position in out_buffer */
107 char in_buffer
[IN_BUFFER_SIZE
];
108 volatile char* readp
; /* Next byte to be read by application */
109 volatile char* writep
; /* Next byte to be written by etrax */
110 int odd_output
; /* 1 if writing odd nible in 12 bit mode */
111 int odd_input
; /* 1 if reading odd nible in 12 bit mode */
115 static int etrax_sync_serial_init(void);
116 static void initialize_port(int portnbr
);
117 static int sync_serial_open(struct inode
*, struct file
*);
118 static int sync_serial_release(struct inode
*, struct file
*);
119 static int sync_serial_ioctl(struct inode
*, struct file
*,
120 unsigned int cmd
, unsigned long arg
);
121 static ssize_t
sync_serial_write(struct file
* file
, const char * buf
,
122 size_t count
, loff_t
*ppos
);
123 static ssize_t
sync_serial_manual_write(struct file
* file
, const char * buf
,
124 size_t count
, loff_t
*ppos
);
125 static ssize_t
sync_serial_read(struct file
*file
, char *buf
,
126 size_t count
, loff_t
*ppos
);
127 static void send_word(sync_port
* port
);
128 static void start_dma(struct sync_port
*port
, const char* data
, int count
);
129 static void start_dma_in(sync_port
* port
);
130 static void tr_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
);
131 static void rx_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
);
132 static void manual_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
);
135 static struct sync_port ports
[]=
138 R_SYNC_SERIAL1_STATUS
, /* status */
139 R_SYNC_SERIAL1_CTRL
, /* ctrl_data */
140 R_DMA_CH8_FIRST
, /* output_dma_first */
141 R_DMA_CH8_CMD
, /* output_dma_cmd */
142 R_DMA_CH8_CLR_INTR
, /* output_dma_clr_irq */
143 R_DMA_CH9_FIRST
, /* input_dma_first */
144 R_DMA_CH9_CMD
, /* input_dma_cmd */
145 R_DMA_CH9_CLR_INTR
, /* input_dma_clr_irq */
146 R_SYNC_SERIAL1_TR_DATA
, /* data_out */
147 R_SYNC_SERIAL1_REC_DATA
,/* data in */
148 IO_BITNR(R_IRQ_MASK1_RD
, ser1_data
), /* data_avail_bit */
149 IO_BITNR(R_IRQ_MASK1_RD
, ser1_ready
), /* transmitter_ready_bit */
150 IO_BITNR(R_IRQ_MASK1_SET
, ser1_ready
), /* ready_irq_bit */
151 IO_BITNR(R_IRQ_MASK2_RD
, dma9_descr
), /* input_dma_descr_bit */
152 IO_BITNR(R_IRQ_MASK2_RD
, dma8_eop
), /* output_dma_bit */
155 R_SYNC_SERIAL3_STATUS
, /* status */
156 R_SYNC_SERIAL3_CTRL
, /* ctrl_data */
157 R_DMA_CH4_FIRST
, /* output_dma_first */
158 R_DMA_CH4_CMD
, /* output_dma_cmd */
159 R_DMA_CH4_CLR_INTR
, /* output_dma_clr_irq */
160 R_DMA_CH5_FIRST
, /* input_dma_first */
161 R_DMA_CH5_CMD
, /* input_dma_cmd */
162 R_DMA_CH5_CLR_INTR
, /* input_dma_clr_irq */
163 R_SYNC_SERIAL3_TR_DATA
, /* data_out */
164 R_SYNC_SERIAL3_REC_DATA
,/* data in */
165 IO_BITNR(R_IRQ_MASK1_RD
, ser3_data
), /* data_avail_bit */
166 IO_BITNR(R_IRQ_MASK1_RD
, ser3_ready
), /* transmitter_ready_bit */
167 IO_BITNR(R_IRQ_MASK1_SET
, ser3_ready
), /* ready_irq_bit */
168 IO_BITNR(R_IRQ_MASK2_RD
, dma5_descr
), /* input_dma_descr_bit */
169 IO_BITNR(R_IRQ_MASK2_RD
, dma4_eop
), /* output_dma_bit */
173 /* Register shadows */
174 static unsigned sync_serial_prescale_shadow
= 0;
175 static unsigned gen_config_ii_shadow
= 0;
177 #define NUMBER_OF_PORTS (sizeof(ports)/sizeof(sync_port))
179 static struct file_operations sync_serial_fops
= {
180 .owner
= THIS_MODULE
,
181 .write
= sync_serial_write
,
182 .read
= sync_serial_read
,
183 .ioctl
= sync_serial_ioctl
,
184 .open
= sync_serial_open
,
185 .release
= sync_serial_release
188 static int __init
etrax_sync_serial_init(void)
190 ports
[0].enabled
= 0;
191 ports
[1].enabled
= 0;
193 if (register_chrdev(SYNC_SERIAL_MAJOR
,"sync serial", &sync_serial_fops
) <0 )
195 printk("unable to get major for synchronous serial port\n");
199 /* Deselect synchronous serial ports */
200 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode1
, async
);
201 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode3
, async
);
202 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, ser3
, select
);
203 *R_GEN_CONFIG_II
= gen_config_ii_shadow
;
205 /* Initialize Ports */
206 #if defined(CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT0)
207 ports
[0].enabled
= 1;
208 SETS(port_pb_i2c_shadow
, R_PORT_PB_I2C
, syncser1
, ss1extra
);
209 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode1
, sync
);
210 #if defined(CONFIG_ETRAX_SYNCHRONOUS_SERIAL0_DMA)
211 ports
[0].use_dma
= 1;
213 if(request_irq(24, tr_interrupt
, 0, "synchronous serial 1 dma tr", &ports
[0]))
214 panic("Can't allocate sync serial port 1 IRQ");
215 if(request_irq(25, rx_interrupt
, 0, "synchronous serial 1 dma rx", &ports
[0]))
216 panic("Can't allocate sync serial port 1 IRQ");
217 RESET_DMA(8); WAIT_DMA(8);
218 RESET_DMA(9); WAIT_DMA(9);
219 *R_DMA_CH8_CLR_INTR
= IO_STATE(R_DMA_CH8_CLR_INTR
, clr_eop
, do) |
220 IO_STATE(R_DMA_CH8_CLR_INTR
, clr_descr
, do);
221 *R_DMA_CH9_CLR_INTR
= IO_STATE(R_DMA_CH9_CLR_INTR
, clr_eop
, do) |
222 IO_STATE(R_DMA_CH9_CLR_INTR
, clr_descr
, do);
224 IO_STATE(R_IRQ_MASK2_SET
, dma8_eop
, set
) |
225 IO_STATE(R_IRQ_MASK2_SET
, dma8_descr
, set
) |
226 IO_STATE(R_IRQ_MASK2_SET
, dma9_descr
, set
);
227 start_dma_in(&ports
[0]);
229 ports
[0].use_dma
= 0;
231 if (request_irq(8, manual_interrupt
, SA_SHIRQ
, "synchronous serial manual irq", &ports
[0]))
232 panic("Can't allocate sync serial manual irq");
233 *R_IRQ_MASK1_SET
= IO_STATE(R_IRQ_MASK1_SET
, ser1_data
, set
);
237 #if defined(CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT1)
238 ports
[1].enabled
= 1;
239 SETS(port_pb_i2c_shadow
, R_PORT_PB_I2C
, syncser3
, ss3extra
);
240 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode3
, sync
);
241 #if defined(CONFIG_ETRAX_SYNCHRONOUS_SERIAL1_DMA)
242 ports
[1].use_dma
= 1;
244 if(request_irq(20, tr_interrupt
, 0, "synchronous serial 3 dma tr", &ports
[1]))
245 panic("Can't allocate sync serial port 1 IRQ");
246 if(request_irq(21, rx_interrupt
, 0, "synchronous serial 3 dma rx", &ports
[1]))
247 panic("Can't allocate sync serial port 1 IRQ");
248 RESET_DMA(4); WAIT_DMA(4);
249 RESET_DMA(5); WAIT_DMA(5);
250 *R_DMA_CH4_CLR_INTR
= IO_STATE(R_DMA_CH4_CLR_INTR
, clr_eop
, do) |
251 IO_STATE(R_DMA_CH4_CLR_INTR
, clr_descr
, do);
252 *R_DMA_CH5_CLR_INTR
= IO_STATE(R_DMA_CH5_CLR_INTR
, clr_eop
, do) |
253 IO_STATE(R_DMA_CH5_CLR_INTR
, clr_descr
, do);
255 IO_STATE(R_IRQ_MASK2_SET
, dma4_eop
, set
) |
256 IO_STATE(R_IRQ_MASK2_SET
, dma4_descr
, set
) |
257 IO_STATE(R_IRQ_MASK2_SET
, dma5_descr
, set
);
258 start_dma_in(&ports
[1]);
260 ports
[1].use_dma
= 0;
262 if (port
[0].use_dma
) /* Port 0 uses dma, we must manual allocate IRQ */
264 if (request_irq(8, manual_interrupt
, SA_SHIRQ
, "synchronous serial manual irq", &ports
[1]))
265 panic("Can't allocate sync serial manual irq");
267 *R_IRQ_MASK1_SET
= IO_STATE(R_IRQ_MASK1_SET
, ser3_data
, set
);
271 *R_PORT_PB_I2C
= port_pb_i2c_shadow
; /* Use PB4/PB7 */
274 *R_SYNC_SERIAL_PRESCALE
= sync_serial_prescale_shadow
= (
275 IO_STATE(R_SYNC_SERIAL_PRESCALE
, clk_sel_u1
, codec
) |
276 IO_STATE(R_SYNC_SERIAL_PRESCALE
, word_stb_sel_u1
, external
) |
277 IO_STATE(R_SYNC_SERIAL_PRESCALE
, clk_sel_u3
, codec
) |
278 IO_STATE(R_SYNC_SERIAL_PRESCALE
, word_stb_sel_u3
, external
) |
279 IO_STATE(R_SYNC_SERIAL_PRESCALE
, prescaler
, div4
) |
280 IO_FIELD(R_SYNC_SERIAL_PRESCALE
, frame_rate
, DEFAULT_FRAME_RATE
) |
281 IO_FIELD(R_SYNC_SERIAL_PRESCALE
, word_rate
, DEFAULT_WORD_RATE
) |
282 IO_STATE(R_SYNC_SERIAL_PRESCALE
, warp_mode
, normal
));
284 /* Select synchronous ports */
285 *R_GEN_CONFIG_II
= gen_config_ii_shadow
;
287 printk("ETRAX 100LX synchronous serial port driver\n");
291 static void initialize_port(int portnbr
)
293 struct sync_port
* port
= &ports
[portnbr
];
295 DEBUG(printk("Init sync serial port %d\n", portnbr
));
297 port
->port_nbr
= portnbr
;
299 port
->readp
= port
->in_buffer
;
300 port
->writep
= port
->in_buffer
+ IN_BUFFER_SIZE
/2;
303 init_waitqueue_head(&port
->out_wait_q
);
304 init_waitqueue_head(&port
->in_wait_q
);
306 port
->ctrl_data_shadow
=
307 IO_STATE(R_SYNC_SERIAL1_CTRL
, tr_baud
, c115k2Hz
) |
308 IO_STATE(R_SYNC_SERIAL1_CTRL
, mode
, master_output
) |
309 IO_STATE(R_SYNC_SERIAL1_CTRL
, error
, ignore
) |
310 IO_STATE(R_SYNC_SERIAL1_CTRL
, rec_enable
, disable
) |
311 IO_STATE(R_SYNC_SERIAL1_CTRL
, f_synctype
, normal
) |
312 IO_STATE(R_SYNC_SERIAL1_CTRL
, f_syncsize
, word
) |
313 IO_STATE(R_SYNC_SERIAL1_CTRL
, f_sync
, on
) |
314 IO_STATE(R_SYNC_SERIAL1_CTRL
, clk_mode
, normal
) |
315 IO_STATE(R_SYNC_SERIAL1_CTRL
, clk_halt
, stopped
) |
316 IO_STATE(R_SYNC_SERIAL1_CTRL
, bitorder
, msb
) |
317 IO_STATE(R_SYNC_SERIAL1_CTRL
, tr_enable
, disable
) |
318 IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size8bit
) |
319 IO_STATE(R_SYNC_SERIAL1_CTRL
, buf_empty
, lmt_8
) |
320 IO_STATE(R_SYNC_SERIAL1_CTRL
, buf_full
, lmt_8
) |
321 IO_STATE(R_SYNC_SERIAL1_CTRL
, flow_ctrl
, enabled
) |
322 IO_STATE(R_SYNC_SERIAL1_CTRL
, clk_polarity
, neg
) |
323 IO_STATE(R_SYNC_SERIAL1_CTRL
, frame_polarity
, normal
)|
324 IO_STATE(R_SYNC_SERIAL1_CTRL
, status_polarity
, inverted
)|
325 IO_STATE(R_SYNC_SERIAL1_CTRL
, clk_driver
, normal
) |
326 IO_STATE(R_SYNC_SERIAL1_CTRL
, frame_driver
, normal
) |
327 IO_STATE(R_SYNC_SERIAL1_CTRL
, status_driver
, normal
)|
328 IO_STATE(R_SYNC_SERIAL1_CTRL
, def_out0
, high
);
331 port
->ctrl_data_shadow
|= IO_STATE(R_SYNC_SERIAL1_CTRL
, dma_enable
, on
);
333 port
->ctrl_data_shadow
|= IO_STATE(R_SYNC_SERIAL1_CTRL
, dma_enable
, off
);
335 *port
->ctrl_data
= port
->ctrl_data_shadow
;
338 static int sync_serial_open(struct inode
*inode
, struct file
*file
)
340 int dev
= MINOR(inode
->i_rdev
);
341 DEBUG(printk("Open sync serial port %d\n", dev
));
343 if (dev
< 0 || dev
>= NUMBER_OF_PORTS
|| !ports
[dev
].enabled
)
345 DEBUG(printk("Invalid minor %d\n", dev
));
350 DEBUG(printk("Device is busy.. \n"));
357 static int sync_serial_release(struct inode
*inode
, struct file
*file
)
359 int dev
= MINOR(inode
->i_rdev
);
360 if (dev
< 0 || dev
>= NUMBER_OF_PORTS
|| !ports
[dev
].enabled
)
362 DEBUG(printk("Invalid minor %d\n", dev
));
369 static int sync_serial_ioctl(struct inode
*inode
, struct file
*file
,
370 unsigned int cmd
, unsigned long arg
)
373 int dev
= MINOR(file
->f_dentry
->d_inode
->i_rdev
);
376 if (dev
< 0 || dev
>= NUMBER_OF_PORTS
|| !ports
[dev
].enabled
)
378 DEBUG(printk("Invalid minor %d\n", dev
));
383 /* Disable port while changing config */
386 RESET_DMA(4); WAIT_DMA(4);
387 *R_DMA_CH4_CLR_INTR
= IO_STATE(R_DMA_CH4_CLR_INTR
, clr_eop
, do) |
388 IO_STATE(R_DMA_CH4_CLR_INTR
, clr_descr
, do);
389 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode3
, async
);
393 RESET_DMA(8); WAIT_DMA(8);
394 *R_DMA_CH8_CLR_INTR
= IO_STATE(R_DMA_CH8_CLR_INTR
, clr_eop
, do) |
395 IO_STATE(R_DMA_CH8_CLR_INTR
, clr_descr
, do);
396 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode1
, async
);
398 *R_GEN_CONFIG_II
= gen_config_ii_shadow
;
403 if (GET_SPEED(arg
) == CODEC
)
406 SETS(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, clk_sel_u3
, codec
);
408 SETS(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, clk_sel_u1
, codec
);
410 SETF(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, prescaler
, GET_FREQ(arg
));
411 SETF(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, frame_rate
, GET_FRAME_RATE(arg
));
412 SETF(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, word_rate
, GET_WORD_RATE(arg
));
416 SETF(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, tr_baud
, GET_SPEED(arg
));
418 SETS(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, clk_sel_u3
, baudrate
);
420 SETS(sync_serial_prescale_shadow
, R_SYNC_SERIAL_PRESCALE
, clk_sel_u1
, baudrate
);
426 SETF(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, mode
, arg
);
429 if (arg
& NORMAL_SYNC
)
430 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_synctype
, normal
);
431 else if (arg
& EARLY_SYNC
)
432 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_synctype
, early
);
435 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_syncsize
, bit
);
436 else if (arg
& WORD_SYNC
)
437 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_syncsize
, word
);
438 else if (arg
& EXTENDED_SYNC
)
439 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_syncsize
, extended
);
442 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_sync
, on
);
443 else if (arg
& SYNC_OFF
)
444 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_sync
, off
);
446 if (arg
& WORD_SIZE_8
)
447 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, wordsize
, size8bit
);
448 else if (arg
& WORD_SIZE_12
)
449 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, wordsize
, size12bit
);
450 else if (arg
& WORD_SIZE_16
)
451 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, wordsize
, size16bit
);
452 else if (arg
& WORD_SIZE_24
)
453 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, wordsize
, size24bit
);
454 else if (arg
& WORD_SIZE_32
)
455 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, wordsize
, size32bit
);
457 if (arg
& BIT_ORDER_MSB
)
458 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, bitorder
, msb
);
459 else if (arg
& BIT_ORDER_LSB
)
460 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, bitorder
, lsb
);
462 if (arg
& FLOW_CONTROL_ENABLE
)
463 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, flow_ctrl
, enabled
);
464 else if (arg
& FLOW_CONTROL_DISABLE
)
465 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, flow_ctrl
, disabled
);
467 if (arg
& CLOCK_NOT_GATED
)
468 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_mode
, normal
);
469 else if (arg
& CLOCK_GATED
)
470 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_mode
, gated
);
474 if (arg
& CLOCK_NORMAL
)
475 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_polarity
, neg
);
476 else if (arg
& CLOCK_INVERT
)
477 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_polarity
, pos
);
479 if (arg
& FRAME_NORMAL
)
480 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, frame_polarity
, normal
);
481 else if (arg
& FRAME_INVERT
)
482 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, frame_polarity
, inverted
);
484 if (arg
& STATUS_NORMAL
)
485 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, status_polarity
, normal
);
486 else if (arg
& STATUS_INVERT
)
487 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, status_polarity
, inverted
);
490 if (arg
& CLOCK_NORMAL
)
491 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_driver
, normal
);
492 else if (arg
& CLOCK_INVERT
)
493 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_driver
, inverted
);
495 if (arg
& FRAME_NORMAL
)
496 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, frame_driver
, normal
);
497 else if (arg
& FRAME_INVERT
)
498 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, frame_driver
, inverted
);
500 if (arg
& STATUS_NORMAL
)
501 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, status_driver
, normal
);
502 else if (arg
& STATUS_INVERT
)
503 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, status_driver
, inverted
);
506 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, flow_ctrl
, disabled
);
507 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, bitorder
, msb
);
508 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, wordsize
, size8bit
);
509 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_sync
, on
);
510 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_syncsize
, word
);
511 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, f_synctype
, normal
);
514 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, frame_polarity
, inverted
);
515 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_polarity
, neg
);
516 SETF(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, mode
, SLAVE_INPUT
);
520 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, frame_driver
, inverted
);
521 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_driver
, inverted
);
522 SETF(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, mode
, MASTER_OUTPUT
);
528 /* Set config and enable port */
529 *port
->ctrl_data
= port
->ctrl_data_shadow
;
530 *R_SYNC_SERIAL_PRESCALE
= sync_serial_prescale_shadow
;
532 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode3
, sync
);
534 SETS(gen_config_ii_shadow
, R_GEN_CONFIG_II
, sermode1
, sync
);
536 *R_GEN_CONFIG_II
= gen_config_ii_shadow
;
540 static ssize_t
sync_serial_manual_write(struct file
* file
, const char * buf
,
541 size_t count
, loff_t
*ppos
)
543 int dev
= MINOR(file
->f_dentry
->d_inode
->i_rdev
);
544 DECLARE_WAITQUEUE(wait
, current
);
547 if (dev
< 0 || dev
>= NUMBER_OF_PORTS
|| !ports
[dev
].enabled
)
549 DEBUG(printk("Invalid minor %d\n", dev
));
554 if (copy_from_user(port
->out_buffer
, buf
, count
))
556 port
->outp
= port
->out_buffer
;
557 port
->out_count
= count
;
558 port
->odd_output
= 1;
559 add_wait_queue(&port
->out_wait_q
, &wait
);
560 set_current_state(TASK_INTERRUPTIBLE
);
561 *R_IRQ_MASK1_SET
= 1 << port
->ready_irq_bit
; /* transmitter ready IRQ on */
562 send_word(port
); /* Start sender by sending first word */
564 set_current_state(TASK_RUNNING
);
565 remove_wait_queue(&port
->out_wait_q
, &wait
);
566 if (signal_pending(current
))
573 static ssize_t
sync_serial_write(struct file
* file
, const char * buf
,
574 size_t count
, loff_t
*ppos
)
576 int dev
= MINOR(file
->f_dentry
->d_inode
->i_rdev
);
577 DECLARE_WAITQUEUE(wait
, current
);
580 if (dev
< 0 || dev
>= NUMBER_OF_PORTS
|| !ports
[dev
].enabled
)
582 DEBUG(printk("Invalid minor %d\n", dev
));
587 DEBUG(printk("Write dev %d count %d\n", port
->port_nbr
, count
));
589 count
= count
> OUT_BUFFER_SIZE
? OUT_BUFFER_SIZE
: count
;
591 /* Make sure transmitter is running */
592 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_halt
, running
);
593 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, tr_enable
, enable
);
594 *port
->ctrl_data
= port
->ctrl_data_shadow
;
598 return sync_serial_manual_write(file
, buf
, count
, ppos
);
601 if (copy_from_user(port
->out_buffer
, buf
, count
))
603 add_wait_queue(&port
->out_wait_q
, &wait
);
604 set_current_state(TASK_INTERRUPTIBLE
);
605 start_dma(port
, buf
, count
);
607 set_current_state(TASK_RUNNING
);
608 remove_wait_queue(&port
->out_wait_q
, &wait
);
609 if (signal_pending(current
))
616 static ssize_t
sync_serial_read(struct file
* file
, char * buf
,
617 size_t count
, loff_t
*ppos
)
619 int dev
= MINOR(file
->f_dentry
->d_inode
->i_rdev
);
626 if (dev
< 0 || dev
>= NUMBER_OF_PORTS
|| !ports
[dev
].enabled
)
628 DEBUG(printk("Invalid minor %d\n", dev
));
633 DEBUG(printk("Read dev %d count %d\n", dev
, count
));
635 /* Make sure receiver is running */
636 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, clk_halt
, running
);
637 SETS(port
->ctrl_data_shadow
, R_SYNC_SERIAL1_CTRL
, rec_enable
, enable
);
638 *port
->ctrl_data
= port
->ctrl_data_shadow
;
640 /* Calculate number of available bytes */
641 while (port
->readp
== port
->writep
) /* No data */
643 if (file
->f_flags
& O_NONBLOCK
)
645 interruptible_sleep_on(&port
->in_wait_q
);
646 if (signal_pending(current
))
652 /* Save pointers to avoid that they are modified by interrupt */
656 /* Lazy read, never return wrapped data. */
660 avail
= port
->in_buffer
+ IN_BUFFER_SIZE
- start
;
662 count
= count
> avail
? avail
: count
;
663 if (copy_to_user(buf
, start
, count
))
666 /* Disable interrupts while updating readp */
669 port
->readp
+= count
;
670 if (port
->readp
== port
->in_buffer
+ IN_BUFFER_SIZE
) /* Wrap? */
671 port
->readp
= port
->in_buffer
;
672 restore_flags(flags
);
674 DEBUG(printk("%d bytes read\n", count
));
678 static void send_word(sync_port
* port
)
680 switch(port
->ctrl_data_shadow
& IO_MASK(R_SYNC_SERIAL1_CTRL
, wordsize
))
682 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size8bit
):
684 *port
->data_out
= *port
->outp
++;
686 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size12bit
):
688 if (port
->odd_output
)
689 *port
->data_out
= ((*port
->outp
) << 16) | (*(unsigned short *)(port
->outp
+ 1));
691 *port
->data_out
= ((*(unsigned short *)port
->outp
) << 8) | (*(port
->outp
+ 1));
692 port
->odd_output
= !port
->odd_output
;
695 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size16bit
):
697 *port
->data_out
= *(unsigned short *)port
->outp
;
700 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size24bit
):
702 *port
->data_out
= *(unsigned int *)port
->outp
;
705 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size32bit
):
707 *port
->data_out
= *(unsigned int *)port
->outp
;
713 static void start_dma(struct sync_port
* port
, const char* data
, int count
)
715 port
->out_descr
.hw_len
= 0;
716 port
->out_descr
.next
= 0;
717 port
->out_descr
.ctrl
= d_int
| d_eol
| d_eop
| d_wait
;
718 port
->out_descr
.sw_len
= count
;
719 port
->out_descr
.buf
= virt_to_phys(port
->out_buffer
);
720 port
->out_descr
.status
= 0;
722 *port
->output_dma_first
= virt_to_phys(&port
->out_descr
);
723 *port
->output_dma_cmd
= IO_STATE(R_DMA_CH0_CMD
, cmd
, start
);
726 static void start_dma_in(sync_port
* port
)
728 if (port
->writep
> port
->in_buffer
+ IN_BUFFER_SIZE
)
730 panic("Offset too large in sync serial driver\n");
733 port
->in_descr1
.hw_len
= 0;
734 port
->in_descr1
.ctrl
= d_int
;
735 port
->in_descr1
.status
= 0;
736 port
->in_descr1
.next
= virt_to_phys(&port
->in_descr2
);
737 port
->in_descr2
.hw_len
= 0;
738 port
->in_descr2
.next
= virt_to_phys(&port
->in_descr1
);
739 port
->in_descr2
.ctrl
= d_int
;
740 port
->in_descr2
.status
= 0;
742 /* Find out which descriptor to start */
743 if (port
->writep
>= port
->in_buffer
+ IN_BUFFER_SIZE
/2)
745 /* Start descriptor 2 */
746 port
->in_descr1
.sw_len
= IN_BUFFER_SIZE
/2; /* All data available in 1 */
747 port
->in_descr1
.buf
= virt_to_phys(port
->in_buffer
);
748 port
->in_descr2
.sw_len
= port
->in_buffer
+ IN_BUFFER_SIZE
- port
->writep
;
749 port
->in_descr2
.buf
= virt_to_phys(port
->writep
);
750 *port
->input_dma_first
= virt_to_phys(&port
->in_descr2
);
754 /* Start descriptor 1 */
755 port
->in_descr1
.sw_len
= port
->in_buffer
+ IN_BUFFER_SIZE
/2 - port
->writep
;
756 port
->in_descr1
.buf
= virt_to_phys(port
->writep
);
757 port
->in_descr2
.sw_len
= IN_BUFFER_SIZE
/2;
758 port
->in_descr2
.buf
= virt_to_phys(port
->in_buffer
+ IN_BUFFER_SIZE
/ 2);
759 *port
->input_dma_first
= virt_to_phys(&port
->in_descr1
);
761 *port
->input_dma_cmd
= IO_STATE(R_DMA_CH0_CMD
, cmd
, start
);
764 static void tr_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
)
766 unsigned long ireg
= *R_IRQ_MASK2_RD
;
769 for (i
= 0; i
< NUMBER_OF_PORTS
; i
++)
771 sync_port
*port
= &ports
[i
];
772 if (ireg
& (1 << port
->output_dma_bit
)) /* IRQ active for the port? */
775 *port
->output_dma_clr_irq
=
776 IO_STATE(R_DMA_CH0_CLR_INTR
, clr_eop
, do) |
777 IO_STATE(R_DMA_CH0_CLR_INTR
, clr_descr
, do);
778 wake_up_interruptible(&port
->out_wait_q
); /* wake up the waiting process */
783 static void rx_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
)
785 unsigned long ireg
= *R_IRQ_MASK2_RD
;
788 for (i
= 0; i
< NUMBER_OF_PORTS
; i
++)
791 sync_port
*port
= &ports
[i
];
798 if (ireg
& (1 << port
->input_dma_descr_bit
)) /* Descriptor interrupt */
800 /* DMA has reached end of descriptor */
801 *port
->input_dma_clr_irq
=
802 IO_STATE(R_DMA_CH0_CLR_INTR
, clr_eop
, do) |
803 IO_STATE(R_DMA_CH0_CLR_INTR
, clr_descr
, do);
805 /* Find out which descriptor that is ready */
806 if (port
->writep
>= port
->in_buffer
+ IN_BUFFER_SIZE
/2)
808 /* Descr 2 was ready. Restart DMA at descriptor 1 */
809 port
->writep
= port
->in_buffer
;
811 /* Throw away data? */
812 if (port
->readp
< port
->in_buffer
+ IN_BUFFER_SIZE
/2)
813 port
->readp
= port
->in_buffer
+ IN_BUFFER_SIZE
/2;
817 /* Descr 1 was ready. Restart DMA at descriptor 2 */
818 port
->writep
= port
->in_buffer
+ IN_BUFFER_SIZE
/2;
820 /* Throw away data? */
821 if (port
->readp
>= port
->in_buffer
+ IN_BUFFER_SIZE
/2)
822 port
->readp
= port
->in_buffer
;
825 wake_up_interruptible(&port
->in_wait_q
); /* wake up the waiting process */
830 static void manual_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
)
834 for (i
= 0; i
< NUMBER_OF_PORTS
; i
++)
836 sync_port
* port
= &ports
[i
];
843 if (*R_IRQ_MASK1_RD
& (1 << port
->data_avail_bit
)) /* Data received? */
846 switch(port
->ctrl_data_shadow
& IO_MASK(R_SYNC_SERIAL1_CTRL
, wordsize
))
848 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size8bit
):
849 *port
->writep
++ = *(volatile char *)port
->data_in
;
851 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size12bit
):
853 int data
= *(unsigned short *)port
->data_in
;
856 *port
->writep
|= (data
& 0x0f00) >> 8;
857 *(port
->writep
+ 1) = data
& 0xff;
861 *port
->writep
= (data
& 0x0ff0) >> 4;
862 *(port
->writep
+ 1) = (data
& 0x0f) << 4;
864 port
->odd_input
= !port
->odd_input
;
868 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size16bit
):
869 *(unsigned short*)port
->writep
= *(volatile unsigned short *)port
->data_in
;
872 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size24bit
):
873 *(unsigned int*)port
->writep
= *port
->data_in
;
876 case IO_STATE(R_SYNC_SERIAL1_CTRL
, wordsize
, size32bit
):
877 *(unsigned int*)port
->writep
= *port
->data_in
;
882 if (port
->writep
> port
->in_buffer
+ IN_BUFFER_SIZE
) /* Wrap? */
883 port
->writep
= port
->in_buffer
;
884 wake_up_interruptible(&port
->in_wait_q
); /* Wake up application */
887 if (*R_IRQ_MASK1_RD
& (1 << port
->transmitter_ready_bit
)) /* Transmitter ready? */
889 if (port
->out_count
) /* More data to send */
891 else /* transmission finished */
893 *R_IRQ_MASK1_CLR
= 1 << port
->ready_irq_bit
; /* Turn off IRQ */
894 wake_up_interruptible(&port
->out_wait_q
); /* Wake up application */
900 module_init(etrax_sync_serial_init
);