Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 8 May 2007 18:50:19 +0000 (11:50 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 8 May 2007 18:50:19 +0000 (11:50 -0700)
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (77 commits)
  [POWERPC] Abolish powerpc_flash_init()
  [POWERPC] Early serial debug support for PPC44x
  [POWERPC] Support for the Ebony 440GP reference board in arch/powerpc
  [POWERPC] Add device tree for Ebony
  [POWERPC] Add powerpc/platforms/44x, disable platforms/4xx for now
  [POWERPC] MPIC U3/U4 MSI backend
  [POWERPC] MPIC MSI allocator
  [POWERPC] Enable MSI mappings for MPIC
  [POWERPC] Tell Phyp we support MSI
  [POWERPC] RTAS MSI implementation
  [POWERPC] PowerPC MSI infrastructure
  [POWERPC] Rip out the existing powerpc msi stubs
  [POWERPC] Remove use of 4level-fixup.h for ppc32
  [POWERPC] Add powerpc PCI-E reset API implementation
  [POWERPC] Holly bootwrapper
  [POWERPC] Holly DTS
  [POWERPC] Holly defconfig
  [POWERPC] Add support for 750CL Holly board
  [POWERPC] Generalize tsi108 PCI setup
  [POWERPC] Generalize tsi108 PHY types
  ...

Fixed conflict in include/asm-powerpc/kdebug.h manually

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1109 files changed:
CREDITS
Documentation/CodingStyle
Documentation/DocBook/Makefile
Documentation/DocBook/kernel-api.tmpl
Documentation/DocBook/librs.tmpl
Documentation/SubmittingDrivers
Documentation/accounting/getdelays.c
Documentation/cciss.txt
Documentation/fb/deferred_io.txt [new file with mode: 0644]
Documentation/fb/s3fb.txt
Documentation/feature-removal-schedule.txt
Documentation/filesystems/Locking
Documentation/filesystems/jfs.txt
Documentation/filesystems/proc.txt
Documentation/filesystems/vfat.txt
Documentation/filesystems/vfs.txt
Documentation/ioctl-number.txt
Documentation/kernel-parameters.txt
Documentation/kprobes.txt
Documentation/laptop-mode.txt
Documentation/oops-tracing.txt
Documentation/power/basic-pm-debugging.txt [new file with mode: 0644]
Documentation/power/drivers-testing.txt [new file with mode: 0644]
Documentation/rtc.txt
Documentation/spi/spi-summary
Documentation/spi/spidev [new file with mode: 0644]
Documentation/tty.txt
MAINTAINERS
arch/alpha/Kconfig.debug
arch/alpha/kernel/osf_sys.c
arch/alpha/kernel/process.c
arch/alpha/kernel/setup.c
arch/alpha/kernel/signal.c
arch/alpha/kernel/smp.c
arch/alpha/kernel/srmcons.c
arch/alpha/mm/fault.c
arch/arm/kernel/ptrace.c
arch/arm/kernel/traps.c
arch/arm/mach-aaec2000/core.c
arch/arm/mach-at91/at91rm9200_time.c
arch/arm/mach-at91/at91sam926x_time.c
arch/arm/mach-clps711x/time.c
arch/arm/mach-clps7500/core.c
arch/arm/mach-ebsa110/core.c
arch/arm/mach-ep93xx/core.c
arch/arm/mach-footbridge/dc21285-timer.c
arch/arm/mach-footbridge/isa-timer.c
arch/arm/mach-h720x/cpu-h7201.c
arch/arm/mach-h720x/cpu-h7202.c
arch/arm/mach-imx/time.c
arch/arm/mach-integrator/core.c
arch/arm/mach-ixp2000/core.c
arch/arm/mach-ixp23xx/core.c
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-lh7a40x/time.c
arch/arm/mach-netx/time.c
arch/arm/mach-ns9xxx/time.c
arch/arm/mach-omap1/time.c
arch/arm/mach-omap2/timer-gp.c
arch/arm/mach-pnx4008/time.c
arch/arm/mach-pxa/time.c
arch/arm/mach-realview/core.c
arch/arm/mach-sa1100/h3600.c
arch/arm/mach-sa1100/time.c
arch/arm/mach-shark/core.c
arch/arm/mach-versatile/core.c
arch/arm/mm/fault.c
arch/arm/plat-iop/time.c
arch/arm/plat-omap/timer32k.c
arch/arm/plat-s3c24xx/time.c
arch/arm26/kernel/armksyms.c
arch/arm26/kernel/ptrace.c
arch/arm26/kernel/signal.c
arch/arm26/mm/memc.c
arch/avr32/kernel/kprobes.c
arch/avr32/kernel/ptrace.c
arch/avr32/kernel/traps.c
arch/avr32/mm/fault.c
arch/cris/arch-v10/kernel/ptrace.c
arch/cris/arch-v10/kernel/signal.c
arch/cris/arch-v32/drivers/pci/dma.c
arch/cris/arch-v32/kernel/ptrace.c
arch/cris/kernel/crisksyms.c
arch/cris/kernel/ptrace.c
arch/frv/kernel/irq.c
arch/frv/kernel/ptrace.c
arch/frv/kernel/semaphore.c
arch/frv/kernel/signal.c
arch/frv/kernel/sys_frv.c
arch/frv/mm/pgalloc.c
arch/h8300/kernel/ptrace.c
arch/h8300/kernel/sys_h8300.c
arch/i386/boot/video.S
arch/i386/kernel/Makefile
arch/i386/kernel/apic.c
arch/i386/kernel/apm.c
arch/i386/kernel/crash.c
arch/i386/kernel/efi.c
arch/i386/kernel/i8259.c
arch/i386/kernel/io_apic.c
arch/i386/kernel/ioport.c
arch/i386/kernel/kprobes.c
arch/i386/kernel/ldt.c
arch/i386/kernel/legacy_serial.c [new file with mode: 0644]
arch/i386/kernel/mpparse.c
arch/i386/kernel/nmi.c
arch/i386/kernel/pci-dma.c
arch/i386/kernel/process.c
arch/i386/kernel/ptrace.c
arch/i386/kernel/signal.c
arch/i386/kernel/smp.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/sys_i386.c
arch/i386/kernel/syscall_table.S
arch/i386/kernel/traps.c
arch/i386/kernel/vm86.c
arch/i386/mach-default/setup.c
arch/i386/mach-visws/setup.c
arch/i386/mach-visws/visws_apic.c
arch/i386/mach-voyager/setup.c
arch/i386/mach-voyager/voyager_smp.c
arch/i386/mach-voyager/voyager_thread.c
arch/i386/mm/fault.c
arch/i386/mm/hugetlbpage.c
arch/i386/mm/init.c
arch/i386/oprofile/nmi_int.c
arch/i386/oprofile/nmi_timer_int.c
arch/ia64/hp/sim/boot/fw-emu.c
arch/ia64/ia32/ia32_ldt.c
arch/ia64/ia32/ia32_signal.c
arch/ia64/ia32/ia32_support.c
arch/ia64/kernel/crash.c
arch/ia64/kernel/efi.c
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/kprobes.c
arch/ia64/kernel/mca.c
arch/ia64/kernel/mca_drv.c
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/process.c
arch/ia64/kernel/salinfo.c
arch/ia64/kernel/signal.c
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/sys_ia64.c
arch/ia64/kernel/time.c
arch/ia64/kernel/traps.c
arch/ia64/kernel/unaligned.c
arch/ia64/mm/discontig.c
arch/ia64/mm/fault.c
arch/ia64/mm/hugetlbpage.c
arch/ia64/pci/pci.c
arch/ia64/sn/kernel/xpc_main.c
arch/m32r/kernel/m32r_ksyms.c
arch/m32r/kernel/signal.c
arch/m32r/kernel/smpboot.c
arch/m32r/kernel/sys_m32r.c
arch/m32r/mm/fault-nommu.c
arch/m32r/mm/fault.c
arch/m68k/kernel/ptrace.c
arch/m68k/mvme16x/rtc.c
arch/m68knommu/kernel/ptrace.c
arch/m68knommu/kernel/sys_m68k.c
arch/mips/kernel/early_printk.c
arch/mips/kernel/irixelf.c
arch/mips/kernel/irixioctl.c
arch/mips/kernel/irixsig.c
arch/mips/kernel/ptrace.c
arch/mips/kernel/signal.c
arch/mips/kernel/signal32.c
arch/mips/kernel/signal_n32.c
arch/mips/kernel/stacktrace.c
arch/mips/kernel/syscall.c
arch/mips/kernel/traps.c
arch/mips/kernel/unaligned.c
arch/mips/math-emu/dsemul.c
arch/mips/mm/fault.c
arch/mips/sgi-ip27/ip27-irq.c
arch/mips/sni/irq.c
arch/parisc/hpux/fs.c
arch/parisc/hpux/ioctl.c
arch/parisc/kernel/irq.c
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/signal.c
arch/parisc/kernel/signal32.c
arch/parisc/kernel/sys_parisc.c
arch/parisc/kernel/traps.c
arch/parisc/kernel/unwind.c
arch/powerpc/kernel/kprobes.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/ptrace.c
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/signal_64.c
arch/powerpc/kernel/syscalls.c
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/udbg.c
arch/powerpc/kernel/vdso.c
arch/powerpc/mm/fault.c
arch/powerpc/mm/hugetlbpage.c
arch/powerpc/mm/init_64.c
arch/powerpc/platforms/cell/spufs/backing_ops.c
arch/powerpc/platforms/cell/spufs/hw_ops.c
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/cell/spufs/switch.c
arch/powerpc/platforms/chrp/smp.c
arch/powerpc/platforms/iseries/smp.c
arch/powerpc/platforms/iseries/viopath.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/xmon/xmon.c
arch/ppc/kernel/ppc_htab.c
arch/ppc/kernel/smp.c
arch/ppc/syslib/virtex_devices.h
arch/s390/kernel/compat_signal.c
arch/s390/kernel/dis.c
arch/s390/kernel/kprobes.c
arch/s390/kernel/process.c
arch/s390/kernel/signal.c
arch/s390/kernel/smp.c
arch/s390/kernel/stacktrace.c
arch/s390/kernel/sys_s390.c
arch/s390/kernel/time.c
arch/s390/kernel/traps.c
arch/s390/mm/fault.c
arch/sh/drivers/pci/pci-st40.c
arch/sh/kernel/early_printk.c
arch/sh/kernel/ptrace.c
arch/sh/kernel/sh_ksyms.c
arch/sh/kernel/signal.c
arch/sh/kernel/stacktrace.c
arch/sh/kernel/sys_sh.c
arch/sh/kernel/timers/timer-cmt.c
arch/sh/kernel/timers/timer-mtu2.c
arch/sh/kernel/timers/timer-tmu.c
arch/sh/mm/fault-nommu.c
arch/sh/mm/hugetlbpage.c
arch/sh/mm/pmb.c
arch/sh64/kernel/early_printk.c
arch/sh64/kernel/irq.c
arch/sh64/kernel/pci_sh5.c
arch/sh64/kernel/sh_ksyms.c
arch/sh64/kernel/signal.c
arch/sh64/kernel/sys_sh64.c
arch/sh64/kernel/traps.c
arch/sh64/kernel/unwind.c
arch/sh64/mm/fault.c
arch/sh64/mm/hugetlbpage.c
arch/sh64/mm/tlbmiss.c
arch/sparc/kernel/head.S
arch/sparc/kernel/irq.c
arch/sparc/kernel/process.c
arch/sparc/kernel/setup.c
arch/sparc/kernel/signal.c
arch/sparc/kernel/smp.c
arch/sparc/kernel/sun4d_irq.c
arch/sparc/kernel/sun4d_smp.c
arch/sparc/kernel/sun4m_smp.c
arch/sparc/kernel/sunos_ioctl.c
arch/sparc/kernel/sys_solaris.c
arch/sparc/kernel/traps.c
arch/sparc/lib/bitext.c
arch/sparc/mm/fault.c
arch/sparc/mm/srmmu.c
arch/sparc64/kernel/kprobes.c
arch/sparc64/kernel/pci.c
arch/sparc64/kernel/process.c
arch/sparc64/kernel/signal.c
arch/sparc64/kernel/signal32.c
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/stacktrace.c
arch/sparc64/kernel/sunos_ioctl32.c
arch/sparc64/kernel/sys_sparc.c
arch/sparc64/kernel/sys_sparc32.c
arch/sparc64/kernel/traps.c
arch/sparc64/kernel/unaligned.c
arch/sparc64/mm/fault.c
arch/sparc64/mm/hugetlbpage.c
arch/sparc64/solaris/ipc.c
arch/sparc64/solaris/misc.c
arch/sparc64/solaris/signal.c
arch/sparc64/solaris/socket.c
arch/sparc64/solaris/socksys.c
arch/um/drivers/net_kern.c
arch/um/drivers/pcap_kern.c
arch/um/drivers/pcap_user.c
arch/um/kernel/time.c
arch/v850/kernel/process.c
arch/v850/kernel/ptrace.c
arch/v850/kernel/signal.c
arch/v850/kernel/syscalls.c
arch/x86_64/ia32/ia32_signal.c
arch/x86_64/ia32/ia32entry.S
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/apic.c
arch/x86_64/kernel/crash.c
arch/x86_64/kernel/early_printk.c
arch/x86_64/kernel/i8259.c
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/ioport.c
arch/x86_64/kernel/kprobes.c
arch/x86_64/kernel/ldt.c
arch/x86_64/kernel/mce.c
arch/x86_64/kernel/mpparse.c
arch/x86_64/kernel/nmi.c
arch/x86_64/kernel/pci-gart.c
arch/x86_64/kernel/process.c
arch/x86_64/kernel/ptrace.c
arch/x86_64/kernel/reboot.c
arch/x86_64/kernel/signal.c
arch/x86_64/kernel/smp.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/stacktrace.c
arch/x86_64/kernel/sys_x86_64.c
arch/x86_64/kernel/time.c
arch/x86_64/kernel/traps.c
arch/x86_64/mm/fault.c
arch/x86_64/mm/init.c
arch/xtensa/kernel/process.c
arch/xtensa/kernel/ptrace.c
arch/xtensa/kernel/signal.c
block/as-iosched.c
block/ll_rw_blk.c
drivers/acpi/glue.c
drivers/acpi/numa.c
drivers/acpi/osl.c
drivers/acpi/scan.c
drivers/acpi/sleep/proc.c
drivers/base/platform.c
drivers/block/acsi_slm.c
drivers/block/cciss.c
drivers/block/cciss_scsi.c
drivers/block/floppy.c
drivers/block/loop.c
drivers/block/umem.c
drivers/char/Kconfig
drivers/char/amiserial.c
drivers/char/consolemap.c
drivers/char/cs5535_gpio.c
drivers/char/cyclades.c
drivers/char/digi.h [deleted file]
drivers/char/ds1620.c
drivers/char/dsp56k.c
drivers/char/dtlk.c
drivers/char/ec3104_keyb.c
drivers/char/epca.c
drivers/char/genrtc.c
drivers/char/hangcheck-timer.c
drivers/char/hvc_console.c
drivers/char/hw_random/intel-rng.c
drivers/char/i8k.c
drivers/char/ip27-rtc.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/ipmi/ipmi_watchdog.c
drivers/char/isicom.c
drivers/char/keyboard.c
drivers/char/lp.c
drivers/char/mem.c
drivers/char/misc.c
drivers/char/moxa.c
drivers/char/mxser.c
drivers/char/mxser_new.c
drivers/char/n_r3964.c
drivers/char/ppdev.c
drivers/char/riscom8.c
drivers/char/rocket.c
drivers/char/rocket_int.h
drivers/char/rtc.c
drivers/char/selection.c
drivers/char/serial167.c
drivers/char/synclink.c
drivers/char/synclink_gt.c
drivers/char/sysrq.c
drivers/char/tipar.c
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_infineon.c
drivers/char/tty_io.c
drivers/char/vc_screen.c
drivers/char/vt.c
drivers/char/vt_ioctl.c
drivers/char/watchdog/omap_wdt.c
drivers/cpufreq/cpufreq_ondemand.c
drivers/edac/i82875p_edac.c
drivers/eisa/virtual_root.c
drivers/hid/hid-core.c
drivers/hwmon/Kconfig
drivers/hwmon/Makefile
drivers/hwmon/applesmc.c [new file with mode: 0644]
drivers/hwmon/hdaps.c
drivers/i2c/busses/i2c-parport.c
drivers/i2c/busses/scx200_acb.c
drivers/i2c/i2c-dev.c
drivers/ieee1394/dv1394.c
drivers/ieee1394/raw1394.c
drivers/ieee1394/video1394.c
drivers/infiniband/hw/ipath/ipath_fs.c
drivers/infiniband/ulp/iser/iser_verbs.c
drivers/input/evdev.c
drivers/input/input.c
drivers/input/joydev.c
drivers/input/mousedev.c
drivers/input/tsdev.c
drivers/isdn/capi/capi.c
drivers/isdn/capi/capiutil.c
drivers/isdn/divert/divert_procfs.c
drivers/isdn/hardware/eicon/capimain.c
drivers/isdn/hardware/eicon/dbgioctl.h [deleted file]
drivers/isdn/hardware/eicon/divamnt.c
drivers/isdn/hardware/eicon/divasi.c
drivers/isdn/hardware/eicon/divasmain.c
drivers/isdn/hardware/eicon/main_if.h [deleted file]
drivers/isdn/hardware/eicon/platform.h
drivers/isdn/hisax/hfc_usb.c
drivers/isdn/hysdn/boardergo.c
drivers/isdn/hysdn/hysdn_proclog.c
drivers/isdn/isdnloop/isdnloop.c
drivers/macintosh/therm_adt746x.c
drivers/macintosh/therm_pm72.c
drivers/macintosh/windfarm_core.c
drivers/md/bitmap.c
drivers/media/dvb/bt8xx/dst_common.h
drivers/media/dvb/ttpci/av7110_av.c
drivers/media/dvb/ttpci/av7110_ca.c
drivers/media/dvb/ttpci/av7110_hw.c
drivers/media/dvb/ttpci/av7110_v4l.c
drivers/media/radio/dsbr100.c
drivers/media/video/cpia.h
drivers/media/video/cpia_pp.c
drivers/media/video/cx88/cx88-tvaudio.c
drivers/media/video/dabusb.c
drivers/media/video/ov511.h
drivers/media/video/pvrusb2/pvrusb2-main.c
drivers/media/video/saa7134/saa7134-tvaudio.c
drivers/media/video/se401.h
drivers/media/video/tvaudio.c
drivers/media/video/usbvideo/usbvideo.c
drivers/media/video/usbvision/usbvision-core.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/v4l1-compat.c
drivers/media/video/v4l2-common.c
drivers/media/video/videodev.c
drivers/media/video/zoran_driver.c
drivers/message/i2o/i2o_lan.h [deleted file]
drivers/mfd/ucb1x00-ts.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/blink.c [new file with mode: 0644]
drivers/misc/phantom.c [new file with mode: 0644]
drivers/mtd/mtd_blkdevs.c
drivers/net/irda/sir_dev.c
drivers/net/irda/sir_dongle.c
drivers/net/irda/smsc-ircc2.c
drivers/net/irda/vlsi_ir.c
drivers/net/ns83820.c
drivers/net/ppp_generic.c
drivers/net/wan/cosa.c
drivers/net/wireless/airo.c
drivers/net/wireless/hostap/hostap_ioctl.c
drivers/parisc/lba_pci.c
drivers/parport/parport_cs.c
drivers/parport/parport_mfc3.c
drivers/parport/parport_pc.c
drivers/parport/parport_serial.c
drivers/parport/parport_sunbpp.c
drivers/parport/share.c
drivers/pci/hotplug/acpiphp_core.c
drivers/pci/hotplug/acpiphp_glue.c
drivers/pci/hotplug/ibmphp_core.c
drivers/pci/hotplug/ibmphp_hpc.c
drivers/pci/hotplug/pci_hotplug_core.c
drivers/pci/hotplug/rpaphp_core.c
drivers/pci/hotplug/shpchp_ctrl.c
drivers/pci/msi.c
drivers/pci/proc.c
drivers/pcmcia/pxa2xx_mainstone.c
drivers/pcmcia/pxa2xx_sharpsl.c
drivers/pnp/core.c
drivers/pnp/pnpacpi/core.c
drivers/pnp/pnpbios/core.c
drivers/pnp/quirks.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/class.c
drivers/rtc/hctosys.c
drivers/rtc/interface.c
drivers/rtc/rtc-at91rm9200.c
drivers/rtc/rtc-cmos.c
drivers/rtc/rtc-core.h [new file with mode: 0644]
drivers/rtc/rtc-dev.c
drivers/rtc/rtc-ds1553.c
drivers/rtc/rtc-lib.c
drivers/rtc/rtc-max6900.c [new file with mode: 0644]
drivers/rtc/rtc-omap.c
drivers/rtc/rtc-pl031.c
drivers/rtc/rtc-proc.c
drivers/rtc/rtc-rs5c313.c [new file with mode: 0644]
drivers/rtc/rtc-s3c.c
drivers/rtc/rtc-sa1100.c
drivers/rtc/rtc-sh.c
drivers/rtc/rtc-sysfs.c
drivers/rtc/rtc-test.c
drivers/rtc/rtc-vr41xx.c
drivers/sbus/char/bpp.c
drivers/sbus/char/rtc.c
drivers/sbus/char/vfc_dev.c
drivers/scsi/aic7xxx/aic79xx_osm.h
drivers/scsi/aic7xxx/aic7xxx_osm.h
drivers/scsi/dpt_i2o.c
drivers/scsi/scsi_debug.c
drivers/scsi/sg.c
drivers/scsi/sni_53c710.c
drivers/serial/8250.c
drivers/serial/Kconfig
drivers/serial/cpm_uart/cpm_uart_core.c
drivers/serial/icom.c
drivers/serial/jsm/jsm_neo.c
drivers/serial/jsm/jsm_tty.c
drivers/serial/s3c2410.c
drivers/serial/serial_txx9.c
drivers/spi/Kconfig
drivers/spi/Makefile
drivers/spi/au1550_spi.c [new file with mode: 0644]
drivers/spi/spi.c
drivers/spi/spi_butterfly.c
drivers/spi/spidev.c [new file with mode: 0644]
drivers/telephony/ixj.c
drivers/usb/atm/usbatm.c
drivers/usb/class/cdc-acm.c
drivers/usb/class/usblp.c
drivers/usb/core/hub.c
drivers/usb/core/inode.c
drivers/usb/core/usb.c
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/goku_udc.c
drivers/usb/gadget/net2280.c
drivers/usb/gadget/serial.c
drivers/usb/gadget/zero.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/sl811-hcd.c
drivers/usb/host/u132-hcd.c
drivers/usb/image/mdc800.c
drivers/usb/image/microtek.c
drivers/usb/input/xpad.c
drivers/usb/misc/idmouse.c
drivers/usb/misc/legousbtower.c
drivers/usb/misc/rio500.c
drivers/usb/misc/sisusbvga/sisusb_con.c
drivers/usb/mon/mon_main.c
drivers/usb/serial/usb-serial.c
drivers/usb/storage/usb.h
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/arcfb.c
drivers/video/aty/ati_ids.h
drivers/video/aty/aty128fb.c
drivers/video/aty/atyfb_base.c
drivers/video/aty/mach64_ct.c
drivers/video/aty/radeon_base.c
drivers/video/aty/radeon_pm.c
drivers/video/aty/radeonfb.h
drivers/video/backlight/Kconfig
drivers/video/backlight/Makefile
drivers/video/backlight/cr_bllcd.c [new file with mode: 0644]
drivers/video/cfbcopyarea.c
drivers/video/cfbfillrect.c
drivers/video/cirrusfb.c
drivers/video/console/fbcon.c
drivers/video/console/fonts.c
drivers/video/console/mdacon.c
drivers/video/console/promcon.c
drivers/video/console/sticon.c
drivers/video/console/sticore.c
drivers/video/console/vgacon.c
drivers/video/display/Kconfig [new file with mode: 0644]
drivers/video/display/Makefile [new file with mode: 0644]
drivers/video/display/display-sysfs.c [new file with mode: 0644]
drivers/video/epson1355fb.c
drivers/video/fb_defio.c [new file with mode: 0644]
drivers/video/fb_draw.h [new file with mode: 0644]
drivers/video/fb_sys_fops.c [new file with mode: 0644]
drivers/video/fbmem.c
drivers/video/fbmon.c
drivers/video/fbsysfs.c
drivers/video/hecubafb.c [new file with mode: 0644]
drivers/video/i810/i810.h
drivers/video/intelfb/intelfbhw.c
drivers/video/logo/Kconfig
drivers/video/modedb.c
drivers/video/neofb.c
drivers/video/nvidia/nv_accel.c
drivers/video/nvidia/nv_hw.c
drivers/video/nvidia/nv_i2c.c
drivers/video/nvidia/nv_local.h
drivers/video/nvidia/nv_setup.c
drivers/video/nvidia/nv_type.h
drivers/video/nvidia/nvidia.c
drivers/video/pm2fb.c
drivers/video/pvr2fb.c
drivers/video/pxafb.c
drivers/video/riva/fbdev.c
drivers/video/riva/nv4ref.h [deleted file]
drivers/video/riva/nv_driver.c
drivers/video/riva/riva_hw.c
drivers/video/riva/rivafb-i2c.c
drivers/video/riva/rivafb.h
drivers/video/s3fb.c
drivers/video/savage/savagefb-i2c.c
drivers/video/savage/savagefb.h
drivers/video/savage/savagefb_driver.c
drivers/video/sis/osdef.h
drivers/video/sis/sis.h
drivers/video/sis/sis_main.c
drivers/video/skeletonfb.c
drivers/video/sm501fb.c
drivers/video/svgalib.c
drivers/video/syscopyarea.c [new file with mode: 0644]
drivers/video/sysfillrect.c [new file with mode: 0644]
drivers/video/sysimgblt.c [new file with mode: 0644]
drivers/video/tgafb.c
drivers/video/vermilion/Makefile [new file with mode: 0644]
drivers/video/vermilion/cr_pll.c [new file with mode: 0644]
drivers/video/vermilion/vermilion.c [new file with mode: 0644]
drivers/video/vermilion/vermilion.h [new file with mode: 0644]
drivers/video/vfb.c
drivers/video/vga16fb.c
drivers/video/vgastate.c
drivers/video/xilinxfb.c [new file with mode: 0644]
drivers/w1/masters/Kconfig
drivers/w1/masters/Makefile
drivers/w1/masters/ds1wm.c [new file with mode: 0644]
drivers/w1/w1.c
drivers/w1/w1_int.c
fs/9p/vfs_addr.c
fs/9p/vfs_dentry.c
fs/9p/vfs_dir.c
fs/9p/vfs_file.c
fs/9p/vfs_inode.c
fs/9p/vfs_super.c
fs/Kconfig
fs/attr.c
fs/autofs4/inode.c
fs/autofs4/root.c
fs/bad_inode.c
fs/binfmt_elf.c
fs/binfmt_elf_fdpic.c
fs/binfmt_em86.c
fs/binfmt_misc.c
fs/binfmt_script.c
fs/block_dev.c
fs/buffer.c
fs/cifs/file.c
fs/cifs/readdir.c
fs/compat.c
fs/compat_ioctl.c
fs/dcache.c
fs/devpts/inode.c
fs/dquot.c
fs/ecryptfs/file.c
fs/eventpoll.c
fs/exec.c
fs/exportfs/expfs.c
fs/ext2/dir.c
fs/ext2/ext2.h
fs/ext2/fsync.c
fs/ext2/inode.c
fs/ext2/ioctl.c
fs/ext2/xattr_security.c
fs/ext2/xattr_trusted.c
fs/ext3/dir.c
fs/ext3/inode.c
fs/ext3/ioctl.c
fs/ext3/namei.c
fs/ext3/resize.c
fs/ext3/xattr_security.c
fs/ext3/xattr_trusted.c
fs/ext3/xattr_user.c
fs/ext4/dir.c
fs/ext4/extents.c
fs/ext4/inode.c
fs/ext4/namei.c
fs/ext4/resize.c
fs/ext4/xattr_security.c
fs/ext4/xattr_trusted.c
fs/ext4/xattr_user.c
fs/fat/dir.c
fs/fat/inode.c
fs/fifo.c
fs/file_table.c
fs/filesystems.c
fs/freevxfs/vxfs_bmap.c
fs/freevxfs/vxfs_inode.c
fs/fuse/inode.c
fs/gfs2/glops.c
fs/gfs2/locking/nolock/main.c
fs/gfs2/ops_dentry.c
fs/gfs2/ops_file.c
fs/hfs/btree.c
fs/hfsplus/btree.c
fs/hostfs/hostfs.h
fs/hostfs/hostfs_kern.c
fs/hostfs/hostfs_user.c
fs/inode.c
fs/inotify.c
fs/internal.h
fs/ioctl.c
fs/jbd/commit.c
fs/jbd/journal.c
fs/jbd/revoke.c
fs/jbd/transaction.c
fs/jbd2/commit.c
fs/jbd2/journal.c
fs/jbd2/revoke.c
fs/jbd2/transaction.c
fs/jfs/inode.c
fs/jfs/ioctl.c
fs/jfs/jfs_imap.c
fs/jfs/jfs_inode.c
fs/jfs/jfs_inode.h
fs/jfs/jfs_lock.h
fs/jfs/jfs_logmgr.c
fs/jfs/jfs_txnmgr.c
fs/libfs.c
fs/lockd/clntproc.c
fs/mpage.c
fs/namei.c
fs/namespace.c
fs/ncpfs/file.c
fs/nfs/client.c
fs/nfs/direct.c
fs/nfs/getroot.c
fs/nfs/nfs3proc.c
fs/nfs/nfs4renewd.c
fs/nfs/proc.c
fs/nfs/symlink.c
fs/nfs/write.c
fs/nfsd/nfs4idmap.c
fs/nfsd/nfs4xdr.c
fs/nfsd/nfsfh.c
fs/ntfs/dir.c
fs/ntfs/file.c
fs/ntfs/inode.c
fs/ocfs2/dlm/dlmfs.c
fs/ocfs2/dlmglue.c
fs/ocfs2/inode.c
fs/ocfs2/slot_map.c
fs/ocfs2/vote.c
fs/open.c
fs/partitions/Kconfig
fs/partitions/Makefile
fs/partitions/check.c
fs/partitions/sysv68.c [new file with mode: 0644]
fs/partitions/sysv68.h [new file with mode: 0644]
fs/pipe.c
fs/pnode.c
fs/proc/array.c
fs/proc/base.c
fs/proc/generic.c
fs/proc/inode.c
fs/proc/internal.h
fs/proc/proc_misc.c
fs/proc/proc_sysctl.c
fs/proc/proc_tty.c
fs/proc/task_mmu.c
fs/proc/task_nommu.c
fs/quota.c
fs/ramfs/file-nommu.c
fs/ramfs/inode.c
fs/read_write.c
fs/readdir.c
fs/reiserfs/dir.c
fs/reiserfs/file.c
fs/reiserfs/journal.c
fs/reiserfs/namei.c
fs/reiserfs/procfs.c
fs/reiserfs/resize.c
fs/reiserfs/stree.c
fs/reiserfs/super.c
fs/select.c
fs/smbfs/request.c
fs/smbfs/smbiod.c
fs/smbfs/sock.c
fs/smbfs/symlink.c
fs/splice.c
fs/stat.c
fs/super.c
fs/sync.c
fs/sysv/namei.c
fs/udf/balloc.c
fs/udf/dir.c
fs/udf/directory.c
fs/udf/fsync.c
fs/udf/inode.c
fs/udf/misc.c
fs/udf/namei.c
fs/udf/partition.c
fs/udf/super.c
fs/udf/symlink.c
fs/udf/truncate.c
fs/udf/udf_sb.h
fs/udf/udfdecl.h
fs/ufs/dir.c
fs/utimes.c
fs/xattr.c
fs/xfs/linux-2.6/xfs_lrw.c
include/acpi/acpi_bus.h
include/asm-alpha/atomic.h
include/asm-alpha/kdebug.h [new file with mode: 0644]
include/asm-alpha/local.h
include/asm-alpha/pgtable.h
include/asm-alpha/system.h
include/asm-arm/atomic.h
include/asm-arm/kdebug.h [new file with mode: 0644]
include/asm-arm/kexec.h
include/asm-arm/pgtable-nommu.h
include/asm-arm/pgtable.h
include/asm-arm/system.h
include/asm-arm26/atomic.h
include/asm-arm26/kdebug.h [new file with mode: 0644]
include/asm-arm26/pgtable.h
include/asm-arm26/system.h
include/asm-avr32/kdebug.h
include/asm-avr32/pgtable.h
include/asm-blackfin/system.h
include/asm-cris/kdebug.h [new file with mode: 0644]
include/asm-frv/atomic.h
include/asm-frv/kdebug.h [new file with mode: 0644]
include/asm-frv/pgtable.h
include/asm-frv/semaphore.h
include/asm-frv/system.h
include/asm-generic/atomic.h
include/asm-generic/kdebug.h [new file with mode: 0644]
include/asm-generic/local.h
include/asm-h8300/kdebug.h [new file with mode: 0644]
include/asm-h8300/pgtable.h
include/asm-h8300/system.h
include/asm-i386/atomic.h
include/asm-i386/cmpxchg.h [new file with mode: 0644]
include/asm-i386/elf.h
include/asm-i386/ioctls.h
include/asm-i386/kdebug.h
include/asm-i386/kexec.h
include/asm-i386/local.h
include/asm-i386/pgtable.h
include/asm-i386/serial.h
include/asm-i386/system.h
include/asm-i386/termbits.h
include/asm-i386/termios.h
include/asm-i386/unistd.h
include/asm-ia64/atomic.h
include/asm-ia64/kdebug.h
include/asm-ia64/kexec.h
include/asm-ia64/local.h
include/asm-ia64/pgtable.h
include/asm-m32r/atomic.h
include/asm-m32r/kdebug.h [new file with mode: 0644]
include/asm-m32r/pgtable.h
include/asm-m32r/system.h
include/asm-m68k/atomic.h
include/asm-m68k/kdebug.h [new file with mode: 0644]
include/asm-m68k/pgtable.h
include/asm-m68k/system.h
include/asm-m68knommu/atomic.h
include/asm-m68knommu/kdebug.h [new file with mode: 0644]
include/asm-m68knommu/pgtable.h
include/asm-m68knommu/system.h
include/asm-mips/atomic.h
include/asm-mips/kdebug.h [new file with mode: 0644]
include/asm-mips/kexec.h
include/asm-mips/local.h
include/asm-mips/mach-au1x00/au1550_spi.h [new file with mode: 0644]
include/asm-mips/pgtable.h
include/asm-mips/system.h
include/asm-parisc/atomic.h
include/asm-parisc/kdebug.h [new file with mode: 0644]
include/asm-parisc/local.h
include/asm-parisc/pgtable.h
include/asm-powerpc/atomic.h
include/asm-powerpc/bitops.h
include/asm-powerpc/kdebug.h
include/asm-powerpc/kexec.h
include/asm-powerpc/local.h
include/asm-powerpc/parport.h
include/asm-powerpc/system.h
include/asm-ppc/kdebug.h [new file with mode: 0644]
include/asm-ppc/pgtable.h
include/asm-ppc/system.h
include/asm-s390/kdebug.h
include/asm-s390/kexec.h
include/asm-sh/kdebug.h
include/asm-sh/kexec.h
include/asm-sh/pgtable.h
include/asm-sh/system.h
include/asm-sh64/kdebug.h [new file with mode: 0644]
include/asm-sh64/pgtable.h
include/asm-sh64/system.h
include/asm-sparc/kdebug.h
include/asm-sparc/system.h
include/asm-sparc64/Kbuild
include/asm-sparc64/atomic.h
include/asm-sparc64/const.h [deleted file]
include/asm-sparc64/kdebug.h
include/asm-sparc64/local.h
include/asm-sparc64/lsu.h
include/asm-sparc64/mmu.h
include/asm-sparc64/page.h
include/asm-sparc64/pgtable.h
include/asm-sparc64/pstate.h
include/asm-sparc64/sfafsr.h
include/asm-sparc64/system.h
include/asm-um/cmpxchg.h [new file with mode: 0644]
include/asm-um/kdebug.h [new file with mode: 0644]
include/asm-v850/kdebug.h [new file with mode: 0644]
include/asm-v850/system.h
include/asm-x86_64/Kbuild
include/asm-x86_64/atomic.h
include/asm-x86_64/cmpxchg.h [new file with mode: 0644]
include/asm-x86_64/kdebug.h
include/asm-x86_64/kexec.h
include/asm-x86_64/local.h
include/asm-x86_64/page.h
include/asm-x86_64/pgtable.h
include/asm-x86_64/serial.h
include/asm-x86_64/system.h
include/asm-x86_64/termbits.h
include/asm-x86_64/unistd.h
include/asm-xtensa/atomic.h
include/asm-xtensa/kdebug.h [new file with mode: 0644]
include/asm-xtensa/system.h
include/linux/Kbuild
include/linux/awe_voice.h [deleted file]
include/linux/byteorder/generic.h
include/linux/byteorder/swab.h
include/linux/clockchips.h
include/linux/clocksource.h
include/linux/compat_ioctl.h [deleted file]
include/linux/console.h
include/linux/console_struct.h
include/linux/const.h [moved from include/asm-x86_64/const.h with 70% similarity]
include/linux/cpu.h
include/linux/cyclades.h
include/linux/dcache.h
include/linux/device.h
include/linux/display.h [new file with mode: 0644]
include/linux/ds1wm.h [new file with mode: 0644]
include/linux/efi.h
include/linux/ext3_fs.h
include/linux/fb.h
include/linux/font.h
include/linux/fs.h
include/linux/futex.h
include/linux/init.h
include/linux/init_task.h
include/linux/interrupt.h
include/linux/ioctl32.h [deleted file]
include/linux/ipc.h
include/linux/irq.h
include/linux/isdn/capiutil.h
include/linux/isdn_divertif.h
include/linux/kallsyms.h
include/linux/kdebug.h [new file with mode: 0644]
include/linux/kexec.h
include/linux/kprobes.h
include/linux/list.h
include/linux/loop.h
include/linux/mc146818rtc.h
include/linux/mnt_namespace.h
include/linux/module.h
include/linux/msdos_fs.h
include/linux/nfs_fs_sb.h
include/linux/nsproxy.h
include/linux/pagemap.h
include/linux/parport.h
include/linux/parport_pc.h
include/linux/phantom.h [new file with mode: 0644]
include/linux/pid_namespace.h
include/linux/pnp.h
include/linux/poison.h
include/linux/proc_fs.h
include/linux/quota.h
include/linux/quotaops.h
include/linux/reiserfs_fs_sb.h
include/linux/rtc.h
include/linux/sched.h
include/linux/spi/Kbuild [new file with mode: 0644]
include/linux/spi/spi.h
include/linux/spi/spidev.h [new file with mode: 0644]
include/linux/spinlock_types.h
include/linux/stacktrace.h
include/linux/stat.h
include/linux/svga.h
include/linux/sysdev.h
include/linux/time.h
include/linux/timer.h
include/linux/tty.h
include/linux/utsname.h
include/linux/vmalloc.h
include/linux/vt_kern.h
include/linux/workqueue.h
include/math-emu/extended.h [deleted file]
include/net/sock.h
include/video/mach64.h
include/video/permedia2.h
include/video/tgafb.h
init/Kconfig
init/do_mounts.c
init/main.c
ipc/compat.c
ipc/sem.c
ipc/util.c
kernel/Makefile
kernel/audit.c
kernel/cpuset.c
kernel/die_notifier.c [new file with mode: 0644]
kernel/exit.c
kernel/fork.c
kernel/futex.c
kernel/hrtimer.c
kernel/irq/handle.c
kernel/irq/manage.c
kernel/irq/proc.c
kernel/irq/spurious.c
kernel/itimer.c
kernel/kallsyms.c
kernel/kexec.c
kernel/kmod.c
kernel/kprobes.c
kernel/lockdep.c
kernel/module.c
kernel/nsproxy.c
kernel/params.c
kernel/pid.c
kernel/posix-cpu-timers.c
kernel/posix-timers.c
kernel/power/process.c
kernel/power/snapshot.c
kernel/power/swap.c
kernel/printk.c
kernel/rcutorture.c
kernel/rwsem.c
kernel/sched.c
kernel/signal.c
kernel/softlockup.c
kernel/stop_machine.c
kernel/sys.c
kernel/sysctl.c
kernel/time.c
kernel/time/Makefile
kernel/time/tick-common.c
kernel/time/tick-internal.h
kernel/time/tick-sched.c
kernel/time/timekeeping.c [new file with mode: 0644]
kernel/time/timer_list.c
kernel/time/timer_stats.c
kernel/timer.c
kernel/uid16.c
kernel/utsname.c
lib/Kconfig.debug
lib/fault-inject.c
lib/swiotlb.c
lib/vsprintf.c
mm/filemap.c
mm/mmap.c
mm/nommu.c
mm/page-writeback.c
mm/page_alloc.c
mm/rmap.c
mm/slab.c
mm/sparse.c
mm/vmalloc.c
mm/vmscan.c
net/appletalk/ddp.c
net/ax25/af_ax25.c
net/bluetooth/bnep/core.c
net/bridge/br_stp.c
net/bridge/br_stp_if.c
net/bridge/br_stp_timer.c
net/core/netpoll.c
net/core/pktgen.c
net/ipv4/af_inet.c
net/ipv4/tcp.c
net/ipv4/tcp_output.c
net/ipv6/af_inet6.c
net/ipx/af_ipx.c
net/irda/af_irda.c
net/netlink/af_netlink.c
net/socket.c
net/unix/af_unix.c
net/x25/af_x25.c
scripts/kernel-doc
scripts/mod/modpost.c
security/capability.c
security/commoncap.c
security/selinux/hooks.c
sound/core/control.c
sound/core/hwdep.c
sound/core/oss/mixer_oss.c
sound/core/oss/pcm_oss.c
sound/core/pcm_native.c
sound/core/rawmidi.c
sound/core/seq/oss/seq_oss.c
sound/core/seq/seq_clientmgr.c
sound/core/timer.c
sound/oss/Kconfig
sound/oss/btaudio.c
sound/oss/dmasound/Kconfig
sound/oss/swarm_cs4297a.c
sound/oss/trident.c
sound/oss/via82cxxx_audio.c

diff --git a/CREDITS b/CREDITS
index c5f819bacda3e28322c391af965558dd37ab2dd8..80e241304b8ee0ad5d535ccc96ed0e4db7f5f940 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -661,7 +661,7 @@ N: Kees Cook
 E: kees@outflux.net
 W: http://outflux.net/
 P: 1024D/17063E6D 9FA3 C49C 23C9 D1BC 2E30  1975 1FFF 4BA9 1706 3E6D
-D: Minor updates to SCSI code for the Communications type
+D: Minor updates to SCSI types, added /proc/pid/maps protection
 S: (ask for current address)
 S: USA
 
@@ -2580,10 +2580,9 @@ S: Australia
 
 N: Miguel Ojeda Sandonis
 E: maxextreme@gmail.com
-D: Author: Auxiliary LCD Controller driver (ks0108)
-D: Author: Auxiliary LCD driver (cfag12864b)
-D: Author: Auxiliary LCD framebuffer driver (cfag12864bfb)
-D: Maintainer: Auxiliary display drivers tree (drivers/auxdisplay/*)
+W: http://maxextreme.googlepages.com/
+D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
+D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
 S: C/ Mieses 20, 9-B
 S: Valladolid 47009
 S: Spain
index 9069189e78ef3c7ec272bbeebda291d509b2b66a..afc2867758914e952e9bc33f2cce4751acc70cfc 100644 (file)
@@ -160,6 +160,21 @@ supply of new-lines on your screen is not a renewable resource (think
 25-line terminal screens here), you have more empty lines to put
 comments on.
 
+Do not unnecessarily use braces where a single statement will do.
+
+if (condition)
+       action();
+
+This does not apply if one branch of a conditional statement is a single
+statement. Use braces in both branches.
+
+if (condition) {
+       do_this();
+       do_that();
+} else {
+       otherwise();
+}
+
                3.1:  Spaces
 
 Linux kernel style for use of spaces depends (mostly) on
@@ -625,7 +640,7 @@ language.
 
 There appears to be a common misperception that gcc has a magic "make me
 faster" speedup option called "inline". While the use of inlines can be
-appropriate (for example as a means of replacing macros, see Chapter 11), it
+appropriate (for example as a means of replacing macros, see Chapter 12), it
 very often is not. Abundant use of the inline keyword leads to a much bigger
 kernel, which in turn slows the system as a whole down, due to a bigger
 icache footprint for the CPU and simply because there is less memory
index 10b5cd6c54a03f1cf23a67eb227af37aa92b2edb..6fd1646d3204d8b17555ac436667b5ffe1b9de95 100644 (file)
@@ -43,6 +43,7 @@ pdfdocs: $(PDF)
 
 HTML := $(sort $(patsubst %.xml, %.html, $(BOOKS)))
 htmldocs: $(HTML)
+       $(call build_main_index)
 
 MAN := $(patsubst %.xml, %.9, $(BOOKS))
 mandocs: $(MAN)
@@ -132,10 +133,17 @@ quiet_cmd_db2pdf = PDF      $@
 %.pdf : %.xml
        $(call cmd,db2pdf)
 
+
+main_idx = Documentation/DocBook/index.html
+build_main_index = rm -rf $(main_idx) && \
+                  echo '<h1>Linux Kernel HTML Documentation</h1>' >> $(main_idx) && \
+                  echo '<h2>Kernel Version: $(KERNELVERSION)</h2>' >> $(main_idx) && \
+                  cat $(HTML) >> $(main_idx)
+
 quiet_cmd_db2html = HTML   $@
       cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
                echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
-         Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
+        $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
 
 %.html:        %.xml
        @(which xmlto > /dev/null 2>&1) || \
index b61dfc79e1b87904b4280ad8a9fba47b733e0bef..a2b2b4d187c5c75a9312112fb9fc361159acd20b 100644 (file)
@@ -576,4 +576,67 @@ X!Idrivers/video/console/fonts.c
 !Edrivers/input/ff-core.c
 !Edrivers/input/ff-memless.c
   </chapter>
+
+  <chapter id="spi">
+      <title>Serial Peripheral Interface (SPI)</title>
+  <para>
+       SPI is the "Serial Peripheral Interface", widely used with
+       embedded systems because it is a simple and efficient
+       interface:  basically a multiplexed shift register.
+       Its three signal wires hold a clock (SCK, often in the range
+       of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
+       a "Master In, Slave Out" (MISO) data line.
+       SPI is a full duplex protocol; for each bit shifted out the
+       MOSI line (one per clock) another is shifted in on the MISO line.
+       Those bits are assembled into words of various sizes on the
+       way to and from system memory.
+       An additional chipselect line is usually active-low (nCS);
+       four signals are normally used for each peripheral, plus
+       sometimes an interrupt.
+  </para>
+  <para>
+       The SPI bus facilities listed here provide a generalized
+       interface to declare SPI busses and devices, manage them
+       according to the standard Linux driver model, and perform
+       input/output operations.
+       At this time, only "master" side interfaces are supported,
+       where Linux talks to SPI peripherals and does not implement
+       such a peripheral itself.
+       (Interfaces to support implementing SPI slaves would
+       necessarily look different.)
+  </para>
+  <para>
+       The programming interface is structured around two kinds of driver,
+       and two kinds of device.
+       A "Controller Driver" abstracts the controller hardware, which may
+       be as simple as a set of GPIO pins or as complex as a pair of FIFOs
+       connected to dual DMA engines on the other side of the SPI shift
+       register (maximizing throughput).  Such drivers bridge between
+       whatever bus they sit on (often the platform bus) and SPI, and
+       expose the SPI side of their device as a
+       <structname>struct spi_master</structname>.
+       SPI devices are children of that master, represented as a
+       <structname>struct spi_device</structname> and manufactured from
+       <structname>struct spi_board_info</structname> descriptors which
+       are usually provided by board-specific initialization code.
+       A <structname>struct spi_driver</structname> is called a
+       "Protocol Driver", and is bound to a spi_device using normal
+       driver model calls.
+  </para>
+  <para>
+       The I/O model is a set of queued messages.  Protocol drivers
+       submit one or more <structname>struct spi_message</structname>
+       objects, which are processed and completed asynchronously.
+       (There are synchronous wrappers, however.)  Messages are
+       built from one or more <structname>struct spi_transfer</structname>
+       objects, each of which wraps a full duplex SPI transfer.
+       A variety of protocol tweaking options are needed, because
+       different chips adopt very different policies for how they
+       use the bits transferred with SPI.
+  </para>
+!Iinclude/linux/spi/spi.h
+!Fdrivers/spi/spi.c spi_register_board_info
+!Edrivers/spi/spi.c
+  </chapter>
+
 </book>
index 3ff39bafc00e1be692e6f351a6516fe692ac002d..94f21361e0edaa2778cfa4e8b1e4b5ab2cc0d1cf 100644 (file)
   <chapter id="usage">
        <title>Usage</title>
        <para>
-               This chapter provides examples how to use the library.
+               This chapter provides examples of how to use the library.
        </para>
        <sect1>
                <title>Initializing</title>
                <para>
-                       The init function init_rs returns a pointer to a
+                       The init function init_rs returns a pointer to an
                        rs decoder structure, which holds the necessary
                        information for encoding, decoding and error correction
                        with the given polynomial. It either uses an existing
 static struct rs_control *rs_decoder;
 
 /* Symbolsize is 10 (bits)
- * Primitve polynomial is x^10+x^3+1
+ * Primitive polynomial is x^10+x^3+1
  * first consecutive root is 0
- * primitve element to generate roots = 1
- * generator polinomial degree (number of roots) = 6
+ * primitive element to generate roots = 1
+ * generator polynomial degree (number of roots) = 6
  */
 rs_decoder = init_rs (10, 0x409, 0, 1, 6);
                </programlisting>
@@ -116,12 +116,12 @@ rs_decoder = init_rs (10, 0x409, 0, 1, 6);
                </para>
                <para>
                        The expanded data can be inverted on the fly by
-                       providing a non zero inversion mask. The expanded data is
+                       providing a non-zero inversion mask. The expanded data is
                        XOR'ed with the mask. This is used e.g. for FLASH
                        ECC, where the all 0xFF is inverted to an all 0x00.
                        The Reed-Solomon code for all 0x00 is all 0x00. The
                        code is inverted before storing to FLASH so it is 0xFF
-                       too. This prevent's that reading from an erased FLASH
+                       too. This prevents that reading from an erased FLASH
                        results in ECC errors.
                </para>
                <para>
@@ -273,7 +273,7 @@ free_rs(rs_decoder);
                May be used under the terms of the GNU General Public License (GPL)
        </programlisting>
        <para>
-               The wrapper functions and interfaces are written by Thomas Gleixner
+               The wrapper functions and interfaces are written by Thomas Gleixner.
        </para>
        <para>
                Many users have provided bugfixes, improvements and helping hands for testing.
index 58bead05eabb057fb777bdd5fe7a56b44f35b0e0..d7e26427e426929a35b339c35799c476c8f3573b 100644 (file)
@@ -87,6 +87,21 @@ Clarity:     It helps if anyone can see how to fix the driver. It helps
                driver that intentionally obfuscates how the hardware works
                it will go in the bitbucket.
 
+PM support:    Since Linux is used on many portable and desktop systems, your
+               driver is likely to be used on such a system and therefore it
+               should support basic power management by implementing, if
+               necessary, the .suspend and .resume methods used during the
+               system-wide suspend and resume transitions.  You should verify
+               that your driver correctly handles the suspend and resume, but
+               if you are unable to ensure that, please at least define the
+               .suspend method returning the -ENOSYS ("Function not
+               implemented") error.  You should also try to make sure that your
+               driver uses as little power as possible when it's not doing
+               anything.  For the driver testing instructions see
+               Documentation/power/drivers-testing.txt and for a relatively
+               complete overview of the power management issues related to
+               drivers see Documentation/power/devices.txt .
+
 Control:       In general if there is active maintainance of a driver by
                the author then patches will be redirected to them unless
                they are totally obvious and without need of checking.
index e9126e794ed7c04c19c42fb318dd36295d8806da..71acc28ed0d1b8b6b3692362bcf9d6ef4d7fcd02 100644 (file)
@@ -61,8 +61,6 @@ __u64 stime, utime;
 #define MAX_MSG_SIZE   1024
 /* Maximum number of cpus expected to be specified in a cpumask */
 #define MAX_CPUS       32
-/* Maximum length of pathname to log file */
-#define MAX_FILENAME   256
 
 struct msgtemplate {
        struct nlmsghdr n;
@@ -72,6 +70,16 @@ struct msgtemplate {
 
 char cpumask[100+6*MAX_CPUS];
 
+static void usage(void)
+{
+       fprintf(stderr, "getdelays [-dilv] [-w logfile] [-r bufsize] "
+                       "[-m cpumask] [-t tgid] [-p pid]\n");
+       fprintf(stderr, "  -d: print delayacct stats\n");
+       fprintf(stderr, "  -i: print IO accounting (works only with -p)\n");
+       fprintf(stderr, "  -l: listen forever\n");
+       fprintf(stderr, "  -v: debug on\n");
+}
+
 /*
  * Create a raw netlink socket and bind
  */
@@ -221,13 +229,13 @@ int main(int argc, char *argv[])
        int count = 0;
        int write_file = 0;
        int maskset = 0;
-       char logfile[128];
+       char *logfile = NULL;
        int loop = 0;
 
        struct msgtemplate msg;
 
        while (1) {
-               c = getopt(argc, argv, "diw:r:m:t:p:v:l");
+               c = getopt(argc, argv, "diw:r:m:t:p:vl");
                if (c < 0)
                        break;
 
@@ -241,7 +249,7 @@ int main(int argc, char *argv[])
                        print_io_accounting = 1;
                        break;
                case 'w':
-                       strncpy(logfile, optarg, MAX_FILENAME);
+                       logfile = strdup(optarg);
                        printf("write to file %s\n", logfile);
                        write_file = 1;
                        break;
@@ -277,7 +285,7 @@ int main(int argc, char *argv[])
                        loop = 1;
                        break;
                default:
-                       printf("Unknown option %d\n", c);
+                       usage();
                        exit(-1);
                }
        }
index f74affe5c8297f58b4d36dfac566e7411899f2c5..e65736c6b8bc890448c81de9ade727cee9f43ca4 100644 (file)
@@ -22,14 +22,21 @@ This driver is known to work with the following cards:
        * SA E200i
        * SA E500
 
-If nodes are not already created in the /dev/cciss directory, run as root:
+Detecting drive failures:
+-------------------------
 
-# cd /dev
-# ./MAKEDEV cciss
+To get the status of logical volumes and to detect physical drive
+failures, you can use the cciss_vol_status program found here:
+http://cciss.sourceforge.net/#cciss_utils
 
 Device Naming:
 --------------
 
+If nodes are not already created in the /dev/cciss directory, run as root:
+
+# cd /dev
+# ./MAKEDEV cciss
+
 You need some entries in /dev for the cciss device.  The MAKEDEV script
 can make device nodes for you automatically.  Currently the device setup
 is as follows:
diff --git a/Documentation/fb/deferred_io.txt b/Documentation/fb/deferred_io.txt
new file mode 100644 (file)
index 0000000..73cf9fb
--- /dev/null
@@ -0,0 +1,75 @@
+Deferred IO
+-----------
+
+Deferred IO is a way to delay and repurpose IO. It uses host memory as a
+buffer and the MMU pagefault as a pretrigger for when to perform the device
+IO. The following example may be a useful explaination of how one such setup
+works:
+
+- userspace app like Xfbdev mmaps framebuffer
+- deferred IO and driver sets up nopage and page_mkwrite handlers
+- userspace app tries to write to mmaped vaddress
+- we get pagefault and reach nopage handler
+- nopage handler finds and returns physical page
+- we get page_mkwrite where we add this page to a list
+- schedule a workqueue task to be run after a delay
+- app continues writing to that page with no additional cost. this is
+  the key benefit.
+- the workqueue task comes in and mkcleans the pages on the list, then
+ completes the work associated with updating the framebuffer. this is
+  the real work talking to the device.
+- app tries to write to the address (that has now been mkcleaned)
+- get pagefault and the above sequence occurs again
+
+As can be seen from above, one benefit is roughly to allow bursty framebuffer
+writes to occur at minimum cost. Then after some time when hopefully things
+have gone quiet, we go and really update the framebuffer which would be
+a relatively more expensive operation.
+
+For some types of nonvolatile high latency displays, the desired image is
+the final image rather than the intermediate stages which is why it's okay
+to not update for each write that is occuring.
+
+It may be the case that this is useful in other scenarios as well. Paul Mundt
+has mentioned a case where it is beneficial to use the page count to decide
+whether to coalesce and issue SG DMA or to do memory bursts.
+
+Another one may be if one has a device framebuffer that is in an usual format,
+say diagonally shifting RGB, this may then be a mechanism for you to allow
+apps to pretend to have a normal framebuffer but reswizzle for the device
+framebuffer at vsync time based on the touched pagelist.
+
+How to use it: (for applications)
+---------------------------------
+No changes needed. mmap the framebuffer like normal and just use it.
+
+How to use it: (for fbdev drivers)
+----------------------------------
+The following example may be helpful.
+
+1. Setup your structure. Eg:
+
+static struct fb_deferred_io hecubafb_defio = {
+       .delay          = HZ,
+       .deferred_io    = hecubafb_dpy_deferred_io,
+};
+
+The delay is the minimum delay between when the page_mkwrite trigger occurs
+and when the deferred_io callback is called. The deferred_io callback is
+explained below.
+
+2. Setup your deferred IO callback. Eg:
+static void hecubafb_dpy_deferred_io(struct fb_info *info,
+                               struct list_head *pagelist)
+
+The deferred_io callback is where you would perform all your IO to the display
+device. You receive the pagelist which is the list of pages that were written
+to during the delay. You must not modify this list. This callback is called
+from a workqueue.
+
+3. Call init
+       info->fbdefio = &hecubafb_defio;
+       fb_deferred_io_init(info);
+
+4. Call cleanup
+       fb_deferred_io_cleanup(info);
index 8a04c0da0c91b46c2aed8d311b0407365273db7c..2c97770bdbaa01b9fef902def986c1da818df12c 100644 (file)
@@ -35,10 +35,12 @@ Supported Features
        * suspend/resume support
        * DPMS support
 
-Text mode is supported even in higher resolutions, but there is limitation
-to lower pixclocks (maximum between 50-60 MHz, depending on specific hardware).
-This limitation is not enforced by driver. Text mode supports 8bit wide fonts
-only (hardware limitation) and 16bit tall fonts (driver limitation).
+Text mode is supported even in higher resolutions, but there is limitation to
+lower pixclocks (maximum usually between 50-60 MHz, depending on specific
+hardware, i get best results from plain S3 Trio32 card - about 75 MHz). This
+limitation is not enforced by driver. Text mode supports 8bit wide fonts only
+(hardware limitation) and 16bit tall fonts (driver limitation). Text mode
+support is broken on S3 Trio64 V2/DX.
 
 There are two 4 bpp modes. First mode (selected if nonstd == 0) is mode with
 packed pixels, high nibble first. Second mode (selected if nonstd == 1) is mode
@@ -73,6 +75,8 @@ Known bugs
 ==========
 
        * cursor disable in text mode doesn't work
+       * text mode broken on S3 Trio64 V2/DX
+
 
 --
 Ondrej Zajicek <santiago@crfreenet.org>
index 5f96cb33743e44d6a3f1ea1ba055150e9e88fb47..2291ff620d93e2e220823dd3da8094b60ef709fa 100644 (file)
@@ -6,6 +6,14 @@ be removed from this file.
 
 ---------------------------
 
+What:  MXSER
+When:  December 2007
+Why:   Old mxser driver is obsoleted by the mxser_new. Give it some time yet
+       and remove it.
+Who:   Jiri Slaby <jirislaby@gmail.com>
+
+---------------------------
+
 What:  V4L2 VIDIOC_G_MPEGCOMP and VIDIOC_S_MPEGCOMP
 When:  October 2007
 Why:   Broken attempt to set MPEG compression parameters. These ioctls are
@@ -117,18 +125,6 @@ Who:   Adrian Bunk <bunk@stusta.de>
 
 ---------------------------
 
-What:  Usage of invalid timevals in setitimer
-When:  March 2007
-Why:   POSIX requires to validate timevals in the setitimer call. This
-       was never done by Linux. The invalid (e.g. negative timevals) were
-       silently converted to more or less random timeouts and intervals.
-       Until the removal a per boot limited number of warnings is printed
-       and the timevals are sanitized.
-
-Who:   Thomas Gleixner <tglx@linutronix.de>
-
----------------------------
-
 What:  Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports
        (temporary transition config option provided until then)
        The transition config option will also be removed at the same time.
@@ -156,7 +152,7 @@ Who:        Greg Kroah-Hartman <gregkh@suse.de>
 ---------------------------
 
 What:  Interrupt only SA_* flags
-When:  Januar 2007
+When:  September 2007
 Why:   The interrupt related SA_* flags are replaced by IRQF_* to move them
        out of the signal namespace.
 
@@ -323,3 +319,11 @@ Why:       Obsolete. The new i2c-gpio driver replaces all hardware-specific
 Who:   Jean Delvare <khali@linux-fr.org>
 
 ---------------------------
+
+What:  drivers depending on OSS_OBSOLETE
+When:  options in 2.6.23, code in 2.6.25
+Why:   obsolete OSS drivers
+Who:   Adrian Bunk <bunk@stusta.de>
+
+---------------------------
+
index 28bfea75bcf26151ac5594d131cbbc71d0dc93d0..59c14159cc47ddce04a19ae48d559fabedcf6902 100644 (file)
@@ -15,6 +15,7 @@ prototypes:
        int (*d_delete)(struct dentry *);
        void (*d_release)(struct dentry *);
        void (*d_iput)(struct dentry *, struct inode *);
+       char *(*d_dname)((struct dentry *dentry, char *buffer, int buflen);
 
 locking rules:
        none have BKL
@@ -25,6 +26,7 @@ d_compare:    no              yes             no              no
 d_delete:      yes             no              yes             no
 d_release:     no              no              no              yes
 d_iput:                no              no              no              yes
+d_dname:       no              no              no              no
 
 --------------------------- inode_operations --------------------------- 
 prototypes:
index bae128663748ebcac0df61ab910827bfaf932f96..26ebde77e821cecf11062032dfec702513eecd66 100644 (file)
@@ -29,7 +29,13 @@ errors=continue              Keep going on a filesystem error.
 errors=remount-ro      Default. Remount the filesystem read-only on an error.
 errors=panic           Panic and halt the machine if an error occurs.
 
-Please send bugs, comments, cards and letters to shaggy@austin.ibm.com.
+uid=value      Override on-disk uid with specified value
+gid=value      Override on-disk gid with specified value
+umask=value    Override on-disk umask with specified octal value.  For
+               directories, the execute bit will be set if the corresponding
+               read bit is set.
+
+Please send bugs, comments, cards and letters to shaggy@linux.vnet.ibm.com.
 
 The JFS mailing list can be subscribed to by using the link labeled
 "Mail list Subscribe" at our web page http://jfs.sourceforge.net/
index 3f4b226572e7fd39cea5cd6547dd80a2627f928b..4f3e84c520a5cd844f602ad4e2b8c18c02c48aec 100644 (file)
@@ -1138,6 +1138,13 @@ determine whether or not they are still functioning properly.
 Because the NMI watchdog shares registers with oprofile, by disabling the NMI
 watchdog, oprofile may have more registers to utilize.
 
+maps_protect
+------------
+
+Enables/Disables the protection of the per-process proc entries "maps" and
+"smaps".  When enabled, the contents of these files are visible only to
+readers that are allowed to ptrace() the given process.
+
 
 2.4 /proc/sys/vm - The virtual memory subsystem
 -----------------------------------------------
index 069cb10943001e92da62cd24c30000af5e50a930..fcc123ffa2523d2dc3d932ddb63c240cf9052840 100644 (file)
@@ -57,6 +57,13 @@ nonumtail=<bool> -- When creating 8.3 aliases, normally the alias will
                  currently exist in the directory, 'longfile.txt' will
                  be the short alias instead of 'longfi~1.txt'. 
                   
+usefree       -- Use the "free clusters" value stored on FSINFO. It'll
+                 be used to determine number of free clusters without
+                 scanning disk. But it's not used by default, because
+                 recent Windows don't update it correctly in some
+                 case. If you are sure the "free clusters" on FSINFO is
+                 correct, by this option you can avoid scanning disk.
+
 quiet         -- Stops printing certain warning messages.
 
 check=s|r|n   -- Case sensitivity checking setting.
index ea271f2d395400b82cd8023db74fed76d878ce06..a47cc819f37bb7f5535afbf2bf720766ae51dfdd 100644 (file)
@@ -827,7 +827,7 @@ This describes how a filesystem can overload the standard dentry
 operations. Dentries and the dcache are the domain of the VFS and the
 individual filesystem implementations. Device drivers have no business
 here. These methods may be set to NULL, as they are either optional or
-the VFS uses a default. As of kernel 2.6.13, the following members are
+the VFS uses a default. As of kernel 2.6.22, the following members are
 defined:
 
 struct dentry_operations {
@@ -837,6 +837,7 @@ struct dentry_operations {
        int (*d_delete)(struct dentry *);
        void (*d_release)(struct dentry *);
        void (*d_iput)(struct dentry *, struct inode *);
+       char *(*d_dname)(struct dentry *, char *, int);
 };
 
   d_revalidate: called when the VFS needs to revalidate a dentry. This
@@ -859,6 +860,26 @@ struct dentry_operations {
        VFS calls iput(). If you define this method, you must call
        iput() yourself
 
+  d_dname: called when the pathname of a dentry should be generated.
+       Usefull for some pseudo filesystems (sockfs, pipefs, ...) to delay
+       pathname generation. (Instead of doing it when dentry is created,
+       its done only when the path is needed.). Real filesystems probably
+       dont want to use it, because their dentries are present in global
+       dcache hash, so their hash should be an invariant. As no lock is
+       held, d_dname() should not try to modify the dentry itself, unless
+       appropriate SMP safety is used. CAUTION : d_path() logic is quite
+       tricky. The correct way to return for example "Hello" is to put it
+       at the end of the buffer, and returns a pointer to the first char.
+       dynamic_dname() helper function is provided to take care of this.
+
+Example :
+
+static char *pipefs_dname(struct dentry *dent, char *buffer, int buflen)
+{
+       return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]",
+                               dentry->d_inode->i_ino);
+}
+
 Each dentry has a pointer to its parent dentry, as well as a hash list
 of child dentries. Child dentries are basically like files in a
 directory.
index 8f750c0efed5ed0adc5329ff5bd6a5e17d5c9113..3de7d379cf077d3c933c931133b5f17132d1fa3a 100644 (file)
@@ -138,7 +138,8 @@ Code        Seq#    Include File            Comments
 'm'    00-1F   net/irda/irmod.h        conflict!
 'n'    00-7F   linux/ncp_fs.h
 'n'    E0-FF   video/matrox.h          matroxfb
-'p'    00-3F   linux/mc146818rtc.h
+'p'    00-0F   linux/phantom.h         conflict! (OpenHaptics needs this)
+'p'    00-3F   linux/mc146818rtc.h     conflict!
 'p'    40-7F   linux/nvram.h
 'p'    80-9F                           user-space parport
                                        <mailto:tim@cyberelk.net>
index 38d7db3262c7e85f7e9d327f4ed2a30eee47ba1c..6b8ad06846c449550212b08974f0e6c9de50786a 100644 (file)
@@ -496,6 +496,30 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format: <area>[,<node>]
                        See also Documentation/networking/decnet.txt.
 
+       default_blu=    [VT]
+                       Format: <blue0>,<blue1>,<blue2>,...,<blue15>
+                       Change the default blue palette of the console.
+                       This is a 16-member array composed of values
+                       ranging from 0-255.
+
+       default_grn=    [VT]
+                       Format: <green0>,<green1>,<green2>,...,<green15>
+                       Change the default green palette of the console.
+                       This is a 16-member array composed of values
+                       ranging from 0-255.
+
+       default_red=    [VT]
+                       Format: <red0>,<red1>,<red2>,...,<red15>
+                       Change the default red palette of the console.
+                       This is a 16-member array composed of values
+                       ranging from 0-255.
+
+       default_utf8=   [VT]
+                       Format=<0|1>
+                       Set system-wide default UTF-8 mode for all tty's.
+                       Default is 0 and by setting to 1, it enables UTF-8
+                       mode for all newly opened or allocated terminals.
+
        dhash_entries=  [KNL]
                        Set number of hash buckets for dentry cache.
 
@@ -816,6 +840,11 @@ and is between 256 and 4096 characters. It is defined in the file
        lasi=           [HW,SCSI] PARISC LASI driver for the 53c700 chip
                        Format: addr:<io>,irq:<irq>
 
+       legacy_serial.force [HW,IA-32,X86-64]
+                       Probe for COM ports at legacy addresses even
+                       if PNPBIOS or ACPI should describe them.  This
+                       is for working around firmware defects.
+
        llsc*=          [IA64] See function print_params() in
                        arch/ia64/sn/kernel/llsc4.c.
 
@@ -1578,6 +1607,17 @@ and is between 256 and 4096 characters. It is defined in the file
        smp-alt-once    [IA-32,SMP] On a hotplug CPU system, only
                        attempt to substitute SMP alternatives once at boot.
 
+       smsc-ircc2.nopnp        [HW] Don't use PNP to discover SMC devices
+       smsc-ircc2.ircc_cfg=    [HW] Device configuration I/O port
+       smsc-ircc2.ircc_sir=    [HW] SIR base I/O port
+       smsc-ircc2.ircc_fir=    [HW] FIR base I/O port
+       smsc-ircc2.ircc_irq=    [HW] IRQ line
+       smsc-ircc2.ircc_dma=    [HW] DMA channel
+       smsc-ircc2.ircc_transceiver= [HW] Transceiver type:
+                               0: Toshiba Satellite 1800 (GP data pin select)
+                               1: Fast pin select (default)
+                               2: ATC IRMode
+
        snd-ad1816a=    [HW,ALSA]
 
        snd-ad1848=     [HW,ALSA]
index d71fafffce90de81cba916c5d98dae7db5e9eb63..da5404ab75691c58e3d69c89ea1a3f8ba1fd993b 100644 (file)
@@ -14,6 +14,7 @@ CONTENTS
 8. Kprobes Example
 9. Jprobes Example
 10. Kretprobes Example
+Appendix A: The kprobes debugfs interface
 
 1. Concepts: Kprobes, Jprobes, Return Probes
 
@@ -349,9 +350,12 @@ for instrumentation and error reporting.)
 
 If the number of times a function is called does not match the number
 of times it returns, registering a return probe on that function may
-produce undesirable results.  We have the do_exit() case covered.
-do_execve() and do_fork() are not an issue.  We're unaware of other
-specific cases where this could be a problem.
+produce undesirable results. In such a case, a line:
+kretprobe BUG!: Processing kretprobe d000000000041aa8 @ c00000000004f48c
+gets printed. With this information, one will be able to correlate the
+exact instance of the kretprobe that caused the problem. We have the
+do_exit() case covered. do_execve() and do_fork() are not an issue.
+We're unaware of other specific cases where this could be a problem.
 
 If, upon entry to or exit from a function, the CPU is running on
 a stack other than that of the current task, registering a return
@@ -614,3 +618,27 @@ http://www-106.ibm.com/developerworks/library/l-kprobes.html?ca=dgr-lnxw42Kprobe
 http://www.redhat.com/magazine/005mar05/features/kprobes/
 http://www-users.cs.umn.edu/~boutcher/kprobes/
 http://www.linuxsymposium.org/2006/linuxsymposium_procv2.pdf (pages 101-115)
+
+
+Appendix A: The kprobes debugfs interface
+
+With recent kernels (> 2.6.20) the list of registered kprobes is visible
+under the /debug/kprobes/ directory (assuming debugfs is mounted at /debug).
+
+/debug/kprobes/list: Lists all registered probes on the system
+
+c015d71a  k  vfs_read+0x0
+c011a316  j  do_fork+0x0
+c03dedc5  r  tcp_v4_rcv+0x0
+
+The first column provides the kernel address where the probe is inserted.
+The second column identifies the type of probe (k - kprobe, r - kretprobe
+and j - jprobe), while the third column specifies the symbol+offset of
+the probe. If the probed function belongs to a module, the module name
+is also specified.
+
+/debug/kprobes/enabled: Turn kprobes ON/OFF
+
+Provides a knob to globally turn registered kprobes ON or OFF. By default,
+all kprobes are enabled. By echoing "0" to this file, all registered probes
+will be disarmed, till such time a "1" is echoed to this file.
index 6f639e3473af550bbf384a506fcb9074a60dca2b..eeedee11c8c2bd44c16011b804166a78c04955bf 100644 (file)
@@ -33,7 +33,7 @@ or anything. Simply install all the files included in this document, and
 laptop mode will automatically be started when you're on battery. For
 your convenience, a tarball containing an installer can be downloaded at:
 
-http://www.xs4all.nl/~bsamwel/laptop_mode/tools/
+http://www.samwel.tk/laptop_mode/laptop_mode/
 
 To configure laptop mode, you need to edit the configuration file, which is
 located in /etc/default/laptop-mode on Debian-based systems, or in
index ea55ea8bc8ef0c32de234e612adf742d72214167..7d5b60dea551daacec4cc81006678957a38f1795 100644 (file)
@@ -234,9 +234,6 @@ characters, each representing a particular tainted value.
   6: 'B' if a page-release function has found a bad page reference or
      some unexpected page flags.
 
-  7: 'U' if a user specifically requested that the Tainted flag be set,
-     ' ' otherwise.
-
   7: 'U' if a user or user application specifically requested that the
      Tainted flag be set, ' ' otherwise.
 
diff --git a/Documentation/power/basic-pm-debugging.txt b/Documentation/power/basic-pm-debugging.txt
new file mode 100644 (file)
index 0000000..1a85e2b
--- /dev/null
@@ -0,0 +1,106 @@
+Debugging suspend and resume
+       (C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL
+
+1. Testing suspend to disk (STD)
+
+To verify that the STD works, you can try to suspend in the "reboot" mode:
+
+# echo reboot > /sys/power/disk
+# echo disk > /sys/power/state
+
+and the system should suspend, reboot, resume and get back to the command prompt
+where you have started the transition.  If that happens, the STD is most likely
+to work correctly, but you need to repeat the test at least a couple of times in
+a row for confidence.  This is necessary, because some problems only show up on
+a second attempt at suspending and resuming the system.  You should also test
+the "platform" and "shutdown" modes of suspend:
+
+# echo platform > /sys/power/disk
+# echo disk > /sys/power/state
+
+or
+
+# echo shutdown > /sys/power/disk
+# echo disk > /sys/power/state
+
+in which cases you will have to press the power button to make the system
+resume.  If that does not work, you will need to identify what goes wrong.
+
+a) Test mode of STD
+
+To verify if there are any drivers that cause problems you can run the STD
+in the test mode:
+
+# echo test > /sys/power/disk
+# echo disk > /sys/power/state
+
+in which case the system should freeze tasks, suspend devices, disable nonboot
+CPUs (if any), wait for 5 seconds, enable nonboot CPUs, resume devices, thaw
+tasks and return to your command prompt.  If that fails, most likely there is
+a driver that fails to either suspend or resume (in the latter case the system
+may hang or be unstable after the test, so please take that into consideration).
+To find this driver, you can carry out a binary search according to the rules:
+- if the test fails, unload a half of the drivers currently loaded and repeat
+(that would probably involve rebooting the system, so always note what drivers
+have been loaded before the test),
+- if the test succeeds, load a half of the drivers you have unloaded most
+recently and repeat.
+
+Once you have found the failing driver (there can be more than just one of
+them), you have to unload it every time before the STD transition.  In that case
+please make sure to report the problem with the driver.
+
+It is also possible that a cycle can still fail after you have unloaded
+all modules. In that case, you would want to look in your kernel configuration
+for the drivers that can be compiled as modules (testing again with them as
+modules), and possibly also try boot time options such as "noapic" or "noacpi".
+
+b) Testing minimal configuration
+
+If the test mode of STD works, you can boot the system with "init=/bin/bash"
+and attempt to suspend in the "reboot", "shutdown" and "platform" modes.  If
+that does not work, there probably is a problem with a driver statically
+compiled into the kernel and you can try to compile more drivers as modules,
+so that they can be tested individually.  Otherwise, there is a problem with a
+modular driver and you can find it by loading a half of the modules you normally
+use and binary searching in accordance with the algorithm:
+- if there are n modules loaded and the attempt to suspend and resume fails,
+unload n/2 of the modules and try again (that would probably involve rebooting
+the system),
+- if there are n modules loaded and the attempt to suspend and resume succeeds,
+load n/2 modules more and try again.
+
+Again, if you find the offending module(s), it(they) must be unloaded every time
+before the STD transition, and please report the problem with it(them).
+
+c) Advanced debugging
+
+In case the STD does not work on your system even in the minimal configuration
+and compiling more drivers as modules is not practical or some modules cannot
+be unloaded, you can use one of the more advanced debugging techniques to find
+the problem.  First, if there is a serial port in your box, you can set the
+CONFIG_DISABLE_CONSOLE_SUSPEND kernel configuration option and try to log kernel
+messages using the serial console.  This may provide you with some information
+about the reasons of the suspend (resume) failure.  Alternatively, it may be
+possible to use a FireWire port for debugging with firescope
+(ftp://ftp.firstfloor.org/pub/ak/firescope/).  On i386 it is also possible to
+use the PM_TRACE mechanism documented in Documentation/s2ram.txt .
+
+2. Testing suspend to RAM (STR)
+
+To verify that the STR works, it is generally more convenient to use the s2ram
+tool available from http://suspend.sf.net and documented at
+http://en.opensuse.org/s2ram .  However, before doing that it is recommended to
+carry out the procedure described in section 1.
+
+Assume you have resolved the problems with the STD and you have found some
+failing drivers.  These drivers are also likely to fail during the STR or
+during the resume, so it is better to unload them every time before the STR
+transition.  Now, you can follow the instructions at
+http://en.opensuse.org/s2ram to test the system, but if it does not work
+"out of the box", you may need to boot it with "init=/bin/bash" and test
+s2ram in the minimal configuration.  In that case, you may be able to search
+for failing drivers by following the procedure analogous to the one described in
+1b).  If you find some failing drivers, you will have to unload them every time
+before the STR transition (ie. before you run s2ram), and please report the
+problems with them.
diff --git a/Documentation/power/drivers-testing.txt b/Documentation/power/drivers-testing.txt
new file mode 100644 (file)
index 0000000..33016c2
--- /dev/null
@@ -0,0 +1,42 @@
+Testing suspend and resume support in device drivers
+       (C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL
+
+1. Preparing the test system
+
+Unfortunately, to effectively test the support for the system-wide suspend and
+resume transitions in a driver, it is necessary to suspend and resume a fully
+functional system with this driver loaded.  Moreover, that should be done
+several times, preferably several times in a row, and separately for the suspend
+to disk (STD) and the suspend to RAM (STR) transitions, because each of these
+cases involves different ordering of operations and different interactions with
+the machine's BIOS.
+
+Of course, for this purpose the test system has to be known to suspend and
+resume without the driver being tested.  Thus, if possible, you should first
+resolve all suspend/resume-related problems in the test system before you start
+testing the new driver.  Please see Documents/power/basic-pm-debugging.txt for
+more information about the debugging of suspend/resume functionality.
+
+2. Testing the driver
+
+Once you have resolved the suspend/resume-related problems with your test system
+without the new driver, you are ready to test it:
+
+a) Build the driver as a module, load it and try the STD in the test mode (see:
+Documents/power/basic-pm-debugging.txt, 1a)).
+
+b) Load the driver and attempt to suspend to disk in the "reboot", "shutdown"
+and "platform" modes (see: Documents/power/basic-pm-debugging.txt, 1).
+
+c) Compile the driver directly into the kernel and try the STD in the test mode.
+
+d) Attempt to suspend to disk with the driver compiled directly into the kernel
+in the "reboot", "shutdown" and "platform" modes.
+
+e) Attempt to suspend to RAM using the s2ram tool with the driver loaded (see:
+Documents/power/basic-pm-debugging.txt, 2).  As far as the STR tests are
+concerned, it should not matter whether or not the driver is built as a module.
+
+Each of the above tests should be repeated several times and the STD tests
+should be mixed with the STR tests.  If any of them fails, the driver cannot be
+regarded as suspend/resume-safe.
index 1ef6bb88cd0003ad05a0d813533689e130a72002..7c701b88d6d59dd4e1068a8ad22a4321704737a0 100644 (file)
@@ -147,7 +147,7 @@ RTC class framework, but can't be supported by the older driver.
 
     *  RTC_AIE_ON, RTC_AIE_OFF, RTC_ALM_SET, RTC_ALM_READ ... when the RTC
        is connected to an IRQ line, it can often issue an alarm IRQ up to
