root/drivers/block/umc8672.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. out_umc
  2. in_umc
  3. umc_set_speeds
  4. tune_umc
  5. init_umc8672

   1 /*
   2  *  linux/drivers/block/umc8672.c       Version 0.03  Feb 09, 1996
   3  *
   4  *  Copyright (C) 1995-1996  Linus Torvalds & author (see below)
   5  */
   6 
   7 /*
   8  *  Principal Author/Maintainer:  PODIEN@hml2.atlas.de (Wolfram Podien)
   9  *
  10  *  This file provides support for the advanced features
  11  *  of the UMC 8672 IDE interface.
  12  *
  13  *  Version 0.01        Initial version, hacked out of ide.c,
  14  *                      and #include'd rather than compiled separately.
  15  *                      This will get cleaned up in a subsequent release.
  16  *
  17  *  Version 0.02        now configs/compiles separate from ide.c  -ml
  18  *  Version 0.03        enhanced auto-tune, fix display bug
  19  */
  20 
  21 /*
  22  * VLB Controller Support from 
  23  * Wolfram Podien
  24  * Rohoefe 3
  25  * D28832 Achim
  26  * Germany
  27  *
  28  * To enable UMC8672 support there must a lilo line like
  29  * append="hd=umc8672"...
  30  * To set the speed according to the abilities of the hardware there must be a
  31  * line like
  32  * #define UMC_DRIVE0 11
  33  * in the beginning of the driver, which sets the speed of drive 0 to 11 (there
  34  * are some lines present). 0 - 11 are allowed speed values. These values are
  35  * the results from the DOS speed test program supplied from UMC. 11 is the 
  36  * highest speed (about PIO mode 3)
  37  */
  38 #undef REALLY_SLOW_IO           /* most systems can safely undef this */
  39 
  40 #include <linux/types.h>
  41 #include <linux/kernel.h>
  42 #include <linux/delay.h>
  43 #include <linux/timer.h>
  44 #include <linux/mm.h>
  45 #include <linux/ioport.h>
  46 #include <linux/blkdev.h>
  47 #include <linux/hdreg.h>
  48 #include <asm/io.h>
  49 #include "ide.h"
  50 #include "ide_modes.h"
  51 
  52 /*
  53  * Default speeds.  These can be changed with "auto-tune" and/or hdparm.
  54  */
  55 #define UMC_DRIVE0      1              /* DOS measured drive speeds */
  56 #define UMC_DRIVE1      1              /* 0 to 11 allowed */
  57 #define UMC_DRIVE2      1              /* 11 = Fastest Speed */
  58 #define UMC_DRIVE3      1              /* In case of crash reduce speed */
  59 
  60 static byte current_speeds[4] = {UMC_DRIVE0, UMC_DRIVE1, UMC_DRIVE2, UMC_DRIVE3};
  61 static const byte pio_to_umc [5] = {0,3,7,10,11};       /* rough guesses */
  62 
  63 /*       0    1    2    3    4    5    6    7    8    9    10   11      */
  64 static const byte speedtab [3][12] = {
  65         {0xf, 0xb, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 },
  66         {0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 },
  67         {0xff,0xcb,0xc0,0x58,0x36,0x33,0x23,0x22,0x21,0x11,0x10,0x0}};
  68 
  69 static void out_umc (char port,char wert)
     /* [previous][next][first][last][top][bottom][index][help] */
  70 {
  71         outb_p (port,0x108);
  72         outb_p (wert,0x109);
  73 }
  74 
  75 static byte in_umc (char port)
     /* [previous][next][first][last][top][bottom][index][help] */
  76 {
  77         outb_p (port,0x108);
  78         return inb_p (0x109);
  79 }
  80 
  81 static void umc_set_speeds (byte speeds[])
     /* [previous][next][first][last][top][bottom][index][help] */
  82 {
  83         int i, tmp;
  84         unsigned long flags;
  85 
  86         save_flags(flags);
  87         cli ();
  88         outb_p (0x5A,0x108); /* enable umc */
  89 
  90         out_umc (0xd7,(speedtab[0][speeds[2]] | (speedtab[0][speeds[3]]<<4)));
  91         out_umc (0xd6,(speedtab[0][speeds[0]] | (speedtab[0][speeds[1]]<<4)));
  92         tmp = 0;
  93         for (i = 3; i >= 0; i--)
  94         {
  95                 tmp = (tmp << 2) | speedtab[1][speeds[i]];
  96         }
  97         out_umc (0xdc,tmp);
  98         for (i = 0;i < 4; i++)
  99         {
 100                 out_umc (0xd0+i,speedtab[2][speeds[i]]);
 101                 out_umc (0xd8+i,speedtab[2][speeds[i]]);
 102         }
 103         outb_p (0xa5,0x108); /* disable umc */
 104         restore_flags(flags);
 105 
 106         printk ("umc8672: drive speeds [0 to 11]: %d %d %d %d\n",
 107                 speeds[0], speeds[1], speeds[2], speeds[3]);
 108 }
 109 
 110 static void tune_umc (ide_drive_t *drive, byte pio)
     /* [previous][next][first][last][top][bottom][index][help] */
 111 {
 112         if (pio == 255)
 113                 pio = ide_get_best_pio_mode(drive);
 114         if (pio > 4)
 115                 pio = 4;
 116 
 117         current_speeds[drive->name[2] - 'a'] = pio_to_umc[pio];
 118         umc_set_speeds (current_speeds);
 119 }
 120 
 121 void init_umc8672 (void)        /* called from ide.c */
     /* [previous][next][first][last][top][bottom][index][help] */
 122 {
 123         unsigned long flags;
 124 
 125         if (check_region(0x108, 2)) {
 126                 printk("\numc8672: PORTS 0x108-0x109 ALREADY IN USE\n");
 127                 return;
 128         }
 129         save_flags(flags);
 130         cli ();
 131         outb_p (0x5A,0x108); /* enable umc */
 132         if (in_umc (0xd5) != 0xa0)
 133         {
 134                 sti ();
 135                 printk ("umc8672: not found\n");
 136                 return;  
 137         }
 138         outb_p (0xa5,0x108); /* disable umc */
 139         restore_flags(flags);
 140 
 141         umc_set_speeds (current_speeds);
 142 
 143         request_region(0x108, 2, "umc8672");
 144         ide_hwifs[0].chipset = ide_umc8672;
 145         ide_hwifs[1].chipset = ide_umc8672;
 146         ide_hwifs[0].tuneproc = &tune_umc;
 147         ide_hwifs[1].tuneproc = &tune_umc;
 148 
 149 }

/* [previous][next][first][last][top][bottom][index][help] */