1. 09 Jun, 2003 2 commits
    • Patrick Mochel's avatar
      [list.h] Add list_for_each_entry_reverse · fab97929
      Patrick Mochel authored
      fab97929
    • Patrick Mochel's avatar
      [driver model] Rewrite system device API · a4ff342a
      Patrick Mochel authored
      System devices are special, and after two years of listening to Linus
      preach this, it finally sunk in enough to do something about. We don't
      need to regard them as real devices that reside on a peripheral bus and
      can be dynamically bound to drivers. If we discover, e.g. a CPU, we know
      by default that we have a driver for it, and we know damn well that we
      have a CPU. We still need to keep track of all the devices, and all the
      devices of a particular type. The kobject infrastructure allows us to do
      this, without the overhead of the regular model.
      
      A new subsystem is defined that registers as a child object of 
      devices_subsys, giving us:
      
              /sys/devices/system/
      
      struct sysdev_class {
              struct list_head        drivers;
      
              /* Default operations for these types of devices */
              int     (*shutdown)(struct sys_device *);
              int     (*suspend)(struct sys_device *, u32 state);
              int     (*resume)(struct sys_device *);
              struct kset             kset;
      };
      
      Defines a type of system device. These are registered on startup, by e.g. 
      drivers/base/cpu.c. The methods are default operations for devices of that 
      type that may or may not be used. For things like the i8259 controller, 
      these will be filled in, since it is registered by the same component that 
      the device controls reside in. 
      
      For things like CPUs, generic code will register the class, but other 
      architecture-specific or otherwise configurable drivers may register 
      auxillary drivers, that look like: 
      
      struct sysdev_driver {
              struct list_head        entry;
              int     (*add)(struct sys_device *);
              int     (*remove)(struct sys_device *);
              int     (*shutdown)(struct sys_device *);
              int     (*suspend)(struct sys_device *, u32 state);
              int     (*resume)(struct sys_device *);
      };
      
      
      Each auxillary driver gets called during each operation on a device of a 
      particular class. 
      Auxillary drivers may register with a NULL class parameter, in which case 
      they will be added to a list of 'global drivers' that get called for each 
      device of each class. 
      
      
      Besides providing a decent of cleanup for system device drivers, this also 
      allows:
      
      - Special handling of system devices during power transitions. 
      
        We no longer have to worry about shutting down the PIC before we shut 
        down any devices. We can shut down the system devices after we've shut 
        down every other device. 
      
        Ditto for suspend/resume cycles. Almost (if not) all PM actions for 
        system devices happen with interrupts off, and require only one call, 
        which makes that easier. But, we can also make sure we take care of 
        these last during suspend and first during resume.
      
      - Easy expression of configurable device-specific interfaces. 
      
        Namely cpufreq and mtrr. We don't have to worry about mispresentation in 
        the driver model (like recent MTRR patches) or using a cumbersome 
        interface ({device,class}_interface) that don't receive all the 
        necessary calls. 
      
      - Consolidation of userspace representation.
      
        No longer do we have /sys/devices/sys, /sys/bus/sys, and /sys/class/cpu,
        etc. We have only /sys/devices/system: 
      
      # tree /sys/devices/system/
      /sys/devices/system/
      |-- cpu
      |   `-- cpu0
      |-- i8259
      |   `-- i82590
      |-- lapic
      |   `-- lapic0
      |-- rtc
      |   `-- rtc0
      `-- timer
          `-- timer0
      
      Each directory in 'system' is the class, and each directory under that is 
      the instance of each device in that class. 
      a4ff342a
  2. 05 Jun, 2003 38 commits