                          EISA Хݡ

                Marc Zyngier <maz@wild-wind.fr.eu.org>


ʸ񷲤ϡ EISA/sysfs API ؤ EISA ɥ饤аܿ˴ؤ
ΡȤǤ

С 2.5.59 ʹߡEISA ХϡPCI  USB Ȥääȼή
¾ΥХȤۤƱȤʤäƤޤξϡsysfs ˤã
ޤsysfs ϡХǥХӥɥ饤Ф뤿Ρ
ʬݲåȤƤޤ

 API ˴ñ˻ѤǤޤ¸Υɥ饤Ф򿷤ե
ȥ饯ؤѹΤϡñʺȤǤϤޤ (Хɤ
 ISA ɤץ֤뤿ˤѤƤ롢ȤΤ
ͳǤ)ˡۤȤɤ EISA ɥ饤ФäȤŤ Linux ɥ
з˴ޤޤΤǤ뤿ᡢΤȤꡢǯΤߤ
Ĥ³ƤΤǤ

EISA ե饹ȥ饯ϡĤʬǹƤޤ

  - ХɤϡѥɤΤۤȤɤƤޤХɤϡ
    EISA ɤ¹ԤƤΥƥǶͭޤХ
    ɤϡХΥץ (Х¸ߤ EISA ɤθ) 
    I/O ꥽γƤ򤪤ʤsysfs ̾Ϳ
    ɥ饤ФϿ륤󥿡ե󶡤ޤ

  - Х롼ȥɥ饤ФϡХϡɥѥХɴ֤ܹʬ
    ޤХǥХȯȡΥǥХȤ
    Хɤˤץ֤褦˥åȥåפ뤳ȤˡǤ
    ޤϡx86  I/O ꡼ͽ󤹤Ȥ٤δ
    ñʤΤ顢hppa EISA ɤΤ褦ˡäʣʤΤˤʤ
    ⤢ޤֿץץåȥե EISA ư
    ˼ʤФʤʤʬǤ

  - ɥ饤ФϡǥХΥꥹȤХ󶡤׵ᤵ줿
    ȤˤĤǤǥХΥץ֤Ȳ򤪤ʤ褦ˤ뤿
    ɬפʥХåޤ

δؿȹ¤ΤϤ٤ <linux/eisa.h> ˤޤ
<linux/device.h> 礭¸ޤ


Х롼ȥɥ饤
------------------

  int eisa_root_register (struct eisa_root_device *root);

eisa_root_register ؿϡǥХ EISA ХΥ롼ȤȤ
˻Ѥޤeisa_root_device ¤ΤϡץѤΥѥ᡼
ˤΥǥХλȤݻޤ

  struct eisa_root_device {
          struct device   *dev;           /* ֥åǥХؤΥݥ */
          struct resource *res;
          unsigned long    bus_base_addr;
          int              slots;         /* 祹åȿ */
          int              force_probe;   /* å 0 ʤƤץ֤ */
          u64              dma_mask;      /* ֥åǥХ */
          int              bus_nr;        /* eisa_root_register ˤꥻåȤ */
          struct resource  eisa_root_res; /* Ʊ */
  };

  node          : eisa_root_register Ū˻Ѥޤ
  dev           : 롼ȥǥХؤΥݥ
  res           : 롼ȥǥХ I/O ꥽
  bus_base_addr : ΥХΥå 0 ɥ쥹
  slots         : ץ֤祹åȿ
  force_probe   : å 0  (EISA ᥤܡɤ̵) Ǥץ֤ޤ
  dma_mask      : ǥե DMA ޥ̾֥åǥХ dma_mask.
  bus_nr        : դΥХ ID ǡeisa_root_register ˤꥻåȤޤ


ɥ饤
--------

  int eisa_driver_register (struct eisa_driver *edrv);
  void eisa_driver_unregister (struct eisa_driver *edrv);

򤹤ؿϽʬΤǤ͡

  struct eisa_device_id {
          char sig[EISA_SIG_LEN];
          unsigned long driver_data;
  };

  struct eisa_driver {
          const struct eisa_device_id *id_table;
          struct device_driver         driver;
  };

  id_table      : ̥ǽü줿 EISA ID ʸǤꡢǸ
                  ʸ󡣳ʸϡɥ饤а¸ (driver_data)
                  ǤդȤˤ뤳ȤǤޤ

  driver        : Documentation/driver-model/driver.txt 
                  ѥɥ饤С.name, .probe, .remove Ф
                  ɬܤǤ

3c59x ɥ饤ФȤʤޤ

  static struct eisa_device_id vortex_eisa_ids[] = {
          { "TCM5920", EISA_3C592_OFFSET },
          { "TCM5970", EISA_3C597_OFFSET },
          { "" }
  };

  static struct eisa_driver vortex_eisa_driver = {
          .id_table = vortex_eisa_ids,
          .driver   = {
                  .name    = "3c59x",
                  .probe   = vortex_eisa_probe,
                  .remove  = vortex_eisa_remove
          }
  };


