1 /* 2 * Analog Devices PPI header file 3 * 4 * Copyright (c) 2011 Analog Devices Inc. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 */ 19 20 #ifndef _PPI_H_ 21 #define _PPI_H_ 22 23 #include <linux/interrupt.h> 24 #include <asm/blackfin.h> 25 #include <asm/bfin_ppi.h> 26 27 /* EPPI */ 28 #ifdef EPPI_EN 29 #define PORT_EN EPPI_EN 30 #define PORT_DIR EPPI_DIR 31 #define DMA32 0 32 #define PACK_EN PACKEN 33 #endif 34 35 /* EPPI3 */ 36 #ifdef EPPI0_CTL2 37 #define PORT_EN EPPI_CTL_EN 38 #define PORT_DIR EPPI_CTL_DIR 39 #define PACK_EN EPPI_CTL_PACKEN 40 #define DMA32 0 41 #define DLEN_8 EPPI_CTL_DLEN08 42 #define DLEN_16 EPPI_CTL_DLEN16 43 #endif 44 45 struct ppi_if; 46 47 struct ppi_params { 48 u32 width; /* width in pixels */ 49 u32 height; /* height in lines */ 50 u32 hdelay; /* delay after the HSYNC in pixels */ 51 u32 vdelay; /* delay after the VSYNC in lines */ 52 u32 line; /* total pixels per line */ 53 u32 frame; /* total lines per frame */ 54 u32 hsync; /* HSYNC length in pixels */ 55 u32 vsync; /* VSYNC length in lines */ 56 int bpp; /* bits per pixel */ 57 int dlen; /* data length for ppi in bits */ 58 u32 ppi_control; /* ppi configuration */ 59 u32 int_mask; /* interrupt mask */ 60 }; 61 62 struct ppi_ops { 63 int (*attach_irq)(struct ppi_if *ppi, irq_handler_t handler); 64 void (*detach_irq)(struct ppi_if *ppi); 65 int (*start)(struct ppi_if *ppi); 66 int (*stop)(struct ppi_if *ppi); 67 int (*set_params)(struct ppi_if *ppi, struct ppi_params *params); 68 void (*update_addr)(struct ppi_if *ppi, unsigned long addr); 69 }; 70 71 enum ppi_type { 72 PPI_TYPE_PPI, 73 PPI_TYPE_EPPI, 74 PPI_TYPE_EPPI3, 75 }; 76 77 struct ppi_info { 78 enum ppi_type type; 79 int dma_ch; 80 int irq_err; 81 void __iomem *base; 82 const unsigned short *pin_req; 83 }; 84 85 struct ppi_if { 86 struct device *dev; 87 unsigned long ppi_control; 88 const struct ppi_ops *ops; 89 const struct ppi_info *info; 90 bool err_int; /* if we need request error interrupt */ 91 bool err; /* if ppi has fifo error */ 92 void *priv; 93 }; 94 95 struct ppi_if *ppi_create_instance(struct platform_device *pdev, 96 const struct ppi_info *info); 97 void ppi_delete_instance(struct ppi_if *ppi); 98 #endif 99