-       24 hours in the future.
+       24 hours in the future.  (Use RTC_WKALM_* by preference.)
 
     *  RTC_WKALM_SET, RTC_WKALM_RD ... RTCs that can issue alarms beyond
        the next 24 hours use a slightly more powerful API, which supports
@@ -175,10 +175,7 @@ driver returns ENOIOCTLCMD.  Some common examples:
        called with appropriate values.
 
     *  RTC_ALM_SET, RTC_ALM_READ, RTC_WKALM_SET, RTC_WKALM_RD: the
-       set_alarm/read_alarm functions will be called.  To differentiate
-       between the ALM and WKALM, check the larger fields of the rtc_wkalrm
-       struct (like tm_year).  These will be set to -1 when using ALM and
-       will be set to proper values when using WKALM.
+       set_alarm/read_alarm functions will be called.
 
     *  RTC_IRQP_SET, RTC_IRQP_READ: the irq_set_freq function will be called
        to set the frequency while the framework will handle the read for you
index ecc7c9eb9f2938ee00b38aa30863050c3ac01c0d..795fbb48ffa7f080c88ccfd39e5afc7827183d3d 100644 (file)
@@ -8,7 +8,7 @@ What is SPI?
 The "Serial Peripheral Interface" (SPI) is a synchronous four wire serial
 link used to connect microcontrollers to sensors, memory, and peripherals.
 