ǥХ
--------

sysfs ե졼ϡǥХȯȺκݡ.probe ؿ .remove
ؿƤӤޤ (.remove ؿƤФΤϡɥ饤Ф⥸塼Ȥ
ӥɤƤΤߤǤ뤳ȤդƤ)

ɤδؿ⡢˼ 'struct eisa_device' ˤ 'struct device'
ؤΥݥ󥿤ޤ

  struct eisa_device {
          struct eisa_device_id id;
          int                   slot;
          int                   state;
          unsigned long         base_addr;
          struct resource       res[EISA_MAX_RESOURCES];
          u64                   dma_mask;
          struct device         dev; /* ѥǥХ */
  };

  id       : ǥХɤߤȤ EISA ID. id.driver_data ϡб
             ɥ饤 EISA ID Ȥ˥åȤޤ
  slot     : ǥХФ줿åȤֹ
  state    : ǥХξ֤򼨤ե饰ΥåȡߤΥե饰
             EISA_CONFIG_ENABLED  EISA_CONFIG_FORCED.
  res      : ΥǥХ˳Ƥ줿 4 Ĥ 256 Х I/O ꡼
             Υå
  dma_mask : ƥǥХѤ DMA ޥ
  dev      : ѥǥХ (Documentation/driver-model/device.txt )

'to_eisa_device' ޥȤ'struct device'  'struct eisa_device'
Ǥޤ


¾
------

  void eisa_set_drvdata (struct eisa_device *edev, void *data);

    ǥХ driver_data ΰ˥ǡǼޤ

  void *eisa_get_drvdata (struct eisa_device *edev):

    ǥХ driver_data ΰ˳ǼƤݥ󥿤ޤ

  int eisa_get_region_index (void *addr);

    Ϥ줿ɥ쥹Υ꡼ֹ֤ޤ (0 ʾ EISA_MAX_RESOURCES
    ̤)


ͥѥ᡼
------------------

  eisa_bus.enable_dev :

    ͭˤ륹åȤ򥫥޶ڤǥꥹȤΡե०
    ɤ̵ˤƤǤͭˤޤɥ饤ФϡΤ褦
    ξˤ⡢Ŭڤ˥ǥХǤʤФʤޤ

  eisa_bus.disable_dev :

    ̵ˤ륹åȤ򥫥޶ڤǥꥹȤΡե०
    ɤͭˤƤǤ̵ˤޤΥǥХ
    ɥ饤ФƤФ뤳ȤϤޤ

  virtual_root.force_probe :

    EISA ΥᥤܡɤȯǤʤǤ (å 0 ˲
    ʤǤ)ץ֥ɤ˶Ū EISA åȤץ
    ޤǥեȤ 0 (ʤ) ǤCONFIG_ALPHA_JENSEN
    ⤷ CONFIG_EISA_VLB_PRIMING åȤƤϡ1 (
    ֤) ˥åȤޤ


Ρ
--------------

EISA ɥ饤Ф򿷤 API ѹȤϡۤȤɤξ硢ɤ
ֺפʤޤ (ߤϥ EISA ɤ˥ץ֥ɤ¸
뤫Ǥ)ǰʤ顢ۤȤɤΥɥ饤ФϡISA, MCA, EISA ֤
ȤΥץ֥롼ͭƤޤζɽŪѹ¾ΥХ
˱ƶͿ뤳Ȥʤ褦EISA ɤȤˤ̤դ
ɬפǤ

eisa_driver_register äȤ˲餫 EISA ǥХФ
뤳ȤԤƤϡ֤ޤסȤΤϡХΤޤץ
Ƥʤǽ뤫Ǥ¡ƤξϤǤ (Х
롼ȥɥ饤Ф̾ɤ餫Ȥȥ֡ȥץΤȤΤۤư
Ϥޤ)ǰʤ顢ۤȤɤΥɥ饤Фϼʬǥץ֤򤪤ʤä
ꡢΥץ֥롼󤫤ȴȤˤϥޥΤĴٽä
ΤȴԤƤޤ

㤨Сߤ EISA SCSI ɤ֥ۥåȥץ饰ץǥڤؤ
Ȥϡ"the right thing"(tm) Ǥ("right thing" ˤϡ֤Ǥ⡢
ʿͤʤ餽ʤȤϤʤɤ͡סȤ˥奢󥹤⤢ޤ
http://www.catb.org/~esr/jargon/html/R/Right-Thing.html 򻲾ȤΤ)


ռ
----

ϤƤȤФơ˴դȻפޤ

  - Xavier Benigni : 餷 Alpha Jensen ߤƤޤ
  - James Bottomley, Jeff Garzik : 򥫡ͥ˼Ǥޤ
  - Andries Brouwer : ¿ EISA ID 󶡤Ƥޤ
  - Catrin Jones : ˤΥޥбƤޤ

------------------------------------------------------------
Ρ JF ץ < http://www.linux.or.jp/JF/ >
   2004/05/23
ԡ    ɧ <takahiko(a)hakubi.co.jp>
