1*8e75f744SArnaud Giersch /* Low-level parallel port routines for built-in port on SGI IP32 2*8e75f744SArnaud Giersch * 3*8e75f744SArnaud Giersch * Author: Arnaud Giersch <arnaud.giersch@free.fr> 4*8e75f744SArnaud Giersch * 5*8e75f744SArnaud Giersch * Based on parport_pc.c by 6*8e75f744SArnaud Giersch * Phil Blundell, Tim Waugh, Jose Renau, David Campbell, 7*8e75f744SArnaud Giersch * Andrea Arcangeli, et al. 8*8e75f744SArnaud Giersch * 9*8e75f744SArnaud Giersch * Thanks to Ilya A. Volynets-Evenbakh for his help. 10*8e75f744SArnaud Giersch * 11*8e75f744SArnaud Giersch * Copyright (C) 2005, 2006 Arnaud Giersch. 12*8e75f744SArnaud Giersch * 13*8e75f744SArnaud Giersch * This program is free software; you can redistribute it and/or modify it 14*8e75f744SArnaud Giersch * under the terms of the GNU General Public License as published by the Free 15*8e75f744SArnaud Giersch * Software Foundation; either version 2 of the License, or (at your option) 16*8e75f744SArnaud Giersch * any later version. 17*8e75f744SArnaud Giersch * 18*8e75f744SArnaud Giersch * This program is distributed in the hope that it will be useful, but WITHOUT 19*8e75f744SArnaud Giersch * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 20*8e75f744SArnaud Giersch * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 21*8e75f744SArnaud Giersch * more details. 22*8e75f744SArnaud Giersch * 23*8e75f744SArnaud Giersch * You should have received a copy of the GNU General Public License along 24*8e75f744SArnaud Giersch * with this program; if not, write to the Free Software Foundation, Inc., 59 25*8e75f744SArnaud Giersch * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 26*8e75f744SArnaud Giersch */ 27*8e75f744SArnaud Giersch 28*8e75f744SArnaud Giersch /* Current status: 29*8e75f744SArnaud Giersch * 30*8e75f744SArnaud Giersch * Basic SPP and PS2 modes are supported. 31*8e75f744SArnaud Giersch * Support for parallel port IRQ is present. 32*8e75f744SArnaud Giersch * Hardware SPP (a.k.a. compatibility), EPP, and ECP modes are 33*8e75f744SArnaud Giersch * supported. 34*8e75f744SArnaud Giersch * SPP/ECP FIFO can be driven in PIO or DMA mode. PIO mode can work with 35*8e75f744SArnaud Giersch * or without interrupt support. 36*8e75f744SArnaud Giersch * 37*8e75f744SArnaud Giersch * Hardware ECP mode is not fully implemented (ecp_read_data and 38*8e75f744SArnaud Giersch * ecp_write_addr are actually missing). 39*8e75f744SArnaud Giersch * 40*8e75f744SArnaud Giersch * To do: 41*8e75f744SArnaud Giersch * 42*8e75f744SArnaud Giersch * Fully implement ECP mode. 43*8e75f744SArnaud Giersch * EPP and ECP mode need to be tested. I currently do not own any 44*8e75f744SArnaud Giersch * peripheral supporting these extended mode, and cannot test them. 45*8e75f744SArnaud Giersch * If DMA mode works well, decide if support for PIO FIFO modes should be 46*8e75f744SArnaud Giersch * dropped. 47*8e75f744SArnaud Giersch * Use the io{read,write} family functions when they become available in 48*8e75f744SArnaud Giersch * the linux-mips.org tree. Note: the MIPS specific functions readsb() 49*8e75f744SArnaud Giersch * and writesb() are to be translated by ioread8_rep() and iowrite8_rep() 50*8e75f744SArnaud Giersch * respectively. 51*8e75f744SArnaud Giersch */ 52*8e75f744SArnaud Giersch 53*8e75f744SArnaud Giersch /* The built-in parallel port on the SGI 02 workstation (a.k.a. IP32) is an 54*8e75f744SArnaud Giersch * IEEE 1284 parallel port driven by a Texas Instrument TL16PIR552PH chip[1]. 55*8e75f744SArnaud Giersch * This chip supports SPP, bidirectional, EPP and ECP modes. It has a 16 byte 56*8e75f744SArnaud Giersch * FIFO buffer and supports DMA transfers. 57*8e75f744SArnaud Giersch * 58*8e75f744SArnaud Giersch * [1] http://focus.ti.com/docs/prod/folders/print/tl16pir552.html 59*8e75f744SArnaud Giersch * 60*8e75f744SArnaud Giersch * Theoretically, we could simply use the parport_pc module. It is however 61*8e75f744SArnaud Giersch * not so simple. The parport_pc code assumes that the parallel port 62*8e75f744SArnaud Giersch * registers are port-mapped. On the O2, they are memory-mapped. 63*8e75f744SArnaud Giersch * Furthermore, each register is replicated on 256 consecutive addresses (as 64*8e75f744SArnaud Giersch * it is for the built-in serial ports on the same chip). 65*8e75f744SArnaud Giersch */ 66*8e75f744SArnaud Giersch 67*8e75f744SArnaud Giersch /*--- Some configuration defines ---------------------------------------*/ 68*8e75f744SArnaud Giersch 69*8e75f744SArnaud Giersch /* DEBUG_PARPORT_IP32 70*8e75f744SArnaud Giersch * 0 disable debug 71*8e75f744SArnaud Giersch * 1 standard level: pr_debug1 is enabled 72*8e75f744SArnaud Giersch * 2 parport_ip32_dump_state is enabled 73*8e75f744SArnaud Giersch * >=3 verbose level: pr_debug is enabled 74*8e75f744SArnaud Giersch */ 75*8e75f744SArnaud Giersch #if !defined(DEBUG_PARPORT_IP32) 76*8e75f744SArnaud Giersch # define DEBUG_PARPORT_IP32 0 /* 0 (disabled) for production */ 77*8e75f744SArnaud Giersch #endif 78*8e75f744SArnaud Giersch 79*8e75f744SArnaud Giersch /*----------------------------------------------------------------------*/ 80*8e75f744SArnaud Giersch 81*8e75f744SArnaud Giersch /* Setup DEBUG macros. This is done before any includes, just in case we 82*8e75f744SArnaud Giersch * activate pr_debug() with DEBUG_PARPORT_IP32 >= 3. 83*8e75f744SArnaud Giersch */ 84*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 == 1 85*8e75f744SArnaud Giersch # warning DEBUG_PARPORT_IP32 == 1 86*8e75f744SArnaud Giersch #elif DEBUG_PARPORT_IP32 == 2 87*8e75f744SArnaud Giersch # warning DEBUG_PARPORT_IP32 == 2 88*8e75f744SArnaud Giersch #elif DEBUG_PARPORT_IP32 >= 3 89*8e75f744SArnaud Giersch # warning DEBUG_PARPORT_IP32 >= 3 90*8e75f744SArnaud Giersch # if !defined(DEBUG) 91*8e75f744SArnaud Giersch # define DEBUG /* enable pr_debug() in kernel.h */ 92*8e75f744SArnaud Giersch # endif 93*8e75f744SArnaud Giersch #endif 94*8e75f744SArnaud Giersch 95*8e75f744SArnaud Giersch #include <linux/completion.h> 96*8e75f744SArnaud Giersch #include <linux/delay.h> 97*8e75f744SArnaud Giersch #include <linux/dma-mapping.h> 98*8e75f744SArnaud Giersch #include <linux/err.h> 99*8e75f744SArnaud Giersch #include <linux/init.h> 100*8e75f744SArnaud Giersch #include <linux/interrupt.h> 101*8e75f744SArnaud Giersch #include <linux/jiffies.h> 102*8e75f744SArnaud Giersch #include <linux/kernel.h> 103*8e75f744SArnaud Giersch #include <linux/module.h> 104*8e75f744SArnaud Giersch #include <linux/parport.h> 105*8e75f744SArnaud Giersch #include <linux/sched.h> 106*8e75f744SArnaud Giersch #include <linux/spinlock.h> 107*8e75f744SArnaud Giersch #include <linux/stddef.h> 108*8e75f744SArnaud Giersch #include <linux/types.h> 109*8e75f744SArnaud Giersch #include <asm/io.h> 110*8e75f744SArnaud Giersch #include <asm/ip32/ip32_ints.h> 111*8e75f744SArnaud Giersch #include <asm/ip32/mace.h> 112*8e75f744SArnaud Giersch 113*8e75f744SArnaud Giersch /*--- Global variables -------------------------------------------------*/ 114*8e75f744SArnaud Giersch 115*8e75f744SArnaud Giersch /* Verbose probing on by default for debugging. */ 116*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 >= 1 117*8e75f744SArnaud Giersch # define DEFAULT_VERBOSE_PROBING 1 118*8e75f744SArnaud Giersch #else 119*8e75f744SArnaud Giersch # define DEFAULT_VERBOSE_PROBING 0 120*8e75f744SArnaud Giersch #endif 121*8e75f744SArnaud Giersch 122*8e75f744SArnaud Giersch /* Default prefix for printk */ 123*8e75f744SArnaud Giersch #define PPIP32 "parport_ip32: " 124*8e75f744SArnaud Giersch 125*8e75f744SArnaud Giersch /* 126*8e75f744SArnaud Giersch * These are the module parameters: 127*8e75f744SArnaud Giersch * @features: bit mask of features to enable/disable 128*8e75f744SArnaud Giersch * (all enabled by default) 129*8e75f744SArnaud Giersch * @verbose_probing: log chit-chat during initialization 130*8e75f744SArnaud Giersch */ 131*8e75f744SArnaud Giersch #define PARPORT_IP32_ENABLE_IRQ (1U << 0) 132*8e75f744SArnaud Giersch #define PARPORT_IP32_ENABLE_DMA (1U << 1) 133*8e75f744SArnaud Giersch #define PARPORT_IP32_ENABLE_SPP (1U << 2) 134*8e75f744SArnaud Giersch #define PARPORT_IP32_ENABLE_EPP (1U << 3) 135*8e75f744SArnaud Giersch #define PARPORT_IP32_ENABLE_ECP (1U << 4) 136*8e75f744SArnaud Giersch static unsigned int features = ~0U; 137*8e75f744SArnaud Giersch static int verbose_probing = DEFAULT_VERBOSE_PROBING; 138*8e75f744SArnaud Giersch 139*8e75f744SArnaud Giersch /* We do not support more than one port. */ 140*8e75f744SArnaud Giersch static struct parport *this_port = NULL; 141*8e75f744SArnaud Giersch 142*8e75f744SArnaud Giersch /* Timing constants for FIFO modes. */ 143*8e75f744SArnaud Giersch #define FIFO_NFAULT_TIMEOUT 100 /* milliseconds */ 144*8e75f744SArnaud Giersch #define FIFO_POLLING_INTERVAL 50 /* microseconds */ 145*8e75f744SArnaud Giersch 146*8e75f744SArnaud Giersch /*--- I/O register definitions -----------------------------------------*/ 147*8e75f744SArnaud Giersch 148*8e75f744SArnaud Giersch /** 149*8e75f744SArnaud Giersch * struct parport_ip32_regs - virtual addresses of parallel port registers 150*8e75f744SArnaud Giersch * @data: Data Register 151*8e75f744SArnaud Giersch * @dsr: Device Status Register 152*8e75f744SArnaud Giersch * @dcr: Device Control Register 153*8e75f744SArnaud Giersch * @eppAddr: EPP Address Register 154*8e75f744SArnaud Giersch * @eppData0: EPP Data Register 0 155*8e75f744SArnaud Giersch * @eppData1: EPP Data Register 1 156*8e75f744SArnaud Giersch * @eppData2: EPP Data Register 2 157*8e75f744SArnaud Giersch * @eppData3: EPP Data Register 3 158*8e75f744SArnaud Giersch * @ecpAFifo: ECP Address FIFO 159*8e75f744SArnaud Giersch * @fifo: General FIFO register. The same address is used for: 160*8e75f744SArnaud Giersch * - cFifo, the Parallel Port DATA FIFO 161*8e75f744SArnaud Giersch * - ecpDFifo, the ECP Data FIFO 162*8e75f744SArnaud Giersch * - tFifo, the ECP Test FIFO 163*8e75f744SArnaud Giersch * @cnfgA: Configuration Register A 164*8e75f744SArnaud Giersch * @cnfgB: Configuration Register B 165*8e75f744SArnaud Giersch * @ecr: Extended Control Register 166*8e75f744SArnaud Giersch */ 167*8e75f744SArnaud Giersch struct parport_ip32_regs { 168*8e75f744SArnaud Giersch void __iomem *data; 169*8e75f744SArnaud Giersch void __iomem *dsr; 170*8e75f744SArnaud Giersch void __iomem *dcr; 171*8e75f744SArnaud Giersch void __iomem *eppAddr; 172*8e75f744SArnaud Giersch void __iomem *eppData0; 173*8e75f744SArnaud Giersch void __iomem *eppData1; 174*8e75f744SArnaud Giersch void __iomem *eppData2; 175*8e75f744SArnaud Giersch void __iomem *eppData3; 176*8e75f744SArnaud Giersch void __iomem *ecpAFifo; 177*8e75f744SArnaud Giersch void __iomem *fifo; 178*8e75f744SArnaud Giersch void __iomem *cnfgA; 179*8e75f744SArnaud Giersch void __iomem *cnfgB; 180*8e75f744SArnaud Giersch void __iomem *ecr; 181*8e75f744SArnaud Giersch }; 182*8e75f744SArnaud Giersch 183*8e75f744SArnaud Giersch /* Device Status Register */ 184*8e75f744SArnaud Giersch #define DSR_nBUSY (1U << 7) /* PARPORT_STATUS_BUSY */ 185*8e75f744SArnaud Giersch #define DSR_nACK (1U << 6) /* PARPORT_STATUS_ACK */ 186*8e75f744SArnaud Giersch #define DSR_PERROR (1U << 5) /* PARPORT_STATUS_PAPEROUT */ 187*8e75f744SArnaud Giersch #define DSR_SELECT (1U << 4) /* PARPORT_STATUS_SELECT */ 188*8e75f744SArnaud Giersch #define DSR_nFAULT (1U << 3) /* PARPORT_STATUS_ERROR */ 189*8e75f744SArnaud Giersch #define DSR_nPRINT (1U << 2) /* specific to TL16PIR552 */ 190*8e75f744SArnaud Giersch /* #define DSR_reserved (1U << 1) */ 191*8e75f744SArnaud Giersch #define DSR_TIMEOUT (1U << 0) /* EPP timeout */ 192*8e75f744SArnaud Giersch 193*8e75f744SArnaud Giersch /* Device Control Register */ 194*8e75f744SArnaud Giersch /* #define DCR_reserved (1U << 7) | (1U << 6) */ 195*8e75f744SArnaud Giersch #define DCR_DIR (1U << 5) /* direction */ 196*8e75f744SArnaud Giersch #define DCR_IRQ (1U << 4) /* interrupt on nAck */ 197*8e75f744SArnaud Giersch #define DCR_SELECT (1U << 3) /* PARPORT_CONTROL_SELECT */ 198*8e75f744SArnaud Giersch #define DCR_nINIT (1U << 2) /* PARPORT_CONTROL_INIT */ 199*8e75f744SArnaud Giersch #define DCR_AUTOFD (1U << 1) /* PARPORT_CONTROL_AUTOFD */ 200*8e75f744SArnaud Giersch #define DCR_STROBE (1U << 0) /* PARPORT_CONTROL_STROBE */ 201*8e75f744SArnaud Giersch 202*8e75f744SArnaud Giersch /* ECP Configuration Register A */ 203*8e75f744SArnaud Giersch #define CNFGA_IRQ (1U << 7) 204*8e75f744SArnaud Giersch #define CNFGA_ID_MASK ((1U << 6) | (1U << 5) | (1U << 4)) 205*8e75f744SArnaud Giersch #define CNFGA_ID_SHIFT 4 206*8e75f744SArnaud Giersch #define CNFGA_ID_16 (00U << CNFGA_ID_SHIFT) 207*8e75f744SArnaud Giersch #define CNFGA_ID_8 (01U << CNFGA_ID_SHIFT) 208*8e75f744SArnaud Giersch #define CNFGA_ID_32 (02U << CNFGA_ID_SHIFT) 209*8e75f744SArnaud Giersch /* #define CNFGA_reserved (1U << 3) */ 210*8e75f744SArnaud Giersch #define CNFGA_nBYTEINTRANS (1U << 2) 211*8e75f744SArnaud Giersch #define CNFGA_PWORDLEFT ((1U << 1) | (1U << 0)) 212*8e75f744SArnaud Giersch 213*8e75f744SArnaud Giersch /* ECP Configuration Register B */ 214*8e75f744SArnaud Giersch #define CNFGB_COMPRESS (1U << 7) 215*8e75f744SArnaud Giersch #define CNFGB_INTRVAL (1U << 6) 216*8e75f744SArnaud Giersch #define CNFGB_IRQ_MASK ((1U << 5) | (1U << 4) | (1U << 3)) 217*8e75f744SArnaud Giersch #define CNFGB_IRQ_SHIFT 3 218*8e75f744SArnaud Giersch #define CNFGB_DMA_MASK ((1U << 2) | (1U << 1) | (1U << 0)) 219*8e75f744SArnaud Giersch #define CNFGB_DMA_SHIFT 0 220*8e75f744SArnaud Giersch 221*8e75f744SArnaud Giersch /* Extended Control Register */ 222*8e75f744SArnaud Giersch #define ECR_MODE_MASK ((1U << 7) | (1U << 6) | (1U << 5)) 223*8e75f744SArnaud Giersch #define ECR_MODE_SHIFT 5 224*8e75f744SArnaud Giersch #define ECR_MODE_SPP (00U << ECR_MODE_SHIFT) 225*8e75f744SArnaud Giersch #define ECR_MODE_PS2 (01U << ECR_MODE_SHIFT) 226*8e75f744SArnaud Giersch #define ECR_MODE_PPF (02U << ECR_MODE_SHIFT) 227*8e75f744SArnaud Giersch #define ECR_MODE_ECP (03U << ECR_MODE_SHIFT) 228*8e75f744SArnaud Giersch #define ECR_MODE_EPP (04U << ECR_MODE_SHIFT) 229*8e75f744SArnaud Giersch /* #define ECR_MODE_reserved (05U << ECR_MODE_SHIFT) */ 230*8e75f744SArnaud Giersch #define ECR_MODE_TST (06U << ECR_MODE_SHIFT) 231*8e75f744SArnaud Giersch #define ECR_MODE_CFG (07U << ECR_MODE_SHIFT) 232*8e75f744SArnaud Giersch #define ECR_nERRINTR (1U << 4) 233*8e75f744SArnaud Giersch #define ECR_DMAEN (1U << 3) 234*8e75f744SArnaud Giersch #define ECR_SERVINTR (1U << 2) 235*8e75f744SArnaud Giersch #define ECR_F_FULL (1U << 1) 236*8e75f744SArnaud Giersch #define ECR_F_EMPTY (1U << 0) 237*8e75f744SArnaud Giersch 238*8e75f744SArnaud Giersch /*--- Private data -----------------------------------------------------*/ 239*8e75f744SArnaud Giersch 240*8e75f744SArnaud Giersch /** 241*8e75f744SArnaud Giersch * enum parport_ip32_irq_mode - operation mode of interrupt handler 242*8e75f744SArnaud Giersch * @PARPORT_IP32_IRQ_FWD: forward interrupt to the upper parport layer 243*8e75f744SArnaud Giersch * @PARPORT_IP32_IRQ_HERE: interrupt is handled locally 244*8e75f744SArnaud Giersch */ 245*8e75f744SArnaud Giersch enum parport_ip32_irq_mode { PARPORT_IP32_IRQ_FWD, PARPORT_IP32_IRQ_HERE }; 246*8e75f744SArnaud Giersch 247*8e75f744SArnaud Giersch /** 248*8e75f744SArnaud Giersch * struct parport_ip32_private - private stuff for &struct parport 249*8e75f744SArnaud Giersch * @regs: register addresses 250*8e75f744SArnaud Giersch * @dcr_cache: cached contents of DCR 251*8e75f744SArnaud Giersch * @dcr_writable: bit mask of writable DCR bits 252*8e75f744SArnaud Giersch * @pword: number of bytes per PWord 253*8e75f744SArnaud Giersch * @fifo_depth: number of PWords that FIFO will hold 254*8e75f744SArnaud Giersch * @readIntrThreshold: minimum number of PWords we can read 255*8e75f744SArnaud Giersch * if we get an interrupt 256*8e75f744SArnaud Giersch * @writeIntrThreshold: minimum number of PWords we can write 257*8e75f744SArnaud Giersch * if we get an interrupt 258*8e75f744SArnaud Giersch * @irq_mode: operation mode of interrupt handler for this port 259*8e75f744SArnaud Giersch * @irq_complete: mutex used to wait for an interrupt to occur 260*8e75f744SArnaud Giersch */ 261*8e75f744SArnaud Giersch struct parport_ip32_private { 262*8e75f744SArnaud Giersch struct parport_ip32_regs regs; 263*8e75f744SArnaud Giersch unsigned int dcr_cache; 264*8e75f744SArnaud Giersch unsigned int dcr_writable; 265*8e75f744SArnaud Giersch unsigned int pword; 266*8e75f744SArnaud Giersch unsigned int fifo_depth; 267*8e75f744SArnaud Giersch unsigned int readIntrThreshold; 268*8e75f744SArnaud Giersch unsigned int writeIntrThreshold; 269*8e75f744SArnaud Giersch enum parport_ip32_irq_mode irq_mode; 270*8e75f744SArnaud Giersch struct completion irq_complete; 271*8e75f744SArnaud Giersch }; 272*8e75f744SArnaud Giersch 273*8e75f744SArnaud Giersch /*--- Debug code -------------------------------------------------------*/ 274*8e75f744SArnaud Giersch 275*8e75f744SArnaud Giersch /* 276*8e75f744SArnaud Giersch * pr_debug1 - print debug messages 277*8e75f744SArnaud Giersch * 278*8e75f744SArnaud Giersch * This is like pr_debug(), but is defined for %DEBUG_PARPORT_IP32 >= 1 279*8e75f744SArnaud Giersch */ 280*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 >= 1 281*8e75f744SArnaud Giersch # define pr_debug1(...) printk(KERN_DEBUG __VA_ARGS__) 282*8e75f744SArnaud Giersch #else /* DEBUG_PARPORT_IP32 < 1 */ 283*8e75f744SArnaud Giersch # define pr_debug1(...) do { } while (0) 284*8e75f744SArnaud Giersch #endif 285*8e75f744SArnaud Giersch 286*8e75f744SArnaud Giersch /* 287*8e75f744SArnaud Giersch * pr_trace, pr_trace1 - trace function calls 288*8e75f744SArnaud Giersch * @p: pointer to &struct parport 289*8e75f744SArnaud Giersch * @fmt: printk format string 290*8e75f744SArnaud Giersch * @...: parameters for format string 291*8e75f744SArnaud Giersch * 292*8e75f744SArnaud Giersch * Macros used to trace function calls. The given string is formatted after 293*8e75f744SArnaud Giersch * function name. pr_trace() uses pr_debug(), and pr_trace1() uses 294*8e75f744SArnaud Giersch * pr_debug1(). __pr_trace() is the low-level macro and is not to be used 295*8e75f744SArnaud Giersch * directly. 296*8e75f744SArnaud Giersch */ 297*8e75f744SArnaud Giersch #define __pr_trace(pr, p, fmt, ...) \ 298*8e75f744SArnaud Giersch pr("%s: %s" fmt "\n", \ 299*8e75f744SArnaud Giersch ({ const struct parport *__p = (p); \ 300*8e75f744SArnaud Giersch __p ? __p->name : "parport_ip32"; }), \ 301*8e75f744SArnaud Giersch __func__ , ##__VA_ARGS__) 302*8e75f744SArnaud Giersch #define pr_trace(p, fmt, ...) __pr_trace(pr_debug, p, fmt , ##__VA_ARGS__) 303*8e75f744SArnaud Giersch #define pr_trace1(p, fmt, ...) __pr_trace(pr_debug1, p, fmt , ##__VA_ARGS__) 304*8e75f744SArnaud Giersch 305*8e75f744SArnaud Giersch /* 306*8e75f744SArnaud Giersch * __pr_probe, pr_probe - print message if @verbose_probing is true 307*8e75f744SArnaud Giersch * @p: pointer to &struct parport 308*8e75f744SArnaud Giersch * @fmt: printk format string 309*8e75f744SArnaud Giersch * @...: parameters for format string 310*8e75f744SArnaud Giersch * 311*8e75f744SArnaud Giersch * For new lines, use pr_probe(). Use __pr_probe() for continued lines. 312*8e75f744SArnaud Giersch */ 313*8e75f744SArnaud Giersch #define __pr_probe(...) \ 314*8e75f744SArnaud Giersch do { if (verbose_probing) printk(__VA_ARGS__); } while (0) 315*8e75f744SArnaud Giersch #define pr_probe(p, fmt, ...) \ 316*8e75f744SArnaud Giersch __pr_probe(KERN_INFO PPIP32 "0x%lx: " fmt, (p)->base , ##__VA_ARGS__) 317*8e75f744SArnaud Giersch 318*8e75f744SArnaud Giersch /* 319*8e75f744SArnaud Giersch * parport_ip32_dump_state - print register status of parport 320*8e75f744SArnaud Giersch * @p: pointer to &struct parport 321*8e75f744SArnaud Giersch * @str: string to add in message 322*8e75f744SArnaud Giersch * @show_ecp_config: shall we dump ECP configuration registers too? 323*8e75f744SArnaud Giersch * 324*8e75f744SArnaud Giersch * This function is only here for debugging purpose, and should be used with 325*8e75f744SArnaud Giersch * care. Reading the parallel port registers may have undesired side effects. 326*8e75f744SArnaud Giersch * Especially if @show_ecp_config is true, the parallel port is resetted. 327*8e75f744SArnaud Giersch * This function is only defined if %DEBUG_PARPORT_IP32 >= 2. 328*8e75f744SArnaud Giersch */ 329*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 >= 2 330*8e75f744SArnaud Giersch static void parport_ip32_dump_state(struct parport *p, char *str, 331*8e75f744SArnaud Giersch unsigned int show_ecp_config) 332*8e75f744SArnaud Giersch { 333*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 334*8e75f744SArnaud Giersch unsigned int i; 335*8e75f744SArnaud Giersch 336*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 "%s: state (%s):\n", p->name, str); 337*8e75f744SArnaud Giersch { 338*8e75f744SArnaud Giersch static const char ecr_modes[8][4] = {"SPP", "PS2", "PPF", 339*8e75f744SArnaud Giersch "ECP", "EPP", "???", 340*8e75f744SArnaud Giersch "TST", "CFG"}; 341*8e75f744SArnaud Giersch unsigned int ecr = readb(priv->regs.ecr); 342*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 " ecr=0x%02x", ecr); 343*8e75f744SArnaud Giersch printk(" %s", 344*8e75f744SArnaud Giersch ecr_modes[(ecr & ECR_MODE_MASK) >> ECR_MODE_SHIFT]); 345*8e75f744SArnaud Giersch if (ecr & ECR_nERRINTR) 346*8e75f744SArnaud Giersch printk(",nErrIntrEn"); 347*8e75f744SArnaud Giersch if (ecr & ECR_DMAEN) 348*8e75f744SArnaud Giersch printk(",dmaEn"); 349*8e75f744SArnaud Giersch if (ecr & ECR_SERVINTR) 350*8e75f744SArnaud Giersch printk(",serviceIntr"); 351*8e75f744SArnaud Giersch if (ecr & ECR_F_FULL) 352*8e75f744SArnaud Giersch printk(",f_full"); 353*8e75f744SArnaud Giersch if (ecr & ECR_F_EMPTY) 354*8e75f744SArnaud Giersch printk(",f_empty"); 355*8e75f744SArnaud Giersch printk("\n"); 356*8e75f744SArnaud Giersch } 357*8e75f744SArnaud Giersch if (show_ecp_config) { 358*8e75f744SArnaud Giersch unsigned int oecr, cnfgA, cnfgB; 359*8e75f744SArnaud Giersch oecr = readb(priv->regs.ecr); 360*8e75f744SArnaud Giersch writeb(ECR_MODE_PS2, priv->regs.ecr); 361*8e75f744SArnaud Giersch writeb(ECR_MODE_CFG, priv->regs.ecr); 362*8e75f744SArnaud Giersch cnfgA = readb(priv->regs.cnfgA); 363*8e75f744SArnaud Giersch cnfgB = readb(priv->regs.cnfgB); 364*8e75f744SArnaud Giersch writeb(ECR_MODE_PS2, priv->regs.ecr); 365*8e75f744SArnaud Giersch writeb(oecr, priv->regs.ecr); 366*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 " cnfgA=0x%02x", cnfgA); 367*8e75f744SArnaud Giersch printk(" ISA-%s", (cnfgA & CNFGA_IRQ) ? "Level" : "Pulses"); 368*8e75f744SArnaud Giersch switch (cnfgA & CNFGA_ID_MASK) { 369*8e75f744SArnaud Giersch case CNFGA_ID_8: 370*8e75f744SArnaud Giersch printk(",8 bits"); 371*8e75f744SArnaud Giersch break; 372*8e75f744SArnaud Giersch case CNFGA_ID_16: 373*8e75f744SArnaud Giersch printk(",16 bits"); 374*8e75f744SArnaud Giersch break; 375*8e75f744SArnaud Giersch case CNFGA_ID_32: 376*8e75f744SArnaud Giersch printk(",32 bits"); 377*8e75f744SArnaud Giersch break; 378*8e75f744SArnaud Giersch default: 379*8e75f744SArnaud Giersch printk(",unknown ID"); 380*8e75f744SArnaud Giersch break; 381*8e75f744SArnaud Giersch } 382*8e75f744SArnaud Giersch if (!(cnfgA & CNFGA_nBYTEINTRANS)) 383*8e75f744SArnaud Giersch printk(",ByteInTrans"); 384*8e75f744SArnaud Giersch if ((cnfgA & CNFGA_ID_MASK) != CNFGA_ID_8) 385*8e75f744SArnaud Giersch printk(",%d byte%s left", cnfgA & CNFGA_PWORDLEFT, 386*8e75f744SArnaud Giersch ((cnfgA & CNFGA_PWORDLEFT) > 1) ? "s" : ""); 387*8e75f744SArnaud Giersch printk("\n"); 388*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 " cnfgB=0x%02x", cnfgB); 389*8e75f744SArnaud Giersch printk(" irq=%u,dma=%u", 390*8e75f744SArnaud Giersch (cnfgB & CNFGB_IRQ_MASK) >> CNFGB_IRQ_SHIFT, 391*8e75f744SArnaud Giersch (cnfgB & CNFGB_DMA_MASK) >> CNFGB_DMA_SHIFT); 392*8e75f744SArnaud Giersch printk(",intrValue=%d", !!(cnfgB & CNFGB_INTRVAL)); 393*8e75f744SArnaud Giersch if (cnfgB & CNFGB_COMPRESS) 394*8e75f744SArnaud Giersch printk(",compress"); 395*8e75f744SArnaud Giersch printk("\n"); 396*8e75f744SArnaud Giersch } 397*8e75f744SArnaud Giersch for (i = 0; i < 2; i++) { 398*8e75f744SArnaud Giersch unsigned int dcr = i ? priv->dcr_cache : readb(priv->regs.dcr); 399*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 " dcr(%s)=0x%02x", 400*8e75f744SArnaud Giersch i ? "soft" : "hard", dcr); 401*8e75f744SArnaud Giersch printk(" %s", (dcr & DCR_DIR) ? "rev" : "fwd"); 402*8e75f744SArnaud Giersch if (dcr & DCR_IRQ) 403*8e75f744SArnaud Giersch printk(",ackIntEn"); 404*8e75f744SArnaud Giersch if (!(dcr & DCR_SELECT)) 405*8e75f744SArnaud Giersch printk(",nSelectIn"); 406*8e75f744SArnaud Giersch if (dcr & DCR_nINIT) 407*8e75f744SArnaud Giersch printk(",nInit"); 408*8e75f744SArnaud Giersch if (!(dcr & DCR_AUTOFD)) 409*8e75f744SArnaud Giersch printk(",nAutoFD"); 410*8e75f744SArnaud Giersch if (!(dcr & DCR_STROBE)) 411*8e75f744SArnaud Giersch printk(",nStrobe"); 412*8e75f744SArnaud Giersch printk("\n"); 413*8e75f744SArnaud Giersch } 414*8e75f744SArnaud Giersch #define sep (f++ ? ',' : ' ') 415*8e75f744SArnaud Giersch { 416*8e75f744SArnaud Giersch unsigned int f = 0; 417*8e75f744SArnaud Giersch unsigned int dsr = readb(priv->regs.dsr); 418*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 " dsr=0x%02x", dsr); 419*8e75f744SArnaud Giersch if (!(dsr & DSR_nBUSY)) 420*8e75f744SArnaud Giersch printk("%cBusy", sep); 421*8e75f744SArnaud Giersch if (dsr & DSR_nACK) 422*8e75f744SArnaud Giersch printk("%cnAck", sep); 423*8e75f744SArnaud Giersch if (dsr & DSR_PERROR) 424*8e75f744SArnaud Giersch printk("%cPError", sep); 425*8e75f744SArnaud Giersch if (dsr & DSR_SELECT) 426*8e75f744SArnaud Giersch printk("%cSelect", sep); 427*8e75f744SArnaud Giersch if (dsr & DSR_nFAULT) 428*8e75f744SArnaud Giersch printk("%cnFault", sep); 429*8e75f744SArnaud Giersch if (!(dsr & DSR_nPRINT)) 430*8e75f744SArnaud Giersch printk("%c(Print)", sep); 431*8e75f744SArnaud Giersch if (dsr & DSR_TIMEOUT) 432*8e75f744SArnaud Giersch printk("%cTimeout", sep); 433*8e75f744SArnaud Giersch printk("\n"); 434*8e75f744SArnaud Giersch } 435*8e75f744SArnaud Giersch #undef sep 436*8e75f744SArnaud Giersch } 437*8e75f744SArnaud Giersch #else /* DEBUG_PARPORT_IP32 < 2 */ 438*8e75f744SArnaud Giersch #define parport_ip32_dump_state(...) do { } while (0) 439*8e75f744SArnaud Giersch #endif 440*8e75f744SArnaud Giersch 441*8e75f744SArnaud Giersch /* 442*8e75f744SArnaud Giersch * CHECK_EXTRA_BITS - track and log extra bits 443*8e75f744SArnaud Giersch * @p: pointer to &struct parport 444*8e75f744SArnaud Giersch * @b: byte to inspect 445*8e75f744SArnaud Giersch * @m: bit mask of authorized bits 446*8e75f744SArnaud Giersch * 447*8e75f744SArnaud Giersch * This is used to track and log extra bits that should not be there in 448*8e75f744SArnaud Giersch * parport_ip32_write_control() and parport_ip32_frob_control(). It is only 449*8e75f744SArnaud Giersch * defined if %DEBUG_PARPORT_IP32 >= 1. 450*8e75f744SArnaud Giersch */ 451*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 >= 1 452*8e75f744SArnaud Giersch #define CHECK_EXTRA_BITS(p, b, m) \ 453*8e75f744SArnaud Giersch do { \ 454*8e75f744SArnaud Giersch unsigned int __b = (b), __m = (m); \ 455*8e75f744SArnaud Giersch if (__b & ~__m) \ 456*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: extra bits in %s(%s): " \ 457*8e75f744SArnaud Giersch "0x%02x/0x%02x\n", \ 458*8e75f744SArnaud Giersch (p)->name, __func__, #b, __b, __m); \ 459*8e75f744SArnaud Giersch } while (0) 460*8e75f744SArnaud Giersch #else /* DEBUG_PARPORT_IP32 < 1 */ 461*8e75f744SArnaud Giersch #define CHECK_EXTRA_BITS(...) do { } while (0) 462*8e75f744SArnaud Giersch #endif 463*8e75f744SArnaud Giersch 464*8e75f744SArnaud Giersch /*--- IP32 parallel port DMA operations --------------------------------*/ 465*8e75f744SArnaud Giersch 466*8e75f744SArnaud Giersch /** 467*8e75f744SArnaud Giersch * struct parport_ip32_dma_data - private data needed for DMA operation 468*8e75f744SArnaud Giersch * @dir: DMA direction (from or to device) 469*8e75f744SArnaud Giersch * @buf: buffer physical address 470*8e75f744SArnaud Giersch * @len: buffer length 471*8e75f744SArnaud Giersch * @next: address of next bytes to DMA transfer 472*8e75f744SArnaud Giersch * @left: number of bytes remaining 473*8e75f744SArnaud Giersch * @ctx: next context to write (0: context_a; 1: context_b) 474*8e75f744SArnaud Giersch * @irq_on: are the DMA IRQs currently enabled? 475*8e75f744SArnaud Giersch * @lock: spinlock to protect access to the structure 476*8e75f744SArnaud Giersch */ 477*8e75f744SArnaud Giersch struct parport_ip32_dma_data { 478*8e75f744SArnaud Giersch enum dma_data_direction dir; 479*8e75f744SArnaud Giersch dma_addr_t buf; 480*8e75f744SArnaud Giersch dma_addr_t next; 481*8e75f744SArnaud Giersch size_t len; 482*8e75f744SArnaud Giersch size_t left; 483*8e75f744SArnaud Giersch unsigned int ctx; 484*8e75f744SArnaud Giersch unsigned int irq_on; 485*8e75f744SArnaud Giersch spinlock_t lock; 486*8e75f744SArnaud Giersch }; 487*8e75f744SArnaud Giersch static struct parport_ip32_dma_data parport_ip32_dma; 488*8e75f744SArnaud Giersch 489*8e75f744SArnaud Giersch /** 490*8e75f744SArnaud Giersch * parport_ip32_dma_setup_context - setup next DMA context 491*8e75f744SArnaud Giersch * @limit: maximum data size for the context 492*8e75f744SArnaud Giersch * 493*8e75f744SArnaud Giersch * The alignment constraints must be verified in caller function, and the 494*8e75f744SArnaud Giersch * parameter @limit must be set accordingly. 495*8e75f744SArnaud Giersch */ 496*8e75f744SArnaud Giersch static void parport_ip32_dma_setup_context(unsigned int limit) 497*8e75f744SArnaud Giersch { 498*8e75f744SArnaud Giersch unsigned long flags; 499*8e75f744SArnaud Giersch 500*8e75f744SArnaud Giersch spin_lock_irqsave(&parport_ip32_dma.lock, flags); 501*8e75f744SArnaud Giersch if (parport_ip32_dma.left > 0) { 502*8e75f744SArnaud Giersch /* Note: ctxreg is "volatile" here only because 503*8e75f744SArnaud Giersch * mace->perif.ctrl.parport.context_a and context_b are 504*8e75f744SArnaud Giersch * "volatile". */ 505*8e75f744SArnaud Giersch volatile u64 __iomem *ctxreg = (parport_ip32_dma.ctx == 0) ? 506*8e75f744SArnaud Giersch &mace->perif.ctrl.parport.context_a : 507*8e75f744SArnaud Giersch &mace->perif.ctrl.parport.context_b; 508*8e75f744SArnaud Giersch u64 count; 509*8e75f744SArnaud Giersch u64 ctxval; 510*8e75f744SArnaud Giersch if (parport_ip32_dma.left <= limit) { 511*8e75f744SArnaud Giersch count = parport_ip32_dma.left; 512*8e75f744SArnaud Giersch ctxval = MACEPAR_CONTEXT_LASTFLAG; 513*8e75f744SArnaud Giersch } else { 514*8e75f744SArnaud Giersch count = limit; 515*8e75f744SArnaud Giersch ctxval = 0; 516*8e75f744SArnaud Giersch } 517*8e75f744SArnaud Giersch 518*8e75f744SArnaud Giersch pr_trace(NULL, 519*8e75f744SArnaud Giersch "(%u): 0x%04x:0x%04x, %u -> %u%s", 520*8e75f744SArnaud Giersch limit, 521*8e75f744SArnaud Giersch (unsigned int)parport_ip32_dma.buf, 522*8e75f744SArnaud Giersch (unsigned int)parport_ip32_dma.next, 523*8e75f744SArnaud Giersch (unsigned int)count, 524*8e75f744SArnaud Giersch parport_ip32_dma.ctx, ctxval ? "*" : ""); 525*8e75f744SArnaud Giersch 526*8e75f744SArnaud Giersch ctxval |= parport_ip32_dma.next & 527*8e75f744SArnaud Giersch MACEPAR_CONTEXT_BASEADDR_MASK; 528*8e75f744SArnaud Giersch ctxval |= ((count - 1) << MACEPAR_CONTEXT_DATALEN_SHIFT) & 529*8e75f744SArnaud Giersch MACEPAR_CONTEXT_DATALEN_MASK; 530*8e75f744SArnaud Giersch writeq(ctxval, ctxreg); 531*8e75f744SArnaud Giersch parport_ip32_dma.next += count; 532*8e75f744SArnaud Giersch parport_ip32_dma.left -= count; 533*8e75f744SArnaud Giersch parport_ip32_dma.ctx ^= 1U; 534*8e75f744SArnaud Giersch } 535*8e75f744SArnaud Giersch /* If there is nothing more to send, disable IRQs to avoid to 536*8e75f744SArnaud Giersch * face an IRQ storm which can lock the machine. Disable them 537*8e75f744SArnaud Giersch * only once. */ 538*8e75f744SArnaud Giersch if (parport_ip32_dma.left == 0 && parport_ip32_dma.irq_on) { 539*8e75f744SArnaud Giersch pr_debug(PPIP32 "IRQ off (ctx)\n"); 540*8e75f744SArnaud Giersch disable_irq_nosync(MACEISA_PAR_CTXA_IRQ); 541*8e75f744SArnaud Giersch disable_irq_nosync(MACEISA_PAR_CTXB_IRQ); 542*8e75f744SArnaud Giersch parport_ip32_dma.irq_on = 0; 543*8e75f744SArnaud Giersch } 544*8e75f744SArnaud Giersch spin_unlock_irqrestore(&parport_ip32_dma.lock, flags); 545*8e75f744SArnaud Giersch } 546*8e75f744SArnaud Giersch 547*8e75f744SArnaud Giersch /** 548*8e75f744SArnaud Giersch * parport_ip32_dma_interrupt - DMA interrupt handler 549*8e75f744SArnaud Giersch * @irq: interrupt number 550*8e75f744SArnaud Giersch * @dev_id: unused 551*8e75f744SArnaud Giersch * @regs: pointer to &struct pt_regs 552*8e75f744SArnaud Giersch */ 553*8e75f744SArnaud Giersch static irqreturn_t parport_ip32_dma_interrupt(int irq, void *dev_id, 554*8e75f744SArnaud Giersch struct pt_regs *regs) 555*8e75f744SArnaud Giersch { 556*8e75f744SArnaud Giersch if (parport_ip32_dma.left) 557*8e75f744SArnaud Giersch pr_trace(NULL, "(%d): ctx=%d", irq, parport_ip32_dma.ctx); 558*8e75f744SArnaud Giersch parport_ip32_dma_setup_context(MACEPAR_CONTEXT_DATA_BOUND); 559*8e75f744SArnaud Giersch return IRQ_HANDLED; 560*8e75f744SArnaud Giersch } 561*8e75f744SArnaud Giersch 562*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 563*8e75f744SArnaud Giersch static irqreturn_t parport_ip32_merr_interrupt(int irq, void *dev_id, 564*8e75f744SArnaud Giersch struct pt_regs *regs) 565*8e75f744SArnaud Giersch { 566*8e75f744SArnaud Giersch pr_trace1(NULL, "(%d)", irq); 567*8e75f744SArnaud Giersch return IRQ_HANDLED; 568*8e75f744SArnaud Giersch } 569*8e75f744SArnaud Giersch #endif 570*8e75f744SArnaud Giersch 571*8e75f744SArnaud Giersch /** 572*8e75f744SArnaud Giersch * parport_ip32_dma_start - begins a DMA transfer 573*8e75f744SArnaud Giersch * @dir: DMA direction: DMA_TO_DEVICE or DMA_FROM_DEVICE 574*8e75f744SArnaud Giersch * @addr: pointer to data buffer 575*8e75f744SArnaud Giersch * @count: buffer size 576*8e75f744SArnaud Giersch * 577*8e75f744SArnaud Giersch * Calls to parport_ip32_dma_start() and parport_ip32_dma_stop() must be 578*8e75f744SArnaud Giersch * correctly balanced. 579*8e75f744SArnaud Giersch */ 580*8e75f744SArnaud Giersch static int parport_ip32_dma_start(enum dma_data_direction dir, 581*8e75f744SArnaud Giersch void *addr, size_t count) 582*8e75f744SArnaud Giersch { 583*8e75f744SArnaud Giersch unsigned int limit; 584*8e75f744SArnaud Giersch u64 ctrl; 585*8e75f744SArnaud Giersch 586*8e75f744SArnaud Giersch pr_trace(NULL, "(%d, %lu)", dir, (unsigned long)count); 587*8e75f744SArnaud Giersch 588*8e75f744SArnaud Giersch /* FIXME - add support for DMA_FROM_DEVICE. In this case, buffer must 589*8e75f744SArnaud Giersch * be 64 bytes aligned. */ 590*8e75f744SArnaud Giersch BUG_ON(dir != DMA_TO_DEVICE); 591*8e75f744SArnaud Giersch 592*8e75f744SArnaud Giersch /* Reset DMA controller */ 593*8e75f744SArnaud Giersch ctrl = MACEPAR_CTLSTAT_RESET; 594*8e75f744SArnaud Giersch writeq(ctrl, &mace->perif.ctrl.parport.cntlstat); 595*8e75f744SArnaud Giersch 596*8e75f744SArnaud Giersch /* DMA IRQs should normally be enabled */ 597*8e75f744SArnaud Giersch if (!parport_ip32_dma.irq_on) { 598*8e75f744SArnaud Giersch WARN_ON(1); 599*8e75f744SArnaud Giersch enable_irq(MACEISA_PAR_CTXA_IRQ); 600*8e75f744SArnaud Giersch enable_irq(MACEISA_PAR_CTXB_IRQ); 601*8e75f744SArnaud Giersch parport_ip32_dma.irq_on = 1; 602*8e75f744SArnaud Giersch } 603*8e75f744SArnaud Giersch 604*8e75f744SArnaud Giersch /* Prepare DMA pointers */ 605*8e75f744SArnaud Giersch parport_ip32_dma.dir = dir; 606*8e75f744SArnaud Giersch parport_ip32_dma.buf = dma_map_single(NULL, addr, count, dir); 607*8e75f744SArnaud Giersch parport_ip32_dma.len = count; 608*8e75f744SArnaud Giersch parport_ip32_dma.next = parport_ip32_dma.buf; 609*8e75f744SArnaud Giersch parport_ip32_dma.left = parport_ip32_dma.len; 610*8e75f744SArnaud Giersch parport_ip32_dma.ctx = 0; 611*8e75f744SArnaud Giersch 612*8e75f744SArnaud Giersch /* Setup DMA direction and first two contexts */ 613*8e75f744SArnaud Giersch ctrl = (dir == DMA_TO_DEVICE) ? 0 : MACEPAR_CTLSTAT_DIRECTION; 614*8e75f744SArnaud Giersch writeq(ctrl, &mace->perif.ctrl.parport.cntlstat); 615*8e75f744SArnaud Giersch /* Single transfer should not cross a 4K page boundary */ 616*8e75f744SArnaud Giersch limit = MACEPAR_CONTEXT_DATA_BOUND - 617*8e75f744SArnaud Giersch (parport_ip32_dma.next & (MACEPAR_CONTEXT_DATA_BOUND - 1)); 618*8e75f744SArnaud Giersch parport_ip32_dma_setup_context(limit); 619*8e75f744SArnaud Giersch parport_ip32_dma_setup_context(MACEPAR_CONTEXT_DATA_BOUND); 620*8e75f744SArnaud Giersch 621*8e75f744SArnaud Giersch /* Real start of DMA transfer */ 622*8e75f744SArnaud Giersch ctrl |= MACEPAR_CTLSTAT_ENABLE; 623*8e75f744SArnaud Giersch writeq(ctrl, &mace->perif.ctrl.parport.cntlstat); 624*8e75f744SArnaud Giersch 625*8e75f744SArnaud Giersch return 0; 626*8e75f744SArnaud Giersch } 627*8e75f744SArnaud Giersch 628*8e75f744SArnaud Giersch /** 629*8e75f744SArnaud Giersch * parport_ip32_dma_stop - ends a running DMA transfer 630*8e75f744SArnaud Giersch * 631*8e75f744SArnaud Giersch * Calls to parport_ip32_dma_start() and parport_ip32_dma_stop() must be 632*8e75f744SArnaud Giersch * correctly balanced. 633*8e75f744SArnaud Giersch */ 634*8e75f744SArnaud Giersch static void parport_ip32_dma_stop(void) 635*8e75f744SArnaud Giersch { 636*8e75f744SArnaud Giersch u64 ctx_a; 637*8e75f744SArnaud Giersch u64 ctx_b; 638*8e75f744SArnaud Giersch u64 ctrl; 639*8e75f744SArnaud Giersch u64 diag; 640*8e75f744SArnaud Giersch size_t res[2]; /* {[0] = res_a, [1] = res_b} */ 641*8e75f744SArnaud Giersch 642*8e75f744SArnaud Giersch pr_trace(NULL, "()"); 643*8e75f744SArnaud Giersch 644*8e75f744SArnaud Giersch /* Disable IRQs */ 645*8e75f744SArnaud Giersch spin_lock_irq(&parport_ip32_dma.lock); 646*8e75f744SArnaud Giersch if (parport_ip32_dma.irq_on) { 647*8e75f744SArnaud Giersch pr_debug(PPIP32 "IRQ off (stop)\n"); 648*8e75f744SArnaud Giersch disable_irq_nosync(MACEISA_PAR_CTXA_IRQ); 649*8e75f744SArnaud Giersch disable_irq_nosync(MACEISA_PAR_CTXB_IRQ); 650*8e75f744SArnaud Giersch parport_ip32_dma.irq_on = 0; 651*8e75f744SArnaud Giersch } 652*8e75f744SArnaud Giersch spin_unlock_irq(&parport_ip32_dma.lock); 653*8e75f744SArnaud Giersch /* Force IRQ synchronization, even if the IRQs were disabled 654*8e75f744SArnaud Giersch * elsewhere. */ 655*8e75f744SArnaud Giersch synchronize_irq(MACEISA_PAR_CTXA_IRQ); 656*8e75f744SArnaud Giersch synchronize_irq(MACEISA_PAR_CTXB_IRQ); 657*8e75f744SArnaud Giersch 658*8e75f744SArnaud Giersch /* Stop DMA transfer */ 659*8e75f744SArnaud Giersch ctrl = readq(&mace->perif.ctrl.parport.cntlstat); 660*8e75f744SArnaud Giersch ctrl &= ~MACEPAR_CTLSTAT_ENABLE; 661*8e75f744SArnaud Giersch writeq(ctrl, &mace->perif.ctrl.parport.cntlstat); 662*8e75f744SArnaud Giersch 663*8e75f744SArnaud Giersch /* Adjust residue (parport_ip32_dma.left) */ 664*8e75f744SArnaud Giersch ctx_a = readq(&mace->perif.ctrl.parport.context_a); 665*8e75f744SArnaud Giersch ctx_b = readq(&mace->perif.ctrl.parport.context_b); 666*8e75f744SArnaud Giersch ctrl = readq(&mace->perif.ctrl.parport.cntlstat); 667*8e75f744SArnaud Giersch diag = readq(&mace->perif.ctrl.parport.diagnostic); 668*8e75f744SArnaud Giersch res[0] = (ctrl & MACEPAR_CTLSTAT_CTXA_VALID) ? 669*8e75f744SArnaud Giersch 1 + ((ctx_a & MACEPAR_CONTEXT_DATALEN_MASK) >> 670*8e75f744SArnaud Giersch MACEPAR_CONTEXT_DATALEN_SHIFT) : 671*8e75f744SArnaud Giersch 0; 672*8e75f744SArnaud Giersch res[1] = (ctrl & MACEPAR_CTLSTAT_CTXB_VALID) ? 673*8e75f744SArnaud Giersch 1 + ((ctx_b & MACEPAR_CONTEXT_DATALEN_MASK) >> 674*8e75f744SArnaud Giersch MACEPAR_CONTEXT_DATALEN_SHIFT) : 675*8e75f744SArnaud Giersch 0; 676*8e75f744SArnaud Giersch if (diag & MACEPAR_DIAG_DMACTIVE) 677*8e75f744SArnaud Giersch res[(diag & MACEPAR_DIAG_CTXINUSE) != 0] = 678*8e75f744SArnaud Giersch 1 + ((diag & MACEPAR_DIAG_CTRMASK) >> 679*8e75f744SArnaud Giersch MACEPAR_DIAG_CTRSHIFT); 680*8e75f744SArnaud Giersch parport_ip32_dma.left += res[0] + res[1]; 681*8e75f744SArnaud Giersch 682*8e75f744SArnaud Giersch /* Reset DMA controller, and re-enable IRQs */ 683*8e75f744SArnaud Giersch ctrl = MACEPAR_CTLSTAT_RESET; 684*8e75f744SArnaud Giersch writeq(ctrl, &mace->perif.ctrl.parport.cntlstat); 685*8e75f744SArnaud Giersch pr_debug(PPIP32 "IRQ on (stop)\n"); 686*8e75f744SArnaud Giersch enable_irq(MACEISA_PAR_CTXA_IRQ); 687*8e75f744SArnaud Giersch enable_irq(MACEISA_PAR_CTXB_IRQ); 688*8e75f744SArnaud Giersch parport_ip32_dma.irq_on = 1; 689*8e75f744SArnaud Giersch 690*8e75f744SArnaud Giersch dma_unmap_single(NULL, parport_ip32_dma.buf, parport_ip32_dma.len, 691*8e75f744SArnaud Giersch parport_ip32_dma.dir); 692*8e75f744SArnaud Giersch } 693*8e75f744SArnaud Giersch 694*8e75f744SArnaud Giersch /** 695*8e75f744SArnaud Giersch * parport_ip32_dma_get_residue - get residue from last DMA transfer 696*8e75f744SArnaud Giersch * 697*8e75f744SArnaud Giersch * Returns the number of bytes remaining from last DMA transfer. 698*8e75f744SArnaud Giersch */ 699*8e75f744SArnaud Giersch static inline size_t parport_ip32_dma_get_residue(void) 700*8e75f744SArnaud Giersch { 701*8e75f744SArnaud Giersch return parport_ip32_dma.left; 702*8e75f744SArnaud Giersch } 703*8e75f744SArnaud Giersch 704*8e75f744SArnaud Giersch /** 705*8e75f744SArnaud Giersch * parport_ip32_dma_register - initialize DMA engine 706*8e75f744SArnaud Giersch * 707*8e75f744SArnaud Giersch * Returns zero for success. 708*8e75f744SArnaud Giersch */ 709*8e75f744SArnaud Giersch static int parport_ip32_dma_register(void) 710*8e75f744SArnaud Giersch { 711*8e75f744SArnaud Giersch int err; 712*8e75f744SArnaud Giersch 713*8e75f744SArnaud Giersch spin_lock_init(&parport_ip32_dma.lock); 714*8e75f744SArnaud Giersch parport_ip32_dma.irq_on = 1; 715*8e75f744SArnaud Giersch 716*8e75f744SArnaud Giersch /* Reset DMA controller */ 717*8e75f744SArnaud Giersch writeq(MACEPAR_CTLSTAT_RESET, &mace->perif.ctrl.parport.cntlstat); 718*8e75f744SArnaud Giersch 719*8e75f744SArnaud Giersch /* Request IRQs */ 720*8e75f744SArnaud Giersch err = request_irq(MACEISA_PAR_CTXA_IRQ, parport_ip32_dma_interrupt, 721*8e75f744SArnaud Giersch 0, "parport_ip32", NULL); 722*8e75f744SArnaud Giersch if (err) 723*8e75f744SArnaud Giersch goto fail_a; 724*8e75f744SArnaud Giersch err = request_irq(MACEISA_PAR_CTXB_IRQ, parport_ip32_dma_interrupt, 725*8e75f744SArnaud Giersch 0, "parport_ip32", NULL); 726*8e75f744SArnaud Giersch if (err) 727*8e75f744SArnaud Giersch goto fail_b; 728*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 729*8e75f744SArnaud Giersch /* FIXME - what is this IRQ for? */ 730*8e75f744SArnaud Giersch err = request_irq(MACEISA_PAR_MERR_IRQ, parport_ip32_merr_interrupt, 731*8e75f744SArnaud Giersch 0, "parport_ip32", NULL); 732*8e75f744SArnaud Giersch if (err) 733*8e75f744SArnaud Giersch goto fail_merr; 734*8e75f744SArnaud Giersch #endif 735*8e75f744SArnaud Giersch return 0; 736*8e75f744SArnaud Giersch 737*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 738*8e75f744SArnaud Giersch fail_merr: 739*8e75f744SArnaud Giersch free_irq(MACEISA_PAR_CTXB_IRQ, NULL); 740*8e75f744SArnaud Giersch #endif 741*8e75f744SArnaud Giersch fail_b: 742*8e75f744SArnaud Giersch free_irq(MACEISA_PAR_CTXA_IRQ, NULL); 743*8e75f744SArnaud Giersch fail_a: 744*8e75f744SArnaud Giersch return err; 745*8e75f744SArnaud Giersch } 746*8e75f744SArnaud Giersch 747*8e75f744SArnaud Giersch /** 748*8e75f744SArnaud Giersch * parport_ip32_dma_unregister - release and free resources for DMA engine 749*8e75f744SArnaud Giersch */ 750*8e75f744SArnaud Giersch static void parport_ip32_dma_unregister(void) 751*8e75f744SArnaud Giersch { 752*8e75f744SArnaud Giersch #if DEBUG_PARPORT_IP32 753*8e75f744SArnaud Giersch free_irq(MACEISA_PAR_MERR_IRQ, NULL); 754*8e75f744SArnaud Giersch #endif 755*8e75f744SArnaud Giersch free_irq(MACEISA_PAR_CTXB_IRQ, NULL); 756*8e75f744SArnaud Giersch free_irq(MACEISA_PAR_CTXA_IRQ, NULL); 757*8e75f744SArnaud Giersch } 758*8e75f744SArnaud Giersch 759*8e75f744SArnaud Giersch /*--- Interrupt handlers and associates --------------------------------*/ 760*8e75f744SArnaud Giersch 761*8e75f744SArnaud Giersch /** 762*8e75f744SArnaud Giersch * parport_ip32_wakeup - wakes up code waiting for an interrupt 763*8e75f744SArnaud Giersch * @p: pointer to &struct parport 764*8e75f744SArnaud Giersch */ 765*8e75f744SArnaud Giersch static inline void parport_ip32_wakeup(struct parport *p) 766*8e75f744SArnaud Giersch { 767*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 768*8e75f744SArnaud Giersch complete(&priv->irq_complete); 769*8e75f744SArnaud Giersch } 770*8e75f744SArnaud Giersch 771*8e75f744SArnaud Giersch /** 772*8e75f744SArnaud Giersch * parport_ip32_interrupt - interrupt handler 773*8e75f744SArnaud Giersch * @irq: interrupt number 774*8e75f744SArnaud Giersch * @dev_id: pointer to &struct parport 775*8e75f744SArnaud Giersch * @regs: pointer to &struct pt_regs 776*8e75f744SArnaud Giersch * 777*8e75f744SArnaud Giersch * Caught interrupts are forwarded to the upper parport layer if IRQ_mode is 778*8e75f744SArnaud Giersch * %PARPORT_IP32_IRQ_FWD. 779*8e75f744SArnaud Giersch */ 780*8e75f744SArnaud Giersch static irqreturn_t parport_ip32_interrupt(int irq, void *dev_id, 781*8e75f744SArnaud Giersch struct pt_regs *regs) 782*8e75f744SArnaud Giersch { 783*8e75f744SArnaud Giersch struct parport * const p = dev_id; 784*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 785*8e75f744SArnaud Giersch enum parport_ip32_irq_mode irq_mode = priv->irq_mode; 786*8e75f744SArnaud Giersch switch (irq_mode) { 787*8e75f744SArnaud Giersch case PARPORT_IP32_IRQ_FWD: 788*8e75f744SArnaud Giersch parport_generic_irq(irq, p, regs); 789*8e75f744SArnaud Giersch break; 790*8e75f744SArnaud Giersch case PARPORT_IP32_IRQ_HERE: 791*8e75f744SArnaud Giersch parport_ip32_wakeup(p); 792*8e75f744SArnaud Giersch break; 793*8e75f744SArnaud Giersch } 794*8e75f744SArnaud Giersch return IRQ_HANDLED; 795*8e75f744SArnaud Giersch } 796*8e75f744SArnaud Giersch 797*8e75f744SArnaud Giersch /*--- Some utility function to manipulate ECR register -----------------*/ 798*8e75f744SArnaud Giersch 799*8e75f744SArnaud Giersch /** 800*8e75f744SArnaud Giersch * parport_ip32_read_econtrol - read contents of the ECR register 801*8e75f744SArnaud Giersch * @p: pointer to &struct parport 802*8e75f744SArnaud Giersch */ 803*8e75f744SArnaud Giersch static inline unsigned int parport_ip32_read_econtrol(struct parport *p) 804*8e75f744SArnaud Giersch { 805*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 806*8e75f744SArnaud Giersch return readb(priv->regs.ecr); 807*8e75f744SArnaud Giersch } 808*8e75f744SArnaud Giersch 809*8e75f744SArnaud Giersch /** 810*8e75f744SArnaud Giersch * parport_ip32_write_econtrol - write new contents to the ECR register 811*8e75f744SArnaud Giersch * @p: pointer to &struct parport 812*8e75f744SArnaud Giersch * @c: new value to write 813*8e75f744SArnaud Giersch */ 814*8e75f744SArnaud Giersch static inline void parport_ip32_write_econtrol(struct parport *p, 815*8e75f744SArnaud Giersch unsigned int c) 816*8e75f744SArnaud Giersch { 817*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 818*8e75f744SArnaud Giersch writeb(c, priv->regs.ecr); 819*8e75f744SArnaud Giersch } 820*8e75f744SArnaud Giersch 821*8e75f744SArnaud Giersch /** 822*8e75f744SArnaud Giersch * parport_ip32_frob_econtrol - change bits from the ECR register 823*8e75f744SArnaud Giersch * @p: pointer to &struct parport 824*8e75f744SArnaud Giersch * @mask: bit mask of bits to change 825*8e75f744SArnaud Giersch * @val: new value for changed bits 826*8e75f744SArnaud Giersch * 827*8e75f744SArnaud Giersch * Read from the ECR, mask out the bits in @mask, exclusive-or with the bits 828*8e75f744SArnaud Giersch * in @val, and write the result to the ECR. 829*8e75f744SArnaud Giersch */ 830*8e75f744SArnaud Giersch static inline void parport_ip32_frob_econtrol(struct parport *p, 831*8e75f744SArnaud Giersch unsigned int mask, 832*8e75f744SArnaud Giersch unsigned int val) 833*8e75f744SArnaud Giersch { 834*8e75f744SArnaud Giersch unsigned int c; 835*8e75f744SArnaud Giersch c = (parport_ip32_read_econtrol(p) & ~mask) ^ val; 836*8e75f744SArnaud Giersch parport_ip32_write_econtrol(p, c); 837*8e75f744SArnaud Giersch } 838*8e75f744SArnaud Giersch 839*8e75f744SArnaud Giersch /** 840*8e75f744SArnaud Giersch * parport_ip32_set_mode - change mode of ECP port 841*8e75f744SArnaud Giersch * @p: pointer to &struct parport 842*8e75f744SArnaud Giersch * @mode: new mode to write in ECR 843*8e75f744SArnaud Giersch * 844*8e75f744SArnaud Giersch * ECR is reset in a sane state (interrupts and DMA disabled), and placed in 845*8e75f744SArnaud Giersch * mode @mode. Go through PS2 mode if needed. 846*8e75f744SArnaud Giersch */ 847*8e75f744SArnaud Giersch static void parport_ip32_set_mode(struct parport *p, unsigned int mode) 848*8e75f744SArnaud Giersch { 849*8e75f744SArnaud Giersch unsigned int omode; 850*8e75f744SArnaud Giersch 851*8e75f744SArnaud Giersch mode &= ECR_MODE_MASK; 852*8e75f744SArnaud Giersch omode = parport_ip32_read_econtrol(p) & ECR_MODE_MASK; 853*8e75f744SArnaud Giersch 854*8e75f744SArnaud Giersch if (!(mode == ECR_MODE_SPP || mode == ECR_MODE_PS2 855*8e75f744SArnaud Giersch || omode == ECR_MODE_SPP || omode == ECR_MODE_PS2)) { 856*8e75f744SArnaud Giersch /* We have to go through PS2 mode */ 857*8e75f744SArnaud Giersch unsigned int ecr = ECR_MODE_PS2 | ECR_nERRINTR | ECR_SERVINTR; 858*8e75f744SArnaud Giersch parport_ip32_write_econtrol(p, ecr); 859*8e75f744SArnaud Giersch } 860*8e75f744SArnaud Giersch parport_ip32_write_econtrol(p, mode | ECR_nERRINTR | ECR_SERVINTR); 861*8e75f744SArnaud Giersch } 862*8e75f744SArnaud Giersch 863*8e75f744SArnaud Giersch /*--- Basic functions needed for parport -------------------------------*/ 864*8e75f744SArnaud Giersch 865*8e75f744SArnaud Giersch /** 866*8e75f744SArnaud Giersch * parport_ip32_read_data - return current contents of the DATA register 867*8e75f744SArnaud Giersch * @p: pointer to &struct parport 868*8e75f744SArnaud Giersch */ 869*8e75f744SArnaud Giersch static inline unsigned char parport_ip32_read_data(struct parport *p) 870*8e75f744SArnaud Giersch { 871*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 872*8e75f744SArnaud Giersch return readb(priv->regs.data); 873*8e75f744SArnaud Giersch } 874*8e75f744SArnaud Giersch 875*8e75f744SArnaud Giersch /** 876*8e75f744SArnaud Giersch * parport_ip32_write_data - set new contents for the DATA register 877*8e75f744SArnaud Giersch * @p: pointer to &struct parport 878*8e75f744SArnaud Giersch * @d: new value to write 879*8e75f744SArnaud Giersch */ 880*8e75f744SArnaud Giersch static inline void parport_ip32_write_data(struct parport *p, unsigned char d) 881*8e75f744SArnaud Giersch { 882*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 883*8e75f744SArnaud Giersch writeb(d, priv->regs.data); 884*8e75f744SArnaud Giersch } 885*8e75f744SArnaud Giersch 886*8e75f744SArnaud Giersch /** 887*8e75f744SArnaud Giersch * parport_ip32_read_status - return current contents of the DSR register 888*8e75f744SArnaud Giersch * @p: pointer to &struct parport 889*8e75f744SArnaud Giersch */ 890*8e75f744SArnaud Giersch static inline unsigned char parport_ip32_read_status(struct parport *p) 891*8e75f744SArnaud Giersch { 892*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 893*8e75f744SArnaud Giersch return readb(priv->regs.dsr); 894*8e75f744SArnaud Giersch } 895*8e75f744SArnaud Giersch 896*8e75f744SArnaud Giersch /** 897*8e75f744SArnaud Giersch * __parport_ip32_read_control - return cached contents of the DCR register 898*8e75f744SArnaud Giersch * @p: pointer to &struct parport 899*8e75f744SArnaud Giersch */ 900*8e75f744SArnaud Giersch static inline unsigned int __parport_ip32_read_control(struct parport *p) 901*8e75f744SArnaud Giersch { 902*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 903*8e75f744SArnaud Giersch return priv->dcr_cache; /* use soft copy */ 904*8e75f744SArnaud Giersch } 905*8e75f744SArnaud Giersch 906*8e75f744SArnaud Giersch /** 907*8e75f744SArnaud Giersch * __parport_ip32_write_control - set new contents for the DCR register 908*8e75f744SArnaud Giersch * @p: pointer to &struct parport 909*8e75f744SArnaud Giersch * @c: new value to write 910*8e75f744SArnaud Giersch */ 911*8e75f744SArnaud Giersch static inline void __parport_ip32_write_control(struct parport *p, 912*8e75f744SArnaud Giersch unsigned int c) 913*8e75f744SArnaud Giersch { 914*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 915*8e75f744SArnaud Giersch CHECK_EXTRA_BITS(p, c, priv->dcr_writable); 916*8e75f744SArnaud Giersch c &= priv->dcr_writable; /* only writable bits */ 917*8e75f744SArnaud Giersch writeb(c, priv->regs.dcr); 918*8e75f744SArnaud Giersch priv->dcr_cache = c; /* update soft copy */ 919*8e75f744SArnaud Giersch } 920*8e75f744SArnaud Giersch 921*8e75f744SArnaud Giersch /** 922*8e75f744SArnaud Giersch * __parport_ip32_frob_control - change bits from the DCR register 923*8e75f744SArnaud Giersch * @p: pointer to &struct parport 924*8e75f744SArnaud Giersch * @mask: bit mask of bits to change 925*8e75f744SArnaud Giersch * @val: new value for changed bits 926*8e75f744SArnaud Giersch * 927*8e75f744SArnaud Giersch * This is equivalent to read from the DCR, mask out the bits in @mask, 928*8e75f744SArnaud Giersch * exclusive-or with the bits in @val, and write the result to the DCR. 929*8e75f744SArnaud Giersch * Actually, the cached contents of the DCR is used. 930*8e75f744SArnaud Giersch */ 931*8e75f744SArnaud Giersch static inline void __parport_ip32_frob_control(struct parport *p, 932*8e75f744SArnaud Giersch unsigned int mask, 933*8e75f744SArnaud Giersch unsigned int val) 934*8e75f744SArnaud Giersch { 935*8e75f744SArnaud Giersch unsigned int c; 936*8e75f744SArnaud Giersch c = (__parport_ip32_read_control(p) & ~mask) ^ val; 937*8e75f744SArnaud Giersch __parport_ip32_write_control(p, c); 938*8e75f744SArnaud Giersch } 939*8e75f744SArnaud Giersch 940*8e75f744SArnaud Giersch /** 941*8e75f744SArnaud Giersch * parport_ip32_read_control - return cached contents of the DCR register 942*8e75f744SArnaud Giersch * @p: pointer to &struct parport 943*8e75f744SArnaud Giersch * 944*8e75f744SArnaud Giersch * The return value is masked so as to only return the value of %DCR_STROBE, 945*8e75f744SArnaud Giersch * %DCR_AUTOFD, %DCR_nINIT, and %DCR_SELECT. 946*8e75f744SArnaud Giersch */ 947*8e75f744SArnaud Giersch static inline unsigned char parport_ip32_read_control(struct parport *p) 948*8e75f744SArnaud Giersch { 949*8e75f744SArnaud Giersch const unsigned int rm = 950*8e75f744SArnaud Giersch DCR_STROBE | DCR_AUTOFD | DCR_nINIT | DCR_SELECT; 951*8e75f744SArnaud Giersch return __parport_ip32_read_control(p) & rm; 952*8e75f744SArnaud Giersch } 953*8e75f744SArnaud Giersch 954*8e75f744SArnaud Giersch /** 955*8e75f744SArnaud Giersch * parport_ip32_write_control - set new contents for the DCR register 956*8e75f744SArnaud Giersch * @p: pointer to &struct parport 957*8e75f744SArnaud Giersch * @c: new value to write 958*8e75f744SArnaud Giersch * 959*8e75f744SArnaud Giersch * The value is masked so as to only change the value of %DCR_STROBE, 960*8e75f744SArnaud Giersch * %DCR_AUTOFD, %DCR_nINIT, and %DCR_SELECT. 961*8e75f744SArnaud Giersch */ 962*8e75f744SArnaud Giersch static inline void parport_ip32_write_control(struct parport *p, 963*8e75f744SArnaud Giersch unsigned char c) 964*8e75f744SArnaud Giersch { 965*8e75f744SArnaud Giersch const unsigned int wm = 966*8e75f744SArnaud Giersch DCR_STROBE | DCR_AUTOFD | DCR_nINIT | DCR_SELECT; 967*8e75f744SArnaud Giersch CHECK_EXTRA_BITS(p, c, wm); 968*8e75f744SArnaud Giersch __parport_ip32_frob_control(p, wm, c & wm); 969*8e75f744SArnaud Giersch } 970*8e75f744SArnaud Giersch 971*8e75f744SArnaud Giersch /** 972*8e75f744SArnaud Giersch * parport_ip32_frob_control - change bits from the DCR register 973*8e75f744SArnaud Giersch * @p: pointer to &struct parport 974*8e75f744SArnaud Giersch * @mask: bit mask of bits to change 975*8e75f744SArnaud Giersch * @val: new value for changed bits 976*8e75f744SArnaud Giersch * 977*8e75f744SArnaud Giersch * This differs from __parport_ip32_frob_control() in that it only allows to 978*8e75f744SArnaud Giersch * change the value of %DCR_STROBE, %DCR_AUTOFD, %DCR_nINIT, and %DCR_SELECT. 979*8e75f744SArnaud Giersch */ 980*8e75f744SArnaud Giersch static inline unsigned char parport_ip32_frob_control(struct parport *p, 981*8e75f744SArnaud Giersch unsigned char mask, 982*8e75f744SArnaud Giersch unsigned char val) 983*8e75f744SArnaud Giersch { 984*8e75f744SArnaud Giersch const unsigned int wm = 985*8e75f744SArnaud Giersch DCR_STROBE | DCR_AUTOFD | DCR_nINIT | DCR_SELECT; 986*8e75f744SArnaud Giersch CHECK_EXTRA_BITS(p, mask, wm); 987*8e75f744SArnaud Giersch CHECK_EXTRA_BITS(p, val, wm); 988*8e75f744SArnaud Giersch __parport_ip32_frob_control(p, mask & wm, val & wm); 989*8e75f744SArnaud Giersch return parport_ip32_read_control(p); 990*8e75f744SArnaud Giersch } 991*8e75f744SArnaud Giersch 992*8e75f744SArnaud Giersch /** 993*8e75f744SArnaud Giersch * parport_ip32_disable_irq - disable interrupts on the rising edge of nACK 994*8e75f744SArnaud Giersch * @p: pointer to &struct parport 995*8e75f744SArnaud Giersch */ 996*8e75f744SArnaud Giersch static inline void parport_ip32_disable_irq(struct parport *p) 997*8e75f744SArnaud Giersch { 998*8e75f744SArnaud Giersch __parport_ip32_frob_control(p, DCR_IRQ, 0); 999*8e75f744SArnaud Giersch } 1000*8e75f744SArnaud Giersch 1001*8e75f744SArnaud Giersch /** 1002*8e75f744SArnaud Giersch * parport_ip32_enable_irq - enable interrupts on the rising edge of nACK 1003*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1004*8e75f744SArnaud Giersch */ 1005*8e75f744SArnaud Giersch static inline void parport_ip32_enable_irq(struct parport *p) 1006*8e75f744SArnaud Giersch { 1007*8e75f744SArnaud Giersch __parport_ip32_frob_control(p, DCR_IRQ, DCR_IRQ); 1008*8e75f744SArnaud Giersch } 1009*8e75f744SArnaud Giersch 1010*8e75f744SArnaud Giersch /** 1011*8e75f744SArnaud Giersch * parport_ip32_data_forward - enable host-to-peripheral communications 1012*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1013*8e75f744SArnaud Giersch * 1014*8e75f744SArnaud Giersch * Enable the data line drivers, for 8-bit host-to-peripheral communications. 1015*8e75f744SArnaud Giersch */ 1016*8e75f744SArnaud Giersch static inline void parport_ip32_data_forward(struct parport *p) 1017*8e75f744SArnaud Giersch { 1018*8e75f744SArnaud Giersch __parport_ip32_frob_control(p, DCR_DIR, 0); 1019*8e75f744SArnaud Giersch } 1020*8e75f744SArnaud Giersch 1021*8e75f744SArnaud Giersch /** 1022*8e75f744SArnaud Giersch * parport_ip32_data_reverse - enable peripheral-to-host communications 1023*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1024*8e75f744SArnaud Giersch * 1025*8e75f744SArnaud Giersch * Place the data bus in a high impedance state, if @p->modes has the 1026*8e75f744SArnaud Giersch * PARPORT_MODE_TRISTATE bit set. 1027*8e75f744SArnaud Giersch */ 1028*8e75f744SArnaud Giersch static inline void parport_ip32_data_reverse(struct parport *p) 1029*8e75f744SArnaud Giersch { 1030*8e75f744SArnaud Giersch __parport_ip32_frob_control(p, DCR_DIR, DCR_DIR); 1031*8e75f744SArnaud Giersch } 1032*8e75f744SArnaud Giersch 1033*8e75f744SArnaud Giersch /** 1034*8e75f744SArnaud Giersch * parport_ip32_init_state - for core parport code 1035*8e75f744SArnaud Giersch * @dev: pointer to &struct pardevice 1036*8e75f744SArnaud Giersch * @s: pointer to &struct parport_state to initialize 1037*8e75f744SArnaud Giersch */ 1038*8e75f744SArnaud Giersch static void parport_ip32_init_state(struct pardevice *dev, 1039*8e75f744SArnaud Giersch struct parport_state *s) 1040*8e75f744SArnaud Giersch { 1041*8e75f744SArnaud Giersch s->u.ip32.dcr = DCR_SELECT | DCR_nINIT; 1042*8e75f744SArnaud Giersch s->u.ip32.ecr = ECR_MODE_PS2 | ECR_nERRINTR | ECR_SERVINTR; 1043*8e75f744SArnaud Giersch } 1044*8e75f744SArnaud Giersch 1045*8e75f744SArnaud Giersch /** 1046*8e75f744SArnaud Giersch * parport_ip32_save_state - for core parport code 1047*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1048*8e75f744SArnaud Giersch * @s: pointer to &struct parport_state to save state to 1049*8e75f744SArnaud Giersch */ 1050*8e75f744SArnaud Giersch static void parport_ip32_save_state(struct parport *p, 1051*8e75f744SArnaud Giersch struct parport_state *s) 1052*8e75f744SArnaud Giersch { 1053*8e75f744SArnaud Giersch s->u.ip32.dcr = __parport_ip32_read_control(p); 1054*8e75f744SArnaud Giersch s->u.ip32.ecr = parport_ip32_read_econtrol(p); 1055*8e75f744SArnaud Giersch } 1056*8e75f744SArnaud Giersch 1057*8e75f744SArnaud Giersch /** 1058*8e75f744SArnaud Giersch * parport_ip32_restore_state - for core parport code 1059*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1060*8e75f744SArnaud Giersch * @s: pointer to &struct parport_state to restore state from 1061*8e75f744SArnaud Giersch */ 1062*8e75f744SArnaud Giersch static void parport_ip32_restore_state(struct parport *p, 1063*8e75f744SArnaud Giersch struct parport_state *s) 1064*8e75f744SArnaud Giersch { 1065*8e75f744SArnaud Giersch parport_ip32_set_mode(p, s->u.ip32.ecr & ECR_MODE_MASK); 1066*8e75f744SArnaud Giersch parport_ip32_write_econtrol(p, s->u.ip32.ecr); 1067*8e75f744SArnaud Giersch __parport_ip32_write_control(p, s->u.ip32.dcr); 1068*8e75f744SArnaud Giersch } 1069*8e75f744SArnaud Giersch 1070*8e75f744SArnaud Giersch /*--- EPP mode functions -----------------------------------------------*/ 1071*8e75f744SArnaud Giersch 1072*8e75f744SArnaud Giersch /** 1073*8e75f744SArnaud Giersch * parport_ip32_clear_epp_timeout - clear Timeout bit in EPP mode 1074*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1075*8e75f744SArnaud Giersch * 1076*8e75f744SArnaud Giersch * Returns 1 if the Timeout bit is clear, and 0 otherwise. 1077*8e75f744SArnaud Giersch */ 1078*8e75f744SArnaud Giersch static unsigned int parport_ip32_clear_epp_timeout(struct parport *p) 1079*8e75f744SArnaud Giersch { 1080*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1081*8e75f744SArnaud Giersch unsigned int cleared; 1082*8e75f744SArnaud Giersch 1083*8e75f744SArnaud Giersch if (!(parport_ip32_read_status(p) & DSR_TIMEOUT)) 1084*8e75f744SArnaud Giersch cleared = 1; 1085*8e75f744SArnaud Giersch else { 1086*8e75f744SArnaud Giersch unsigned int r; 1087*8e75f744SArnaud Giersch /* To clear timeout some chips require double read */ 1088*8e75f744SArnaud Giersch parport_ip32_read_status(p); 1089*8e75f744SArnaud Giersch r = parport_ip32_read_status(p); 1090*8e75f744SArnaud Giersch /* Some reset by writing 1 */ 1091*8e75f744SArnaud Giersch writeb(r | DSR_TIMEOUT, priv->regs.dsr); 1092*8e75f744SArnaud Giersch /* Others by writing 0 */ 1093*8e75f744SArnaud Giersch writeb(r & ~DSR_TIMEOUT, priv->regs.dsr); 1094*8e75f744SArnaud Giersch 1095*8e75f744SArnaud Giersch r = parport_ip32_read_status(p); 1096*8e75f744SArnaud Giersch cleared = !(r & DSR_TIMEOUT); 1097*8e75f744SArnaud Giersch } 1098*8e75f744SArnaud Giersch 1099*8e75f744SArnaud Giersch pr_trace(p, "(): %s", cleared ? "cleared" : "failed"); 1100*8e75f744SArnaud Giersch return cleared; 1101*8e75f744SArnaud Giersch } 1102*8e75f744SArnaud Giersch 1103*8e75f744SArnaud Giersch /** 1104*8e75f744SArnaud Giersch * parport_ip32_epp_read - generic EPP read function 1105*8e75f744SArnaud Giersch * @eppreg: I/O register to read from 1106*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1107*8e75f744SArnaud Giersch * @buf: buffer to store read data 1108*8e75f744SArnaud Giersch * @len: length of buffer @buf 1109*8e75f744SArnaud Giersch * @flags: may be PARPORT_EPP_FAST 1110*8e75f744SArnaud Giersch */ 1111*8e75f744SArnaud Giersch static size_t parport_ip32_epp_read(void __iomem *eppreg, 1112*8e75f744SArnaud Giersch struct parport *p, void *buf, 1113*8e75f744SArnaud Giersch size_t len, int flags) 1114*8e75f744SArnaud Giersch { 1115*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1116*8e75f744SArnaud Giersch size_t got; 1117*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_EPP); 1118*8e75f744SArnaud Giersch parport_ip32_data_reverse(p); 1119*8e75f744SArnaud Giersch parport_ip32_write_control(p, DCR_nINIT); 1120*8e75f744SArnaud Giersch if ((flags & PARPORT_EPP_FAST) && (len > 1)) { 1121*8e75f744SArnaud Giersch readsb(eppreg, buf, len); 1122*8e75f744SArnaud Giersch if (readb(priv->regs.dsr) & DSR_TIMEOUT) { 1123*8e75f744SArnaud Giersch parport_ip32_clear_epp_timeout(p); 1124*8e75f744SArnaud Giersch return -EIO; 1125*8e75f744SArnaud Giersch } 1126*8e75f744SArnaud Giersch got = len; 1127*8e75f744SArnaud Giersch } else { 1128*8e75f744SArnaud Giersch u8 *bufp = buf; 1129*8e75f744SArnaud Giersch for (got = 0; got < len; got++) { 1130*8e75f744SArnaud Giersch *bufp++ = readb(eppreg); 1131*8e75f744SArnaud Giersch if (readb(priv->regs.dsr) & DSR_TIMEOUT) { 1132*8e75f744SArnaud Giersch parport_ip32_clear_epp_timeout(p); 1133*8e75f744SArnaud Giersch break; 1134*8e75f744SArnaud Giersch } 1135*8e75f744SArnaud Giersch } 1136*8e75f744SArnaud Giersch } 1137*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 1138*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1139*8e75f744SArnaud Giersch return got; 1140*8e75f744SArnaud Giersch } 1141*8e75f744SArnaud Giersch 1142*8e75f744SArnaud Giersch /** 1143*8e75f744SArnaud Giersch * parport_ip32_epp_write - generic EPP write function 1144*8e75f744SArnaud Giersch * @eppreg: I/O register to write to 1145*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1146*8e75f744SArnaud Giersch * @buf: buffer of data to write 1147*8e75f744SArnaud Giersch * @len: length of buffer @buf 1148*8e75f744SArnaud Giersch * @flags: may be PARPORT_EPP_FAST 1149*8e75f744SArnaud Giersch */ 1150*8e75f744SArnaud Giersch static size_t parport_ip32_epp_write(void __iomem *eppreg, 1151*8e75f744SArnaud Giersch struct parport *p, const void *buf, 1152*8e75f744SArnaud Giersch size_t len, int flags) 1153*8e75f744SArnaud Giersch { 1154*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1155*8e75f744SArnaud Giersch size_t written; 1156*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_EPP); 1157*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 1158*8e75f744SArnaud Giersch parport_ip32_write_control(p, DCR_nINIT); 1159*8e75f744SArnaud Giersch if ((flags & PARPORT_EPP_FAST) && (len > 1)) { 1160*8e75f744SArnaud Giersch writesb(eppreg, buf, len); 1161*8e75f744SArnaud Giersch if (readb(priv->regs.dsr) & DSR_TIMEOUT) { 1162*8e75f744SArnaud Giersch parport_ip32_clear_epp_timeout(p); 1163*8e75f744SArnaud Giersch return -EIO; 1164*8e75f744SArnaud Giersch } 1165*8e75f744SArnaud Giersch written = len; 1166*8e75f744SArnaud Giersch } else { 1167*8e75f744SArnaud Giersch const u8 *bufp = buf; 1168*8e75f744SArnaud Giersch for (written = 0; written < len; written++) { 1169*8e75f744SArnaud Giersch writeb(*bufp++, eppreg); 1170*8e75f744SArnaud Giersch if (readb(priv->regs.dsr) & DSR_TIMEOUT) { 1171*8e75f744SArnaud Giersch parport_ip32_clear_epp_timeout(p); 1172*8e75f744SArnaud Giersch break; 1173*8e75f744SArnaud Giersch } 1174*8e75f744SArnaud Giersch } 1175*8e75f744SArnaud Giersch } 1176*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1177*8e75f744SArnaud Giersch return written; 1178*8e75f744SArnaud Giersch } 1179*8e75f744SArnaud Giersch 1180*8e75f744SArnaud Giersch /** 1181*8e75f744SArnaud Giersch * parport_ip32_epp_read_data - read a block of data in EPP mode 1182*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1183*8e75f744SArnaud Giersch * @buf: buffer to store read data 1184*8e75f744SArnaud Giersch * @len: length of buffer @buf 1185*8e75f744SArnaud Giersch * @flags: may be PARPORT_EPP_FAST 1186*8e75f744SArnaud Giersch */ 1187*8e75f744SArnaud Giersch static size_t parport_ip32_epp_read_data(struct parport *p, void *buf, 1188*8e75f744SArnaud Giersch size_t len, int flags) 1189*8e75f744SArnaud Giersch { 1190*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1191*8e75f744SArnaud Giersch return parport_ip32_epp_read(priv->regs.eppData0, p, buf, len, flags); 1192*8e75f744SArnaud Giersch } 1193*8e75f744SArnaud Giersch 1194*8e75f744SArnaud Giersch /** 1195*8e75f744SArnaud Giersch * parport_ip32_epp_write_data - write a block of data in EPP mode 1196*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1197*8e75f744SArnaud Giersch * @buf: buffer of data to write 1198*8e75f744SArnaud Giersch * @len: length of buffer @buf 1199*8e75f744SArnaud Giersch * @flags: may be PARPORT_EPP_FAST 1200*8e75f744SArnaud Giersch */ 1201*8e75f744SArnaud Giersch static size_t parport_ip32_epp_write_data(struct parport *p, const void *buf, 1202*8e75f744SArnaud Giersch size_t len, int flags) 1203*8e75f744SArnaud Giersch { 1204*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1205*8e75f744SArnaud Giersch return parport_ip32_epp_write(priv->regs.eppData0, p, buf, len, flags); 1206*8e75f744SArnaud Giersch } 1207*8e75f744SArnaud Giersch 1208*8e75f744SArnaud Giersch /** 1209*8e75f744SArnaud Giersch * parport_ip32_epp_read_addr - read a block of addresses in EPP mode 1210*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1211*8e75f744SArnaud Giersch * @buf: buffer to store read data 1212*8e75f744SArnaud Giersch * @len: length of buffer @buf 1213*8e75f744SArnaud Giersch * @flags: may be PARPORT_EPP_FAST 1214*8e75f744SArnaud Giersch */ 1215*8e75f744SArnaud Giersch static size_t parport_ip32_epp_read_addr(struct parport *p, void *buf, 1216*8e75f744SArnaud Giersch size_t len, int flags) 1217*8e75f744SArnaud Giersch { 1218*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1219*8e75f744SArnaud Giersch return parport_ip32_epp_read(priv->regs.eppAddr, p, buf, len, flags); 1220*8e75f744SArnaud Giersch } 1221*8e75f744SArnaud Giersch 1222*8e75f744SArnaud Giersch /** 1223*8e75f744SArnaud Giersch * parport_ip32_epp_write_addr - write a block of addresses in EPP mode 1224*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1225*8e75f744SArnaud Giersch * @buf: buffer of data to write 1226*8e75f744SArnaud Giersch * @len: length of buffer @buf 1227*8e75f744SArnaud Giersch * @flags: may be PARPORT_EPP_FAST 1228*8e75f744SArnaud Giersch */ 1229*8e75f744SArnaud Giersch static size_t parport_ip32_epp_write_addr(struct parport *p, const void *buf, 1230*8e75f744SArnaud Giersch size_t len, int flags) 1231*8e75f744SArnaud Giersch { 1232*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1233*8e75f744SArnaud Giersch return parport_ip32_epp_write(priv->regs.eppAddr, p, buf, len, flags); 1234*8e75f744SArnaud Giersch } 1235*8e75f744SArnaud Giersch 1236*8e75f744SArnaud Giersch /*--- ECP mode functions (FIFO) ----------------------------------------*/ 1237*8e75f744SArnaud Giersch 1238*8e75f744SArnaud Giersch /** 1239*8e75f744SArnaud Giersch * parport_ip32_fifo_wait_break - check if the waiting function should return 1240*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1241*8e75f744SArnaud Giersch * @expire: timeout expiring date, in jiffies 1242*8e75f744SArnaud Giersch * 1243*8e75f744SArnaud Giersch * parport_ip32_fifo_wait_break() checks if the waiting function should return 1244*8e75f744SArnaud Giersch * immediately or not. The break conditions are: 1245*8e75f744SArnaud Giersch * - expired timeout; 1246*8e75f744SArnaud Giersch * - a pending signal; 1247*8e75f744SArnaud Giersch * - nFault asserted low. 1248*8e75f744SArnaud Giersch * This function also calls cond_resched(). 1249*8e75f744SArnaud Giersch */ 1250*8e75f744SArnaud Giersch static unsigned int parport_ip32_fifo_wait_break(struct parport *p, 1251*8e75f744SArnaud Giersch unsigned long expire) 1252*8e75f744SArnaud Giersch { 1253*8e75f744SArnaud Giersch cond_resched(); 1254*8e75f744SArnaud Giersch if (time_after(jiffies, expire)) { 1255*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: FIFO write timed out\n", p->name); 1256*8e75f744SArnaud Giersch return 1; 1257*8e75f744SArnaud Giersch } 1258*8e75f744SArnaud Giersch if (signal_pending(current)) { 1259*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: Signal pending\n", p->name); 1260*8e75f744SArnaud Giersch return 1; 1261*8e75f744SArnaud Giersch } 1262*8e75f744SArnaud Giersch if (!(parport_ip32_read_status(p) & DSR_nFAULT)) { 1263*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: nFault asserted low\n", p->name); 1264*8e75f744SArnaud Giersch return 1; 1265*8e75f744SArnaud Giersch } 1266*8e75f744SArnaud Giersch return 0; 1267*8e75f744SArnaud Giersch } 1268*8e75f744SArnaud Giersch 1269*8e75f744SArnaud Giersch /** 1270*8e75f744SArnaud Giersch * parport_ip32_fwp_wait_polling - wait for FIFO to empty (polling) 1271*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1272*8e75f744SArnaud Giersch * 1273*8e75f744SArnaud Giersch * Returns the number of bytes that can safely be written in the FIFO. A 1274*8e75f744SArnaud Giersch * return value of zero means that the calling function should terminate as 1275*8e75f744SArnaud Giersch * fast as possible. 1276*8e75f744SArnaud Giersch */ 1277*8e75f744SArnaud Giersch static unsigned int parport_ip32_fwp_wait_polling(struct parport *p) 1278*8e75f744SArnaud Giersch { 1279*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1280*8e75f744SArnaud Giersch struct parport * const physport = p->physport; 1281*8e75f744SArnaud Giersch unsigned long expire; 1282*8e75f744SArnaud Giersch unsigned int count; 1283*8e75f744SArnaud Giersch unsigned int ecr; 1284*8e75f744SArnaud Giersch 1285*8e75f744SArnaud Giersch expire = jiffies + physport->cad->timeout; 1286*8e75f744SArnaud Giersch count = 0; 1287*8e75f744SArnaud Giersch while (1) { 1288*8e75f744SArnaud Giersch if (parport_ip32_fifo_wait_break(p, expire)) 1289*8e75f744SArnaud Giersch break; 1290*8e75f744SArnaud Giersch 1291*8e75f744SArnaud Giersch /* Check FIFO state. We do nothing when the FIFO is nor full, 1292*8e75f744SArnaud Giersch * nor empty. It appears that the FIFO full bit is not always 1293*8e75f744SArnaud Giersch * reliable, the FIFO state is sometimes wrongly reported, and 1294*8e75f744SArnaud Giersch * the chip gets confused if we give it another byte. */ 1295*8e75f744SArnaud Giersch ecr = parport_ip32_read_econtrol(p); 1296*8e75f744SArnaud Giersch if (ecr & ECR_F_EMPTY) { 1297*8e75f744SArnaud Giersch /* FIFO is empty, fill it up */ 1298*8e75f744SArnaud Giersch count = priv->fifo_depth; 1299*8e75f744SArnaud Giersch break; 1300*8e75f744SArnaud Giersch } 1301*8e75f744SArnaud Giersch 1302*8e75f744SArnaud Giersch /* Wait a moment... */ 1303*8e75f744SArnaud Giersch udelay(FIFO_POLLING_INTERVAL); 1304*8e75f744SArnaud Giersch } /* while (1) */ 1305*8e75f744SArnaud Giersch 1306*8e75f744SArnaud Giersch return count; 1307*8e75f744SArnaud Giersch } 1308*8e75f744SArnaud Giersch 1309*8e75f744SArnaud Giersch /** 1310*8e75f744SArnaud Giersch * parport_ip32_fwp_wait_interrupt - wait for FIFO to empty (interrupt-driven) 1311*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1312*8e75f744SArnaud Giersch * 1313*8e75f744SArnaud Giersch * Returns the number of bytes that can safely be written in the FIFO. A 1314*8e75f744SArnaud Giersch * return value of zero means that the calling function should terminate as 1315*8e75f744SArnaud Giersch * fast as possible. 1316*8e75f744SArnaud Giersch */ 1317*8e75f744SArnaud Giersch static unsigned int parport_ip32_fwp_wait_interrupt(struct parport *p) 1318*8e75f744SArnaud Giersch { 1319*8e75f744SArnaud Giersch static unsigned int lost_interrupt = 0; 1320*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1321*8e75f744SArnaud Giersch struct parport * const physport = p->physport; 1322*8e75f744SArnaud Giersch unsigned long nfault_timeout; 1323*8e75f744SArnaud Giersch unsigned long expire; 1324*8e75f744SArnaud Giersch unsigned int count; 1325*8e75f744SArnaud Giersch unsigned int ecr; 1326*8e75f744SArnaud Giersch 1327*8e75f744SArnaud Giersch nfault_timeout = min((unsigned long)physport->cad->timeout, 1328*8e75f744SArnaud Giersch msecs_to_jiffies(FIFO_NFAULT_TIMEOUT)); 1329*8e75f744SArnaud Giersch expire = jiffies + physport->cad->timeout; 1330*8e75f744SArnaud Giersch count = 0; 1331*8e75f744SArnaud Giersch while (1) { 1332*8e75f744SArnaud Giersch if (parport_ip32_fifo_wait_break(p, expire)) 1333*8e75f744SArnaud Giersch break; 1334*8e75f744SArnaud Giersch 1335*8e75f744SArnaud Giersch /* Initialize mutex used to take interrupts into account */ 1336*8e75f744SArnaud Giersch INIT_COMPLETION(priv->irq_complete); 1337*8e75f744SArnaud Giersch 1338*8e75f744SArnaud Giersch /* Enable serviceIntr */ 1339*8e75f744SArnaud Giersch parport_ip32_frob_econtrol(p, ECR_SERVINTR, 0); 1340*8e75f744SArnaud Giersch 1341*8e75f744SArnaud Giersch /* Enabling serviceIntr while the FIFO is empty does not 1342*8e75f744SArnaud Giersch * always generate an interrupt, so check for emptiness 1343*8e75f744SArnaud Giersch * now. */ 1344*8e75f744SArnaud Giersch ecr = parport_ip32_read_econtrol(p); 1345*8e75f744SArnaud Giersch if (!(ecr & ECR_F_EMPTY)) { 1346*8e75f744SArnaud Giersch /* FIFO is not empty: wait for an interrupt or a 1347*8e75f744SArnaud Giersch * timeout to occur */ 1348*8e75f744SArnaud Giersch wait_for_completion_interruptible_timeout( 1349*8e75f744SArnaud Giersch &priv->irq_complete, nfault_timeout); 1350*8e75f744SArnaud Giersch ecr = parport_ip32_read_econtrol(p); 1351*8e75f744SArnaud Giersch if ((ecr & ECR_F_EMPTY) && !(ecr & ECR_SERVINTR) 1352*8e75f744SArnaud Giersch && !lost_interrupt) { 1353*8e75f744SArnaud Giersch printk(KERN_WARNING PPIP32 1354*8e75f744SArnaud Giersch "%s: lost interrupt in %s\n", 1355*8e75f744SArnaud Giersch p->name, __func__); 1356*8e75f744SArnaud Giersch lost_interrupt = 1; 1357*8e75f744SArnaud Giersch } 1358*8e75f744SArnaud Giersch } 1359*8e75f744SArnaud Giersch 1360*8e75f744SArnaud Giersch /* Disable serviceIntr */ 1361*8e75f744SArnaud Giersch parport_ip32_frob_econtrol(p, ECR_SERVINTR, ECR_SERVINTR); 1362*8e75f744SArnaud Giersch 1363*8e75f744SArnaud Giersch /* Check FIFO state */ 1364*8e75f744SArnaud Giersch if (ecr & ECR_F_EMPTY) { 1365*8e75f744SArnaud Giersch /* FIFO is empty, fill it up */ 1366*8e75f744SArnaud Giersch count = priv->fifo_depth; 1367*8e75f744SArnaud Giersch break; 1368*8e75f744SArnaud Giersch } else if (ecr & ECR_SERVINTR) { 1369*8e75f744SArnaud Giersch /* FIFO is not empty, but we know that can safely push 1370*8e75f744SArnaud Giersch * writeIntrThreshold bytes into it */ 1371*8e75f744SArnaud Giersch count = priv->writeIntrThreshold; 1372*8e75f744SArnaud Giersch break; 1373*8e75f744SArnaud Giersch } 1374*8e75f744SArnaud Giersch /* FIFO is not empty, and we did not get any interrupt. 1375*8e75f744SArnaud Giersch * Either it's time to check for nFault, or a signal is 1376*8e75f744SArnaud Giersch * pending. This is verified in 1377*8e75f744SArnaud Giersch * parport_ip32_fifo_wait_break(), so we continue the loop. */ 1378*8e75f744SArnaud Giersch } /* while (1) */ 1379*8e75f744SArnaud Giersch 1380*8e75f744SArnaud Giersch return count; 1381*8e75f744SArnaud Giersch } 1382*8e75f744SArnaud Giersch 1383*8e75f744SArnaud Giersch /** 1384*8e75f744SArnaud Giersch * parport_ip32_fifo_write_block_pio - write a block of data (PIO mode) 1385*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1386*8e75f744SArnaud Giersch * @buf: buffer of data to write 1387*8e75f744SArnaud Giersch * @len: length of buffer @buf 1388*8e75f744SArnaud Giersch * 1389*8e75f744SArnaud Giersch * Uses PIO to write the contents of the buffer @buf into the parallel port 1390*8e75f744SArnaud Giersch * FIFO. Returns the number of bytes that were actually written. It can work 1391*8e75f744SArnaud Giersch * with or without the help of interrupts. The parallel port must be 1392*8e75f744SArnaud Giersch * correctly initialized before calling parport_ip32_fifo_write_block_pio(). 1393*8e75f744SArnaud Giersch */ 1394*8e75f744SArnaud Giersch static size_t parport_ip32_fifo_write_block_pio(struct parport *p, 1395*8e75f744SArnaud Giersch const void *buf, size_t len) 1396*8e75f744SArnaud Giersch { 1397*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1398*8e75f744SArnaud Giersch const u8 *bufp = buf; 1399*8e75f744SArnaud Giersch size_t left = len; 1400*8e75f744SArnaud Giersch 1401*8e75f744SArnaud Giersch priv->irq_mode = PARPORT_IP32_IRQ_HERE; 1402*8e75f744SArnaud Giersch 1403*8e75f744SArnaud Giersch while (left > 0) { 1404*8e75f744SArnaud Giersch unsigned int count; 1405*8e75f744SArnaud Giersch 1406*8e75f744SArnaud Giersch count = (p->irq == PARPORT_IRQ_NONE) ? 1407*8e75f744SArnaud Giersch parport_ip32_fwp_wait_polling(p) : 1408*8e75f744SArnaud Giersch parport_ip32_fwp_wait_interrupt(p); 1409*8e75f744SArnaud Giersch if (count == 0) 1410*8e75f744SArnaud Giersch break; /* Transmission should be stopped */ 1411*8e75f744SArnaud Giersch if (count > left) 1412*8e75f744SArnaud Giersch count = left; 1413*8e75f744SArnaud Giersch if (count == 1) { 1414*8e75f744SArnaud Giersch writeb(*bufp, priv->regs.fifo); 1415*8e75f744SArnaud Giersch bufp++, left--; 1416*8e75f744SArnaud Giersch } else { 1417*8e75f744SArnaud Giersch writesb(priv->regs.fifo, bufp, count); 1418*8e75f744SArnaud Giersch bufp += count, left -= count; 1419*8e75f744SArnaud Giersch } 1420*8e75f744SArnaud Giersch } 1421*8e75f744SArnaud Giersch 1422*8e75f744SArnaud Giersch priv->irq_mode = PARPORT_IP32_IRQ_FWD; 1423*8e75f744SArnaud Giersch 1424*8e75f744SArnaud Giersch return len - left; 1425*8e75f744SArnaud Giersch } 1426*8e75f744SArnaud Giersch 1427*8e75f744SArnaud Giersch /** 1428*8e75f744SArnaud Giersch * parport_ip32_fifo_write_block_dma - write a block of data (DMA mode) 1429*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1430*8e75f744SArnaud Giersch * @buf: buffer of data to write 1431*8e75f744SArnaud Giersch * @len: length of buffer @buf 1432*8e75f744SArnaud Giersch * 1433*8e75f744SArnaud Giersch * Uses DMA to write the contents of the buffer @buf into the parallel port 1434*8e75f744SArnaud Giersch * FIFO. Returns the number of bytes that were actually written. The 1435*8e75f744SArnaud Giersch * parallel port must be correctly initialized before calling 1436*8e75f744SArnaud Giersch * parport_ip32_fifo_write_block_dma(). 1437*8e75f744SArnaud Giersch */ 1438*8e75f744SArnaud Giersch static size_t parport_ip32_fifo_write_block_dma(struct parport *p, 1439*8e75f744SArnaud Giersch const void *buf, size_t len) 1440*8e75f744SArnaud Giersch { 1441*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1442*8e75f744SArnaud Giersch struct parport * const physport = p->physport; 1443*8e75f744SArnaud Giersch unsigned long nfault_timeout; 1444*8e75f744SArnaud Giersch unsigned long expire; 1445*8e75f744SArnaud Giersch size_t written; 1446*8e75f744SArnaud Giersch unsigned int ecr; 1447*8e75f744SArnaud Giersch 1448*8e75f744SArnaud Giersch priv->irq_mode = PARPORT_IP32_IRQ_HERE; 1449*8e75f744SArnaud Giersch 1450*8e75f744SArnaud Giersch parport_ip32_dma_start(DMA_TO_DEVICE, (void *)buf, len); 1451*8e75f744SArnaud Giersch INIT_COMPLETION(priv->irq_complete); 1452*8e75f744SArnaud Giersch parport_ip32_frob_econtrol(p, ECR_DMAEN | ECR_SERVINTR, ECR_DMAEN); 1453*8e75f744SArnaud Giersch 1454*8e75f744SArnaud Giersch nfault_timeout = min((unsigned long)physport->cad->timeout, 1455*8e75f744SArnaud Giersch msecs_to_jiffies(FIFO_NFAULT_TIMEOUT)); 1456*8e75f744SArnaud Giersch expire = jiffies + physport->cad->timeout; 1457*8e75f744SArnaud Giersch while (1) { 1458*8e75f744SArnaud Giersch if (parport_ip32_fifo_wait_break(p, expire)) 1459*8e75f744SArnaud Giersch break; 1460*8e75f744SArnaud Giersch wait_for_completion_interruptible_timeout(&priv->irq_complete, 1461*8e75f744SArnaud Giersch nfault_timeout); 1462*8e75f744SArnaud Giersch ecr = parport_ip32_read_econtrol(p); 1463*8e75f744SArnaud Giersch if (ecr & ECR_SERVINTR) 1464*8e75f744SArnaud Giersch break; /* DMA transfer just finished */ 1465*8e75f744SArnaud Giersch } 1466*8e75f744SArnaud Giersch parport_ip32_dma_stop(); 1467*8e75f744SArnaud Giersch written = len - parport_ip32_dma_get_residue(); 1468*8e75f744SArnaud Giersch 1469*8e75f744SArnaud Giersch priv->irq_mode = PARPORT_IP32_IRQ_FWD; 1470*8e75f744SArnaud Giersch 1471*8e75f744SArnaud Giersch return written; 1472*8e75f744SArnaud Giersch } 1473*8e75f744SArnaud Giersch 1474*8e75f744SArnaud Giersch /** 1475*8e75f744SArnaud Giersch * parport_ip32_fifo_write_block - write a block of data 1476*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1477*8e75f744SArnaud Giersch * @buf: buffer of data to write 1478*8e75f744SArnaud Giersch * @len: length of buffer @buf 1479*8e75f744SArnaud Giersch * 1480*8e75f744SArnaud Giersch * Uses PIO or DMA to write the contents of the buffer @buf into the parallel 1481*8e75f744SArnaud Giersch * p FIFO. Returns the number of bytes that were actually written. 1482*8e75f744SArnaud Giersch */ 1483*8e75f744SArnaud Giersch static size_t parport_ip32_fifo_write_block(struct parport *p, 1484*8e75f744SArnaud Giersch const void *buf, size_t len) 1485*8e75f744SArnaud Giersch { 1486*8e75f744SArnaud Giersch size_t written = 0; 1487*8e75f744SArnaud Giersch if (len) 1488*8e75f744SArnaud Giersch /* FIXME - Maybe some threshold value should be set for @len 1489*8e75f744SArnaud Giersch * under which we revert to PIO mode? */ 1490*8e75f744SArnaud Giersch written = (p->modes & PARPORT_MODE_DMA) ? 1491*8e75f744SArnaud Giersch parport_ip32_fifo_write_block_dma(p, buf, len) : 1492*8e75f744SArnaud Giersch parport_ip32_fifo_write_block_pio(p, buf, len); 1493*8e75f744SArnaud Giersch return written; 1494*8e75f744SArnaud Giersch } 1495*8e75f744SArnaud Giersch 1496*8e75f744SArnaud Giersch /** 1497*8e75f744SArnaud Giersch * parport_ip32_drain_fifo - wait for FIFO to empty 1498*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1499*8e75f744SArnaud Giersch * @timeout: timeout, in jiffies 1500*8e75f744SArnaud Giersch * 1501*8e75f744SArnaud Giersch * This function waits for FIFO to empty. It returns 1 when FIFO is empty, or 1502*8e75f744SArnaud Giersch * 0 if the timeout @timeout is reached before, or if a signal is pending. 1503*8e75f744SArnaud Giersch */ 1504*8e75f744SArnaud Giersch static unsigned int parport_ip32_drain_fifo(struct parport *p, 1505*8e75f744SArnaud Giersch unsigned long timeout) 1506*8e75f744SArnaud Giersch { 1507*8e75f744SArnaud Giersch unsigned long expire = jiffies + timeout; 1508*8e75f744SArnaud Giersch unsigned int polling_interval; 1509*8e75f744SArnaud Giersch unsigned int counter; 1510*8e75f744SArnaud Giersch 1511*8e75f744SArnaud Giersch /* Busy wait for approx. 200us */ 1512*8e75f744SArnaud Giersch for (counter = 0; counter < 40; counter++) { 1513*8e75f744SArnaud Giersch if (parport_ip32_read_econtrol(p) & ECR_F_EMPTY) 1514*8e75f744SArnaud Giersch break; 1515*8e75f744SArnaud Giersch if (time_after(jiffies, expire)) 1516*8e75f744SArnaud Giersch break; 1517*8e75f744SArnaud Giersch if (signal_pending(current)) 1518*8e75f744SArnaud Giersch break; 1519*8e75f744SArnaud Giersch udelay(5); 1520*8e75f744SArnaud Giersch } 1521*8e75f744SArnaud Giersch /* Poll slowly. Polling interval starts with 1 millisecond, and is 1522*8e75f744SArnaud Giersch * increased exponentially until 128. */ 1523*8e75f744SArnaud Giersch polling_interval = 1; /* msecs */ 1524*8e75f744SArnaud Giersch while (!(parport_ip32_read_econtrol(p) & ECR_F_EMPTY)) { 1525*8e75f744SArnaud Giersch if (time_after_eq(jiffies, expire)) 1526*8e75f744SArnaud Giersch break; 1527*8e75f744SArnaud Giersch msleep_interruptible(polling_interval); 1528*8e75f744SArnaud Giersch if (signal_pending(current)) 1529*8e75f744SArnaud Giersch break; 1530*8e75f744SArnaud Giersch if (polling_interval < 128) 1531*8e75f744SArnaud Giersch polling_interval *= 2; 1532*8e75f744SArnaud Giersch } 1533*8e75f744SArnaud Giersch 1534*8e75f744SArnaud Giersch return !!(parport_ip32_read_econtrol(p) & ECR_F_EMPTY); 1535*8e75f744SArnaud Giersch } 1536*8e75f744SArnaud Giersch 1537*8e75f744SArnaud Giersch /** 1538*8e75f744SArnaud Giersch * parport_ip32_get_fifo_residue - reset FIFO 1539*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1540*8e75f744SArnaud Giersch * @mode: current operation mode (ECR_MODE_PPF or ECR_MODE_ECP) 1541*8e75f744SArnaud Giersch * 1542*8e75f744SArnaud Giersch * This function resets FIFO, and returns the number of bytes remaining in it. 1543*8e75f744SArnaud Giersch */ 1544*8e75f744SArnaud Giersch static unsigned int parport_ip32_get_fifo_residue(struct parport *p, 1545*8e75f744SArnaud Giersch unsigned int mode) 1546*8e75f744SArnaud Giersch { 1547*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1548*8e75f744SArnaud Giersch unsigned int residue; 1549*8e75f744SArnaud Giersch unsigned int cnfga; 1550*8e75f744SArnaud Giersch 1551*8e75f744SArnaud Giersch /* FIXME - We are missing one byte if the printer is off-line. I 1552*8e75f744SArnaud Giersch * don't know how to detect this. It looks that the full bit is not 1553*8e75f744SArnaud Giersch * always reliable. For the moment, the problem is avoided in most 1554*8e75f744SArnaud Giersch * cases by testing for BUSY in parport_ip32_compat_write_data(). 1555*8e75f744SArnaud Giersch */ 1556*8e75f744SArnaud Giersch if (parport_ip32_read_econtrol(p) & ECR_F_EMPTY) 1557*8e75f744SArnaud Giersch residue = 0; 1558*8e75f744SArnaud Giersch else { 1559*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: FIFO is stuck\n", p->name); 1560*8e75f744SArnaud Giersch 1561*8e75f744SArnaud Giersch /* Stop all transfers. 1562*8e75f744SArnaud Giersch * 1563*8e75f744SArnaud Giersch * Microsoft's document instructs to drive DCR_STROBE to 0, 1564*8e75f744SArnaud Giersch * but it doesn't work (at least in Compatibility mode, not 1565*8e75f744SArnaud Giersch * tested in ECP mode). Switching directly to Test mode (as 1566*8e75f744SArnaud Giersch * in parport_pc) is not an option: it does confuse the port, 1567*8e75f744SArnaud Giersch * ECP service interrupts are no more working after that. A 1568*8e75f744SArnaud Giersch * hard reset is then needed to revert to a sane state. 1569*8e75f744SArnaud Giersch * 1570*8e75f744SArnaud Giersch * Let's hope that the FIFO is really stuck and that the 1571*8e75f744SArnaud Giersch * peripheral doesn't wake up now. 1572*8e75f744SArnaud Giersch */ 1573*8e75f744SArnaud Giersch parport_ip32_frob_control(p, DCR_STROBE, 0); 1574*8e75f744SArnaud Giersch 1575*8e75f744SArnaud Giersch /* Fill up FIFO */ 1576*8e75f744SArnaud Giersch for (residue = priv->fifo_depth; residue > 0; residue--) { 1577*8e75f744SArnaud Giersch if (parport_ip32_read_econtrol(p) & ECR_F_FULL) 1578*8e75f744SArnaud Giersch break; 1579*8e75f744SArnaud Giersch writeb(0x00, priv->regs.fifo); 1580*8e75f744SArnaud Giersch } 1581*8e75f744SArnaud Giersch } 1582*8e75f744SArnaud Giersch if (residue) 1583*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: %d PWord%s left in FIFO\n", 1584*8e75f744SArnaud Giersch p->name, residue, 1585*8e75f744SArnaud Giersch (residue == 1) ? " was" : "s were"); 1586*8e75f744SArnaud Giersch 1587*8e75f744SArnaud Giersch /* Now reset the FIFO */ 1588*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1589*8e75f744SArnaud Giersch 1590*8e75f744SArnaud Giersch /* Host recovery for ECP mode */ 1591*8e75f744SArnaud Giersch if (mode == ECR_MODE_ECP) { 1592*8e75f744SArnaud Giersch parport_ip32_data_reverse(p); 1593*8e75f744SArnaud Giersch parport_ip32_frob_control(p, DCR_nINIT, 0); 1594*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_PERROR, 0)) 1595*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: PEerror timeout 1 in %s\n", 1596*8e75f744SArnaud Giersch p->name, __func__); 1597*8e75f744SArnaud Giersch parport_ip32_frob_control(p, DCR_STROBE, DCR_STROBE); 1598*8e75f744SArnaud Giersch parport_ip32_frob_control(p, DCR_nINIT, DCR_nINIT); 1599*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_PERROR, DSR_PERROR)) 1600*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: PEerror timeout 2 in %s\n", 1601*8e75f744SArnaud Giersch p->name, __func__); 1602*8e75f744SArnaud Giersch } 1603*8e75f744SArnaud Giersch 1604*8e75f744SArnaud Giersch /* Adjust residue if needed */ 1605*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_CFG); 1606*8e75f744SArnaud Giersch cnfga = readb(priv->regs.cnfgA); 1607*8e75f744SArnaud Giersch if (!(cnfga & CNFGA_nBYTEINTRANS)) { 1608*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: cnfgA contains 0x%02x\n", 1609*8e75f744SArnaud Giersch p->name, cnfga); 1610*8e75f744SArnaud Giersch pr_debug1(PPIP32 "%s: Accounting for extra byte\n", 1611*8e75f744SArnaud Giersch p->name); 1612*8e75f744SArnaud Giersch residue++; 1613*8e75f744SArnaud Giersch } 1614*8e75f744SArnaud Giersch 1615*8e75f744SArnaud Giersch /* Don't care about partial PWords since we do not support 1616*8e75f744SArnaud Giersch * PWord != 1 byte. */ 1617*8e75f744SArnaud Giersch 1618*8e75f744SArnaud Giersch /* Back to forward PS2 mode. */ 1619*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1620*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 1621*8e75f744SArnaud Giersch 1622*8e75f744SArnaud Giersch return residue; 1623*8e75f744SArnaud Giersch } 1624*8e75f744SArnaud Giersch 1625*8e75f744SArnaud Giersch /** 1626*8e75f744SArnaud Giersch * parport_ip32_compat_write_data - write a block of data in SPP mode 1627*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1628*8e75f744SArnaud Giersch * @buf: buffer of data to write 1629*8e75f744SArnaud Giersch * @len: length of buffer @buf 1630*8e75f744SArnaud Giersch * @flags: ignored 1631*8e75f744SArnaud Giersch */ 1632*8e75f744SArnaud Giersch static size_t parport_ip32_compat_write_data(struct parport *p, 1633*8e75f744SArnaud Giersch const void *buf, size_t len, 1634*8e75f744SArnaud Giersch int flags) 1635*8e75f744SArnaud Giersch { 1636*8e75f744SArnaud Giersch static unsigned int ready_before = 1; 1637*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1638*8e75f744SArnaud Giersch struct parport * const physport = p->physport; 1639*8e75f744SArnaud Giersch size_t written = 0; 1640*8e75f744SArnaud Giersch 1641*8e75f744SArnaud Giersch /* Special case: a timeout of zero means we cannot call schedule(). 1642*8e75f744SArnaud Giersch * Also if O_NONBLOCK is set then use the default implementation. */ 1643*8e75f744SArnaud Giersch if (physport->cad->timeout <= PARPORT_INACTIVITY_O_NONBLOCK) 1644*8e75f744SArnaud Giersch return parport_ieee1284_write_compat(p, buf, len, flags); 1645*8e75f744SArnaud Giersch 1646*8e75f744SArnaud Giersch /* Reset FIFO, go in forward mode, and disable ackIntEn */ 1647*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1648*8e75f744SArnaud Giersch parport_ip32_write_control(p, DCR_SELECT | DCR_nINIT); 1649*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 1650*8e75f744SArnaud Giersch parport_ip32_disable_irq(p); 1651*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PPF); 1652*8e75f744SArnaud Giersch physport->ieee1284.phase = IEEE1284_PH_FWD_DATA; 1653*8e75f744SArnaud Giersch 1654*8e75f744SArnaud Giersch /* Wait for peripheral to become ready */ 1655*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_nBUSY | DSR_nFAULT, 1656*8e75f744SArnaud Giersch DSR_nBUSY | DSR_nFAULT)) { 1657*8e75f744SArnaud Giersch /* Avoid to flood the logs */ 1658*8e75f744SArnaud Giersch if (ready_before) 1659*8e75f744SArnaud Giersch printk(KERN_INFO PPIP32 "%s: not ready in %s\n", 1660*8e75f744SArnaud Giersch p->name, __func__); 1661*8e75f744SArnaud Giersch ready_before = 0; 1662*8e75f744SArnaud Giersch goto stop; 1663*8e75f744SArnaud Giersch } 1664*8e75f744SArnaud Giersch ready_before = 1; 1665*8e75f744SArnaud Giersch 1666*8e75f744SArnaud Giersch written = parport_ip32_fifo_write_block(p, buf, len); 1667*8e75f744SArnaud Giersch 1668*8e75f744SArnaud Giersch /* Wait FIFO to empty. Timeout is proportional to FIFO_depth. */ 1669*8e75f744SArnaud Giersch parport_ip32_drain_fifo(p, physport->cad->timeout * priv->fifo_depth); 1670*8e75f744SArnaud Giersch 1671*8e75f744SArnaud Giersch /* Check for a potential residue */ 1672*8e75f744SArnaud Giersch written -= parport_ip32_get_fifo_residue(p, ECR_MODE_PPF); 1673*8e75f744SArnaud Giersch 1674*8e75f744SArnaud Giersch /* Then, wait for BUSY to get low. */ 1675*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_nBUSY, DSR_nBUSY)) 1676*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 "%s: BUSY timeout in %s\n", 1677*8e75f744SArnaud Giersch p->name, __func__); 1678*8e75f744SArnaud Giersch 1679*8e75f744SArnaud Giersch stop: 1680*8e75f744SArnaud Giersch /* Reset FIFO */ 1681*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1682*8e75f744SArnaud Giersch physport->ieee1284.phase = IEEE1284_PH_FWD_IDLE; 1683*8e75f744SArnaud Giersch 1684*8e75f744SArnaud Giersch return written; 1685*8e75f744SArnaud Giersch } 1686*8e75f744SArnaud Giersch 1687*8e75f744SArnaud Giersch /* 1688*8e75f744SArnaud Giersch * FIXME - Insert here parport_ip32_ecp_read_data(). 1689*8e75f744SArnaud Giersch */ 1690*8e75f744SArnaud Giersch 1691*8e75f744SArnaud Giersch /** 1692*8e75f744SArnaud Giersch * parport_ip32_ecp_write_data - write a block of data in ECP mode 1693*8e75f744SArnaud Giersch * @p: pointer to &struct parport 1694*8e75f744SArnaud Giersch * @buf: buffer of data to write 1695*8e75f744SArnaud Giersch * @len: length of buffer @buf 1696*8e75f744SArnaud Giersch * @flags: ignored 1697*8e75f744SArnaud Giersch */ 1698*8e75f744SArnaud Giersch static size_t parport_ip32_ecp_write_data(struct parport *p, 1699*8e75f744SArnaud Giersch const void *buf, size_t len, 1700*8e75f744SArnaud Giersch int flags) 1701*8e75f744SArnaud Giersch { 1702*8e75f744SArnaud Giersch static unsigned int ready_before = 1; 1703*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1704*8e75f744SArnaud Giersch struct parport * const physport = p->physport; 1705*8e75f744SArnaud Giersch size_t written = 0; 1706*8e75f744SArnaud Giersch 1707*8e75f744SArnaud Giersch /* Special case: a timeout of zero means we cannot call schedule(). 1708*8e75f744SArnaud Giersch * Also if O_NONBLOCK is set then use the default implementation. */ 1709*8e75f744SArnaud Giersch if (physport->cad->timeout <= PARPORT_INACTIVITY_O_NONBLOCK) 1710*8e75f744SArnaud Giersch return parport_ieee1284_ecp_write_data(p, buf, len, flags); 1711*8e75f744SArnaud Giersch 1712*8e75f744SArnaud Giersch /* Negotiate to forward mode if necessary. */ 1713*8e75f744SArnaud Giersch if (physport->ieee1284.phase != IEEE1284_PH_FWD_IDLE) { 1714*8e75f744SArnaud Giersch /* Event 47: Set nInit high. */ 1715*8e75f744SArnaud Giersch parport_ip32_frob_control(p, DCR_nINIT | DCR_AUTOFD, 1716*8e75f744SArnaud Giersch DCR_nINIT | DCR_AUTOFD); 1717*8e75f744SArnaud Giersch 1718*8e75f744SArnaud Giersch /* Event 49: PError goes high. */ 1719*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_PERROR, DSR_PERROR)) { 1720*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 "%s: PError timeout in %s", 1721*8e75f744SArnaud Giersch p->name, __func__); 1722*8e75f744SArnaud Giersch physport->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN; 1723*8e75f744SArnaud Giersch return 0; 1724*8e75f744SArnaud Giersch } 1725*8e75f744SArnaud Giersch } 1726*8e75f744SArnaud Giersch 1727*8e75f744SArnaud Giersch /* Reset FIFO, go in forward mode, and disable ackIntEn */ 1728*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1729*8e75f744SArnaud Giersch parport_ip32_write_control(p, DCR_SELECT | DCR_nINIT); 1730*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 1731*8e75f744SArnaud Giersch parport_ip32_disable_irq(p); 1732*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_ECP); 1733*8e75f744SArnaud Giersch physport->ieee1284.phase = IEEE1284_PH_FWD_DATA; 1734*8e75f744SArnaud Giersch 1735*8e75f744SArnaud Giersch /* Wait for peripheral to become ready */ 1736*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_nBUSY | DSR_nFAULT, 1737*8e75f744SArnaud Giersch DSR_nBUSY | DSR_nFAULT)) { 1738*8e75f744SArnaud Giersch /* Avoid to flood the logs */ 1739*8e75f744SArnaud Giersch if (ready_before) 1740*8e75f744SArnaud Giersch printk(KERN_INFO PPIP32 "%s: not ready in %s\n", 1741*8e75f744SArnaud Giersch p->name, __func__); 1742*8e75f744SArnaud Giersch ready_before = 0; 1743*8e75f744SArnaud Giersch goto stop; 1744*8e75f744SArnaud Giersch } 1745*8e75f744SArnaud Giersch ready_before = 1; 1746*8e75f744SArnaud Giersch 1747*8e75f744SArnaud Giersch written = parport_ip32_fifo_write_block(p, buf, len); 1748*8e75f744SArnaud Giersch 1749*8e75f744SArnaud Giersch /* Wait FIFO to empty. Timeout is proportional to FIFO_depth. */ 1750*8e75f744SArnaud Giersch parport_ip32_drain_fifo(p, physport->cad->timeout * priv->fifo_depth); 1751*8e75f744SArnaud Giersch 1752*8e75f744SArnaud Giersch /* Check for a potential residue */ 1753*8e75f744SArnaud Giersch written -= parport_ip32_get_fifo_residue(p, ECR_MODE_ECP); 1754*8e75f744SArnaud Giersch 1755*8e75f744SArnaud Giersch /* Then, wait for BUSY to get low. */ 1756*8e75f744SArnaud Giersch if (parport_wait_peripheral(p, DSR_nBUSY, DSR_nBUSY)) 1757*8e75f744SArnaud Giersch printk(KERN_DEBUG PPIP32 "%s: BUSY timeout in %s\n", 1758*8e75f744SArnaud Giersch p->name, __func__); 1759*8e75f744SArnaud Giersch 1760*8e75f744SArnaud Giersch stop: 1761*8e75f744SArnaud Giersch /* Reset FIFO */ 1762*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1763*8e75f744SArnaud Giersch physport->ieee1284.phase = IEEE1284_PH_FWD_IDLE; 1764*8e75f744SArnaud Giersch 1765*8e75f744SArnaud Giersch return written; 1766*8e75f744SArnaud Giersch } 1767*8e75f744SArnaud Giersch 1768*8e75f744SArnaud Giersch /* 1769*8e75f744SArnaud Giersch * FIXME - Insert here parport_ip32_ecp_write_addr(). 1770*8e75f744SArnaud Giersch */ 1771*8e75f744SArnaud Giersch 1772*8e75f744SArnaud Giersch /*--- Default parport operations ---------------------------------------*/ 1773*8e75f744SArnaud Giersch 1774*8e75f744SArnaud Giersch static __initdata struct parport_operations parport_ip32_ops = { 1775*8e75f744SArnaud Giersch .write_data = parport_ip32_write_data, 1776*8e75f744SArnaud Giersch .read_data = parport_ip32_read_data, 1777*8e75f744SArnaud Giersch 1778*8e75f744SArnaud Giersch .write_control = parport_ip32_write_control, 1779*8e75f744SArnaud Giersch .read_control = parport_ip32_read_control, 1780*8e75f744SArnaud Giersch .frob_control = parport_ip32_frob_control, 1781*8e75f744SArnaud Giersch 1782*8e75f744SArnaud Giersch .read_status = parport_ip32_read_status, 1783*8e75f744SArnaud Giersch 1784*8e75f744SArnaud Giersch .enable_irq = parport_ip32_enable_irq, 1785*8e75f744SArnaud Giersch .disable_irq = parport_ip32_disable_irq, 1786*8e75f744SArnaud Giersch 1787*8e75f744SArnaud Giersch .data_forward = parport_ip32_data_forward, 1788*8e75f744SArnaud Giersch .data_reverse = parport_ip32_data_reverse, 1789*8e75f744SArnaud Giersch 1790*8e75f744SArnaud Giersch .init_state = parport_ip32_init_state, 1791*8e75f744SArnaud Giersch .save_state = parport_ip32_save_state, 1792*8e75f744SArnaud Giersch .restore_state = parport_ip32_restore_state, 1793*8e75f744SArnaud Giersch 1794*8e75f744SArnaud Giersch .epp_write_data = parport_ieee1284_epp_write_data, 1795*8e75f744SArnaud Giersch .epp_read_data = parport_ieee1284_epp_read_data, 1796*8e75f744SArnaud Giersch .epp_write_addr = parport_ieee1284_epp_write_addr, 1797*8e75f744SArnaud Giersch .epp_read_addr = parport_ieee1284_epp_read_addr, 1798*8e75f744SArnaud Giersch 1799*8e75f744SArnaud Giersch .ecp_write_data = parport_ieee1284_ecp_write_data, 1800*8e75f744SArnaud Giersch .ecp_read_data = parport_ieee1284_ecp_read_data, 1801*8e75f744SArnaud Giersch .ecp_write_addr = parport_ieee1284_ecp_write_addr, 1802*8e75f744SArnaud Giersch 1803*8e75f744SArnaud Giersch .compat_write_data = parport_ieee1284_write_compat, 1804*8e75f744SArnaud Giersch .nibble_read_data = parport_ieee1284_read_nibble, 1805*8e75f744SArnaud Giersch .byte_read_data = parport_ieee1284_read_byte, 1806*8e75f744SArnaud Giersch 1807*8e75f744SArnaud Giersch .owner = THIS_MODULE, 1808*8e75f744SArnaud Giersch }; 1809*8e75f744SArnaud Giersch 1810*8e75f744SArnaud Giersch /*--- Device detection -------------------------------------------------*/ 1811*8e75f744SArnaud Giersch 1812*8e75f744SArnaud Giersch /** 1813*8e75f744SArnaud Giersch * parport_ip32_ecp_supported - check for an ECP port 1814*8e75f744SArnaud Giersch * @p: pointer to the &parport structure 1815*8e75f744SArnaud Giersch * 1816*8e75f744SArnaud Giersch * Returns 1 if an ECP port is found, and 0 otherwise. This function actually 1817*8e75f744SArnaud Giersch * checks if an Extended Control Register seems to be present. On successful 1818*8e75f744SArnaud Giersch * return, the port is placed in SPP mode. 1819*8e75f744SArnaud Giersch */ 1820*8e75f744SArnaud Giersch static __init unsigned int parport_ip32_ecp_supported(struct parport *p) 1821*8e75f744SArnaud Giersch { 1822*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1823*8e75f744SArnaud Giersch unsigned int ecr; 1824*8e75f744SArnaud Giersch 1825*8e75f744SArnaud Giersch ecr = ECR_MODE_PS2 | ECR_nERRINTR | ECR_SERVINTR; 1826*8e75f744SArnaud Giersch writeb(ecr, priv->regs.ecr); 1827*8e75f744SArnaud Giersch if (readb(priv->regs.ecr) != (ecr | ECR_F_EMPTY)) 1828*8e75f744SArnaud Giersch goto fail; 1829*8e75f744SArnaud Giersch 1830*8e75f744SArnaud Giersch pr_probe(p, "Found working ECR register\n"); 1831*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_SPP); 1832*8e75f744SArnaud Giersch parport_ip32_write_control(p, DCR_SELECT | DCR_nINIT); 1833*8e75f744SArnaud Giersch return 1; 1834*8e75f744SArnaud Giersch 1835*8e75f744SArnaud Giersch fail: 1836*8e75f744SArnaud Giersch pr_probe(p, "ECR register not found\n"); 1837*8e75f744SArnaud Giersch return 0; 1838*8e75f744SArnaud Giersch } 1839*8e75f744SArnaud Giersch 1840*8e75f744SArnaud Giersch /** 1841*8e75f744SArnaud Giersch * parport_ip32_fifo_supported - check for FIFO parameters 1842*8e75f744SArnaud Giersch * @p: pointer to the &parport structure 1843*8e75f744SArnaud Giersch * 1844*8e75f744SArnaud Giersch * Check for FIFO parameters of an Extended Capabilities Port. Returns 1 on 1845*8e75f744SArnaud Giersch * success, and 0 otherwise. Adjust FIFO parameters in the parport structure. 1846*8e75f744SArnaud Giersch * On return, the port is placed in SPP mode. 1847*8e75f744SArnaud Giersch */ 1848*8e75f744SArnaud Giersch static __init unsigned int parport_ip32_fifo_supported(struct parport *p) 1849*8e75f744SArnaud Giersch { 1850*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 1851*8e75f744SArnaud Giersch unsigned int configa, configb; 1852*8e75f744SArnaud Giersch unsigned int pword; 1853*8e75f744SArnaud Giersch unsigned int i; 1854*8e75f744SArnaud Giersch 1855*8e75f744SArnaud Giersch /* Configuration mode */ 1856*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_CFG); 1857*8e75f744SArnaud Giersch configa = readb(priv->regs.cnfgA); 1858*8e75f744SArnaud Giersch configb = readb(priv->regs.cnfgB); 1859*8e75f744SArnaud Giersch 1860*8e75f744SArnaud Giersch /* Find out PWord size */ 1861*8e75f744SArnaud Giersch switch (configa & CNFGA_ID_MASK) { 1862*8e75f744SArnaud Giersch case CNFGA_ID_8: 1863*8e75f744SArnaud Giersch pword = 1; 1864*8e75f744SArnaud Giersch break; 1865*8e75f744SArnaud Giersch case CNFGA_ID_16: 1866*8e75f744SArnaud Giersch pword = 2; 1867*8e75f744SArnaud Giersch break; 1868*8e75f744SArnaud Giersch case CNFGA_ID_32: 1869*8e75f744SArnaud Giersch pword = 4; 1870*8e75f744SArnaud Giersch break; 1871*8e75f744SArnaud Giersch default: 1872*8e75f744SArnaud Giersch pr_probe(p, "Unknown implementation ID: 0x%0x\n", 1873*8e75f744SArnaud Giersch (configa & CNFGA_ID_MASK) >> CNFGA_ID_SHIFT); 1874*8e75f744SArnaud Giersch goto fail; 1875*8e75f744SArnaud Giersch break; 1876*8e75f744SArnaud Giersch } 1877*8e75f744SArnaud Giersch if (pword != 1) { 1878*8e75f744SArnaud Giersch pr_probe(p, "Unsupported PWord size: %u\n", pword); 1879*8e75f744SArnaud Giersch goto fail; 1880*8e75f744SArnaud Giersch } 1881*8e75f744SArnaud Giersch priv->pword = pword; 1882*8e75f744SArnaud Giersch pr_probe(p, "PWord is %u bits\n", 8 * priv->pword); 1883*8e75f744SArnaud Giersch 1884*8e75f744SArnaud Giersch /* Check for compression support */ 1885*8e75f744SArnaud Giersch writeb(configb | CNFGB_COMPRESS, priv->regs.cnfgB); 1886*8e75f744SArnaud Giersch if (readb(priv->regs.cnfgB) & CNFGB_COMPRESS) 1887*8e75f744SArnaud Giersch pr_probe(p, "Hardware compression detected (unsupported)\n"); 1888*8e75f744SArnaud Giersch writeb(configb & ~CNFGB_COMPRESS, priv->regs.cnfgB); 1889*8e75f744SArnaud Giersch 1890*8e75f744SArnaud Giersch /* Reset FIFO and go in test mode (no interrupt, no DMA) */ 1891*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_TST); 1892*8e75f744SArnaud Giersch 1893*8e75f744SArnaud Giersch /* FIFO must be empty now */ 1894*8e75f744SArnaud Giersch if (!(readb(priv->regs.ecr) & ECR_F_EMPTY)) { 1895*8e75f744SArnaud Giersch pr_probe(p, "FIFO not reset\n"); 1896*8e75f744SArnaud Giersch goto fail; 1897*8e75f744SArnaud Giersch } 1898*8e75f744SArnaud Giersch 1899*8e75f744SArnaud Giersch /* Find out FIFO depth. */ 1900*8e75f744SArnaud Giersch priv->fifo_depth = 0; 1901*8e75f744SArnaud Giersch for (i = 0; i < 1024; i++) { 1902*8e75f744SArnaud Giersch if (readb(priv->regs.ecr) & ECR_F_FULL) { 1903*8e75f744SArnaud Giersch /* FIFO full */ 1904*8e75f744SArnaud Giersch priv->fifo_depth = i; 1905*8e75f744SArnaud Giersch break; 1906*8e75f744SArnaud Giersch } 1907*8e75f744SArnaud Giersch writeb((u8)i, priv->regs.fifo); 1908*8e75f744SArnaud Giersch } 1909*8e75f744SArnaud Giersch if (i >= 1024) { 1910*8e75f744SArnaud Giersch pr_probe(p, "Can't fill FIFO\n"); 1911*8e75f744SArnaud Giersch goto fail; 1912*8e75f744SArnaud Giersch } 1913*8e75f744SArnaud Giersch if (!priv->fifo_depth) { 1914*8e75f744SArnaud Giersch pr_probe(p, "Can't get FIFO depth\n"); 1915*8e75f744SArnaud Giersch goto fail; 1916*8e75f744SArnaud Giersch } 1917*8e75f744SArnaud Giersch pr_probe(p, "FIFO is %u PWords deep\n", priv->fifo_depth); 1918*8e75f744SArnaud Giersch 1919*8e75f744SArnaud Giersch /* Enable interrupts */ 1920*8e75f744SArnaud Giersch parport_ip32_frob_econtrol(p, ECR_SERVINTR, 0); 1921*8e75f744SArnaud Giersch 1922*8e75f744SArnaud Giersch /* Find out writeIntrThreshold: number of PWords we know we can write 1923*8e75f744SArnaud Giersch * if we get an interrupt. */ 1924*8e75f744SArnaud Giersch priv->writeIntrThreshold = 0; 1925*8e75f744SArnaud Giersch for (i = 0; i < priv->fifo_depth; i++) { 1926*8e75f744SArnaud Giersch if (readb(priv->regs.fifo) != (u8)i) { 1927*8e75f744SArnaud Giersch pr_probe(p, "Invalid data in FIFO\n"); 1928*8e75f744SArnaud Giersch goto fail; 1929*8e75f744SArnaud Giersch } 1930*8e75f744SArnaud Giersch if (!priv->writeIntrThreshold 1931*8e75f744SArnaud Giersch && readb(priv->regs.ecr) & ECR_SERVINTR) 1932*8e75f744SArnaud Giersch /* writeIntrThreshold reached */ 1933*8e75f744SArnaud Giersch priv->writeIntrThreshold = i + 1; 1934*8e75f744SArnaud Giersch if (i + 1 < priv->fifo_depth 1935*8e75f744SArnaud Giersch && readb(priv->regs.ecr) & ECR_F_EMPTY) { 1936*8e75f744SArnaud Giersch /* FIFO empty before the last byte? */ 1937*8e75f744SArnaud Giersch pr_probe(p, "Data lost in FIFO\n"); 1938*8e75f744SArnaud Giersch goto fail; 1939*8e75f744SArnaud Giersch } 1940*8e75f744SArnaud Giersch } 1941*8e75f744SArnaud Giersch if (!priv->writeIntrThreshold) { 1942*8e75f744SArnaud Giersch pr_probe(p, "Can't get writeIntrThreshold\n"); 1943*8e75f744SArnaud Giersch goto fail; 1944*8e75f744SArnaud Giersch } 1945*8e75f744SArnaud Giersch pr_probe(p, "writeIntrThreshold is %u\n", priv->writeIntrThreshold); 1946*8e75f744SArnaud Giersch 1947*8e75f744SArnaud Giersch /* FIFO must be empty now */ 1948*8e75f744SArnaud Giersch if (!(readb(priv->regs.ecr) & ECR_F_EMPTY)) { 1949*8e75f744SArnaud Giersch pr_probe(p, "Can't empty FIFO\n"); 1950*8e75f744SArnaud Giersch goto fail; 1951*8e75f744SArnaud Giersch } 1952*8e75f744SArnaud Giersch 1953*8e75f744SArnaud Giersch /* Reset FIFO */ 1954*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1955*8e75f744SArnaud Giersch /* Set reverse direction (must be in PS2 mode) */ 1956*8e75f744SArnaud Giersch parport_ip32_data_reverse(p); 1957*8e75f744SArnaud Giersch /* Test FIFO, no interrupt, no DMA */ 1958*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_TST); 1959*8e75f744SArnaud Giersch /* Enable interrupts */ 1960*8e75f744SArnaud Giersch parport_ip32_frob_econtrol(p, ECR_SERVINTR, 0); 1961*8e75f744SArnaud Giersch 1962*8e75f744SArnaud Giersch /* Find out readIntrThreshold: number of PWords we can read if we get 1963*8e75f744SArnaud Giersch * an interrupt. */ 1964*8e75f744SArnaud Giersch priv->readIntrThreshold = 0; 1965*8e75f744SArnaud Giersch for (i = 0; i < priv->fifo_depth; i++) { 1966*8e75f744SArnaud Giersch writeb(0xaa, priv->regs.fifo); 1967*8e75f744SArnaud Giersch if (readb(priv->regs.ecr) & ECR_SERVINTR) { 1968*8e75f744SArnaud Giersch /* readIntrThreshold reached */ 1969*8e75f744SArnaud Giersch priv->readIntrThreshold = i + 1; 1970*8e75f744SArnaud Giersch break; 1971*8e75f744SArnaud Giersch } 1972*8e75f744SArnaud Giersch } 1973*8e75f744SArnaud Giersch if (!priv->readIntrThreshold) { 1974*8e75f744SArnaud Giersch pr_probe(p, "Can't get readIntrThreshold\n"); 1975*8e75f744SArnaud Giersch goto fail; 1976*8e75f744SArnaud Giersch } 1977*8e75f744SArnaud Giersch pr_probe(p, "readIntrThreshold is %u\n", priv->readIntrThreshold); 1978*8e75f744SArnaud Giersch 1979*8e75f744SArnaud Giersch /* Reset ECR */ 1980*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 1981*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 1982*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_SPP); 1983*8e75f744SArnaud Giersch return 1; 1984*8e75f744SArnaud Giersch 1985*8e75f744SArnaud Giersch fail: 1986*8e75f744SArnaud Giersch priv->fifo_depth = 0; 1987*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_SPP); 1988*8e75f744SArnaud Giersch return 0; 1989*8e75f744SArnaud Giersch } 1990*8e75f744SArnaud Giersch 1991*8e75f744SArnaud Giersch /*--- Initialization code ----------------------------------------------*/ 1992*8e75f744SArnaud Giersch 1993*8e75f744SArnaud Giersch /** 1994*8e75f744SArnaud Giersch * parport_ip32_make_isa_registers - compute (ISA) register addresses 1995*8e75f744SArnaud Giersch * @regs: pointer to &struct parport_ip32_regs to fill 1996*8e75f744SArnaud Giersch * @base: base address of standard and EPP registers 1997*8e75f744SArnaud Giersch * @base_hi: base address of ECP registers 1998*8e75f744SArnaud Giersch * @regshift: how much to shift register offset by 1999*8e75f744SArnaud Giersch * 2000*8e75f744SArnaud Giersch * Compute register addresses, according to the ISA standard. The addresses 2001*8e75f744SArnaud Giersch * of the standard and EPP registers are computed from address @base. The 2002*8e75f744SArnaud Giersch * addresses of the ECP registers are computed from address @base_hi. 2003*8e75f744SArnaud Giersch */ 2004*8e75f744SArnaud Giersch static void __init 2005*8e75f744SArnaud Giersch parport_ip32_make_isa_registers(struct parport_ip32_regs *regs, 2006*8e75f744SArnaud Giersch void __iomem *base, void __iomem *base_hi, 2007*8e75f744SArnaud Giersch unsigned int regshift) 2008*8e75f744SArnaud Giersch { 2009*8e75f744SArnaud Giersch #define r_base(offset) ((u8 __iomem *)base + ((offset) << regshift)) 2010*8e75f744SArnaud Giersch #define r_base_hi(offset) ((u8 __iomem *)base_hi + ((offset) << regshift)) 2011*8e75f744SArnaud Giersch *regs = (struct parport_ip32_regs){ 2012*8e75f744SArnaud Giersch .data = r_base(0), 2013*8e75f744SArnaud Giersch .dsr = r_base(1), 2014*8e75f744SArnaud Giersch .dcr = r_base(2), 2015*8e75f744SArnaud Giersch .eppAddr = r_base(3), 2016*8e75f744SArnaud Giersch .eppData0 = r_base(4), 2017*8e75f744SArnaud Giersch .eppData1 = r_base(5), 2018*8e75f744SArnaud Giersch .eppData2 = r_base(6), 2019*8e75f744SArnaud Giersch .eppData3 = r_base(7), 2020*8e75f744SArnaud Giersch .ecpAFifo = r_base(0), 2021*8e75f744SArnaud Giersch .fifo = r_base_hi(0), 2022*8e75f744SArnaud Giersch .cnfgA = r_base_hi(0), 2023*8e75f744SArnaud Giersch .cnfgB = r_base_hi(1), 2024*8e75f744SArnaud Giersch .ecr = r_base_hi(2) 2025*8e75f744SArnaud Giersch }; 2026*8e75f744SArnaud Giersch #undef r_base_hi 2027*8e75f744SArnaud Giersch #undef r_base 2028*8e75f744SArnaud Giersch } 2029*8e75f744SArnaud Giersch 2030*8e75f744SArnaud Giersch /** 2031*8e75f744SArnaud Giersch * parport_ip32_probe_port - probe and register IP32 built-in parallel port 2032*8e75f744SArnaud Giersch * 2033*8e75f744SArnaud Giersch * Returns the new allocated &parport structure. On error, an error code is 2034*8e75f744SArnaud Giersch * encoded in return value with the ERR_PTR function. 2035*8e75f744SArnaud Giersch */ 2036*8e75f744SArnaud Giersch static __init struct parport *parport_ip32_probe_port(void) 2037*8e75f744SArnaud Giersch { 2038*8e75f744SArnaud Giersch struct parport_ip32_regs regs; 2039*8e75f744SArnaud Giersch struct parport_ip32_private *priv = NULL; 2040*8e75f744SArnaud Giersch struct parport_operations *ops = NULL; 2041*8e75f744SArnaud Giersch struct parport *p = NULL; 2042*8e75f744SArnaud Giersch int err; 2043*8e75f744SArnaud Giersch 2044*8e75f744SArnaud Giersch parport_ip32_make_isa_registers(®s, &mace->isa.parallel, 2045*8e75f744SArnaud Giersch &mace->isa.ecp1284, 8 /* regshift */); 2046*8e75f744SArnaud Giersch 2047*8e75f744SArnaud Giersch ops = kmalloc(sizeof(struct parport_operations), GFP_KERNEL); 2048*8e75f744SArnaud Giersch priv = kmalloc(sizeof(struct parport_ip32_private), GFP_KERNEL); 2049*8e75f744SArnaud Giersch p = parport_register_port(0, PARPORT_IRQ_NONE, PARPORT_DMA_NONE, ops); 2050*8e75f744SArnaud Giersch if (ops == NULL || priv == NULL || p == NULL) { 2051*8e75f744SArnaud Giersch err = -ENOMEM; 2052*8e75f744SArnaud Giersch goto fail; 2053*8e75f744SArnaud Giersch } 2054*8e75f744SArnaud Giersch p->base = MACE_BASE + offsetof(struct sgi_mace, isa.parallel); 2055*8e75f744SArnaud Giersch p->base_hi = MACE_BASE + offsetof(struct sgi_mace, isa.ecp1284); 2056*8e75f744SArnaud Giersch p->private_data = priv; 2057*8e75f744SArnaud Giersch 2058*8e75f744SArnaud Giersch *ops = parport_ip32_ops; 2059*8e75f744SArnaud Giersch *priv = (struct parport_ip32_private){ 2060*8e75f744SArnaud Giersch .regs = regs, 2061*8e75f744SArnaud Giersch .dcr_writable = DCR_DIR | DCR_SELECT | DCR_nINIT | 2062*8e75f744SArnaud Giersch DCR_AUTOFD | DCR_STROBE, 2063*8e75f744SArnaud Giersch .irq_mode = PARPORT_IP32_IRQ_FWD, 2064*8e75f744SArnaud Giersch }; 2065*8e75f744SArnaud Giersch init_completion(&priv->irq_complete); 2066*8e75f744SArnaud Giersch 2067*8e75f744SArnaud Giersch /* Probe port. */ 2068*8e75f744SArnaud Giersch if (!parport_ip32_ecp_supported(p)) { 2069*8e75f744SArnaud Giersch err = -ENODEV; 2070*8e75f744SArnaud Giersch goto fail; 2071*8e75f744SArnaud Giersch } 2072*8e75f744SArnaud Giersch parport_ip32_dump_state(p, "begin init", 0); 2073*8e75f744SArnaud Giersch 2074*8e75f744SArnaud Giersch /* We found what looks like a working ECR register. Simply assume 2075*8e75f744SArnaud Giersch * that all modes are correctly supported. Enable basic modes. */ 2076*8e75f744SArnaud Giersch p->modes = PARPORT_MODE_PCSPP | PARPORT_MODE_SAFEININT; 2077*8e75f744SArnaud Giersch p->modes |= PARPORT_MODE_TRISTATE; 2078*8e75f744SArnaud Giersch 2079*8e75f744SArnaud Giersch if (!parport_ip32_fifo_supported(p)) { 2080*8e75f744SArnaud Giersch printk(KERN_WARNING PPIP32 2081*8e75f744SArnaud Giersch "%s: error: FIFO disabled\n", p->name); 2082*8e75f744SArnaud Giersch /* Disable hardware modes depending on a working FIFO. */ 2083*8e75f744SArnaud Giersch features &= ~PARPORT_IP32_ENABLE_SPP; 2084*8e75f744SArnaud Giersch features &= ~PARPORT_IP32_ENABLE_ECP; 2085*8e75f744SArnaud Giersch /* DMA is not needed if FIFO is not supported. */ 2086*8e75f744SArnaud Giersch features &= ~PARPORT_IP32_ENABLE_DMA; 2087*8e75f744SArnaud Giersch } 2088*8e75f744SArnaud Giersch 2089*8e75f744SArnaud Giersch /* Request IRQ */ 2090*8e75f744SArnaud Giersch if (features & PARPORT_IP32_ENABLE_IRQ) { 2091*8e75f744SArnaud Giersch int irq = MACEISA_PARALLEL_IRQ; 2092*8e75f744SArnaud Giersch if (request_irq(irq, parport_ip32_interrupt, 0, p->name, p)) { 2093*8e75f744SArnaud Giersch printk(KERN_WARNING PPIP32 2094*8e75f744SArnaud Giersch "%s: error: IRQ disabled\n", p->name); 2095*8e75f744SArnaud Giersch /* DMA cannot work without interrupts. */ 2096*8e75f744SArnaud Giersch features &= ~PARPORT_IP32_ENABLE_DMA; 2097*8e75f744SArnaud Giersch } else { 2098*8e75f744SArnaud Giersch pr_probe(p, "Interrupt support enabled\n"); 2099*8e75f744SArnaud Giersch p->irq = irq; 2100*8e75f744SArnaud Giersch priv->dcr_writable |= DCR_IRQ; 2101*8e75f744SArnaud Giersch } 2102*8e75f744SArnaud Giersch } 2103*8e75f744SArnaud Giersch 2104*8e75f744SArnaud Giersch /* Allocate DMA resources */ 2105*8e75f744SArnaud Giersch if (features & PARPORT_IP32_ENABLE_DMA) { 2106*8e75f744SArnaud Giersch if (parport_ip32_dma_register()) 2107*8e75f744SArnaud Giersch printk(KERN_WARNING PPIP32 2108*8e75f744SArnaud Giersch "%s: error: DMA disabled\n", p->name); 2109*8e75f744SArnaud Giersch else { 2110*8e75f744SArnaud Giersch pr_probe(p, "DMA support enabled\n"); 2111*8e75f744SArnaud Giersch p->dma = 0; /* arbitrary value != PARPORT_DMA_NONE */ 2112*8e75f744SArnaud Giersch p->modes |= PARPORT_MODE_DMA; 2113*8e75f744SArnaud Giersch } 2114*8e75f744SArnaud Giersch } 2115*8e75f744SArnaud Giersch 2116*8e75f744SArnaud Giersch if (features & PARPORT_IP32_ENABLE_SPP) { 2117*8e75f744SArnaud Giersch /* Enable compatibility FIFO mode */ 2118*8e75f744SArnaud Giersch p->ops->compat_write_data = parport_ip32_compat_write_data; 2119*8e75f744SArnaud Giersch p->modes |= PARPORT_MODE_COMPAT; 2120*8e75f744SArnaud Giersch pr_probe(p, "Hardware support for SPP mode enabled\n"); 2121*8e75f744SArnaud Giersch } 2122*8e75f744SArnaud Giersch if (features & PARPORT_IP32_ENABLE_EPP) { 2123*8e75f744SArnaud Giersch /* Set up access functions to use EPP hardware. */ 2124*8e75f744SArnaud Giersch p->ops->epp_read_data = parport_ip32_epp_read_data; 2125*8e75f744SArnaud Giersch p->ops->epp_write_data = parport_ip32_epp_write_data; 2126*8e75f744SArnaud Giersch p->ops->epp_read_addr = parport_ip32_epp_read_addr; 2127*8e75f744SArnaud Giersch p->ops->epp_write_addr = parport_ip32_epp_write_addr; 2128*8e75f744SArnaud Giersch p->modes |= PARPORT_MODE_EPP; 2129*8e75f744SArnaud Giersch pr_probe(p, "Hardware support for EPP mode enabled\n"); 2130*8e75f744SArnaud Giersch } 2131*8e75f744SArnaud Giersch if (features & PARPORT_IP32_ENABLE_ECP) { 2132*8e75f744SArnaud Giersch /* Enable ECP FIFO mode */ 2133*8e75f744SArnaud Giersch p->ops->ecp_write_data = parport_ip32_ecp_write_data; 2134*8e75f744SArnaud Giersch /* FIXME - not implemented */ 2135*8e75f744SArnaud Giersch /* p->ops->ecp_read_data = parport_ip32_ecp_read_data; */ 2136*8e75f744SArnaud Giersch /* p->ops->ecp_write_addr = parport_ip32_ecp_write_addr; */ 2137*8e75f744SArnaud Giersch p->modes |= PARPORT_MODE_ECP; 2138*8e75f744SArnaud Giersch pr_probe(p, "Hardware support for ECP mode enabled\n"); 2139*8e75f744SArnaud Giersch } 2140*8e75f744SArnaud Giersch 2141*8e75f744SArnaud Giersch /* Initialize the port with sensible values */ 2142*8e75f744SArnaud Giersch parport_ip32_set_mode(p, ECR_MODE_PS2); 2143*8e75f744SArnaud Giersch parport_ip32_write_control(p, DCR_SELECT | DCR_nINIT); 2144*8e75f744SArnaud Giersch parport_ip32_data_forward(p); 2145*8e75f744SArnaud Giersch parport_ip32_disable_irq(p); 2146*8e75f744SArnaud Giersch parport_ip32_write_data(p, 0x00); 2147*8e75f744SArnaud Giersch parport_ip32_dump_state(p, "end init", 0); 2148*8e75f744SArnaud Giersch 2149*8e75f744SArnaud Giersch /* Print out what we found */ 2150*8e75f744SArnaud Giersch printk(KERN_INFO "%s: SGI IP32 at 0x%lx (0x%lx)", 2151*8e75f744SArnaud Giersch p->name, p->base, p->base_hi); 2152*8e75f744SArnaud Giersch if (p->irq != PARPORT_IRQ_NONE) 2153*8e75f744SArnaud Giersch printk(", irq %d", p->irq); 2154*8e75f744SArnaud Giersch printk(" ["); 2155*8e75f744SArnaud Giersch #define printmode(x) if (p->modes & PARPORT_MODE_##x) \ 2156*8e75f744SArnaud Giersch printk("%s%s", f++ ? "," : "", #x) 2157*8e75f744SArnaud Giersch { 2158*8e75f744SArnaud Giersch unsigned int f = 0; 2159*8e75f744SArnaud Giersch printmode(PCSPP); 2160*8e75f744SArnaud Giersch printmode(TRISTATE); 2161*8e75f744SArnaud Giersch printmode(COMPAT); 2162*8e75f744SArnaud Giersch printmode(EPP); 2163*8e75f744SArnaud Giersch printmode(ECP); 2164*8e75f744SArnaud Giersch printmode(DMA); 2165*8e75f744SArnaud Giersch } 2166*8e75f744SArnaud Giersch #undef printmode 2167*8e75f744SArnaud Giersch printk("]\n"); 2168*8e75f744SArnaud Giersch 2169*8e75f744SArnaud Giersch parport_announce_port(p); 2170*8e75f744SArnaud Giersch return p; 2171*8e75f744SArnaud Giersch 2172*8e75f744SArnaud Giersch fail: 2173*8e75f744SArnaud Giersch if (p) 2174*8e75f744SArnaud Giersch parport_put_port(p); 2175*8e75f744SArnaud Giersch kfree(priv); 2176*8e75f744SArnaud Giersch kfree(ops); 2177*8e75f744SArnaud Giersch return ERR_PTR(err); 2178*8e75f744SArnaud Giersch } 2179*8e75f744SArnaud Giersch 2180*8e75f744SArnaud Giersch /** 2181*8e75f744SArnaud Giersch * parport_ip32_unregister_port - unregister a parallel port 2182*8e75f744SArnaud Giersch * @p: pointer to the &struct parport 2183*8e75f744SArnaud Giersch * 2184*8e75f744SArnaud Giersch * Unregisters a parallel port and free previously allocated resources 2185*8e75f744SArnaud Giersch * (memory, IRQ, ...). 2186*8e75f744SArnaud Giersch */ 2187*8e75f744SArnaud Giersch static __exit void parport_ip32_unregister_port(struct parport *p) 2188*8e75f744SArnaud Giersch { 2189*8e75f744SArnaud Giersch struct parport_ip32_private * const priv = p->physport->private_data; 2190*8e75f744SArnaud Giersch struct parport_operations *ops = p->ops; 2191*8e75f744SArnaud Giersch 2192*8e75f744SArnaud Giersch parport_remove_port(p); 2193*8e75f744SArnaud Giersch if (p->modes & PARPORT_MODE_DMA) 2194*8e75f744SArnaud Giersch parport_ip32_dma_unregister(); 2195*8e75f744SArnaud Giersch if (p->irq != PARPORT_IRQ_NONE) 2196*8e75f744SArnaud Giersch free_irq(p->irq, p); 2197*8e75f744SArnaud Giersch parport_put_port(p); 2198*8e75f744SArnaud Giersch kfree(priv); 2199*8e75f744SArnaud Giersch kfree(ops); 2200*8e75f744SArnaud Giersch } 2201*8e75f744SArnaud Giersch 2202*8e75f744SArnaud Giersch /** 2203*8e75f744SArnaud Giersch * parport_ip32_init - module initialization function 2204*8e75f744SArnaud Giersch */ 2205*8e75f744SArnaud Giersch static int __init parport_ip32_init(void) 2206*8e75f744SArnaud Giersch { 2207*8e75f744SArnaud Giersch pr_info(PPIP32 "SGI IP32 built-in parallel port driver v0.6\n"); 2208*8e75f744SArnaud Giersch pr_debug1(PPIP32 "Compiled on %s, %s\n", __DATE__, __TIME__); 2209*8e75f744SArnaud Giersch this_port = parport_ip32_probe_port(); 2210*8e75f744SArnaud Giersch return IS_ERR(this_port) ? PTR_ERR(this_port) : 0; 2211*8e75f744SArnaud Giersch } 2212*8e75f744SArnaud Giersch 2213*8e75f744SArnaud Giersch /** 2214*8e75f744SArnaud Giersch * parport_ip32_exit - module termination function 2215*8e75f744SArnaud Giersch */ 2216*8e75f744SArnaud Giersch static void __exit parport_ip32_exit(void) 2217*8e75f744SArnaud Giersch { 2218*8e75f744SArnaud Giersch parport_ip32_unregister_port(this_port); 2219*8e75f744SArnaud Giersch } 2220*8e75f744SArnaud Giersch 2221*8e75f744SArnaud Giersch /*--- Module stuff -----------------------------------------------------*/ 2222*8e75f744SArnaud Giersch 2223*8e75f744SArnaud Giersch MODULE_AUTHOR("Arnaud Giersch <arnaud.giersch@free.fr>"); 2224*8e75f744SArnaud Giersch MODULE_DESCRIPTION("SGI IP32 built-in parallel port driver"); 2225*8e75f744SArnaud Giersch MODULE_LICENSE("GPL"); 2226*8e75f744SArnaud Giersch MODULE_VERSION("0.6"); /* update in parport_ip32_init() too */ 2227*8e75f744SArnaud Giersch 2228*8e75f744SArnaud Giersch module_init(parport_ip32_init); 2229*8e75f744SArnaud Giersch module_exit(parport_ip32_exit); 2230*8e75f744SArnaud Giersch 2231*8e75f744SArnaud Giersch module_param(verbose_probing, bool, S_IRUGO); 2232*8e75f744SArnaud Giersch MODULE_PARM_DESC(verbose_probing, "Log chit-chat during initialization"); 2233*8e75f744SArnaud Giersch 2234*8e75f744SArnaud Giersch module_param(features, uint, S_IRUGO); 2235*8e75f744SArnaud Giersch MODULE_PARM_DESC(features, 2236*8e75f744SArnaud Giersch "Bit mask of features to enable" 2237*8e75f744SArnaud Giersch ", bit 0: IRQ support" 2238*8e75f744SArnaud Giersch ", bit 1: DMA support" 2239*8e75f744SArnaud Giersch ", bit 2: hardware SPP mode" 2240*8e75f744SArnaud Giersch ", bit 3: hardware EPP mode" 2241*8e75f744SArnaud Giersch ", bit 4: hardware ECP mode"); 2242*8e75f744SArnaud Giersch 2243*8e75f744SArnaud Giersch /*--- Inform (X)Emacs about preferred coding style ---------------------*/ 2244*8e75f744SArnaud Giersch /* 2245*8e75f744SArnaud Giersch * Local Variables: 2246*8e75f744SArnaud Giersch * mode: c 2247*8e75f744SArnaud Giersch * c-file-style: "linux" 2248*8e75f744SArnaud Giersch * indent-tabs-mode: t 2249*8e75f744SArnaud Giersch * tab-width: 8 2250*8e75f744SArnaud Giersch * fill-column: 78 2251*8e75f744SArnaud Giersch * ispell-local-dictionary: "american" 2252*8e75f744SArnaud Giersch * End: 2253*8e75f744SArnaud Giersch */ 2254