-The three signal wires hold a clock (SCLK, often on the order of 10 MHz),
+The three signal wires hold a clock (SCK, often on the order of 10 MHz),
 and parallel data lines with "Master Out, Slave In" (MOSI) or "Master In,
 Slave Out" (MISO) signals.  (Other names are also used.)  There are four
 clocking modes through which data is exchanged; mode-0 and mode-3 are most
@@ -22,7 +22,7 @@ other signals, often including an interrupt to the master.
 
 Unlike serial busses like USB or SMBUS, even low level protocols for
 SPI slave functions are usually not interoperable between vendors
-(except for cases like SPI memory chips).
+(except for commodities like SPI memory chips).
 
   - SPI may be used for request/response style device protocols, as with
     touchscreen sensors and memory chips.
@@ -77,8 +77,9 @@ cards without needing a special purpose MMC/SD/SDIO controller.
 How do these driver programming interfaces work?
 ------------------------------------------------
 The <linux/spi/spi.h> header file includes kerneldoc, as does the
-main source code, and you should certainly read that.  This is just
-an overview, so you get the big picture before the details.
+main source code, and you should certainly read that chapter of the
+kernel API document.  This is just an overview, so you get the big
+picture before those details.
 
 SPI requests always go into I/O queues.  Requests for a given SPI device
 are always executed in FIFO order, and complete asynchronously through
