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 45struct ppi_if; 46 47struct 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 62struct 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 71enum ppi_type { 72 PPI_TYPE_PPI, 73 PPI_TYPE_EPPI, 74 PPI_TYPE_EPPI3, 75}; 76 77struct 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 85struct 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 95struct ppi_if *ppi_create_instance(struct platform_device *pdev, 96 const struct ppi_info *info); 97void ppi_delete_instance(struct ppi_if *ppi); 98#endif 99