1/*
2 * Blackfin Infra-red Driver
3 *
4 * Copyright 2006-2009 Analog Devices Inc.
5 *
6 * Enter bugs at http://blackfin.uclinux.org/
7 *
8 * Licensed under the GPL-2 or later.
9 *
10 */
11
12#include <linux/serial.h>
13#include <linux/module.h>
14#include <linux/netdevice.h>
15#include <linux/interrupt.h>
16#include <linux/delay.h>
17#include <linux/platform_device.h>
18#include <linux/dma-mapping.h>
19#include <linux/slab.h>
20
21#include <net/irda/irda.h>
22#include <net/irda/wrapper.h>
23#include <net/irda/irda_device.h>
24
25#include <asm/irq.h>
26#include <asm/cacheflush.h>
27#include <asm/dma.h>
28#include <asm/portmux.h>
29#undef DRIVER_NAME
30
31#ifdef CONFIG_SIR_BFIN_DMA
32struct dma_rx_buf {
33	char *buf;
34	int head;
35	int tail;
36};
37#endif
38
39struct bfin_sir_port {
40	unsigned char __iomem   *membase;
41	unsigned int            irq;
42	unsigned int            lsr;
43	unsigned long           clk;
44	struct net_device       *dev;
45#ifdef CONFIG_SIR_BFIN_DMA
46	int                     tx_done;
47	struct dma_rx_buf       rx_dma_buf;
48	struct timer_list       rx_dma_timer;
49	int                     rx_dma_nrows;
50#endif
51	unsigned int            tx_dma_channel;
52	unsigned int            rx_dma_channel;
53};
54
55struct bfin_sir_port_res {
56	unsigned long   base_addr;
57	int             irq;
58	unsigned int    rx_dma_channel;
59	unsigned int    tx_dma_channel;
60};
61
62struct bfin_sir_self {
63	struct bfin_sir_port    *sir_port;
64	spinlock_t              lock;
65	unsigned int            open;
66	int                     speed;
67	int                     newspeed;
68
69	struct sk_buff          *txskb;
70	struct sk_buff          *rxskb;
71	struct net_device_stats stats;
72	struct device           *dev;
73	struct irlap_cb         *irlap;
74	struct qos_info         qos;
75
76	iobuff_t                tx_buff;
77	iobuff_t                rx_buff;
78
79	struct work_struct      work;
80	int                     mtt;
81};
82
83#define DRIVER_NAME "bfin_sir"
84
85#define port_membase(port)     (((struct bfin_sir_port *)(port))->membase)
86#define get_lsr_cache(port)    (((struct bfin_sir_port *)(port))->lsr)
87#define put_lsr_cache(port, v) (((struct bfin_sir_port *)(port))->lsr = (v))
88#include <asm/bfin_serial.h>
89
90static const unsigned short per[][4] = {
91	/* rx pin      tx pin     NULL  uart_number */
92	{P_UART0_RX, P_UART0_TX,    0,    0},
93	{P_UART1_RX, P_UART1_TX,    0,    1},
94	{P_UART2_RX, P_UART2_TX,    0,    2},
95	{P_UART3_RX, P_UART3_TX,    0,    3},
96};
97