@@ -88,7 +89,7 @@ a command and then reading its response.
 
 There are two types of SPI driver, here called:
 
-  Controller drivers ... these are often built in to System-On-Chip
+  Controller drivers ... controllers may be built in to System-On-Chip
        processors, and often support both Master and Slave roles.
        These drivers touch hardware registers and may use DMA.
        Or they can be PIO bitbangers, needing just GPIO pins.
@@ -108,18 +109,18 @@ those two types of driver.  At this writing, Linux has no slave side
 programming interface.
 
 There is a minimal core of SPI programming interfaces, focussing on
-using driver model to connect controller and protocol drivers using
+using the driver model to connect controller and protocol drivers using
 device tables provided by board specific initialization code.  SPI
 shows up in sysfs in several locations:
 
-   /sys/devices/.../CTLR/spiB.C ... spi_device for on bus "B",
+   /sys/devices/.../CTLR/spiB.C ... spi_device on bus "B",
        chipselect C, accessed through CTLR.
 
    /sys/devices/.../CTLR/spiB.C/modalias ... identifies the driver
        that should be used with this device (for hotplug/coldplug)
 
    /sys/bus/spi/devices/spiB.C ... symlink to the physical
-       spiB-C device
+       spiB.C device
 
    /sys/bus/spi/drivers/D ... driver for one or more spi*.* devices
 
