linux/drivers/parport/parport_gsc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *      Low-level parallel-support for PC-style hardware integrated in the 
   4 *      LASI-Controller (on GSC-Bus) for HP-PARISC Workstations
   5 *
   6 *      (C) 1999-2001 by Helge Deller <deller@gmx.de>
   7 * 
   8 * based on parport_pc.c by 
   9 *          Grant Guenther <grant@torque.net>
  10 *          Phil Blundell <philb@gnu.org>
  11 *          Tim Waugh <tim@cyberelk.demon.co.uk>
  12 *          Jose Renau <renau@acm.org>
  13 *          David Campbell
  14 *          Andrea Arcangeli
  15 */
  16
  17#undef DEBUG    /* undef for production */
  18
  19#include <linux/module.h>
  20#include <linux/init.h>
  21#include <linux/delay.h>
  22#include <linux/errno.h>
  23#include <linux/interrupt.h>
  24#include <linux/ioport.h>
  25#include <linux/kernel.h>
  26#include <linux/slab.h>
  27#include <linux/pci.h>
  28#include <linux/sysctl.h>
  29
  30#include <asm/io.h>
  31#include <asm/dma.h>
  32#include <linux/uaccess.h>
  33#include <asm/superio.h>
  34
  35#include <linux/parport.h>
  36#include <asm/pdc.h>
  37#include <asm/parisc-device.h>
  38#include <asm/hardware.h>
  39#include "parport_gsc.h"
  40
  41
  42MODULE_AUTHOR("Helge Deller <deller@gmx.de>");
  43MODULE_DESCRIPTION("HP-PARISC PC-style parallel port driver");
  44MODULE_SUPPORTED_DEVICE("integrated PC-style parallel port");
  45MODULE_LICENSE("GPL");
  46
  47
  48/*
  49 * Clear TIMEOUT BIT in EPP MODE
  50 *
  51 * This is also used in SPP detection.
  52 */
  53static int clear_epp_timeout(struct parport *pb)
  54{
  55        unsigned char r;
  56
  57        if (!(parport_gsc_read_status(pb) & 0x01))
  58                return 1;
  59
  60        /* To clear timeout some chips require double read */
  61        parport_gsc_read_status(pb);
  62        r = parport_gsc_read_status(pb);
  63        parport_writeb (r | 0x01, STATUS (pb)); /* Some reset by writing 1 */
  64        parport_writeb (r & 0xfe, STATUS (pb)); /* Others by writing 0 */
  65        r = parport_gsc_read_status(pb);
  66
  67        return !(r & 0x01);
  68}
  69
  70/*
  71 * Access functions.
  72 *
  73 * Most of these aren't static because they may be used by the
  74 * parport_xxx_yyy macros.  extern __inline__ versions of several
  75 * of these are in parport_gsc.h.
  76 */
  77
  78void parport_gsc_init_state(struct pardevice *dev, struct parport_state *s)
  79{
  80        s->u.pc.ctr = 0xc | (dev->irq_func ? 0x10 : 0x0);
  81}
  82
  83void parport_gsc_save_state(struct parport *p, struct parport_state *s)
  84{
  85        s->u.pc.ctr = parport_readb (CONTROL (p));
  86}
  87
  88void parport_gsc_restore_state(struct parport *p, struct parport_state *s)
  89{
  90        parport_writeb (s->u.pc.ctr, CONTROL (p));
  91}
  92
  93struct parport_operations parport_gsc_ops = 
  94{
  95        .write_data     = parport_gsc_write_data,
  96        .read_data      = parport_gsc_read_data,
  97
  98        .write_control  = parport_gsc_write_control,
  99        .read_control   = parport_gsc_read_control,
 100        .frob_control   = parport_gsc_frob_control,
 101
 102        .read_status    = parport_gsc_read_status,
 103
 104        .enable_irq     = parport_gsc_enable_irq,
 105        .disable_irq    = parport_gsc_disable_irq,
 106
 107        .data_forward   = parport_gsc_data_forward,
 108        .data_reverse   = parport_gsc_data_reverse,
 109
 110        .init_state     = parport_gsc_init_state,
 111        .save_state     = parport_gsc_save_state,
 112        .restore_state  = parport_gsc_restore_state,
 113
 114        .epp_write_data = parport_ieee1284_epp_write_data,
 115        .epp_read_data  = parport_ieee1284_epp_read_data,
 116        .epp_write_addr = parport_ieee1284_epp_write_addr,
 117        .epp_read_addr  = parport_ieee1284_epp_read_addr,
 118
 119        .ecp_write_data = parport_ieee1284_ecp_write_data,
 120        .ecp_read_data  = parport_ieee1284_ecp_read_data,
 121        .ecp_write_addr = parport_ieee1284_ecp_write_addr,
 122
 123        .compat_write_data      = parport_ieee1284_write_compat,
 124        .nibble_read_data       = parport_ieee1284_read_nibble,
 125        .byte_read_data         = parport_ieee1284_read_byte,
 126
 127        .owner          = THIS_MODULE,
 128};
 129
 130/* --- Mode detection ------------------------------------- */
 131
 132/*
 133 * Checks for port existence, all ports support SPP MODE
 134 */
 135static int parport_SPP_supported(struct parport *pb)
 136{
 137        unsigned char r, w;
 138
 139        /*
 140         * first clear an eventually pending EPP timeout 
 141         * I (sailer@ife.ee.ethz.ch) have an SMSC chipset
 142         * that does not even respond to SPP cycles if an EPP
 143         * timeout is pending
 144         */
 145        clear_epp_timeout(pb);
 146
 147        /* Do a simple read-write test to make sure the port exists. */
 148        w = 0xc;
 149        parport_writeb (w, CONTROL (pb));
 150
 151        /* Is there a control register that we can read from?  Some
 152         * ports don't allow reads, so read_control just returns a
 153         * software copy. Some ports _do_ allow reads, so bypass the
 154         * software copy here.  In addition, some bits aren't
 155         * writable. */
 156        r = parport_readb (CONTROL (pb));
 157        if ((r & 0xf) == w) {
 158                w = 0xe;
 159                parport_writeb (w, CONTROL (pb));
 160                r = parport_readb (CONTROL (pb));
 161                parport_writeb (0xc, CONTROL (pb));
 162                if ((r & 0xf) == w)
 163                        return PARPORT_MODE_PCSPP;
 164        }
 165
 166        /* Try the data register.  The data lines aren't tri-stated at
 167         * this stage, so we expect back what we wrote. */
 168        w = 0xaa;
 169        parport_gsc_write_data (pb, w);
 170        r = parport_gsc_read_data (pb);
 171        if (r == w) {
 172                w = 0x55;
 173                parport_gsc_write_data (pb, w);
 174                r = parport_gsc_read_data (pb);
 175                if (r == w)
 176                        return PARPORT_MODE_PCSPP;
 177        }
 178
 179        return 0;
 180}
 181
 182/* Detect PS/2 support.
 183 *
 184 * Bit 5 (0x20) sets the PS/2 data direction; setting this high
 185 * allows us to read data from the data lines.  In theory we would get back
 186 * 0xff but any peripheral attached to the port may drag some or all of the
 187 * lines down to zero.  So if we get back anything that isn't the contents
 188 * of the data register we deem PS/2 support to be present. 
 189 *
 190 * Some SPP ports have "half PS/2" ability - you can't turn off the line
 191 * drivers, but an external peripheral with sufficiently beefy drivers of
 192 * its own can overpower them and assert its own levels onto the bus, from
 193 * where they can then be read back as normal.  Ports with this property
 194 * and the right type of device attached are likely to fail the SPP test,
 195 * (as they will appear to have stuck bits) and so the fact that they might
 196 * be misdetected here is rather academic. 
 197 */
 198
 199static int parport_PS2_supported(struct parport *pb)
 200{
 201        int ok = 0;
 202  
 203        clear_epp_timeout(pb);
 204
 205        /* try to tri-state the buffer */
 206        parport_gsc_data_reverse (pb);
 207        
 208        parport_gsc_write_data(pb, 0x55);
 209        if (parport_gsc_read_data(pb) != 0x55) ok++;
 210
 211        parport_gsc_write_data(pb, 0xaa);
 212        if (parport_gsc_read_data(pb) != 0xaa) ok++;
 213
 214        /* cancel input mode */
 215        parport_gsc_data_forward (pb);
 216
 217        if (ok) {
 218                pb->modes |= PARPORT_MODE_TRISTATE;
 219        } else {
 220                struct parport_gsc_private *priv = pb->private_data;
 221                priv->ctr_writable &= ~0x20;
 222        }
 223
 224        return ok;
 225}
 226
 227
 228/* --- Initialisation code -------------------------------- */
 229
 230struct parport *parport_gsc_probe_port(unsigned long base,
 231                                       unsigned long base_hi, int irq,
 232                                       int dma, struct parisc_device *padev)
 233{
 234        struct parport_gsc_private *priv;
 235        struct parport_operations *ops;
 236        struct parport tmp;
 237        struct parport *p = &tmp;
 238
 239        priv = kzalloc (sizeof (struct parport_gsc_private), GFP_KERNEL);
 240        if (!priv) {
 241                printk (KERN_DEBUG "parport (0x%lx): no memory!\n", base);
 242                return NULL;
 243        }
 244        ops = kmemdup(&parport_gsc_ops, sizeof(struct parport_operations),
 245                      GFP_KERNEL);
 246        if (!ops) {
 247                printk (KERN_DEBUG "parport (0x%lx): no memory for ops!\n",
 248                        base);
 249                kfree (priv);
 250                return NULL;
 251        }
 252        priv->ctr = 0xc;
 253        priv->ctr_writable = 0xff;
 254        priv->dma_buf = NULL;
 255        priv->dma_handle = 0;
 256        p->base = base;
 257        p->base_hi = base_hi;
 258        p->irq = irq;
 259        p->dma = dma;
 260        p->modes = PARPORT_MODE_PCSPP | PARPORT_MODE_SAFEININT;
 261        p->ops = ops;
 262        p->private_data = priv;
 263        p->physport = p;
 264        if (!parport_SPP_supported (p)) {
 265                /* No port. */
 266                kfree (priv);
 267                kfree(ops);
 268                return NULL;
 269        }
 270        parport_PS2_supported (p);
 271
 272        if (!(p = parport_register_port(base, PARPORT_IRQ_NONE,
 273                                        PARPORT_DMA_NONE, ops))) {
 274                kfree (priv);
 275                kfree (ops);
 276                return NULL;
 277        }
 278
 279        p->dev = &padev->dev;
 280        p->base_hi = base_hi;
 281        p->modes = tmp.modes;
 282        p->size = (p->modes & PARPORT_MODE_EPP)?8:3;
 283        p->private_data = priv;
 284
 285        printk(KERN_INFO "%s: PC-style at 0x%lx", p->name, p->base);
 286        p->irq = irq;
 287        if (p->irq == PARPORT_IRQ_AUTO) {
 288                p->irq = PARPORT_IRQ_NONE;
 289        }
 290        if (p->irq != PARPORT_IRQ_NONE) {
 291                pr_cont(", irq %d", p->irq);
 292
 293                if (p->dma == PARPORT_DMA_AUTO) {
 294                        p->dma = PARPORT_DMA_NONE;
 295                }
 296        }
 297        if (p->dma == PARPORT_DMA_AUTO) /* To use DMA, giving the irq
 298                                           is mandatory (see above) */
 299                p->dma = PARPORT_DMA_NONE;
 300
 301        pr_cont(" [");
 302#define printmode(x) {if(p->modes&PARPORT_MODE_##x){pr_cont("%s%s",f?",":"",#x);f++;}}
 303        {
 304                int f = 0;
 305                printmode(PCSPP);
 306                printmode(TRISTATE);
 307                printmode(COMPAT)
 308                printmode(EPP);
 309//              printmode(ECP);
 310//              printmode(DMA);
 311        }
 312#undef printmode
 313        pr_cont("]\n");
 314
 315        if (p->irq != PARPORT_IRQ_NONE) {
 316                if (request_irq (p->irq, parport_irq_handler,
 317                                 0, p->name, p)) {
 318                        printk (KERN_WARNING "%s: irq %d in use, "
 319                                "resorting to polled operation\n",
 320                                p->name, p->irq);
 321                        p->irq = PARPORT_IRQ_NONE;
 322                        p->dma = PARPORT_DMA_NONE;
 323                }
 324        }
 325
 326        /* Done probing.  Now put the port into a sensible start-up state. */
 327
 328        parport_gsc_write_data(p, 0);
 329        parport_gsc_data_forward (p);
 330
 331        /* Now that we've told the sharing engine about the port, and
 332           found out its characteristics, let the high-level drivers
 333           know about it. */
 334        parport_announce_port (p);
 335
 336        return p;
 337}
 338
 339
 340#define PARPORT_GSC_OFFSET 0x800
 341
 342static int parport_count;
 343
 344static int __init parport_init_chip(struct parisc_device *dev)
 345{
 346        struct parport *p;
 347        unsigned long port;
 348
 349        if (!dev->irq) {
 350                printk(KERN_WARNING "IRQ not found for parallel device at 0x%llx\n",
 351                        (unsigned long long)dev->hpa.start);
 352                return -ENODEV;
 353        }
 354
 355        port = dev->hpa.start + PARPORT_GSC_OFFSET;
 356        
 357        /* some older machines with ASP-chip don't support
 358         * the enhanced parport modes.
 359         */
 360        if (boot_cpu_data.cpu_type > pcxt && !pdc_add_valid(port+4)) {
 361
 362                /* Initialize bidirectional-mode (0x10) & data-tranfer-mode #1 (0x20) */
 363                printk("%s: initialize bidirectional-mode.\n", __func__);
 364                parport_writeb ( (0x10 + 0x20), port + 4);
 365
 366        } else {
 367                printk("%s: enhanced parport-modes not supported.\n", __func__);
 368        }
 369        
 370        p = parport_gsc_probe_port(port, 0, dev->irq,
 371                        /* PARPORT_IRQ_NONE */ PARPORT_DMA_NONE, dev);
 372        if (p)
 373                parport_count++;
 374        dev_set_drvdata(&dev->dev, p);
 375
 376        return 0;
 377}
 378
 379static int __exit parport_remove_chip(struct parisc_device *dev)
 380{
 381        struct parport *p = dev_get_drvdata(&dev->dev);
 382        if (p) {
 383                struct parport_gsc_private *priv = p->private_data;
 384                struct parport_operations *ops = p->ops;
 385                parport_remove_port(p);
 386                if (p->dma != PARPORT_DMA_NONE)
 387                        free_dma(p->dma);
 388                if (p->irq != PARPORT_IRQ_NONE)
 389                        free_irq(p->irq, p);
 390                if (priv->dma_buf)
 391                        pci_free_consistent(priv->dev, PAGE_SIZE,
 392                                            priv->dma_buf,
 393                                            priv->dma_handle);
 394                kfree (p->private_data);
 395                parport_put_port(p);
 396                kfree (ops); /* hope no-one cached it */
 397        }
 398        return 0;
 399}
 400
 401static const struct parisc_device_id parport_tbl[] __initconst = {
 402        { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x74 },
 403        { 0, }
 404};
 405
 406MODULE_DEVICE_TABLE(parisc, parport_tbl);
 407
 408static struct parisc_driver parport_driver __refdata = {
 409        .name           = "Parallel",
 410        .id_table       = parport_tbl,
 411        .probe          = parport_init_chip,
 412        .remove         = __exit_p(parport_remove_chip),
 413};
 414
 415int parport_gsc_init(void)
 416{
 417        return register_parisc_driver(&parport_driver);
 418}
 419
 420static void parport_gsc_exit(void)
 421{
 422        unregister_parisc_driver(&parport_driver);
 423}
 424
 425module_init(parport_gsc_init);
 426module_exit(parport_gsc_exit);
 427