|  | /* | 
|  | * Blackfin Infra-red Driver | 
|  | * | 
|  | * Copyright 2006-2009 Analog Devices Inc. | 
|  | * | 
|  | * Enter bugs at http://blackfin.uclinux.org/ | 
|  | * | 
|  | * Licensed under the GPL-2 or later. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <linux/serial.h> | 
|  | #include <linux/module.h> | 
|  | #include <linux/netdevice.h> | 
|  | #include <linux/interrupt.h> | 
|  | #include <linux/delay.h> | 
|  | #include <linux/platform_device.h> | 
|  | #include <linux/dma-mapping.h> | 
|  | #include <linux/slab.h> | 
|  |  | 
|  | #include <net/irda/irda.h> | 
|  | #include <net/irda/wrapper.h> | 
|  | #include <net/irda/irda_device.h> | 
|  |  | 
|  | #include <asm/irq.h> | 
|  | #include <asm/cacheflush.h> | 
|  | #include <asm/dma.h> | 
|  | #include <asm/portmux.h> | 
|  | #undef DRIVER_NAME | 
|  |  | 
|  | #ifdef CONFIG_SIR_BFIN_DMA | 
|  | struct dma_rx_buf { | 
|  | char *buf; | 
|  | int head; | 
|  | int tail; | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | struct bfin_sir_port { | 
|  | unsigned char __iomem   *membase; | 
|  | unsigned int            irq; | 
|  | unsigned int            lsr; | 
|  | unsigned long           clk; | 
|  | struct net_device       *dev; | 
|  | #ifdef CONFIG_SIR_BFIN_DMA | 
|  | int                     tx_done; | 
|  | struct dma_rx_buf       rx_dma_buf; | 
|  | struct timer_list       rx_dma_timer; | 
|  | int                     rx_dma_nrows; | 
|  | #endif | 
|  | unsigned int            tx_dma_channel; | 
|  | unsigned int            rx_dma_channel; | 
|  | }; | 
|  |  | 
|  | struct bfin_sir_port_res { | 
|  | unsigned long   base_addr; | 
|  | int             irq; | 
|  | unsigned int    rx_dma_channel; | 
|  | unsigned int    tx_dma_channel; | 
|  | }; | 
|  |  | 
|  | struct bfin_sir_self { | 
|  | struct bfin_sir_port    *sir_port; | 
|  | spinlock_t              lock; | 
|  | unsigned int            open; | 
|  | int                     speed; | 
|  | int                     newspeed; | 
|  |  | 
|  | struct sk_buff          *txskb; | 
|  | struct sk_buff          *rxskb; | 
|  | struct net_device_stats stats; | 
|  | struct device           *dev; | 
|  | struct irlap_cb         *irlap; | 
|  | struct qos_info         qos; | 
|  |  | 
|  | iobuff_t                tx_buff; | 
|  | iobuff_t                rx_buff; | 
|  |  | 
|  | struct work_struct      work; | 
|  | int                     mtt; | 
|  | }; | 
|  |  | 
|  | #define DRIVER_NAME "bfin_sir" | 
|  |  | 
|  | #include <asm/bfin_serial.h> | 
|  |  | 
|  | static const unsigned short per[][4] = { | 
|  | /* rx pin      tx pin     NULL  uart_number */ | 
|  | {P_UART0_RX, P_UART0_TX,    0,    0}, | 
|  | {P_UART1_RX, P_UART1_TX,    0,    1}, | 
|  | {P_UART2_RX, P_UART2_TX,    0,    2}, | 
|  | {P_UART3_RX, P_UART3_TX,    0,    3}, | 
|  | }; |