@@ -240,7 +241,7 @@ The board_info should provide enough information to let the system work
 without the chip's driver being loaded.  The most troublesome aspect of
 that is likely the SPI_CS_HIGH bit in the spi_device.mode field, since
 sharing a bus with a device that interprets chipselect "backwards" is
-not possible.
+not possible until the infrastructure knows how to deselect it.
 
 Then your board initialization code would register that table with the SPI
 infrastructure, so that it's available later when the SPI master controller
@@ -268,16 +269,14 @@ board info based on the board that was hotplugged.  Of course, you'd later
 call at least spi_unregister_device() when that board is removed.
 
 When Linux includes support for MMC/SD/SDIO/DataFlash cards through SPI, those
-configurations will also be dynamic.  Fortunately, those devices all support
-basic device identification probes, so that support should hotplug normally.
+configurations will also be dynamic.  Fortunately, such devices all support
+basic device identification probes, so they should hotplug normally.
 
 
 How do I write an "SPI Protocol Driver"?
 ----------------------------------------
-All SPI drivers are currently kernel drivers.  A userspace driver API
-would just be another kernel driver, probably offering some lowlevel
-access through aio_read(), aio_write(), and ioctl() calls and using the
-standard userspace sysfs mechanisms to bind to a given SPI device.
+Most SPI drivers are currently kernel drivers, but there's also support
+for userspace drivers.  Here we talk only about kernel drivers.
 
 SPI protocol drivers somewhat resemble platform device drivers:
 
