linux/include/linux/tc.h
<<
>>
Prefs
   1/*
   2 *      Interface to the TURBOchannel related routines.
   3 *
   4 *      Copyright (c) 1998  Harald Koerfgen
   5 *      Copyright (c) 2005  James Simmons
   6 *      Copyright (c) 2006  Maciej W. Rozycki
   7 *
   8 *      Based on:
   9 *
  10 *      "TURBOchannel Firmware Specification", EK-TCAAD-FS-004
  11 *
  12 *      from Digital Equipment Corporation.
  13 *
  14 *      This file is subject to the terms and conditions of the GNU
  15 *      General Public License.  See the file "COPYING" in the main
  16 *      directory of this archive for more details.
  17 */
  18#ifndef _LINUX_TC_H
  19#define _LINUX_TC_H
  20
  21#include <linux/compiler.h>
  22#include <linux/device.h>
  23#include <linux/ioport.h>
  24#include <linux/types.h>
  25
  26/*
  27 * Offsets for the ROM header locations for TURBOchannel cards.
  28 */
  29#define TC_OLDCARD      0x3c0000
  30#define TC_NEWCARD      0x000000
  31
  32#define TC_ROM_WIDTH    0x3e0
  33#define TC_ROM_STRIDE   0x3e4
  34#define TC_ROM_SIZE     0x3e8
  35#define TC_SLOT_SIZE    0x3ec
  36#define TC_PATTERN0     0x3f0
  37#define TC_PATTERN1     0x3f4
  38#define TC_PATTERN2     0x3f8
  39#define TC_PATTERN3     0x3fc
  40#define TC_FIRM_VER     0x400
  41#define TC_VENDOR       0x420
  42#define TC_MODULE       0x440
  43#define TC_FIRM_TYPE    0x460
  44#define TC_FLAGS        0x470
  45#define TC_ROM_OBJECTS  0x480
  46
  47/*
  48 * Information obtained through the get_tcinfo() PROM call.
  49 */
  50struct tcinfo {
  51        s32             revision;       /* Hardware revision level. */
  52        s32             clk_period;     /* Clock period in nanoseconds. */
  53        s32             slot_size;      /* Slot size in megabytes. */
  54        s32             io_timeout;     /* I/O timeout in cycles. */
  55        s32             dma_range;      /* DMA address range in megabytes. */
  56        s32             max_dma_burst;  /* Maximum DMA burst length. */
  57        s32             parity;         /* System module supports TC parity. */
  58        s32             reserved[4];
  59};
  60
  61/*
  62 * TURBOchannel bus.
  63 */
  64struct tc_bus {
  65        struct list_head devices;       /* List of devices on this bus. */
  66        struct resource resource[2];    /* Address space routed to this bus. */
  67
  68        struct device   dev;
  69        char            name[13];
  70        resource_size_t slot_base;
  71        resource_size_t ext_slot_base;
  72        resource_size_t ext_slot_size;
  73        int             num_tcslots;
  74        struct tcinfo   info;
  75};
  76
  77/*
  78 * TURBOchannel device.
  79 */
  80struct tc_dev {
  81        struct list_head node;          /* Node in list of all TC devices. */
  82        struct tc_bus   *bus;           /* Bus this device is on. */
  83        struct tc_driver *driver;       /* Which driver has allocated this
  84                                           device. */
  85        struct device   dev;            /* Generic device interface. */
  86        struct resource resource;       /* Address space of this device. */
  87        u64             dma_mask;       /* DMA addressable range. */
  88        char            vendor[9];
  89        char            name[9];
  90        char            firmware[9];
  91        int             interrupt;
  92        int             slot;
  93};
  94
  95#define to_tc_dev(n) container_of(n, struct tc_dev, dev)
  96
  97struct tc_device_id {
  98        char            vendor[9];
  99        char            name[9];
 100};
 101
 102/*
 103 * TURBOchannel driver.
 104 */
 105struct tc_driver {
 106        struct list_head node;
 107        const struct tc_device_id *id_table;
 108        struct device_driver driver;
 109};
 110
 111#define to_tc_driver(drv) container_of(drv, struct tc_driver, driver)
 112
 113/*
 114 * Return TURBOchannel clock frequency in Hz.
 115 */
 116static inline unsigned long tc_get_speed(struct tc_bus *tbus)
 117{
 118        return 100000 * (10000 / (unsigned long)tbus->info.clk_period);
 119}
 120
 121#ifdef CONFIG_TC
 122
 123extern struct bus_type tc_bus_type;
 124
 125extern int tc_register_driver(struct tc_driver *tdrv);
 126extern void tc_unregister_driver(struct tc_driver *tdrv);
 127
 128#else /* !CONFIG_TC */
 129
 130static inline int tc_register_driver(struct tc_driver *tdrv) { return 0; }
 131static inline void tc_unregister_driver(struct tc_driver *tdrv) { }
 132
 133#endif /* CONFIG_TC */
 134
 135/*
 136 * These have to be provided by the architecture.
 137 */
 138extern int tc_preadb(u8 *valp, void __iomem *addr);
 139extern int tc_bus_get_info(struct tc_bus *tbus);
 140extern void tc_device_get_irq(struct tc_dev *tdev);
 141
 142#endif /* _LINUX_TC_H */
 143