@@ -319,7 +318,8 @@ might look like this unless you're creating a class_device:
 
 As soon as it enters probe(), the driver may issue I/O requests to
 the SPI device using "struct spi_message".  When remove() returns,
-the driver guarantees that it won't submit any more such messages.
+or after probe() fails, the driver guarantees that it won't submit
+any more such messages.
 
   - An spi_message is a sequence of protocol operations, executed
     as one atomic sequence.  SPI driver controls include:
@@ -368,7 +368,8 @@ the driver guarantees that it won't submit any more such messages.
 Some drivers may need to modify spi_device characteristics like the
 transfer mode, wordsize, or clock rate.  This is done with spi_setup(),
 which would normally be called from probe() before the first I/O is
-done to the device.
+done to the device.  However, that can also be called at any time
+that no message is pending for that device.
 
 While "spi_device" would be the bottom boundary of the driver, the
 upper boundaries might include sysfs (especially for sensor readings),
@@ -445,11 +446,15 @@ SPI MASTER METHODS
        This sets up the device clock rate, SPI mode, and word sizes.
        Drivers may change the defaults provided by board_info, and then
        call spi_setup(spi) to invoke this routine.  It may sleep.
+       Unless each SPI slave has its own configuration registers, don't
+       change them right away ... otherwise drivers could corrupt I/O
+       that's in progress for other SPI devices.
 
     master->transfer(struct spi_device *spi, struct spi_message *message)
        This must not sleep.  Its responsibility is arrange that the
-       transfer happens and its complete() callback is issued; the two
-       will normally happen later, after other transfers complete.
+       transfer happens and its complete() callback is issued.  The two
+       will normally happen later, after other transfers complete, and
+       if the controller is idle it will need to be kickstarted.
 
     master->cleanup(struct spi_device *spi)
        Your controller driver may use spi_device.controller_state to hold
diff --git a/Documentation/spi/spidev b/Documentation/spi/spidev
new file mode 100644 (file)
index 0000000..5c8e1b9
--- /dev/null
@@ -0,0 +1,307 @@
+SPI devices have a limited userspace API, supporting basic half-duplex
+read() and write() access to SPI slave devices.  Using ioctl() requests,
+full duplex transfers and device I/O configuration are also available.
+
+       #include <fcntl.h>
+       #include <unistd.h>
+       #include <sys/ioctl.h>
+       #include <linux/types.h>
+       #include <linux/spi/spidev.h>
+
+Some reasons you might want to use this programming interface include:
+
+ * Prototyping in an environment that's not crash-prone; stray pointers
+   in userspace won't normally bring down any Linux system.
+
+ * Developing simple protocols used to talk to microcontrollers acting
+   as SPI slaves, which you may need to change quite often.
+
+Of course there are drivers that can never be written in userspace, because
+they need to access kernel interfaces (such as IRQ handlers or other layers
+of the driver stack) that are not accessible to userspace.
+
+
+DEVICE CREATION, DRIVER BINDING
+===============================
+The simplest way to arrange to use this driver is to just list it in the
+spi_board_info for a device as the driver it should use:  the "modalias"
+entry is "spidev", matching the name of the driver exposing this API.
+Set up the other device characteristics (bits per word, SPI clocking,
+chipselect polarity, etc) as usual, so you won't always need to override
+them later.
+
+(Sysfs also supports userspace driven binding/unbinding of drivers to
+devices.  That mechanism might be supported here in the future.)
+
+When you do that, the sysfs node for the SPI device will include a child
+device node with a "dev" attribute that will be understood by udev or mdev.
+(Larger systems will have "udev".  Smaller ones may configure "mdev" into
+busybox; it's less featureful, but often enough.)  For a SPI device with
+chipselect C on bus B, you should see:
+
+    /dev/spidevB.C ... character special device, major number 153 with
+       a dynamically chosen minor device number.  This is the node
+       that userspace programs will open, created by "udev" or "mdev".
+
+    /sys/devices/.../spiB.C ... as usual, the SPI device node will
+       be a child of its SPI master controller.
+
+    /sys/class/spidev/spidevB.C ... created when the "spidev" driver
+       binds to that device.  (Directory or symlink, based on whether
+       or not you enabled the "deprecated sysfs files" Kconfig option.)
+
+Do not try to manage the /dev character device special file nodes by hand.
+That's error prone, and you'd need to pay careful attention to system
+security issues; udev/mdev should already be configured securely.
+
+If you unbind the "spidev" driver from that device, those two "spidev" nodes
+(in sysfs and in /dev) should automatically be removed (respectively by the
+kernel and by udev/mdev).  You can unbind by removing the "spidev" driver
+module, which will affect all devices using this driver.  You can also unbind
+by having kernel code remove the SPI device, probably by removing the driver
+for its SPI controller (so its spi_master vanishes).
+
+Since this is a standard Linux device driver -- even though it just happens
+to expose a low level API to userspace -- it can be associated with any number
+of devices at a time.  Just provide one spi_board_info record for each such
+SPI device, and you'll get a /dev device node for each device.
+
+
+BASIC CHARACTER DEVICE API
+==========================
+Normal open() and close() operations on /dev/spidevB.D files work as you
+would expect.
+
+Standard read() and write() operations are obviously only half-duplex, and
+the chipselect is deactivated between those operations.  Full-duplex access,
+and composite operation without chipselect de-activation, is available using
+the SPI_IOC_MESSAGE(N) request.
+
+Several ioctl() requests let your driver read or override the device's current
+settings for data transfer parameters:
+
+    SPI_IOC_RD_MODE, SPI_IOC_WR_MODE ... pass a pointer to a byte which will
+       return (RD) or assign (WR) the SPI transfer mode.  Use the constants
+       SPI_MODE_0..SPI_MODE_3; or if you prefer you can combine SPI_CPOL
+       (clock polarity, idle high iff this is set) or SPI_CPHA (clock phase,
+       sample on trailing edge iff this is set) flags.
+
+    SPI_IOC_RD_LSB_FIRST, SPI_IOC_WR_LSB_FIRST ... pass a pointer to a byte
+       which will return (RD) or assign (WR) the bit justification used to
+       transfer SPI words.  Zero indicates MSB-first; other values indicate
+       the less common LSB-first encoding.  In both cases the specified value
+       is right-justified in each word, so that unused (TX) or undefined (RX)
+       bits are in the MSBs.
+
+    SPI_IOC_RD_BITS_PER_WORD, SPI_IOC_WR_BITS_PER_WORD ... pass a pointer to
+       a byte which will return (RD) or assign (WR) the number of bits in
+       each SPI transfer word.  The value zero signifies eight bits.
+
+    SPI_IOC_RD_MAX_SPEED_HZ, SPI_IOC_WR_MAX_SPEED_HZ ... pass a pointer to a
+       u32 which will return (RD) or assign (WR) the maximum SPI transfer
+       speed, in Hz.  The controller can't necessarily assign that specific
+       clock speed.
+
+NOTES:
+
+    - At this time there is no async I/O support; everything is purely
+      synchronous.
+
+    - There's currently no way to report the actual bit rate used to
+      shift data to/from a given device.
+
+    - From userspace, you can't currently change the chip select polarity;
+      that could corrupt transfers to other devices sharing the SPI bus.
+      Each SPI device is deselected when it's not in active use, allowing
+      other drivers to talk to other devices.
+
+    - There's a limit on the number of bytes each I/O request can transfer
+      to the SPI device.  It defaults to one page, but that can be changed
+      using a module parameter.
+
+    - Because SPI has no low-level transfer acknowledgement, you usually
+      won't see any I/O errors when talking to a non-existent device.
+
+
+FULL DUPLEX CHARACTER DEVICE API
+================================
+
+See the sample program below for one example showing the use of the full
+duplex programming interface.  (Although it doesn't perform a full duplex
+transfer.)  The model is the same as that used in the kernel spi_sync()
+request; the individual transfers offer the same capabilities as are
+available to kernel drivers (except that it's not asynchronous).
+
+The example shows one half-duplex RPC-style request and response message.
+These requests commonly require that the chip not be deselected between
+the request and response.  Several such requests could be chained into
+a single kernel request, even allowing the chip to be deselected after
+each response.  (Other protocol options include changing the word size
+and bitrate for each transfer segment.)
+
+To make a full duplex request, provide both rx_buf and tx_buf for the
+same transfer.  It's even OK if those are the same buffer.
+
+
+SAMPLE PROGRAM
+==============
+
+--------------------------------       CUT HERE
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+
+
+static int verbose;
+
+static void do_read(int fd, int len)
+{
+       unsigned char   buf[32], *bp;
+       int             status;
+
+       /* read at least 2 bytes, no more than 32 */
+       if (len < 2)
+               len = 2;
+       else if (len > sizeof(buf))
+               len = sizeof(buf);
+       memset(buf, 0, sizeof buf);
+
+       status = read(fd, buf, len);
+       if (status < 0) {
+               perror("read");
+               return;
+       }
+       if (status != len) {
+               fprintf(stderr, "short read\n");
+               return;
+       }
+
+       printf("read(%2d, %2d): %02x %02x,", len, status,
+               buf[0], buf[1]);
+       status -= 2;
+       bp = buf + 2;
+       while (status-- > 0)
+               printf(" %02x", *bp++);
+       printf("\n");
+}
+
+static void do_msg(int fd, int len)
+{
+       struct spi_ioc_transfer xfer[2];
+       unsigned char           buf[32], *bp;
+       int                     status;
+
+       memset(xfer, 0, sizeof xfer);
+       memset(buf, 0, sizeof buf);
+
+       if (len > sizeof buf)
+               len = sizeof buf;
+
+       buf[0] = 0xaa;
+       xfer[0].tx_buf = (__u64) buf;
+       xfer[0].len = 1;
+
+       xfer[1].rx_buf = (__u64) buf;
+       xfer[1].len = len;
+
+       status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
+       if (status < 0) {
+               perror("SPI_IOC_MESSAGE");
+               return;
+       }
+
+       printf("response(%2d, %2d): ", len, status);
+       for (bp = buf; len; len--)
+               printf(" %02x", *bp++);
+       printf("\n");
+}
+
+static void dumpstat(const char *name, int fd)
+{
+       __u8    mode, lsb, bits;
+       __u32   speed;
+
+       if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
+               perror("SPI rd_mode");
+